這里openpyxl只支持xlsx格式的Excel,openpyxl使用起來會更方便一些,所以如果只操作小流水線文件的話,那么可以優先選擇openpyxl,如果要兼容xls的話,就使用xlrd/xlwt
openpyxl的安裝
pip install openpyxl
# 如果Excel里面有圖片(JPEG,png,...)需要安裝圖片處理模塊
pip install pillow
Excel的寫
基本用法
from openpyxl import Workbook wb = Workbook() wb0 = wb.create_sheet("user") # 默認從后面插入一個工作表 wb1 = wb.create_sheet("user", 0) # 第一個 wb2 = wb.create_sheet("商品", 0) wb3 = wb.create_sheet("價格", 0) wb1.title = "用戶表" # 修改工作簿的名稱 wb.save("xb.xlsx") # 保存 print(wb.sheetnames) # 獲取所有工作簿的名稱
獲取其中一個工作簿的名稱
for sheet in wb: print(sheet) print(wb['用戶表'])
Excel寫數據
wb1['A4'] = 4 # 這將返回A4處的單元格,如果上不存在,則創建一個單元格,值可以直接分配 wb1.cell(row=4, column=2, value=10) # 也可以通過cell來進行寫入,通過行數和列數來找到單元格所在的位置
簡單的求和
wb1['A1'] = 1 wb1['A2'] = 2 wb1['A3'] = '=sum(A1:A2)' wb.save('xb.xlsx')
添加一行內容
l = ["姓名", "性別", "年齡", "愛好"] wb1.append(l) wb.save()
Excel的讀
from openpyxl import load_workbook # 導入模塊 wb = load_workbook(filename='xb.xlsx') # 打開文件,默認可讀寫,若有需要可以指定write_onle和read_only為True sheet = wb['用戶表'] # 找到工作表 print(sheet['A4'].value) # 輸出內容 # 在B9處寫入平均值 sheet["B9"] = '=AVERAGE(B2:B8)' wb.save('xb.xlsx')
如果是讀取的時候就需要加上data_only=True,這樣讀到B9返回的就是數字,如果不加這個參數返回的就是公式本身.
獲取行和列
sheet.row為生成器,里面是每一行數據,每一行又由一個tuple包裹
sheet.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')