python 讀寫 excel 有好多選擇,可是,方便操做的庫很少,在我嘗試了幾個庫以後,我以爲兩個比較方便的庫分別是 xlrd/xlwt、openpyxl。python
之因此推薦連個庫是由於這兩個庫分別操做的是不一樣版本的excel, xlrd 操做的是xls/xlxs 格式,的excel, 而 oppenpyxl 只支持 xlxs 格式的excel, openpyxl 使用起來會更方便一些, 因此若是你操做xlxs 文件的話, 那麼能夠優先選擇openpyxl, 若是要兼容xls的話, 那就用xlrd/xlwt吧web
本處使用openpyxl來實現編程
安裝
pip install openpyxl
若是excel 裏面有圖片(jpg,png,bmg,..........) 須要安裝圖片處理模塊\app
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函數
能夠一次添加多行數據, 從第一行空白開始(下面都是空白行) 寫入ide
# 添加一行 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對象。spa
for cell in list(sheet.rows)[2]: print(cell.value)
如何得到任意區間的單元格?excel
可使用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')