詳解Python操作Excel文件

原文鏈接:https://blog.csdn.net/weixin_38405253/article/details/100512061

前言

本篇文章主要總結了一下利用python操作Excel文件的第三方庫和方法。

常見庫簡介

1.xlrd

xlrd是一個從Excel文件讀取數據和格式化信息的庫,支持.xls以及.xlsx文件。

地址:http://xlrd.readthedocs.io/en/latest/

  • xlrd支持.xls,.xlsx文件的讀

  • 通過設置on_demand變量使open_workbook()函數只加載那些需要的sheet,從而節省時間和內存(該方法對.xlsx文件無效)。

  • xlrd.Book對象有一個unload_sheet方法,它將從內存中卸載工作表,由工作表索引或工作表名稱指定(該方法對.xlsx文件無效)

2.xlwt

xlwt是一個用於將數據和格式化信息寫入舊Excel文件的庫(如.xls)。

地址:https://xlwt.readthedocs.io/en/latest/

  • xlwt支持.xls文件寫。

3.xlutils

xlutils是一個處理Excel文件的庫,依賴於xlrd和xlwt。

地址:http://xlutils.readthedocs.io/en/latest/

  • xlutils支持.xls文件。

  • 支持Excel操作。

4.xlwings

xlwings是一個可以實現從Excel調用Python,也可在python中調用Excel的庫。

地址:http://docs.xlwings.org/en/stable/index.html

  • xlwings支持.xls讀,支持.xlsx文件讀寫。

  • 支持Excel操作。

  • 支持VBA。

4、強大的轉換器可以處理大部分數據類型,包括在兩個方向上的numpy array和pandas DataFrame。

5.openpyxl

openpyxl是一個用於讀取和編寫Excel 2010 xlsx/xlsm/xltx/xltm文件的庫。

地址:https://openpyxl.readthedocs.io/en/stable/

  • openpyxl支持.xlsx文件的讀寫。

  • 支持Excel操作。

  • 加載大.xlsx文件可以使用read_only模式。

  • 寫入大.xlsx文件可以使用write_only模式。

6.xlsxwriter

xlsxwriter是一個用於創建Excel .xlsx文件的庫。

地址:https://xlsxwriter.readthedocs.io/

  • xlswriter支持.xlsx文件的寫。

  • 支持VBA。

  • 寫入大.xlsx文件時使用內存優化模式。

7.win32com

win32com庫存在於pywin32中,是一個讀寫和處理Excel文件的庫。

地址:http://pythonexcels.com/python-excel-mini-cookbook/

  • win32com支持.xls,.xlsx文件的讀寫,支持.xlsx文件的寫。

  • 支持Excel操作。

8.DataNitro

DataNitro是一個內嵌在Excel中的插件。

地址:https://datanitro.com/docs/

  • DataNitro支持.xls,.xlsx文件的讀寫。

  • 支持Excel操作。

  • 支持VBA。

  • 收費

9.pandas

pandas通過對Excel文件的讀寫實現數據輸入輸出

地址:http://pandas.pydata.org/

  • pandas支持.xls,.xlsx文件的讀寫。

  • 支持只加載每個表的單一工作頁。

 

詳解Python操作Excel文件

 

提醒及注意:

  • xlutils 僅支持 xls 文件,即2003以下版本;

  • win32com 與 DataNitro 僅支持 windows 系統;

  • xlwings 安裝成功後,如果運行提示報錯“ImportError: no module named win32api”,請再安裝 pypiwin32 或者 pywin32 包;

  • win32com 不是獨立的擴展庫,而是集成在其他庫中,安裝 pypiwin32 或者 pywin32 包即可使用;

  • DataNitro 是 Excel 的插件,安裝需到官網下載。

基本功能:

由於設計目的不同,每個模塊通常着重於某一方面功能,各有所長。

1.xlwings

可結合 VBA 實現對 Excel 編程,強大的數據輸入分析能力,同時擁有豐富的接口,結合 pandas/numpy/matplotlib 輕鬆應對 Excel 數據處理工作。

2.openpyxl

簡單易用,功能廣泛,單元格格式/圖片/表格/公式/篩選/批註/文件保護等等功能應有盡有,圖表功能是其一大亮點,缺點是對 VBA 支持的不夠好。

3.pandas

數據處理是 pandas 的立身之本,Excel 作爲 pandas 輸入/輸出數據的容器。

4.win32com

從命名上就可以看出,這是一個處理 windows 應用的擴展,Excel 只是該庫能實現的一小部分功能。該庫還支持 office 的衆多操作。需要注意的是,該庫不單獨存在,可通過安裝 pypiwin32 或者 pywin32 獲取。

5.xlsxwriter

擁有豐富的特性,支持圖片/表格/圖表/篩選/格式/公式等,功能與openpyxl相似,優點是相比 openpyxl 還支持 VBA 文件導入,迷你圖等功能,缺點是不能打開/修改已有文件,意味着使用 xlsxwriter 需要從零開始。

6.DataNitro

作爲插件內嵌到 Excel 中,可完全替代 VBA,在 Excel 中使用 python 腳本。既然被稱爲 Excel 中的 python,協同其他 python 庫亦是小事一樁。然而,這是付費插件…

7.xlutils

基於 xlrd/xlwt,老牌 python 包,算是該領域的先驅,功能特點中規中矩,比較大的缺點是僅支持 xls 文件。

讀寫測試

測試用例

  • 用例1. 讀.xls文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數)。

  • 用例2. 讀.xlsx文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數)。

  • 用例3. 讀.xls文件的整個表(表有1個分頁,頁有2000行1200列的整數)。

  • 用例4. 讀.xlsx文件的整個表(表有1個分頁,頁有2000行1200列的整數)。

  • 用例5. 寫.xls文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數)。

  • 用例6. 寫.xlsx文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數)。

  • 用例7. 寫.xls文件的整個表(表有1個分頁,頁有2000行1200列的整數)。

  • 用例8. 寫.xlsx文件的整個表(表有1個分頁,頁有2000行1200列的整數)。

測試結果

詳解Python操作Excel文件

注:

  1. xlwt和pandas每個工作頁最多寫入256列,因此測試用例修改爲每頁有2000行256列的整數.

  2. xlutils讀寫依賴於xlrd和xlwt,不單獨測試。

  3. openpyxl測試兩種模式,一是普通加載寫入,二是read_only/write_only模式下的加載寫入。

  4. DataNitro要收費,且需依託Excel使用,本次不測試。

性能比較

單從讀寫的性能上考慮,win32com的性能是最好的,xlwings其次。

openpyxl雖然操作Excel的功能強大,但讀寫性能過於糟糕,尤其是寫大表時,會佔用大量內存(把我的4G內存用完了),開啓read_only和write_only模式後對其性能有大幅提升,尤其是對讀的性能提升很大,使其幾乎不耗時(0.01秒有點誇張,不過確實是加載上了)。

pandas把Excel當作數據讀寫的容器,爲其強大的數據分析服務,因此讀寫性能表現中規中矩,但其對Excel文件兼容性是最好的,支持讀寫.xls,.xlsx文件,且支持只讀表中單一工作頁。同樣支持此功能的庫還有xlrd,但xlrd只支持讀,並不支持寫,且性能不突出,需要配合xlutils進行Excel操作,並使用xlwt保存數據,而xlwt只能寫入.xls文件(另一個可以寫入.xls文件的庫是pandas,且這兩個寫入的Excel文件最多只能有256列,其餘庫就我目前的瞭解均只能寫入.xlsx文件),性能一般。

xlsxwriter功能單一,一般用來創建.xlsx文件,寫入性能中庸。win32com擁有最棒的讀寫性能,但該庫存在於pywin32的庫中,自身沒有完善的文檔,使用略吃力。xlwings擁有和win32com不相伯仲的讀寫性能,強大的轉換器可以處理大部分數據類型,包括二維的numpy array和pandas DataFrame,可以輕鬆搞定數據分析的工作。

綜合考慮,xlwings的表現最佳,正如其名,xlwings——Make Excel Fly!

便捷性比較

本測試目前只是針對Excel文件的讀寫,並未涉及Excel操作,單從讀寫的便捷性來講,各庫的表現難分上下,但是win32com和xlwings這兩個庫可以在程序運行時實時在打開的Excel文件中進行操作,實現過程的可視化,其次xlwings的數據結構轉換器使其可以快速的爲Excel文件添加二維數據結構而不需要在Excel文件中重定位數據的行和列,因此從讀寫的便捷性來比較,仍是xlwings勝出。

代碼示例

最後,附上一些演示代碼,大家可自行體會下不同模塊的使用。

6.1 xlwings基本代碼

  1. import xlwings as xw
  2. #連接到excel
  3. workbook = xw.Book(r'path/myexcel.xlsx')#連接excel文件
  4. #連接到指定單元格
  5. data_range = workbook.sheets('Sheet1').range('A1')
  6. #寫入數據
  7. data_range.value = [1,2,3]
  8. #保存
  9. workbook.save()

6.2 xlsxwriter基本代碼

  1. import xlsxwriter as xw
  2. #新建excel
  3. workbook  = xw.Workbook('myexcel.xlsx')
  4. #新建工作薄
  5. worksheet = workbook.add_worksheet()
  6. #寫入數據
  7. worksheet.write('A1',1)
  8. #關閉保存
  9. workbook.close()

