為了帶大家了解各個(gè)庫的異同,從而在不同場景下可以靈活使用,本文將橫向比較7個(gè)可以操作 Excel 文件的常用模塊,在比較各模塊常用操作的同時(shí)進(jìn)行鞏固學(xué)習(xí)!
首先讓我們來整體把握下不同庫的特點(diǎn)
“”
xlrd
、xlwt
、xlutils
各自的功能都有局限性,但三者互為補(bǔ)充,覆蓋了Excel文件尤其是.xls
文件的操作。xlwt
可以生成.xls
文件,xlrd
可以讀取已經(jīng)存在的.xls
文件,xlutils
連接xlrd
和xlwt
兩個(gè)模塊,使用戶可以同時(shí)讀寫一個(gè).xls
文件。簡單來說,xlrd
負(fù)責(zé)讀、xlwt
負(fù)責(zé)寫、xlutils
負(fù)責(zé)提供輔助和銜接xlwings
能夠非常方便的讀寫 Excel 文件中的數(shù)據(jù),并且能夠進(jìn)行單元格格式的修改XlsxWriter
是一個(gè)用來寫.xlsx
文件格式的模塊。它可以用來寫文本、數(shù)字、公式并支持單元格格式化、圖片、圖表、文檔配置、自動(dòng)過濾等特性。但不能用來讀取和修改 Excel 文件openpyxl
通過 工作簿 “workbook - 工作表 sheet - 單元格 cell” 的模式對(duì).xlsx
文件進(jìn)行讀、寫、改,并且可以調(diào)整樣式pandas
大家都不陌生,是進(jìn)行數(shù)據(jù)處理和分析的強(qiáng)大模塊,有時(shí)也可以用來自動(dòng)化處理Excel
如果你懶得看詳細(xì)的對(duì)比過程,可以直接看最后的總結(jié)圖,然后拉到文末收藏點(diǎn)贊就算學(xué)會(huì)了
7個(gè)模塊均為非標(biāo)準(zhǔn)庫,因此都需要在命令行中 pip
進(jìn)行安裝:
pip install xlrd
pip install xlwt
pip install xlutils
pip install xlwings
pip install XlsxWriter
pip install openpyxl
pip install pandas
多數(shù)模塊可以直接通過名字導(dǎo)入,有些模塊約定俗稱會(huì)使用縮寫:
import xlrd
import xlwt
import xlwings as xw
import xlsxwriter
import openpyxl
import pandas as pd
xlutils
模塊是 xlrd
和 xlwt
之間的橋梁,最核心的作用是拷貝一份通過 xlrd
讀取到內(nèi)存中的 .xls
對(duì)象,然后再拷貝對(duì)象上通過 xlwt
修改 .xls
表格的內(nèi)容。xlutils
可以將 xlrd
的 Book 對(duì)象復(fù)制轉(zhuǎn)換為 xlwt
的Workbook 對(duì)象,具體使用時(shí)通常導(dǎo)入的是模塊中的 copy
子模塊:
import xlutils.copy
并不是所有7個(gè)模塊都可以讀取 Excel 文件,而即使能讀取Excel文件也要分不同后綴名進(jìn)行討論,具體如下:
“”
xlwt
、xlutils
、XlsxWriter
不能讀取文件xlrd
可以讀取.xls
和.xlsx
文件xlwings
可以讀取.xls
和.xlsx
文件openpyxl
可以讀取.xlsx
文件pandas
可以讀取.xls
和.xlsx
文件
下面使用兩個(gè)大小均為 10MB 的 .xls
和 .xlsx
文件進(jìn)行測試:
xls_path = r'C:\xxx\Desktop\test.xls'
xlsx_path = r'C:\xxx\Desktop\test.xlsx'
xlrd
讀取文件xlrd
可以讀取 .xls
和 .xlsx
文件
xls = xlrd.open_workbook(xls_path)
xlsx = xlrd.open_workbook(xlsx_path)
xlwings
讀取文件xlwings
直接對(duì)接的是 apps,也就是 Excel 應(yīng)用程序,然后才是工作簿 books 和工作表 sheets,xlwings
需要安裝有 Excel 應(yīng)用程序的環(huán)境xlwings
可以讀取 .xls
和 .xlsx
文件
app = xw.App(visible=True, add_book=False) # 程序可見,只打開不新建工作薄
app.display_alerts = False # 警告關(guān)閉
app.screen_updating = False # 屏幕更新關(guān)閉
# wb = app.books.open(xls_path)
wb = app.books.open(xlsx_path)
wb.save() # 保存文件
wb.close() # 關(guān)閉文件
app.quit() # 關(guān)閉程序
openpyxl
讀取文件openpyxl
可以讀取 .xlsx
文件
wb = openpyxl.load_workbook(xlsx_path)
如果讀取 .xls
文件會(huì)報(bào)錯(cuò):
wb = openpyxl.load_workbook(xls_path)
openpyxl.utils.exceptions.InvalidFileException: openpyxl does not support the old .xls file format, please use xlrd to read this file, or convert it to the more recent .xlsx file format.
pandas
讀取文件pandas
可以讀取 .xls
和 .xlsx
文件
xls = pd.read_excel(xls_path, sheet_name='Sheet1')
xlsx = pd.read_excel(xlsx_path, sheet_name='Sheet1')
接下來比較四個(gè)模塊在同一配置電腦下讀取 10MB .xlsx
文件的時(shí)間(運(yùn)行3次求平均值),所用代碼為:
import time
import xxx
time_start = time.time()
xxx
time_end = time.time()
print('time cost: ', time_end-time_start, 's')
最后測試的結(jié)果是,xlwings
讀取 10MB 文件最快,xlrd
次之,openpyxl
最慢(因電腦而異,結(jié)果僅供參考)
讀入 Excel 文件部分的表格總結(jié)如下:
針對(duì)上述4個(gè)可以讀取 Excel 文件的模塊,進(jìn)一步討論其獲取工作表 sheet 的方式
xlrd
獲取工作表可以通過 sheet 名查找:
sheet = xlsx.sheet_by_name('Sheet1')
也可通過索引查找:
sheet = xlsx.sheet_by_index(0)
xlwings
獲取工作表xlwings
的工作表分為活動(dòng)工作表以及指定工作簿下的特定工作表:
sheet = xw.sheets.active # 在活動(dòng)工作簿
sheet = wb.sheets.active # 在特定工作簿
openpyxl
獲取工作表.active
方法默認(rèn)獲取工作簿的第一張工作表
sheet = wb.active
另外也可以通過工作表名指定獲取工作表:
sheet = wb['Sheet1']
pandas
獲取工作表單獨(dú)獲取工作表完全沒有 pandas
什么事情,因?yàn)樽x取文件的同時(shí)已經(jīng)且必須指定工作表才能讀?。?/p>
xlsx = pd.read_excel(xlsx_path, sheet_name='Sheet1')
簡單總結(jié)創(chuàng)建 Excel 文件的情況:
“”
xlrd
、xlutils
不能創(chuàng)建 Excel 文件xlwt
只能創(chuàng)建.xls
文件,不能創(chuàng)建.xlsx
文件xlwings
可以創(chuàng)建.xls
和.xlsx
文件XlsxWriter
可以創(chuàng)建.xlsx
文件openpyxl
可以創(chuàng)建.xls
和.xlsx
文件pandas
沒有創(chuàng)建 Excel 的概念,但可以存儲(chǔ)時(shí)產(chǎn)生.xls
或.xlsx
文件
xlwt
創(chuàng)建文件xlwt
只能創(chuàng)建 .xls
文件,不能創(chuàng)建 .xlsx
文件
xls = xlwt.Workbook(encoding= 'ascii')
# 創(chuàng)建新的sheet表
worksheet = xls.add_sheet('Sheet1')
xlwings
創(chuàng)建文件xlwings
可以創(chuàng)建 .xls
和 .xlsx
文件,只需要最后保存時(shí)寫清楚后綴即可。使用如下命令:
wb = app.books.add()
無論是新建還是打開都需要保存工作簿、關(guān)閉工作簿、關(guān)閉程序,即:
wb.save(path + r'\new_practice.xlsx')
wb.close()
app.quit()
XlsxWriter
創(chuàng)建文件XlsxWriter
可以創(chuàng)建 .xlsx
文件:
xlsx = xlsxwriter.Workbook()
# 添加工作表
sheet = xlsx .add_worksheet('Sheet1')
openpyxl
創(chuàng)建文件openpyxl
可以創(chuàng)建 .xls
和 .xlsx
文件,只需要最后保存時(shí)寫清楚后綴即可。使用如下命令:
wb = Workbook()
# 新工作簿中指定即創(chuàng)建工作表
sheet = wb.active
pandas
創(chuàng)建文件pandas
只需要最后轉(zhuǎn)存時(shí)寫清楚后綴即可。實(shí)際上比較抽象,pandas
并不需要一開始先創(chuàng)建一個(gè) Excel 文件,可以圍繞數(shù)據(jù)框做各式操作后用 .to_excel
命令再用 .xls
或者 .xlsx
做文件后綴。如果一定要產(chǎn)生一個(gè)空白 Excel 文件可以用如下命令:
df = pd.DataFrame([])
df.to_excel(r'C:\xxx\test1.xlsx')
簡單總結(jié)保存 Excel 文件的情況:
“”
xlrd
不能保存 Excel 文件xlwt
可以保存.xls
文件xlutils
可以將xlrd
對(duì)象復(fù)制為xlwt
對(duì)象后保存.xls
文件xlwings
可以保存.xls
和.xlsx
文件XlsxWriter
可以保存.xlsx
文件openpyxl
可以保存.xlsx
文件pandas
可以保存.xls
或.xlsx
文件
xlwt
保存文件xlwt
可以保存 .xls
文件
# xls = xlwt.Workbook(encoding= 'ascii')
# worksheet = xls.add_sheet('Sheet1')
xls.save('new_table.xls')
xlutils
保存文件xlutils
可以將 xlrd
對(duì)象復(fù)制為 xlwt
對(duì)象后保存 .xls
文件
# xls_path = r'C:\xxxx\test.xls'
# xls = xlrd.open_workbook(xls_path)
xls_xlutils = xlutils.copy.copy(xls)
xls_xlutils.save('new_text.xls')
xlwings
保存文件xlwings
可以保存 .xls
和 .xlsx
文件
# wb = app.books.open(xls_path)
wb = app.books.open(xlsx_path)
wb.save() # 保存文件
wb.close() # 關(guān)閉文件
app.quit() # 關(guān)閉程序
XlsxWriter
保存文件XlsxWriter
可以保存 .xlsx
文件,.close
命令執(zhí)行后文件關(guān)閉的同時(shí)保存:
# xlsx = xlsxwriter.Workbook()
# sheet = xlsx .add_worksheet('Sheet1')
xlsx.close()
openoyxl
保存文件openpyxl
可以保存 .xlsx
文件
# wb = openpyxl.load_workbook(xlsx_path)
# wb = Workbook()
# sheet = wb.active
wb.save('new_test.xlsx')
pandas
保存文件pandas
可以保存 .xls
或 .xlsx
文件
df1 = pd.DataFrame([1, 2, 3])
df2 = pd.DataFrame([1, 2, 4])
df1.to_excel(r'C:\xxxx\test1.xls')
df2.to_excel(r'C:\xxxx\test2.xlsx')
獲取單元格的值基本前提是能夠讀取文件,因此基本圍繞 xlrd
、xlwings
、openpyxl
、pandas
介紹。xlutils
由于能夠復(fù)制一份 .xls
因此也可以使用和 xlrd
完全一樣的讀取單元格方法。
xlrd
/xlutils
獲取單元格xlutils
因?yàn)槭侵苯涌截愐环?xlrd
適用的對(duì)象,讀取單元格使用的方法和 xlrd
完全一樣。xlwt
沒有讀取單元格的能力
# xls = xlrd.open_workbook(xls_path)
# sheet = xlsx.sheet_by_name('Sheet1')
value = sheet.cell_value(4, 6) # 第5行第7列的單元格
print(value)
rows = table.row_values(4)
cols = table.col_values(6)
for cell in rows:
print(cell)
xlwings
獲取單元格# app = xw.App(visible=True, add_book=False)
# app.display_alerts = False
# app.screen_updating = False
# wb = app.books.open(xls_path)
# sheet = wb.sheets.active
# 獲取單個(gè)單元格的值
A1 = sheet.range('A1').value
print(A1)
# 獲取橫向或縱向多個(gè)單元格的值,返回列表
A1_A3 = sheet.range('A1:A3').value
print(A1_A3)
# 獲取給定范圍內(nèi)多個(gè)單元格的值,返回嵌套列表,按行為列表
A1_C4 = sheet.range('A1:C4').value
print(A1_C4)
# 獲取單個(gè)單元格的值
A1 = sheet.range('A1').value
print(A1)
# 獲取橫向或縱向多個(gè)單元格的值,返回列表
A1_A3 = sheet.range('A1:A3').value
print(A1_A3)
# 獲取給定范圍內(nèi)多個(gè)單元格的值,返回嵌套列表,按行為列表
A1_C4 = sheet.range('A1:C4').value
print(A1_C4)
openpyxl
獲取單元格# wb = openpyxl.load_workbook(xlsx_path)
# wb = Workbook()
# sheet = wb.active
# 一、指定坐標(biāo)范圍的值
cells = sheet['A1:B5']
# 二、指定列的值
cells = sheet['A']
cells = sheet['A:C']
# 三、指定行的值
cells = sheet[5]
cells = sheet[5:7]
# 獲取單元格的值
for cell in cells:
print(cell.value)
pandas
獲取單元格的值pandas
讀取 Excel 文件后即將它轉(zhuǎn)換為數(shù)據(jù)框?qū)ο?,解析?nèi)容的方法基本是 pandas
體系中的知識(shí)點(diǎn),如 .iloc()
.loc()
.ix()
等:
print(df1.iloc[0:1, [1]])
print(df1.loc['b'])
print(df2.ix['a', 'a']) # 有些版本取消了ix,可以用iat
還是先簡單總結(jié)對(duì) Excel 文件寫入數(shù)據(jù)的情況:
“”
xlrd
不能寫入數(shù)據(jù)xlwt
可以寫入數(shù)據(jù)xlutils
可以借用xlwt
方法寫入數(shù)據(jù)xlwings
可以寫入數(shù)據(jù)XlsxWriter
可以寫入數(shù)據(jù)openpyxl
可以寫入數(shù)據(jù)pandas
將 Excel 文件讀取為數(shù)據(jù)框后,是抽象出數(shù)據(jù)框?qū)用孢M(jìn)行操作,沒有了對(duì) Excel 進(jìn)行單元格寫入和修改的概念
xlwt
/xlutils
寫入數(shù)據(jù)# xls = xlrd.open_workbook(xls_path)
# xls_xlutils = xlutils.copy.copy(xls)
# sheet = xls_xlutils.sheet_by_name('Sheet1')
# value = sheet.cell_value(4, 6)
# print(value)
sheet.write(4, 6, '新內(nèi)容')
xlwings
寫入數(shù)據(jù)# app = xw.App(visible=True, add_book=False)
# app.display_alerts = False
# app.screen_updating = False
# wb = app.books.open(xls_path)
# sheet = wb.sheets.active
# 寫入 1 個(gè)單元格
sheet.range('A2').value = '大明'
# 一行或一列寫入多個(gè)單元格
# 橫向?qū)懭階1:C1
sheet.range('A1').value = [1,2,3]
# 縱向?qū)懭階1:A3
sheet.range('A1').options(transpose=True).value = [1,2,3]
# 寫入范圍內(nèi)多個(gè)單元格
sheet.range('A1').options(expand='table').value = [[1,2,3], [4,5,6]]
XlsxWriter
寫入數(shù)據(jù)代碼中的 new_format
是之前預(yù)設(shè)好的樣式,下文會(huì)進(jìn)行介紹
# xlsx = xlsxwriter.Workbook()
# sheet = xlsx .add_worksheet('Sheet1')
# 一、寫入單個(gè)單元格
sheet.write(row, col, data, new_format)
# A1:從A1單元格開始插入數(shù)據(jù),按行插入
sheet.write_row('A1', data, new_format)
# A1:從A1單元格開始插入數(shù)據(jù),按列插入
sheet.write_column('A1', data, new_format)
openpyxl
寫入數(shù)據(jù)# wb = openpyxl.load_workbook(xlsx_path)
# wb = Workbook()
# sheet = wb.active
# 一、寫入單元格
cell = sheet['A1']
cell.value = '業(yè)務(wù)需求'
# 二、寫入一行或多行數(shù)據(jù)
data1 = [1, 2, 3]
sheet.append(data1)
data2 = [[1, 2, 3], [4, 5, 6]]
sheet.append(data2)
依舊簡單總結(jié)對(duì) Excel 文件樣式調(diào)整的情況:
“”
xlrd
、xlutils
不能調(diào)整樣式(也可以說xlutils
可以,只不過是借用了xlwt
的方法)xlwt
可以調(diào)整樣式xlwings
可以調(diào)整樣式XlsxWriter
可以調(diào)整樣式openpyxl
可以調(diào)整樣式pandas
不能調(diào)整樣式
xlwt
調(diào)整樣式xlwt
支持調(diào)整字體、邊框、顏色等樣式
# 字體部分
# 初始化樣式
style1 = xlwt.XFStyle()
# 為樣式創(chuàng)建字體
font = xlwt.Font()
font.name = 'Times New Roman' #字體
font.bold = True #加粗
font.underline = True #下劃線
font.italic = True #斜體
# 設(shè)置樣式
style1.font = font
# 使用樣式
sheet.write(4, 6, '新內(nèi)容1', style1)
# 邊框部分
borders = xlwt.Borders()
# 設(shè)置線型
borders.left = xlwt.Borders.DASHED
borders.right = xlwt.Borders.DASHED
borders.top = xlwt.Borders.DASHED
borders.bottom = xlwt.Borders.DASHED
# 設(shè)置樣色
borders.left_colour = 0x40
borders.right_colour = 0x40
borders.top_colour = 0x40
borders.bottom_colour = 0x40
#
style2 = xlwt.XFStyle()
style2.borders = borders
# 使用樣式
sheet.write(5, 8, '新內(nèi)容2', style2)
xlwings
調(diào)整樣式簡單介紹 xlwings
對(duì)顏色的調(diào)整:
# 獲取顏色
print(sheet.range('C1').color)
# 設(shè)置顏色
sheet.range('C1').color = (255, 0, 120)
# 清除顏色
sheet.range('C1').color = None
XlsxWriter
包含大量功能,可以創(chuàng)建工作表后對(duì)工作表進(jìn)行高定自定義的樣式修改:
new_format = xlsx.add_format({
'bold': True, # 字體加粗
'border': 1, # 單元格邊框?qū)挾?br> 'align': 'left', # 水平對(duì)齊方式
'valign': 'vcenter', # 垂直對(duì)齊方式
'fg_color': '#F4B084', # 單元格背景顏色
'text_wrap': True # 是否自動(dòng)換行
})
sheet.write(row, col, data, new_format)
openpyxl
樣式主要包括字體、邊框、段落對(duì)齊樣式等
# 字體樣式
from openpyxl.styles import Font
cell = sheet['A1']
font = Font(name='Arial', size=12, bold=True, italic=True, color='FF0000')
cell.font = font
# 段落對(duì)齊
from openpyxl.styles import Alignment
cell = sheet['B2']
alignment = Alignment(horizontal='center', vertical='center', text_rotation=45, wrap_text=True)
cell.alignment = alignment
# 邊框樣式
from openpyxl.styles import Side, Border
cell = sheet['B2']
side1 = Side(style='thin', color='FF0000')
side2 = Side(style='dashed')
border = Border(left=side1, right=side1, top=side2, bottom=side2)
cell.border = border
簡單總結(jié)對(duì) Excel 文件插入圖片的情況:
“”
xlrd
、xlutils
不能調(diào)整樣式(也可以說xlutils
可以,只不過是借用了xlwt
的方法)xlwt
可以插入.bmp
圖片xlwings
可以插入 圖片XlsxWriter
可以插入圖片openpyxl
可以插入圖片pandas
不能插入圖片
xlwt
插入圖片xlwt
插入圖片要求圖片格式必須是 .bmp
格式才能插入成功
sheet.insert_bitmap('test.bmp', 2, 3, 2, 2, 0.5, 0.5)
insert_bitmap(img, x, y, x1, y1, scale_x, scale_y)
img
表示要插入的圖像地址,x
表示行,y
表示列x1 y1
表示相對(duì)原來位置向下向右偏移的像素scale_x scale_y
表示相對(duì)原圖寬高的比例,圖片可放大縮小
xlwings
插入圖片下面是用xlwings
插入圖片的代碼,可以指定位置
sheet.pictures.add(r'C:\\xxx.jpg')
# 也可以給定位置插入
sheet.pictures.add(r'C:\\xxx.jpg', left=sheet.range('A2').left, top=sheet.range('A2').top, width=100, height=100)
第一個(gè)參數(shù)是插入的起始單元格,第二個(gè)參數(shù)是圖片文件的絕對(duì)路徑
sheet.insert_image('A1', r'C:\\xxx.jpg')
openpyxl
也可以給Excel中插入指定圖片并修改大小
from openpyxl.drawing.image import Image
img = Image('test.jpg')
newsize = (180, 360)
img.width, img.height = newsize # 設(shè)置圖片的寬和高
sheet.add_image(img, 'A2') # 往A2單元格插入圖片
以上就是根據(jù)不同 Python 模塊,對(duì)常見的 Excel 操作進(jìn)行對(duì)比的全部內(nèi)容,最終結(jié)果匯總?cè)缦卤硭?/p>
請(qǐng)注意,本文目的并不是要評(píng)出一個(gè)最好的庫,僅是從不同角度對(duì)不同庫進(jìn)行對(duì)比,希望能夠讓大家了解各個(gè)庫所擅長的工作。比如pandas
雖然處理方便,但是不能添加圖片修改樣式,openpyxl
雖然各種操作都支持,但是速度又相對(duì)慢一點(diǎn)等。
只有充分了解不同工具的特點(diǎn),才能夠在不同的場景下靈活運(yùn)用不同的方法來高效解決問題!如果喜歡本文的話,希望你可以給本文點(diǎn)個(gè)贊!
聯(lián)系客服