對 excel 文檔操做有多簡單?看看python如何處理。
最近須要頻繁讀寫 excel 文件,想經過程序對 excel 文件進行自動化處理,發現使用 python 的 openpyxl 庫進行 excel 文件讀寫實在太方便了,結構清晰,操做簡單。本文對 openpyxl 的使用進行總結,主要包含如下內容:java
openpyxl 是一個對 xlsx/xlsm/xltx/xltm
格式的 2010 excel 文檔進行讀寫的 python 庫。它官網有詳細的文檔介紹。在進行使用前,需先安裝並引入python
# 安裝 pip install openpyxl # 引入openpyxl 模塊 import openpyxl
在進行 excel 操做以前,先對 excel 的文件結構作一個簡單瞭解,以便於熟悉後續的操做。以下圖:app
一個 excel 文件,其內容按層次分爲工做簿(文件) -> 工做表(sheet) -> 行列 -> 單元格
,對應上圖,整個 excel 文件便是一個工做簿;工做簿下能夠有多個工做表(如圖中的 Sheet1/test1 等等);工做表中就是對應的表格數據,分爲行和列,行是用序號表示,列用大寫字母表示(也可用序號);行與列的交點就是每個存儲數據的單元格。所以,咱們對 excel 表格進行讀寫,基本按這個層次思路來操做:讀入文件,找到工做表,遍歷行列,定位單元格,對單元格進行讀寫。所以,會涉及到工做表、行列、單元格的讀寫操做。這些操做以前,須要先把文件加載進來,一個 excel 文件就是一個工做簿 (workbook),加載操做以下(示例中的 excel 文件爲 text.xlsx):分佈式
# 加載excel文件 file_path = "E:/pythontest/test.xlsx" workbook = openpyxl.load_workbook(file_path)
工做表( sheet )會有多個,能夠讀取所有的工做表,讀取單個時,能夠按 sheet 名稱讀取,也能夠按下標(下標從0開始)。ide
workbook.worksheets
workbook.sheetnames
workbook[sheet_name]
workbook.worksheets[i]
workbook.active
sheet.title
、sheet.max_row
、sheet.max_column
以下:函數
# 所有sheet對象 >>> workbook.worksheets [<Worksheet "Sheet1">, <Worksheet "test1">, <Worksheet "test2">] # 所有sheet名稱 >>> workbook.sheetnames ['Sheet1', 'test1', 'test2'] # 按名稱讀取sheet >>> workbook["Sheet1"] <Worksheet "Sheet1"> # 按下標讀取 >>> workbook.worksheets[0] <Worksheet "Sheet1"> # 獲取當前正在使用的sheet >>> workbook.active <Worksheet "Sheet1"> # 獲取sheet的屬性 >>> sheet_active.title Sheet1 >>> sheet_active.max_row 6 >>> sheet_active.max_column 3
若須要新增工做表,按操做流程,先添加工做表,再保存文件。建立經過create_sheet
完成,建立後保存(save)文件,添加才能生效。字體
workbook.create_sheet("test3")
workbook.create_sheet("test4",1)
workbook.save(file_path)
要修改工做表名稱,直接經過設置工做表的 title 便可,修改後一樣須要保存文件。ui
# 修改工做表名稱 >>> sheet1 = workbook['test1'] >>> sheet1.title = 'test11' # 保存文件 >>> workbook.save(file_path)
刪除工做表,須要先獲取 sheet 對象,而後刪除。刪除有兩種方式,一是使用 workbook
提供的 remove
方法,也能夠直接使用 python 的del
進行刪除。刪除操做後,一樣須要保存文件:spa
# remove刪除工做表 sheet = workbook["test-1"] workbook.remove(sheet) # del操做刪除 del workbook["test2"] # 保存文件 workbook.save(file_path)
獲取 sheet 對象後,後續便可進行行列操做,包括行列讀取,添加,刪除等。代理
sheet.rows
,sheet.columns
sheet[1]
,讀多行sheet[2:3]
,讀一列sheet['A']
,讀多列sheet['B:C']
# 遍歷所有行 >>> for row in sheet.rows: ... print(row) ... (<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>) (<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>) .... # 讀取部分行列 >>> sheet[1] (<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>) >>> sheet["A:B"] ((<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.A2>, <Cell 'Sheet1'.A3>, <Cell 'Sheet1'.A4>, <Cell 'Sheet1'.A5>, <Cell 'Sheet1'.A6>), (<Cell 'Sheet1'.B1>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.B4>, <Cell 'Sheet1'.B5>, <Cell 'Sheet1'.B6>))
添加行列,能夠指定位置添加單個行列或多個行列。
sheet.append(rowdata)
sheet.insert_rows
,sheet.insert_cols
# 在第4行插入1行空行 >>> sheet.insert_rows(4) # 在第2行插入2行空行 >>> sheet.insert_rows(idx=2,amount=2) # 添加一行數據到表 >>> row_data = ["tom", 15, "tom@test.com"] >>> sheet.append(row_data) # 保存修改內容 >>> workbook.save(file_path)
刪除操做與插入行列操做方式一致,使用delete_rows
及delete_cols
方法。
# 刪除行 >>> sheet.delete_rows(2,2) >>> workbook.save(file_path)
咱們的數據最終是保存在每個單元格(Cell)中,所以,最終咱們操做數據其實就是單元格中的數據,單元格中,openpyxl 使用是 Cell 對象。前面在遍歷行列數據時,能夠看到輸出<Cell 'Sheet1'.A1>
的內容,這對應的單元格對象。下面對單元格的操做進行說明。
定位獲取單元格有兩種方式:
sheet[A1]
cell
函數(行列下標從1開始):sheet.cell(row=2,column=1)
# 指定行列座標獲取單元格 >>> sheet["A1"] <Cell 'Sheet1'.A1> # cell函數獲取單元格 >>> sheet.cell(row=1, column=1) <Cell 'Sheet1'.A1>
獲取單元格對象後,能夠獲取數據值及其屬性,包括它所在的行列數,座標,值等。
>>> cell = sheet["A2"] >>> cell.value '張三' >>> cell.coordinate 'A2' >>> cell.column 1 >>> cell.row 2
經過對單元格區域,能夠向上、下、左、右進行移動,使用的是move_range(range,rows,cols)
,其中 rows 和 cols 爲整數,正整數表示向下或向右,負整數爲向上或向左。
# 移動數據區域(向上移動2行,向右移動3列),正整數爲向下或向右,負整數爲向上或向左 sheet.move_range("A3:C3", rows=-2, cols=3) wb.save(file_path)
對於跨行和跨列,須要對單元格進行合併,使用的是merge_cells(range_string, start_row, start_column, end_row, end_column)
。若是要合併的單元格都有數據,只會保留左上角的數據,其餘則丟棄。合併及拆分均可以經過行列座標(如A1)或者行列下標(如1,2)進行。
# 單元格合併,使用範圍座標 sheet.merge_cells("A2:B3") # 單元格合併,指定行列下標(下標從1開始) sheet.merge_cells(start_row=5, start_column=3, end_row=7, end_column=4) wb.save(file_path) # 拆分單元格 sheet.unmerge_cells("A2:B3") sheet.unmerge_cells(start_row=5, start_column=3, end_row=7, end_column=4) # 保存文件 wb.save(file_path)
對單元格值進行修改和寫入,直接對cell.value
進行賦值便可。這裏須要注意的是,能夠寫入 excel 公式,具體公式與 excel 中用到公式一致,另外,如果寫入公式,讀取時獲取到的 value 值也是公式,而非公式值。
# 寫入值 cell.value = "張三" # 寫入公式(求平均值) cell.value = "=AVERAGE(B2:B6)"
單元格的格式包括行高,列寬,字體、邊框、對齊方式、填充顏色等。這些都在 openpyxl 的 styles 模塊中。
row_dimensions[row_num].height = xx
,sheet.column_dimensions[col_name].width = xx
Font(name="微軟雅黑", size=20, bold=True, italic=True, color="000000")
Side(style="thin", color="000000")
,經過邊構建邊框對象:Border(left=side, right=side, top=side, bottom=side)
Alignment(horizontal="center", vertical="center", wrap_text=True)
PatternFill(fill_type="solid", fgColor="FF0000")
和 GradientFill(stop=("FF0000", "FD1111", "000000"))
# 設置行高和列寬 sheet.row_dimensions[1].height = 50 sheet.column_dimensions["A"].width = 20 # 設置單元格字體 cell = sheet["A1"] current_font = cell.font font = Font(name="微軟雅黑", size=20, bold=True, italic=True, color="000000") cell.font = font # 設置邊框(細邊,黑色) side_style = Side(style="thin", color="000000") border = Border(left=side_style, right=side_style, top=side_style, bottom=side_style) cell.border = border # 居中對齊,自動換行 cell_alignment = Alignment(horizontal="center", vertical="center", wrap_text=True) cell.alignment = cell_alignment # 填充顏色(紅色填充,和紅色到黑色漸變填充) p_fill = PatternFill(fill_type="solid", fgColor="FF0000") g_fill = GradientFill(stop=("FF0000", "FD1111", "000000")) cell.fill = p_fill sheet["B1"].fill = g_fill
最後注意的是,這些修改操做最後都須要經過保存操做(wb.save(file_path)
)才能生效。
經過上面的講解,瞭解如何使用 python 的 openpyxl 庫對 excel 文檔的處理操做,能夠發現它的操做邏輯至關是清晰簡單的,符合的咱們使用 excel 的習慣。處理流程基本是加載文件、定位須要處理的工做表、行、列及單元格。對它們進行讀、寫、修改格式等操做。所以,若是有自動化處理 excel 文件的需求,用 openpyxl 吧,但它限制只能處理 2010 格式的 excel 文檔,對於舊格式( xls )的建議都統一換爲新的格式再操做,或者也可使用 xlrd 和 xlwt 模塊操做。
https://openpyxl.readthedocs.io/
個人公衆號(搜索Mason技術記錄
),獲取更多技術記錄: