openpyxl模塊是一個讀寫Excel 2010文檔的Python庫,若是要處理更早格式的Excel文檔,須要用到額外的庫,openpyxl是一個比較綜合的工具,可以同時讀取和修改Excel文檔。其餘不少的與Excel相關的項目基本只支持讀或者寫Excel一種功能。python
openpyxl是一個開源項目,這裏使用以下命令安裝openpyxl模塊app
pip3 install openpyxl
想要操做Excel首先要了解Excel 基本概念,Excel中列以字幕命名,行以數字命名,好比左上角第一個單元格的座標爲A1,下面的爲A2,右邊的B1。ide
openpyxl中有三個不一樣層次的類,Workbook是對工做簿的抽象,Worksheet是對錶格的抽象,Cell是對單元格的抽象,每個類都包含了許多屬性和方法。函數
操做Excel的通常場景:工具
一個Workbook對象表明一個Excel文檔,所以在操做Excel以前,都應該先建立一個Workbook對象。對於建立一個新的Excel文檔,直接進行Workbook類的調用便可,對於一個已經存在的Excel文檔,能夠使用openpyxl模塊的load_workbook函數進行讀取,該函數包涵多個參數,但只有filename參數爲必傳參數。filename 是一個文件名,也能夠是一個打開的文件對象。編碼
>>> import openpyxl >>> excel = openpyxl.Workbook('hello.xlxs') >>> excel1 = openpyxl.load_workbook('abc.xlsx') >>>
PS:Workbook和load_workbook相同,返回的都是一個Workbook對象。excel
Workbook對象提供了不少屬性和方法,其中,大部分方法都與sheet有關,部分屬性以下:對象
>>> import openpyxl >>> excel2 = openpyxl.load_workbook('abc.xlsx') >>> excel2.active <Worksheet "abc"> >>> excel.read_only False >>> excel2.worksheets [<Worksheet "abc">, <Worksheet "def">] >>> excel2.properties <openpyxl.packaging.core.DocumentProperties object> Parameters: creator='openpyxl', title=None, description=None, subject=None, identifier=None, language=None, created=datetime.datetime(2006, 9, 16, 0, 0), modified=datetime.datetime(2018, 2, 5, 7, 25, 18), lastModifiedBy='Are you SuperMan', category=None, contentStatus=None, version=None, revision=None, keywords=None, lastPrinted=None >>> excel2.encoding 'utf-8' >>>
Workbook提供的方法以下:blog
>>> excel2.get_sheet_names() Warning (from warnings module): File "__main__", line 1 DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames). ['abc', 'def'] >>> excel2.sheetnames ['abc', 'def'] >>> excel2.get_sheet_by_name('def') Warning (from warnings module): File "__main__", line 1 DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]). <Worksheet "def"> >>> excel2['def'] <Worksheet "def"> >>> excel2.get_active_sheet() Warning (from warnings module): File "__main__", line 1 DeprecationWarning: Call to deprecated function get_active_sheet (Use the .active property). <Worksheet "abc"> >>> excel2.create_sheet('ghk') <Worksheet "ghk">
有了Worksheet對象之後,咱們能夠經過這個Worksheet對象獲取表格的屬性,獲得單元格中的數據,修改表格中的內容。openpyxl提供了很是靈活的方式來訪問表格中的單元格和數據,經常使用的Worksheet屬性以下:ip
PS:freeze_panes,參數比較特別,主要用於在表格較大時凍結頂部的行或左邊的行。對於凍結的行,在用戶滾動時,是始終可見的,能夠設置爲一個Cell對象或一個端元個座標的字符串,單元格上面的行和左邊的列將會凍結(單元格所在的行和列不會被凍結)。例如咱們要凍結第一行那麼設置A2爲freeze_panes,若是要凍結第一列,freeze_panes取值爲B1,若是要同時凍結第一行和第一列,那麼須要設置B2爲freeze_panes,freeze_panes值爲none時 表示 不凍結任何列。
經常使用的Worksheet方法以下:
>>> for row in excel2['金融'].iter_rows(min_row=2,max_row=4,min_col=2,max_col=4): print(row) (<Cell 'abc'.B2>, <Cell 'abc'.C2>, <Cell 'abc'.D2>) (<Cell 'abc'.B3>, <Cell 'abc'.C3>, <Cell 'abc'.D3>) (<Cell 'abc'.B4>, <Cell 'abc'.C4>, <Cell 'abc'.D4>)
PS:從Worksheet對象的屬性和方法能夠看到,大部分都是返回的是一個Cell對象,一個Cell對象表明一個單元格,咱們能夠使用Excel座標的方式來獲取Cell對象,也能夠使用Worksheet的cell方法獲取Cell對象。
>>> excel2['abc']['A1'] <Cell 'abc'.A1> >>> excel2['abc'].cell(row=1,column=2) <Cell 'abc'.B1> >>>
Cell對象比較簡單,經常使用的屬性以下:
>>> excel2['abc'].cell(row=1,column=2).coordinate 'B1' >>> excel2['abc'].cell(row=1,column=2).value 'test' >>> excel2['abc'].cell(row=1,column=2).row 1 >>> excel2['abc'].cell(row=1,column=2).column 'B'
# ---------- 方式1 ---------- >>> for row in excel2['abc'].rows: print( *[ cell.value for cell in row ]) # ---------- 方式2 ---------- >>> for row in excel2['abc'].values: print(*row)
現有以下需求,對每一個人提交的表格進行彙總
#!/usr/bin/evn python import os import glob import openpyxl filedir = r'C:\Users\Are you SuperMan\Desktop\test' def process_merge_excel(filename): # 對文件進行彙總 main_file = filename[0] wb = openpyxl.load_workbook(main_file) sheet = wb.active sheet.title = 'merge_result' for file in filename[1:]: wb2 = openpyxl.load_workbook(file) ac_sheet = wb2.active for row in ac_sheet.iter_rows(min_row=2): value = [ cell.value for cell in row] sheet.append(value) return wb def get_file_excel(filelist): # 獲取要合併的文件 file_list = glob.glob(os.path.join(filelist,'*.xlsx')) return file_list if __name__ == '__main__': files = get_file_excel(filedir) wb = process_merge_excel(files) wb.save(r'C:\Users\Are you SuperMan\Desktop\test\result.xlsx')