计算Excel工作表而不打开它们(openpyxl或xlwt)

Frt*_*aal 5 python excel xlwt openpyxl pyxll

我做了一个打开xls的脚本。文件,在其中写入一些新值,然后保存文件。

后来,脚本再次将其打开,并希望在某些包含公式的单元格中找到答案。

如果我用openpyxl调用该单元格,则会得到公式(即:= A1 * B1)。如果我激活data_only,我什么也不会得到。

有没有办法让python计算xls文件?(或者我应该尝试PyXll吗?)

Joh*_*n Y 6

实际上有一个项目采用 Excel 公式并使用 Python 对其进行评估: PycelPycel 使用 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)

  • 好吧,保留公式的机会就在那里,他只是写了一个简单的例子。 (2认同)

Grr*_*Grr 5

我意识到这个问题很旧,但是我遇到了同样的问题,而且广泛的搜索没有给出答案。

该解决方案实际上非常简单,因此我将其发布在此以供后代参考。

假设您有一个使用修改过的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。

  • 好吧,正如主题行中所表达的,问题的重点是不要用 Excel 打开文件。使用 Pycel 或 Koala 的建议并不是“矫枉过正”;它们是*必要的*以满足要求。您的解决方案不仅特定于 Windows,还需要 Excel。有些人使用 Windows 但没有 Excel。您的解决方案恰好是 OP 最终使用的解决方案(请参阅 OP 对我的回答的第二条评论,他们于 2014 年发布),如果您*确实*有 Excel 可供您使用,这当然是一个合理的选择。 (3认同)