6.3 xlutils基本代碼import xlrd #讀取數據

  1. import xlwt #寫入數據
  2. import xlutils #操作excel
  3. #----xlrd庫
  4. #打開excel文件
  5. workbook = xlrd.open_workbook('myexcel.xls')
  6. #獲取表單
  7. worksheet = workbook.sheet_by_index(0)
  8. #讀取數據
  9. data = worksheet.cell_value(0,0)
  10. #----xlwt庫
  11. #新建excel
  12. wb = xlwt.Workbook()
  13. #添加工作薄
  14. sh = wb.add_sheet('Sheet1')
  15. #寫入數據
  16. sh.write(0,0,'data')
  17. #保存文件
  18. wb.save('myexcel.xls')
  19. #----xlutils庫
  20. #打開excel文件
  21. book = xlrd.open_workbook('myexcel.xls')
  22. #複製一份
  23. new_book = xlutils.copy(book)
  24. #拿到工作薄
  25. worksheet = new_book.getsheet(0)
  26. #寫入數據
  27. worksheet.write(0,0,'new data')
  28. #保存
  29. new_book.save()

6.4 win32com基本代碼

  1. import win32com.client as wc
  2. #啓動Excel應用
  3. excel_app = wc.Dispatch('Excel.Application')
  4. #連接excel
  5. workbook = excel_app.Workbooks.Open(r'e:/myexcel.xlsx' )
  6. #寫入數據
  7. workbook.Worksheets('Sheet1').Cells(1,1).Value = 'data'
  8. #關閉並保存
  9. workbook.SaveAs('newexcel.xlsx')
  10. excel_app.Application.Quit()

6.5 openpyxl基本代碼

  1. import openpyxl
  2. # 新建文件
  3. workbook = openpyxl.Workbook()
  4. # 寫入文件
  5. sheet = workbook.activesheet['A1']='data'
  6. # 保存文件
  7. workbook.save('test.xlsx')

6.6 DataNitro基本代碼

  1. #單一單元格賦值
  2. Cell('A1').value = 'data'
  3. #單元區域賦值
  4. CellRange('A1:B2').value = 'data'

openpyxl具體使用

1、 創建一個excel 文件,並寫入不同類的內容

  1. # -*- coding: utf-8 -*-
  2. from openpyxl import Workbook
  3. import datetime
  4. import time
  5. # 創建文件對象
  6. wb = Workbook()
  7. # 獲取第一個sheet
  8. ws = wb.active
  9. # 在第1行第A列,寫入數字23333
  10. ws['A1'] = 23333
  11. # 寫入中文(unicode中文也可以)
  12. ws['B1'] = "你好!"+"歡迎使用openpyxl"
  13. # 在下一行,寫入多個單元格
  14. ws.append([123])
  15. # 寫入一個當前時間
  16. ws['A2'] = datetime.datetime.now()
  17. # 寫入一個自定義的時間格式
  18. ws['A3'] = time.strftime('%Y{y}%m{m}%d{d}%H{h}%M{f}%S{s}', time.localtime()).format(y='年', m='月', d='日', h='時', f='分', s='秒')
  19. # 保存文件,注意文件覆蓋
  20. wb.save("test.xlsx")
  21. # 關閉流
  22. wb.close()

2、創建sheet

  1. from openpyxl import Workbook
  2. wb = Workbook()
  3. # 創建一個sheet
  4. ws1 = wb.create_sheet("sheet1")
  5. # 設定一個sheet的名字
  6. ws1.title = "sheet1 Title"
  7. # 設定sheet的插入位置 默認插在後面
  8. ws2 = wb.create_sheet("Mysheet"0)
  9. ws2.title = "Mysheet"
  10. # 設定sheet的標籤的背景顏色
  11. ws1.sheet_properties.tabColor = "1072BA"
  12. # 獲取某個sheet對象
  13. print(wb["sheet1 Title"])
  14. print(wb["Mysheet"])
  15. # 獲取全部sheet的名字,遍歷sheet名字
  16. print(wb.sheetnames)
  17. for i in wb.sheetnames:
  18.     print(i)
  19. print("*"*50)
  20. for sheet in wb:
  21.     print(sheet.title)
  22. # 將sheet1中的A1單元格賦值爲zeke
  23. wb["sheet1 Title" ]["A1"] = "zeke"
  24. # 複製一個sheet
  25. source = wb["sheet1 Title"]
  26. target = wb.copy_worksheet(source)
  27. wb.save("test2.xlsx")
  28. wb.close()

3、操作單元格

  1. # -*- coding: utf-8 -*-
  2. from openpyxl import Workbook
  3. wb = Workbook()
  4. # 創建一個sheet
  5. ws1 = wb.create_sheet("Sheet1")
  6. # 將A1單元格賦值爲123.11
  7. ws1["A1"] = 123.11
  8. # 將B2單元格賦值爲你好
  9. ws1["B2"] = "你好"
  10. # 將第4行第2列的單元賦值爲10
  11. temp = ws1.cell(row=4, column=2, value=10)
  12. print(ws1["A1"].value)
  13. print(ws1["B2"].value)
  14. print(temp.value)
  15. wb.save("test3.xlsx")
  16. wb.close()

