在前面抓取高考分?jǐn)?shù)線的文章中,我們用到了 openpyxl
模塊來存儲(chǔ)數(shù)據(jù)到 Excel,今天帶大家學(xué)習(xí)一下該模塊的詳細(xì)使用。
根據(jù)官方文檔,openpyxl 是一個(gè)用來處理 xlsx/xlsm/xltx/xltm 格式 Excel 文件的 Python 代碼庫,同時(shí)支持 Pandas 和 NumPy 等包,能夠繪制圖表,并且同樣支持格式控制等,詳細(xì)文檔可以參考: https://openpyxl.readthedocs.io/。
openpyxl 用起來非常簡單,對照文檔就可以解決一些基本需求,比如常見的都寫操作。
現(xiàn)在還有很多人在用 Excel 2003 版本,即 xls 格式,那么
xls
和xlsx
有什么區(qū)別呢?xls 是一個(gè)特有的二進(jìn)制格式,其核心結(jié)構(gòu)是復(fù)合文檔類型的結(jié)構(gòu),而 xlsx 的核心結(jié)構(gòu)是 XML 類型的結(jié)構(gòu),采用的是基于 XML 的壓縮方式,使其占用的空間更小。xlsx 中最后一個(gè) x 的意義就在于此。
在 openpyxl 中,主要用到三個(gè)概念:Workbook,Sheet,Cell:
Workbook
:就是一個(gè) excel 工作簿,其中包含多個(gè) sheet;Sheet
:工作簿中的一張表頁;Cell
:就是簡單的一個(gè)單元格,用來存儲(chǔ)數(shù)據(jù)對象;openpyxl 的主要操作就是圍繞著這三個(gè)概念進(jìn)行的,無怪乎:打開 Workbook,定位 Sheet,操作 Cell。下面就分別介紹 openpyxl 幾個(gè)常見的方法。
openpyxl 的安裝很簡單,使用 pip 直接安裝即可。
pip install openpyxl
提前新建一個(gè)測試 Excel:
>>> import openpyxl
>>> wb = openpyxl.load_workbook("test.xlsx")
openpyxl.load_workbook() 函數(shù)接受文件名,返回一個(gè) Workbook 數(shù)據(jù)類型的值。這個(gè) Workbook 對象代表這個(gè) Excel 文件,有點(diǎn)類似 File 對象代表一個(gè)打開的文本文件。
>>> wb = openpyxl.load_workbook("test.xlsx", read_only=True)
在對 Workbook 進(jìn)行了相關(guān)操作后,可以調(diào)用 save(filename)
方法進(jìn)行保存。
另外,在只讀模式下保存時(shí),會(huì)報(bào) Workbook is read-only
異常。
>>> wb.save('test.xlsx')
Traceback (most recent call last):
File "", line 1, in
File "/usr/local/lib/python3.5/dist-packages/openpyxl/workbook/workbook.py", line 363, in save
raise TypeError("""Workbook is read-only""")
TypeError: Workbook is read-only
返回一個(gè) sheet 的 list。
>>> sheet = wb.worksheets
>>> wb.sheetnames
['各專業(yè)歷年錄取分?jǐn)?shù)線', '測試頁']
# 根據(jù)名稱讀取
>>> sheet = wb['測試頁']
# 通過索引 index 讀取
>>> sheet = wb.worksheets[1]
>>> sheet = wb.active
>>> sheet.title
'測試頁'
# 大列數(shù)
>>> sheet.max_column
4
# 大行數(shù)
>>> sheet.max_row
13
>>> wb.create_sheet('test2')
>>> wb.sheetnames
['各專業(yè)歷年錄取分?jǐn)?shù)線', '測試頁', 'test2']
# 在指定索引處新建
>>> sheet = wb.create_sheet('test2',1)
>>> wb.sheetnames
['各專業(yè)歷年錄取分?jǐn)?shù)線', 'test21', 'test2', '測試頁']
若 sheet 頁重名,會(huì)自動(dòng)進(jìn)行重命名。
>>> sheet = wb['test2']
>>> sheet.title = 'test3'
>>> wb.sheetnames
['各專業(yè)歷年錄取分?jǐn)?shù)線', '測試頁', 'test3']
要先獲取到 sheet 頁才能刪除,不能直接用 sheet 頁的名稱刪除
>>> sheet = wb['test3']
>>> wb.remove(sheet)
>>> wb.sheetnames
['各專業(yè)歷年錄取分?jǐn)?shù)線', '測試頁']
# 也可以使用 del 進(jìn)行刪除
>>> del wb['test2']
# 獲取第 1 行
>>> sheet[1]
(, , , )
# 獲取第 1 列
>>> sheet['A']
(, , , , , , , , , , , , ) | | | | | | | | | | | | | | | |
>>> sheet[2:3]
((, , , ), (<
Cell '測試頁'.A3>, , , ))
>>> sheet['A:B']
((, , , , , , , , , , , , ), (, , , , , , , , , , ,
, )) | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
返回的是一個(gè) Generator 對象,它包含該區(qū)域中的 Cell 對象。里面是每一行(列)的數(shù)據(jù),每一行(列)又由一個(gè) tuple 包裹。
>>> rows = sheet.rows
>>> rows
>>> columns = sheet.columns
>>> for row in sheet.rows:
... for cell in row:
... print(cell.value)
因?yàn)?sheet.rows 是生成器類型,不能直接使用索引,需要先轉(zhuǎn)換成 list 之后才行,如 list(sheet.rows)2 這樣就獲取到第三行的 tuple 對象。
>>> sheet.append(row)
>>> row = [1,2,3,4,5,6]
>>> cell = sheet['B2']
>>> cell = sheet.cell(2,1)
需要注意的是:openpyxl 中 row 和 column 為了和 Excel 中的表達(dá)方式一致,并不和編程語言的習(xí)慣以 0 表示第一個(gè)值,而是 1 開始。
# 所在列
>>> cell.column
'A'
# 所在行
>>> cell.row
2
# 所屬坐標(biāo)
>>> cell.coordinate
'A2'
# 對應(yīng)的值
>>> cell.value
'A2'
# 直接給單元格賦值
>>> cell.value = 'test'
# 這里可以不寫 value?
>>> sheet['A1'] = 'kk'
>>> sheet.cell(1,1).value = 'ff'
# 寫入和值
>>> sheet['A14'] = "=SUM(B14:D14)"
>>> sheet['A14'].value
'=SUM(B14:D14)'
# 寫入平均值
>>> sheet['A14'] = "=AVERAGE(B14:D14)"
>>> sheet['A14'].value
'=AVERAGE(B14:D14)'
這里可發(fā)現(xiàn),在讀取的時(shí)候,返回的是公式本身
'=AVERAGE(B14:D14)'
,而不是計(jì)算結(jié)果。若要返回計(jì)算結(jié)果,只有手動(dòng)打開 test.xlsx 文件,然后點(diǎn)擊保存更改。
>>> sheet.merge_cells('A1:A3')
>>> sheet.merge_cells('B1:D2')
如果這些要合并的單元格都有數(shù)據(jù),只會(huì)保留左上角的數(shù)據(jù),其他則丟棄。
分解類似:
>>> sheet.unmerge_cells('A1:A3')
>>> sheet.unmerge_cells('B1:D2')
from openpyxl.styles import Font, colors, Alignment
# 設(shè)置字體: 等線 24 號(hào)加粗斜體,字體顏色紅色
bold_itatic_24_font = Font(name="等線", size=24, italic=True, color=colors.RED, bold=True)
sheet["B1"].font = bold_itatic_24_font
# 對齊方式: B1 中的數(shù)據(jù)垂直居中和水平居中
sheet["C1"].alignment = Alignment(horizontal="center", vertical="center")
# 設(shè)置行高和列寬
sheet.row_dimensions[2].height = 40
sheet.column_dimensions["C"].width = 30
設(shè)置后的效果:
openpyxl 模塊的使用就到這里,完整使用示例可以參考我的上篇:Python 助你填寫高考志愿。
其實(shí)還有很多高級(jí)用法,但個(gè)人覺得用的較少,有興趣的可以參考官網(wǎng):https://openpyxl.readthedocs.io/en/stable/
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。