Python實(shí)現(xiàn)讀取、修改和計(jì)算 Excel 公式的示例詳解
Excel 公式在計(jì)算、數(shù)據(jù)統(tǒng)計(jì)和自動(dòng)化處理時(shí)非常重要。如果在操作 Excel 文件時(shí),能用程序來(lái)讀取、修改和計(jì)算公式,不僅能節(jié)省大量時(shí)間,還能保證計(jì)算結(jié)果準(zhǔn)確,避免人工操作帶來(lái)的錯(cuò)誤。
這篇文章將詳細(xì)介紹如何使用 Python 處理 Excel 公式:從創(chuàng)建帶公式的Excel文件、到讀取已有公式,再到修改公式并計(jì)算結(jié)果,幫助你全面掌握 Excel 與 Python 的結(jié)合應(yīng)用。
處理 Excel 公式的 Python 庫(kù)
要在 Python 中操作 Excel 公式,需要一個(gè)能夠完整處理公式讀寫(xiě)和計(jì)算的庫(kù)。雖然 openpyxl 等開(kāi)源庫(kù)可以完成基礎(chǔ)的公式寫(xiě)入和讀取,但其對(duì)復(fù)雜函數(shù)的支持有限,且無(wú)法在 Python 內(nèi)部直接計(jì)算公式結(jié)果。
這篇文章將使用 Free Spire.XLS for Python 庫(kù)演示如何以編程方式處理Excel公式。它是一個(gè)免費(fèi)的 Python Excel 庫(kù),支持包括 .xls、.xlsx、.xlsm, .xlsb, .ods, .et 在內(nèi)的多種文件格式,并內(nèi)置計(jì)算引擎,可直接在 Python 中完成數(shù)百種 Excel 函數(shù)的計(jì)算,無(wú)需依賴(lài) Microsoft Excel。
安裝方式
在終端中運(yùn)行以下命令,從 PyPI 安裝 Free Spire.XLS for Python:
pip install spire.xls.free
安裝完成后,在 Python 腳本中導(dǎo)入庫(kù)以訪(fǎng)問(wèn)該庫(kù)的類(lèi)和方法:
from spire.xls import *
步驟 1:使用 Python 生成帶公式的 Excel 文件
為了演示如何在 Python 中讀取、修改和計(jì)算 Excel 公式,我們先創(chuàng)建一個(gè)包含真實(shí)數(shù)據(jù)的 Excel 工作簿。這個(gè)工作簿里包含產(chǎn)品信息、數(shù)量、單價(jià)、折扣,以及一些常用公式,比如算術(shù)運(yùn)算、SUM 和 AVERAGE。
通過(guò)程序生成Excel 文件,你可以直接運(yùn)行示例,清楚看到公式的計(jì)算結(jié)果,而無(wú)需手動(dòng)準(zhǔn)備數(shù)據(jù)。
實(shí)現(xiàn)代碼如下:
from spire.xls import *
# 創(chuàng)建新工作簿
workbook = Workbook()
# 獲取第一個(gè)工作表
sheet = workbook.Worksheets[0]
sheet.Name = "銷(xiāo)售數(shù)據(jù)" # 設(shè)置工作表名稱(chēng)
# 添加表頭并設(shè)置樣式
headers = ["產(chǎn)品", "數(shù)量", "單價(jià)", "折扣 (%)", "小計(jì)", "折后總價(jià)"]
for col, header in enumerate(headers, start=1):
cell = sheet.Range[1, col]
cell.Text = header
cell.Style.Font.IsBold = True
cell.Style.HorizontalAlignment = HorizontalAlignType.Center
cell.Style.Color = Color.FromRgb(200, 200, 250)
# 添加示例數(shù)據(jù)并設(shè)置對(duì)齊方式
data = [
("鍵盤(pán)", 10, 25, 5, "", ""),
("鼠標(biāo)", 15, 12, 0, "", ""),
("顯示器", 8, 150, 10, "", "需檢查"),
("USB 數(shù)據(jù)線(xiàn)", 20, 5, 0, "", ""),
("筆記本包", 5, 40, 15, "", "")
]
for row, row_data in enumerate(data, start=2):
for col, value in enumerate(row_data, start=1):
cell = sheet.Range[row, col]
if isinstance(value, (int, float)):
cell.NumberValue = value
if col > 1:
cell.Style.HorizontalAlignment = HorizontalAlignType.Right
else:
cell.Text = value
cell.Style.HorizontalAlignment = HorizontalAlignType.Left
# 添加計(jì)算公式
for i in range(2, 7):
sheet.Range[f"E{i}"].Formula = f"=B{i}*C{i}"
sheet.Range[f"F{i}"].Formula = f"=E{i}*(1-D{i}/100)"
# 添加總計(jì)和平均值
sheet.Range["E7"].Formula = "=SUM(E2:E6)"
sheet.Range["F7"].Formula = "=SUM(F2:F6)"
sheet.Range["E8"].Formula = "=AVERAGE(E2:E6)"
sheet.Range["F8"].Formula = "=AVERAGE(F2:F6)"
# 高亮顯示總計(jì)和平均值
for cell_address in ["E7", "F7", "E8", "F8"]:
cell = sheet.Range[cell_address]
cell.Style.Font.IsBold = True
cell.Style.Color = Color.FromRgb(220, 230, 241)
# 計(jì)算所有公式
sheet.CalculateAllValue()
# 設(shè)置所有行高
for row in range(1, sheet.LastRow + 1):
sheet.Rows[row - 1].RowHeight = 15
# 設(shè)置所有列寬
for col in range(1, sheet.LastColumn + 1):
sheet.Columns[col - 1].ColumnWidth = 10
# 保存工作簿
workbook.SaveToFile("公式.xlsx", ExcelVersion.Version2016)
workbook.Dispose()運(yùn)行以上代碼,得到一個(gè)包含公式的 Excel 文件,如下圖所示:

