如何在不破坏openpyxl公式的情况下写入现有的excel文件?

2024-03-28 16:21:24 发布

您现在位置:Python中文网/ 问答频道 /正文

以以下方式从Python写入excel文件时:

import pandas
from openpyxl import load_workbook

book = load_workbook('Masterfile.xlsx')
writer = pandas.ExcelWriter('Masterfile.xlsx') 
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2'])

writer.save()

现有工作表中的公式和图表链接将另存为值。

如何覆盖此行为以保留公式和图表链接?


Tags: 文件importpandasws链接方式图表load
3条回答

Openpyxl 1.7包含了一些处理公式的改进,以便在读取时保留它们。使用guess_types=False可防止openpyxl尝试猜测单元格的类型,如果需要值而不是公式,则1.8包含data_only=True选项。

希望保留2.x系列中的图表。

在excel中:

  Home --> Find & Select --> Replace

  Replace All: "=" with "spam"

在python中:

  Run python script to update excel sheets

在excel中:

  Replace All: "spam" with "="

在这里,我只讨论问题的“保留公式”部分。

我试着使用openpyxl 1.8,它确实成功地读取了公式,但是当我试图保存一个副本时,它崩溃了。(断裂似乎与样式有关,而与公式无关。)

无论如何,我建议(直到openpxyl更进一步)将公式映射到一个新的xlsxwriter.Workbook对象。我已经成功地使用该模块创建了新的xlsx工作簿(带有格式和公式),在不知道这些格式将如何从openpyxl对象转换为xlsxwriter对象的情况下,我相信这将是至少保留公式的可行解决方案。

因为shared formulas,做这件事(我自己也想做)并不是非常简单。我必须编写一个工具来“取消共享”这些共享公式,将它们转换,并将它们应用于引用它的每个单元格。

有人可能会首先认为,这种方法通过添加一组公式(以前只引用现有公式)来创建低效率。不过,我试着用xlsxwriter编写这些“多余”的公式,然后用openpyxl重新读回这张表。我发现这些公式再次以共享的形式读取,因此xlsxwriter或Excel应用程序本身都在进行此优化。(当然,人们很容易就能弄清楚是哪一个,我只是还没有。)

如果有需要的话,我很乐意发布我的解共享和转置解决方案;目前它集成到一个更大的模块中,我必须创建一个独立的版本。不过,一般来说,我使用ecatmur对this question的响应中讨论的标记器中的分流码工具来解析公式,这是转换它们的最困难的部分(如果要推断共享公式在另一个“宿主单元格”中的外观,当然必须这样做)。

相关问题 更多 >