4、操作已存在的文件

  1. # -*- coding: utf-8 -*-
  2. from openpyxl import Workbook
  3. from openpyxl import load_workbook
  4. # 打開test5.xlsx文件
  5. wb = load_workbook('test5.xlsx')
  6. # 猜測格式類型
  7. wb.guess_types = True
  8. ws = wb.active
  9. ws["A1"] = "12%"
  10. print(ws["A1"].value)
  11. # 注意如果原文件有一些圖片或者圖標,則保存的時候可能會導致圖片丟失
  12. wb.save("test5.xlsx")
  13. wb.close()

5、操作批量的單元格

  1. # -*- coding: utf-8 -*-
  2. from openpyxl import Workbook
  3. wb = Workbook()
  4. # 創建一個sheet
  5. ws1 = wb.create_sheet("Sheet")
  6. ws1["A1"] = 1
  7. ws1["A2"] = 2
  8. ws1["A3"] = 3
  9. ws1["B1"] = 4
  10. ws1["B2"] = 5
  11. ws1["B3"] = 6
  12. ws1["C1"] = 7
  13. ws1["C2"] = 8
  14. ws1["C3"] = 9
  15. # 操作單列
  16. print(ws1["A"])
  17. for cell in ws1["A"]:
  18.     print(cell.value)
  19. # 從A列到C列,獲取每一個值
  20. print(ws1["A:C"])
  21. for column in ws1["A:C"]:
  22.     for cell in column:
  23.         print(cell.value)
  24. # 從第1行到第3行,獲取每一個值
  25. row_range = ws1[1:3]
  26. print(row_range)
  27. for row in row_range:
  28.     for cell in row:
  29.         print(cell.value)
  30. print("*"*50)
  31. # 從第1行到第3行,從第1列到第3列
  32. for row in ws1.iter_rows(min_row=1, min_col=1, max_col=3, max_row=3):
  33.     for cell in row:
  34.         print(cell.value)
  35. # 獲取所有行
  36. print(ws1.rows)
  37. for row in ws1.rows:
  38.     print(row)
  39. print("*"*50)
  40. # 獲取所有列
  41. print(ws1.columns)
  42. for col in ws1.columns:
  43.     print(col)
  44. wb.save("test4.xlsx")
  45. wb.close()

6、獲取所有的行(列)對象:

  1. # coding=utf-8
  2. from openpyxl import Workbook
  3. from openpyxl import load_workbook
  4. # 打開test5.xlsx文件
  5. wb = load_workbook('test5.xlsx')
  6. ws = wb.active
  7. rows = []
  8. for row in ws.iter_rows():
  9.     rows.append(row)
  10. # 所有行
  11. print(rows)
  12. # 獲取第一行
  13. print(rows[0])
  14. # 獲取第一行第一列的單元格對象
  15. print(rows[0][0])
  16. # 獲取第一行第一列的單元格對象的值
  17. print(rows[0][0].value)
  18. # 獲取最後行 print rows[-1]
  19. print(rows[len(rows) - 1])
  20. # 獲取第後一行和最後一列的單元格對象
  21. print(rows[len(rows) - 1][len(rows[0]) - 1])
  22. # 獲取第後一行和最後一列的單元格對象的值
  23. print(rows[len(rows) - 1][len(rows[0]) - 1].value)
  24. cols = []
  25. for col in ws.iter_cols():
  26.     cols.append(col)
  27. # 所有列
  28. print(cols)
  29. # 獲取第一列
  30. print(cols[0])
  31. # 獲取第一列的第一行的單元格對象
  32. print(cols[0][0])
  33. # 獲取第一列的第一行的值
  34. print(cols[0][0].value)
  35. print("*" * 30)
  36. # 獲取最後一列
  37. print(cols[len(cols) - 1] )
  38. # 獲取最後一列的最後一行的單元格對象
  39. print(cols[len(cols) - 1][len(cols[0]) - 1])
  40. # 獲取最後一列的最後一行的單元格對象的值
  41. print(cols[len(cols) - 1][len(cols[0]) - 1].value)
  42. wb.close()

 

 

推薦閱讀(點擊即可跳轉閱讀)

 

1. SpringBoot內容聚合

2. 面試題內容聚合

3. 設計模式內容聚合

4. Mybatis內容聚合

5. 多線程內容聚合

Javaç¥é³å®æ¹å¬ä¼å·

原文鏈接:https://blog.csdn.net/weixin_38405253/article/details/100512061
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章