步驟 2:使用 Python 讀取 Excel 公式
當(dāng)你收到別人制作的 Excel 文件,想確認(rèn)公式是否正確或覆蓋了所有計(jì)算邏輯時(shí),就需要讀取這些公式。
你可以遍歷工作表的已用單元格,通過(guò) HasFormula 屬性判斷哪些單元格包含公式。對(duì)于每個(gè)含有公式的單元格,使用 Formula 屬性獲取公式,再通過(guò) FormulaValue 屬性獲取公式的計(jì)算結(jié)果。這樣,就能清楚地了解 Excel 中各個(gè)公式的實(shí)際計(jì)算情況。
實(shí)現(xiàn)代碼如下:
from spire.xls import *
# 創(chuàng)建工作簿對(duì)象
workbook = Workbook()
# 加載現(xiàn)有 Excel 文件
workbook.LoadFromFile("公式.xlsx")
# 獲取第一個(gè)工作表
sheet = workbook.Worksheets[0]
# 獲取工作表中已用的單元格范圍
usedRange = sheet.AllocatedRange
print("=== 讀取現(xiàn)有公式 ===")
# 遍歷已用范圍內(nèi)的所有單元格
for cell in usedRange:
if cell.HasFormula:
print(f"單元格 {cell.RangeAddressLocal} 公式: {cell.Formula}")
print(f"計(jì)算結(jié)果: {cell.FormulaValue}")
# 釋放工作簿資源
workbook.Dispose()輸出結(jié)果與示例 Excel 文件中各公式及其計(jì)算結(jié)果一致:

