如何写入一个现有的Excel文件而不破坏公式与openpyxl?

当你用以下方式写入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() 

公式和指向现有工作表中图表的链接将被保存为值。

如何覆盖这种行为,以保存公式和图表的链接?

Openpyxl 1.7包含了一些处理公式的改进,以便在阅读时保留它们。 使用guess_types=False来防止openpyxl猜测单元格的types,如果需要值而不是公式,则包含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对象。 我已经成功地使用该模块来创build新的xlsx工作簿(格式和公式),并且不知道格式将从openpyxl对象转换为xlsxwriter对象,我相信这将是一个可行的解决scheme,至less可以保留公式。

现在,这样做(我想和我自己做的)并不是非常简单,因为共享公式 。 我必须写一个工具来“分享”这些共享公式,转换它们,并将它们应用到每个引用它的单元格。

有人可能会首先想到,这种方法通过添加一堆公式来创build效率低下的地方,之前只有对现有公式的引用。 不过,我试着用xlsxwriter写这些“冗余”的公式,然后再次用openpyxl读取这个表。 我发现公式再次被读入共享,所以xlsxwriter或Excel应用程序本身都在做这种优化。 (当然,我可以很容易地知道,我还没有。)

如果有需求的话,我会很高兴发布我的解决scheme,用于解除和转换。 目前它被集成到一个更大的模块,我不得不创build一个独立的版本。 一般来说,我使用了在ecatmur对这个问题的回答中讨论的分解器中的分stream器工具来parsing这个公式,这是将它们转换的最难的部分(当然,如果你想推断共享公式将看起来像在另一个“宿主细胞”)。

配方问题已经在这里解决了

运行这个来获取最新版本

 hg clone https://bitbucket.org/ericgazoni/openpyxl cd openpyxl/ hg up 1.8 python setup.py develop 

我知道这是一个较老的线程,但是我花了一段时间才find一个解决scheme – xlwings允许您写入一个选项卡并在另一个选项卡上保留图表。

下面的示例打开一个现有的工作簿,更新图表所基于的数据,并保存为新版本。

 import xlwings as xw import pandas as pd #create DF months = ['2017-01','2017-02','2017-03','2017-04','2017-05','2017-06','2017-07','2017-08','2017-09','2017-10','2017-11','2017-12'] value1 = [x * 5+5 for x in range(len(months))] df = pd.DataFrame(value1, index = months, columns = ['value1']) df['value2'] = df['value1']+5 df['value3'] = df['value2']+5 #load workbook that has a chart in it wb = xw.Book('C:\\data\\bookwithChart.xlsx') ws = wb.sheets['chartData'] ws.range('A1').options(index=False).value = df wb = xw.Book('C:\\data\\bookwithChart_updated.xlsx') xw.apps[0].quit()