工做中,你們常常會使用excel去處理數據以及展現,可是對於部分工做咱們能夠藉助程序幫忙實現,達到高效解決問題的效果,好比將接口返回的json解析並保存結果到excel中,按必定規律處理excel中的數據而後寫入到新的excel文件中,彙總來自多個文件的內容到一個excel中,等等。 平時在工做中遇到比較繁瑣的數據須要寫入到excel中,除非excel的內置公式能夠處理,我會第一時間想到使用python處理。在這個過程當中,研究並嘗試了一些工具,閒着沒事,我整理並記錄下來。
XlsxWriter | xlrd&xlwt&xlutils | OpenPyXL | Microsoft Excel API | |
---|---|---|---|---|
介紹 | 能夠建立和寫Excel 2007+ XLSX文件 | xlrd、xlwt、xlutils三大模塊分別提供讀、寫和其餘功能 | 能夠讀、寫Excel 2007+ /xlsm/xltx/xltm文件 | 直接經過COM組件與Microsoft Excel進程通訊調用各類功能實現對excel文件操做 |
讀 | ✘ | √ | √ | √ |
寫 | √ | √ | √ | √ |
修改 | ✘ | √ | ⚠️ | √ |
.xls | ✘ | √ | ✘ | √ |
.xlsx | √ |
|
√ | √ |
大文件 | √ | ✘ | √ | ✘ |
功能 | 強 | 弱 | 通常 | 超強 |
速度 | 快 | 快 | 快 | 超慢 |
|系統|無限制|無限制|無限制|Windows + excel|html
|使用場景|* 須要建立xlsx文件
* 不須要讀取已有文件
* 須要實現比較複雜的功能
* 數據量可能會比較大
* 須要跨平臺|* 須要讀取xls或者xlsx文件
* 要生成xls文件
* 須要對文件處理的功能不太複雜
* 須要跨平臺|* 須要處理xlsx文件
* 須要修改已有文件或者在寫入過程當中不斷修改
* 須要對文件處理的功能比較複雜
* 數據量可能會很大
* 須要跨平臺|* 須要處理各類文件格式
* 須要用到特別複雜功能
* 在修改文件時不但願對原有信息形成任何意外破壞
* 數據量很小,或者願意等待
* 僅在Windows中使用|python
XlsxWriter是我最終選擇的用於寫操做的工具。顧名思義,它只能用來寫文件。 這應該是個比較新的項目,在GitHub上看它最先的提交是在2013年1月份。
其官方文檔中宣稱它支持(See the full documentation at: https://xlsxwriter.readthedocs.io):json
1 import xlsxwriter 2 # Create an new Excel file and add a worksheet. 3 workbook = xlsxwriter.Workbook('demo.xlsx') 4 worksheet = workbook.add_worksheet() 5 # Widen the first column to make the text clearer. 6 worksheet.set_column('A:A', 20) 7 # Add a bold format to use to highlight cells. 8 bold = workbook.add_format({'bold': True}) 9 # Write some simple text. 10 worksheet.write('A1', 'Hello') 11 # Text with formatting. 12 worksheet.write('A2', 'World', bold) 13 # Write some numbers, with row/column notation. 14 worksheet.write(2, 0, 123) # 第二3行第1列 15 worksheet.write(3, 0, 123.456) # 第四行第1列 16 # Insert an image. 17 worksheet.insert_image('B5', 'logo.png') 18 workbook.close()
xlrd&xlwt主要是針對Office 2013或更早版本的XLS文件格式。xlutils使用須要依賴xlrd和xlwt,擴充這兩個庫的功能。(更多信息請見:http://www.python-excel.org/)api
支持XLS格式 XlsxWriter和OpenPyXL都不支持XLS格式,從這個角度看,xlrd&xlwt仍然有必定的不可替代性。
1 import xlwt 2 from datetime import datetime 3 style0 = xlwt.easyxf('font: name Times New Roman, color-index red, bold on', 4 num_format_str='#,##0.00') 5 style1 = xlwt.easyxf(num_format_str='D-MMM-YY') 6 wb = xlwt.Workbook() 7 ws = wb.add_sheet('A Test Sheet') 8 ws.write(0, 0, 1234.56, style0) 9 ws.write(1, 0, datetime.now(), style1) 10 ws.write(2, 0, "hello world") 11 ws.write(3, 0, 1) 12 ws.write(3, 1, 3) 13 ws.write(3, 2, xlwt.Formula("A4+B4")) 14 wb.save('example.xls')
1 import xlrd 2 # 打開文件 3 workbook = xlrd.open_workbook('example.xls') 4 sheet2_name = workbook.sheet_names() # 獲取全部sheet名稱 5 print(sheet2_name) 6 # 根據sheet索引或者名稱獲取sheet內容 7 sheet1 = workbook.sheet_by_index(0) # sheet索引從0開始 8 # sheet1 = workbook.sheet_by_name('sheet2') 9 # sheet1的名稱,行數,列數 10 print(sheet1.name, sheet1.nrows, sheet1.ncols) 11 # 獲取整行和整列的值(數組) 12 rows = sheet1.row_values(2) # 獲取第三行內容 13 cols = sheet1.col_values(0) # 獲取第1列內容 14 print(rows) 15 print(cols) 16 # 獲取單元格內容 17 print(sheet1.cell(2, 0).value.encode('utf-8')) 18 print(sheet1.cell_value(2, 0).encode('utf-8')) 19 print(sheet1.row(2)[0].value.encode('utf-8')) 20 # 獲取單元格內容的數據類型 21 print(sheet1.cell(2, 0).ctype)
輸出: ['A Test Sheet'] A Test Sheet 4 3 ['hello world', '', ''] [1234.56, 43262.66097222222, 'hello world', 1.0] b'hello world' b'hello world' b'hello world' 1
OpenPyXL是比較綜合的一個工具,能讀能寫能修改,功能還算能夠但網上有人說有很大的缺陷。(更多信息請見:http://www.python-excel.org/, https://openpyxl.readthedocs.io/en/stable/index.html)
from openpyxl import Workbook wb = Workbook() # grab the active worksheet ws = wb.active # Data can be assigned directly to cells ws['A1'] = 42 # Rows can also be appended ws.append([1, 2, 3]) # Python types will automatically be converted import datetime ws['A2'] = datetime.datetime.now() # Save the file wb.save("sample.xlsx")
from openpyxl import Workbook
from openpyxl.compat import range
from openpyxl.utils import get_column_letter
wb = Workbook()
dest_filename = 'book.xlsx'
ws1 = wb.active
ws1.title = "range names"
for row in range(1, 5):
ws1.append(range(0, 10))
ws2 = wb.create_sheet(title="Pi")
ws2['F5'] = 3.14
ws3 = wb.create_sheet(title="Data")
for row in range(2, 10):
for col in range(27, 40):
_ = ws3.cell(column=col, row=row, value="{0}".format(get_column_letter(col)))
wb.save(filename=dest_filename)
1 from openpyxl import load_workbook 2 wb = load_workbook(filename='book.xlsx') 3 sheet_ranges = wb['range names'] 4 print(sheet_ranges['D2'].value)
輸出:
3數組
大部分Windows環境的開發人員都會選擇Microsoft Excel API。實際上不只僅是Python,幾乎各類語言都有相應的方法使用它,由於核心的邏輯徹底是由Microsft Excel自身提供的。語言相關的部分只是負責跟Windows的COM組件進行通訊。
在Python中首先須要安裝Python for Windows extensions(pywin32),具體的文檔能夠查閱Win32 Modules和Python COM。
固然你還必需要安裝某一個版本的Microsoft Office Excel,它內部的DLL負責實際的操做。緩存
一個包裝器,他提供了一個接口去讀、寫、操做數據。經過該包裝器能夠根據場景下載安裝不一樣的插件(好比前面提到的:xlrd、xlwt、OpenPyXL、XlsxWriter),而後使用該包裝器可使用相同的一套api去操做excel。
不過該工具若是是公司使用須要支付必定費用,大概$10,我的使用的話是免費的。(詳情可參見:https://pypi.org/project/pyexcel/)。app
可用插件以下:
ide
1 import pyexcel as p # make sure you had pyexcel-xls installed 2 a_list_of_dictionaries = [ 3 { 4 "Name": 'Adam', 5 "Age": 28 6 }, 7 { 8 "Name": 'Beatrice', 9 "Age": 29 10 }, 11 { 12 "Name": 'Ceri', 13 "Age": 30 14 }, 15 { 16 "Name": 'Dean', 17 "Age": 26 18 } 19 ] 20 pyexcel.save_as(records=a_list_of_dictionaries, dest_file_name="your_file.xls")
1 import pyexcel as p # make sure you had pyexcel-xls installed 2 records = p.iget_records(file_name="your_file.xls") 3 for record in records: 4 print("%s is aged at %d" % (record['Name'], record['Age'])) 5 p.free_resources()
輸出:
Adam is aged at 28
Beatrice is aged at 29
Ceri is aged at 30
Dean is aged at 26工具