01-openpyxl讀取Excel(這麼詳細,不可能學不會)

基礎知識

工作簿 workbook
表單 worksheet
行 row
列 column
單元格 cell

這裏有個知識—— active

每個工作簿都有很多的工作表,默認是三個,我們把正在操作的那個稱爲活躍表單,也就是active

這個是本文用到的表格文檔

在這裏插入圖片描述

ws = wb.active
# 將活躍的表單賦值然後進行操作,那麼我們當前那張表單在界面前,就是操作的哪一個

正文

導入模塊

import openpyxl

首先打開一個工作簿

# 導入一個Excel文件
wb = openpyxl.load_workbook('demo.xlsx')   

查看工作簿中所有工作表的名稱

print(wb.sheetnames)
['Sheet1', 'Sheet2']
  • 返回一個列表形式的數據,意味着我們也可以利用索引來操作,由於wb是一個對象,這裏用循環遍歷
for sheet in wb:
    print(sheet)

<Worksheet "Sheet1">
<Worksheet "Sheet2">

創建一個新的表單

mySheet = wb.create_sheet('mySheet')
print(wb.sheetnames)
['Sheet1', 'Sheet2', 'mySheet']

操作指定表單

# 第一種:使用 get_sheet_by_name()方法,指定表單名
sheet2 = wb.get_sheet_by_name('Sheet2')  # 注意大小寫

# 第二種:直接使用 wb對象 索引表單名
sheet3 = wb['mySheet']

查看指定表單的數據

sheet1 = wb['Sheet1']
print(sheet1)
<Worksheet "Sheet1">

print(sheet1['B2'])
<Cell 'Sheet1'.B2>

print(sheet1['B2'].value)
週一

定位單元格

# 使用索引名稱直接找到單元格
print(sheet1['B2'])
<Cell 'Sheet1'.B2>
print(sheet1['B2'].value)
週一

# 使用Worksheet.cell()方法
# 注意:使用關鍵字參數指定行列,數字默認從1開始
print(sheet1.cell(row=4, column=2))
print(sheet1.cell(row=4, column=2).value)
<Cell 'Sheet1'.B4>
鄭三

查看單元格屬性

cell = sheet1['B3']
print('Row {}, Column {} is {}'.format(cell.row, cell.column, cell.value))
Row 3, Column 2 is 吳二

print('Cell {} is {}'.format(cell.coordinate, cell.value))
Cell B3 is 吳二

打印多行數據

for i in range(1,8):  # 也可以指定步數
    print(i, sheet1.cell(row=i, column=3).value)
    
1 2
2 101
3 102
4 103
5 103
6 104
7 104

# 當然循環只是其中一種方法,還有更簡便的,請看下方取整行整列

取整列,取整行

# 直接用索引取出C列的所有數據,得到的cols只是所有單元格的對象,要取值的話,需要遍歷出來value
cols = sheet1['C']
for c in cols:
    print(c.value)
2
101
102
103
103
104
104

# 也可以用切片的方式,取出整列的區間
cols_range = sheet1['B:C']
for col in cols_range:       # 首先先遍歷出來B列,然後再是C列
    for cell in col:         # 遍歷單獨一列的每一個單元格的數據
        print(cell.value)    # 打印單元格的數據
# 這裏結果過長就不再打印

# 取出單行
rows = sheet1[2]
for r in rows:
    print(r.value)
A1
週一
101
2018-08-08 00:00:00

# 取出多行數據
rows_range = sheet1[2:5]   # 這裏行切片的起始是根據Excel的行號,不是默認從0開始
for col in rows_range:
    for cell in col:
        print(cell.value)
A1
週一
101
2018-08-08 00:00:00
A2
吳二
102
2018-08-09 00:00:00
A3
鄭三
103
2018-08-10 00:00:00
A3
趙四
103
2018-08-10 00:00:00

使用生成器的方法訪問多行多列

# 關鍵字參數的理解
# min_row  指定起始的行號
# max_row  指定結束的行號
# max_col  指定列的寬度
for rows in sheet1.iter_rows(min_row=1, max_row=2, max_col=3):
    for row in rows:     # 這裏的rows是一整行的生成器對象
        print(row.value)
0
1
2
A1
週一
101

指定一個行列範圍來遍歷取值

# 首先我們定義一個單元格的範圍
cell_range = sheet1['A2:C4']
print(cell_range)
((<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>), 
 (<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>), 
 (<Cell 'Sheet1'.A4>, <Cell 'Sheet1'.B4>, <Cell 'Sheet1'.C4>))
# 可以看到cell_range這個對象中,每一行都單獨成一個元組

for cell_row in cell_range:
    for cell in cell_row:   # 從每一個單獨的元組中再遍歷,然後輸出單元格的值
        print(cell.coordinate, cell.value)
A2 A1
B2 週一
C2 101
A3 A2
B3 吳二
C3 102
A4 A3
B4 鄭三
C4 103

查看工作表的最大行,最大列

print('{} * {}'.format(sheet1.max_row, sheet1.max_column))
7 * 4

將索引進行互相轉化

from openpyxl.utils import get_column_letter, column_index_from_string
print(get_column_letter(2), get_column_letter(10))
B J

print(column_index_from_string('AAJ'))
712
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章