实际上有一个项目采用 Excel 公式并使用 Python 对其进行评估: Pycel。 Pycel 使用 Excel 本身(通过 COM)来提取公式,因此在您的情况下,您可以跳过该部分。 该项目可能有一些有用的东西可供您使用,但我不能保证它的成熟度或完整性。 它并不是真正为大众开发的。
还有一个名为Koala的新项目,它构建在 Pycel 和 OpenPyXL 上。
另一种方法,如果你不能使用 Excel 但你可以自己计算公式的结果(在你的 Python 代码中),是将值和公式都写入一个单元格(这样当你读取文件时,你可以只需拉取值,根本不用担心公式)。在撰写本文时,我还没有找到在 OpenPyXL 中执行此操作的方法,但XlsxWriter可以做到。从文档:
XlsxWriter 不计算公式的值,而是将值 0 存储为公式结果。然后它会在 XLSX 文件中设置一个全局标志,以说明在打开文件时应重新计算所有公式和函数。这是 Excel 文档中推荐的方法,通常它适用于电子表格应用程序。但是,不具备计算公式功能的应用程序(例如 Excel 查看器)或某些移动应用程序将仅显示 0 结果。
如果需要,还可以使用选项值参数指定公式的计算结果。在使用不计算公式值的非 Excel 应用程序时,有时需要这样做。计算出的值被添加到参数列表的末尾:
worksheet.write_formula('A1', '=2+2', num_format, 4)
使用这种方法,当需要读取值时,您将使用 OpenPyXL 的data_only选项。(对于阅读此答案的其他人:如果您使用 xlrd,则无论如何只有该值可用。)
最后,如果你这样做让Excel,那么也许你可以做最简单和可靠的事情是自动开启和Excel中(这样它会计算并写出公式的值你)的文件重新保存的。xlwings是从 Windows 或 Mac 执行此操作的简单方法。
小智 6
公式模块对我有用。详情请参考https://pypi.org/project/formulas/
from openpyxl import load_workbook
import formulas
#The variable spreadsheet provides the full path with filename to the excel spreadsheet with unevaluated formulae
fpath = path.basename(spreadsheet)
dirname = path.dirname(spreadsheet)
xl_model = formulas.ExcelModel().loads(fpath).finish()
xl_model.calculate()
xl_model.write(dirpath=dirname)
#Use openpyxl to open the updated excel spreadsheet now
wb = load_workbook(filename=spreadsheet,data_only=True)
ws = wb.active
Run Code Online (Sandbox Code Playgroud)
我意识到这个问题很旧,但是我遇到了同样的问题,而且广泛的搜索没有给出答案。
该解决方案实际上非常简单,因此我将其发布在此以供后代参考。
假设您有一个使用修改过的xlsx文件openpyxl。正如查理·克拉克(Charlie Clark)提到的openpyxl那样,它不会计算公式,但是如果您在excel中打开文件,则会自动计算公式。因此,您要做的就是打开文件,然后使用excel保存。
为此,您可以使用win32com模块。
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
workbook = excel.Workbooks.Open(r'absolute/path/to/your/file')
# this must be the absolute path (r'C:/abc/def/ghi')
workbook.Save()
workbook.Close()
excel.Quit()
Run Code Online (Sandbox Code Playgroud)
而已。我已经看过所有使用Pycel或Koala的建议,但是如果您只需要告诉excel打开并保存,这似乎有些过大。
授予此解决方案仅适用于Windows。