本文授權轉載自清風學Python
禁止二次轉載
大家好,我是老表
閱讀文本大概需要 10 分鐘
python操作excel的模塊簡直不要太多,
今天就為大家比較下各模塊之間的優(yōu)缺點。
xlutils & xlrd & xlwt
最原始的莫過于兩位老牌黃金搭檔xlrd xlwt了,針對二者的封裝有如下模塊:
模塊官網(wǎng)
xlutils
https://pypi.org/project/xlutils/
xlrd
https://pypi.org/project/xlrd/
xlwt
https://pypi.org/project/xlwt/
為什么把這三個一起說?
首先,xlutils封裝了xlrd xlwt,所以在使用前,會先下載這兩個依賴的模塊。
其次,這兩個模塊主要用于處理xls文件,而對xlsx的文件處理很挫,甚至xlwt不支持…
但為何到現(xiàn)在依然在使用這些模塊,因為他對xls文檔處理的優(yōu)勢….
win32com & DataNitro
模塊官網(wǎng)
win32comhttp://pythonexcels.com/python-excel-mini-cookbook/
DataNitrohttps://datanitro.com/
這兩個模塊又是怎么一回事兒?他倆僅支持windows系統(tǒng)環(huán)境
win32com這個模塊大家不算陌生了,windows下的操作,哪兒他都能插一腿…至于使用,就點擊鏈接自己看吧…
至于DataNitro,本來不想說的,但畢竟很多帖子都提到了它,我不寫不太好,但大家知道他是一個Excel 的插件,安裝也需單獨到官網(wǎng)下載即可….
pandas
模塊官網(wǎng)
pandashttps://www.pypandas.cn/
pandas作為數(shù)據(jù)分析利器,在處理excel方面也是犀利的一腿….
import pandas as pd
#方法一:默認讀取第一個表單
df=pd.read_excel('lemon.xlsx')#這個會直接默認讀取到這個Excel的第一個表單
data=df.head()#默認讀取前5行的數(shù)據(jù)
print('獲取到所有的值:\n{0}'.format(data))#格式化輸出
#方法二:通過指定表單名的方式來讀取
df=pd.read_excel('lemon.xlsx',sheet_name='student')#可以通過sheet_name來指定讀取的表單
data=df.head()#默認讀取前5行的數(shù)據(jù)
print('獲取到所有的值:\n{0}'.format(data))#格式化輸出
#方法三:通過表單索引來指定要訪問的表單,0表示第一個表單
#也可以采用表單名和索引的雙重方式來定位表單
#也可以同時定位多個表單,方式都羅列如下所示
df=pd.read_excel('lemon.xlsx',sheet_name=['python','student'])#可以通過表單名同時指定多個
# df=pd.read_excel('lemon.xlsx',sheet_name=0)#可以通過表單索引來指定讀取的表單
# df=pd.read_excel('lemon.xlsx',sheet_name=['python',1])#可以混合的方式來指定
# df=pd.read_excel('lemon.xlsx',sheet_name=[1,2])#可以通過索引 同時指定多個
data=df.values#獲取所有的數(shù)據(jù),注意這里不能用head()方法哦~
print('獲取到所有的值:\n{0}'.format(data))#格式化輸出
xlsxwriter
模塊官網(wǎng)
xlsxwriterhttps://xlsxwriter.readthedocs.io/
xlsxwriter擁有豐富的特性,支持圖片/表格/圖表/篩選/格式/公式等,功能與openpyxl相似,優(yōu)點是相比 openpyxl 還支持 VBA 文件導入,迷你圖等功能,缺點是不能打開/修改已有文件,意味著使用 xlsxwriter 需要從零開始。
代碼示例:
import xlsxwriter
# Create a workbook and add a worksheet.
workbook = xlsxwriter.Workbook('Expenses01.xlsx')
worksheet = workbook.add_worksheet()
# Some data we want to write to the worksheet.
expenses = (
['Rent', 1000],
['Gas', 100],
['Food', 300],
['Gym', 50],
)
# Start from the first cell. Rows and columns are zero indexed.
row = 0
col = 0
# Iterate over the data and write it out row by row.
for item, cost in (expenses):
worksheet.write(row, col, item)
worksheet.write(row, col + 1, cost)
row += 1
# Write a total using a formula.
worksheet.write(row, 0, 'Total')
worksheet.write(row, 1, '=SUM(B1:B4)')
workbook.close()
xlwings
模塊官網(wǎng)
xlwingshttp://docs.xlwings.org/en/stable/
xlwings簡單強大,使用方便。而且搞笑的是,這是為數(shù)不多的模塊開發(fā)者,在平臺賣課的,哈哈….
image.pngimport xlwings as xw
#連接到excel
workbook = xw.Book(r'path/myexcel.xlsx')#連接excel文件
#連接到指定單元格
data_range = workbook.sheets('Sheet1').range('A1')
#寫入數(shù)據(jù)
data_range.value = [1,2,3]
#保存
workbook.save()
openpyxl
模塊官網(wǎng)
openpyxlhttps://openpyxl.readthedocs.io/en/latest/
最后要說說個人比較常用,也很方便的一個excel處理模塊openpyxl….這個模塊突出的優(yōu)勢在于,對excel單元格樣式的設置方面特別詳細。所以針對openpyxl,詳細的介紹一下.
寫一個工作簿
>>> from openpyxl import Workbook
>>> from openpyxl.utils import get_column_letter
>>>
>>> wb = Workbook()
>>>
>>> dest_filename = 'empty_book.xlsx'
>>>
>>> ws1 = wb.active
>>> ws1.title = 'range names'
>>>
>>> for row in range(1, 40):
... ws1.append(range(600))
>>>
>>> ws2 = wb.create_sheet(title='Pi')
>>>
>>> ws2['F5'] = 3.14
>>>
>>> ws3 = wb.create_sheet(title='Data')
>>> for row in range(10, 20):
... for col in range(27, 54):
... _ = ws3.cell(column=col, row=row, value='{0}'.format(get_column_letter(col)))
>>> print(ws3['AA10'].value)
AA
>>> wb.save(filename = dest_filename)
讀取現(xiàn)有工作簿
>>> from openpyxl import load_workbook
>>> wb = load_workbook(filename = 'empty_book.xlsx')
>>> sheet_ranges = wb['range names']
>>> print(sheet_ranges['D18'].value)
3
插入圖像 (需要依賴pillow..)
>>> from openpyxl import Workbook
>>> from openpyxl.drawing.image import Image
>>>
>>> wb = Workbook()
>>> ws = wb.active
>>> ws['A1'] = 'You should see three logos below'
>>> # create an image
>>> img = Image('logo.png')
>>> # add to worksheet and anchor next to cells
>>> ws.add_image(img, 'A1')
>>> wb.save('logo.xlsx')
使用樣式
樣式用于在屏幕上顯示時更改數(shù)據(jù)的外觀。它們還用于確定數(shù)字的格式。
樣式可以應用于以下方面:
字體設置字體大小,顏色,下劃線等
填充以設置圖案或顏色漸變
邊框設置單元格上的邊框
單元格排列
保護
以下是默認值
>>> from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font
>>> font = Font(name='Calibri',
... size=11,
... bold=False,
... italic=False,
... vertAlign=None,
... underline='none',
... strike=False,
... color='FF000000')
>>> fill = PatternFill(fill_type=None,
... start_color='FFFFFFFF',
... end_color='FF000000')
>>> border = Border(left=Side(border_style=None,
... color='FF000000'),
... right=Side(border_style=None,
... color='FF000000'),
... top=Side(border_style=None,
... color='FF000000'),
... bottom=Side(border_style=None,
... color='FF000000'),
... diagonal=Side(border_style=None,
... color='FF000000'),
... diagonal_direction=0,
... outline=Side(border_style=None,
... color='FF000000'),
... vertical=Side(border_style=None,
... color='FF000000'),
... horizontal=Side(border_style=None,
... color='FF000000')
... )
>>> alignment=Alignment(horizontal='general',
... vertical='bottom',
... text_rotation=0,
... wrap_text=False,
... shrink_to_fit=False,
... indent=0)
>>> number_format = 'General'
>>> protection = Protection(locked=True,
... hidden=False)
>>>