步驟 3:在 Python 中修改和計(jì)算 Excel 公式
如果需要更新現(xiàn)有公式,只需要將新的公式表達(dá)式賦值給相應(yīng)單元格的Formula屬性。修改完成后,需要調(diào)用 CalculateAllValue() 方法重新計(jì)算工作表中的公式,這樣可以確保所有計(jì)算結(jié)果都是最新且準(zhǔn)確的。
實(shí)現(xiàn)代碼如下:
from spire.xls import *
# 加載現(xiàn)有工作簿
workbook = Workbook()
workbook.LoadFromFile("公式.xlsx")
# 訪(fǎng)問(wèn)第一個(gè)工作表
sheet = workbook.Worksheets[0]
# 更新現(xiàn)有數(shù)據(jù)
sheet.Range["C2"].NumberValue = 27 # 修改鍵盤(pán)單價(jià)
sheet.Range["D4"].NumberValue = 12 # 修改顯示器折扣
# 修改現(xiàn)有公式
sheet.Range["F6"].Formula = "=E6*(1-D6/100)+5" # 筆記本包增加額外費(fèi)用
# 添加新公式
sheet.Range["G2"].Formula = "=C2*B2*0.1" # 示例:小計(jì)的 10% 傭金
# 在工作表級(jí)別重新計(jì)算所有公式
sheet.CalculateAllValue()
print("=== 更新公式 ===")
# 獲取并打印更新后的值
print(f"鍵盤(pán)折后總價(jià) (F2): {sheet.Range['F2'].FormulaValue}")
print(f"顯示器折后總價(jià) (F4): {sheet.Range['F4'].FormulaValue}")
print(f"筆記本包折后總價(jià)(含額外費(fèi)用)(F6): {sheet.Range['F6'].FormulaValue}")
print(f"新增傭金 (G2): {sheet.Range['G2'].FormulaValue}")
# 保存更新后的工作簿
workbook.SaveToFile("更新公式.xlsx", ExcelVersion.Version2016)
workbook.Dispose()代碼說(shuō)明:
- NumberValue – 更新單元格中的數(shù)值。
- Formula – 讀取或?yàn)閱卧裨O(shè)置公式。
- CalculateAllValue() – 重新計(jì)算公式,可在以下對(duì)象上調(diào)用:
- CellRange – 僅計(jì)算該單元格(依賴(lài)單元格不更新)。
- Worksheet – 計(jì)算當(dāng)前工作表中所有公式。
- Workbook – 計(jì)算工作簿中所有工作表的公式。
- FormulaValue – 獲取公式的計(jì)算結(jié)果。
為了確保準(zhǔn)確性,推薦在工作表或工作簿級(jí)別進(jìn)行計(jì)算,因?yàn)閱蝹€(gè)單元格重新計(jì)算不會(huì)自動(dòng)更新依賴(lài)公式。
附加:Free Spire.XLS for Python 與 openpyxl 公式處理比較
在 Python 中處理 Excel 公式時(shí),應(yīng)選擇既支持讀取又能準(zhǔn)確計(jì)算公式的庫(kù)。以下是 Free Spire.XLS for Python 與 openpyxl 的對(duì)比:
| 特性 | Free Spire.XLS for Python | openpyxl |
| 公式支持 | 支持廣泛的算術(shù)、邏輯、文本、日期、財(cái)務(wù)函數(shù)及復(fù)雜表達(dá)式 | 僅支持寫(xiě)入公式 |
| 公式計(jì)算 | 內(nèi)置計(jì)算引擎,可直接計(jì)算,無(wú)需 Excel | 無(wú)內(nèi)部計(jì)算,需要 Excel 或第三方計(jì)算 |
| 文件格式兼容 | 支持 .xls, .xlsx, .xlsm, .xlsb,保持公式完整性 | 僅支持 .xlsx, .xlsm,不支持舊版 .xls |
| 跨平臺(tái) | Windows、macOS、Linux | 純 Python,輕量跨平臺(tái) |
綜上,如果需要在 Python 中完整操作 Excel 公式并進(jìn)行自動(dòng)計(jì)算,F(xiàn)ree Spire.XLS for Python 是更全面的選擇。
到此這篇關(guān)于Python實(shí)現(xiàn)讀取、修改和計(jì)算 Excel 公式的示例詳解的文章就介紹到這了,更多相關(guān)Python操作Excel公式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
完美解決python針對(duì)hdfs上傳和下載的問(wèn)題
這篇文章主要介紹了完美解決python針對(duì)hdfs上傳和下載的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
Python Selenium中等待設(shè)置的實(shí)現(xiàn)
本文主要介紹了Python Selenium中等待設(shè)置的實(shí)現(xiàn),過(guò)詳實(shí)的示例代碼,深入介紹了顯式等待、隱式等待、自定義等待條件、多重等待條件、頁(yè)面加載狀態(tài)的等待、元素存在與可見(jiàn)性等待、Fluent等待以及異步JavaScript加載的等待,感興趣的可以了解一下2023-12-12
Python內(nèi)置的HTTP協(xié)議服務(wù)器SimpleHTTPServer使用指南
這篇文章主要介紹了Python內(nèi)置的HTTP協(xié)議服務(wù)器SimpleHTTPServer使用指南,SimpleHTTPServer本身的功能十分簡(jiǎn)單,文中介紹了需要的朋友可以參考下2016-03-03
python提取excel一列或多列數(shù)據(jù)另存為新表代碼實(shí)例
在日常的工作中,其實(shí)就是用鼠標(biāo)進(jìn)行數(shù)據(jù)篩選,然后選擇你想要這一行數(shù)據(jù)進(jìn)行復(fù)制,下面這篇文章主要給大家介紹了關(guān)于python提取excel一列或多列數(shù)據(jù)另存為新表的相關(guān)資料,需要的朋友可以參考下2024-06-06
python3環(huán)境搭建過(guò)程(利用Anaconda+pycharm)完整版
這篇文章主要介紹了python3環(huán)境搭建過(guò)程(利用Anaconda+pycharm)完整版,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
判斷Threading.start新線(xiàn)程是否執(zhí)行完畢的實(shí)例
這篇文章主要介紹了判斷Threading.start新線(xiàn)程是否執(zhí)行完畢的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05

