python 讀寫 excel 有好多選擇,但是,方便操作的庫不多,在我嘗試了幾個庫之后,我覺得兩個比較方便的庫分別是 xlrd/xlwt、openpyxl。

  之所以推薦連個庫是因為這兩個庫分別操作的是不同版本的excel, xlrd 操作的是xls/xlxs 格式,的excel, 而 oppenpyxl 只支持 xlxs 格式的excel,  openpyxl 使用起來會更方便一些, 所以如果你操作xlxs 文件的話, 那么可以優先選擇openpyxl, 如果要兼容xls的話, 那就用xlrd/xlwt吧

本處使用openpyxl來實現

 

安裝

pip install openpyxl

如果excel 里面有圖片(jpg,png,bmg,..........) 需要安裝圖片處理模塊\

pip install pillow

excel寫

from openpyxl import workbook
wb = workbook()

創建一個新的工作薄

ws1 = wb.create_sheet("Mysheet")    # 默認最后一個
ws2 = wb.create_sheet("Mysheet", 0)   # 第一個

保存

wb.save("balances.xlsx")   #  文件名

修改工作薄的名稱

ws.title = New Title

獲取所有的工作薄名稱

print("wb.sheetnames")

獲取其中一個工作薄名稱

for sheet in wb:
    print(sheet)
wb["New Title"]    #直接獲取名稱為New Title 的工作簿

 

excel 寫數據

ws["A4"] = 4     #這將返回A4處的單元格, 如果尚不存在, 則創建一個單元格, 值可以直接分配

ws.cell(row=4, colum=2, value=10)    #也可以通過cell來進行寫入, 通過行數和列數來找到單元格所在的位置, 通過value 來復制

 

execl讀

from openpyxl  import load_workbook   #導入模塊
wb = load_workbook(filename = "balances.xlsx")    # 打開文件, 默認可讀寫, 若有需要可以指定 write_only和read_only 為True
sheet = web["test2"]   # 找到工作表
print(sheet["B4"].value)   # 輸出內容
# B9處寫入平均值
sheet["B9"] = '=AVERAGE(B2:B8)'

但是如果是讀取的時候需要加上data_only=True 這樣讀到B9返回的就是數字, 如果不加這個參數, 返回的將是公式本身='AVERAGE(B2:B8)'

 

append函數

可以一次添加多行數據, 從第一行空白開始(下面都是空白行) 寫入

#  添加一行
row = [1,2,3,4,5]
sheet.append(row)


#### 獲得最大行和最大列

print(sheet.max_row)
print(sheet.max_column)

 

獲取行和列

sheel.rows為生成器, 里面是每一行的數據,每一行又由一個tuple包裹。

sheel.columns類似, 不過里面是每個tuple是每一列的單元格

# 因為按行,  所以返回A1, B1, C1 這樣的順序
for row in sheet.rows:
    for cell in row:
        print(cell.value)


# A1, A2, A3  這樣的順序
for column in sheet.columns:
    for  cell in column:
        print(cell.value)

上面的代碼就可以獲得所有單元格的數據。如果要獲得某行的數據呢?給其一個索引就行了,因為sheet.rows是生成器類型,不能使用索引,轉換成list之后再使用索引,list(sheet.rows)[2]這樣就獲取到第三行的tuple對象。

for  cell in list(sheet.rows)[2]:
    print(cell.value)

如何獲得任意區間的單元格?

可以使用range函數,下面的寫法,獲得了以A1為左上角,B3為右下角矩形區域的所有單元格。注意range從1開始的,因為在openpyxl中為了和Excel中的表達方式一致,並不和編程語言的習慣以0表示第一個值。

for i in range(1, 4):
    for j in range(1, 3):
        print(sheet.cell(row=i, column=j).value)

# out
None
None
None
None
None
None

還可以像使用切片那樣使用。sheet['A1':'B3']返回一個tuple,該元組內部還是元組,由每行的單元格構成一個元組

for  row_cell  in  sheet_ranges["A1":"B3"]:
    for cell in row_cell:
        print(cell)

設置單元格風格--Style

先導入需要的類from openpyxl.styles import Font, colors, Alignment

分別可指定字體相關,顏色,和對齊方式。

字體

bold_itatic_24_font = Font(name='等線', size=24, italic=True, color=colors.RED, bold=True)

sheet['A1'].font = bold_itatic_24_font

對齊方式

也是直接使用cell的屬性aligment,這里指定垂直居中和水平居中。除了center,還可以使用right、left等等參數。

# 設置B1中的數據垂直居中和水平居中
sheet['B1'].alignment = Alignment(horizontal='center', vertical='center')

設置行高和列寬
有時候數據太長顯示不完,就需要拉長拉高單元格。

# 第2行行高
sheet.row_dimensions[2].height = 40
# C列列寬
sheet.column_dimensions['C'].width = 30

合並和拆分單元格

所謂合並單元格,即以合並區域的左上角的那個單元格為基准,覆蓋其他單元格使之稱為一個大的單元格。
相反,拆分單元格后將這個大單元格的值返回到原來的左上角位置。

# 合並單元格, 往左上角寫入數據即可
sheet.merge_cells('B1:G1') # 合並一行中的幾個單元格
sheet.merge_cells('A1:C3') # 合並一個矩形區域中的單元格

合並后只可以往左上角寫入數據,也就是區間中:左邊的坐標。
如果這些要合並的單元格都有數據,只會保留左上角的數據,其他則丟棄。換句話說若合並前不是在左上角寫入數據,合並后單元格中不會有數據。
以下是拆分單元格的代碼。拆分后,值回到A1位置。

sheet.unmerge_cells('A1:C3')