写入现有的xlsx文件,在Python中覆盖一些工作表

时间:2018-03-15 19:17:30

标签: python python-3.x pandas openpyxl pandas.excelwriter

我有一个包含多个工作表的Excel文件,例如Data 1Data 2Pivots

工作表Data 1Data 2各有一个表格。 工作表Pivots只有数据透视表,其数据源是Data 1Data 2上的表格。

我想要做的是用两个数据框中的数据重写数据表,分别说df1df2,同时保持数据透视表链接到相同的工作表。我们的想法是运行一个脚本,替换Data 1Data 2并刷新数据透视表以获取更新的数据。

pd.ExcelWriter(xlsx_file)无效,因为它会替换该文件。 以下方法改编自this回答。

import pandas as pd
from openpyxl import load_workbook

book=load_workbook(xlsx_file)
writer = pd.ExcelWriter(xlsx_file, engine = "openpyxl")
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
writer.sheets.pop("Pivots", None)
data_sheets = ["Data 1", "Data 2"]

for (k, df) in enumerate([df1, df2]):
    df.to_excel(writer, data_sheets[k], index=False)
writer.save()

这失败了,因为工作表Pivots确实将数据保留在单元格中,但数据透视表已经消失,并且所有格式都已消失。这只是硬性价值。

我也仔细阅读了this问题和this问题,但无法使其发挥作用。

我该如何完成这项简单的任务?

我上传了一个可以下载here的示例文件。为方便起见,这里有两个数据表来替换数据表:

df1 = pd.DataFrame({"Category": ["A", "B", "C", "D", "A"], "Value": [1, 2, 3, 4, 5]})
df2 = pd.DataFrame({"SKU": ["AB", "BB", "CB", "DB", "AB"], "No of Items": [3, 2, 7, 4, 12]})

正如下面一位用户所说的那样,我将离开这里,我的解决方案提议失败了(枢轴和他们的所有格式都消失了,只剩下他们的硬评价)。

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

df1 = pd.DataFrame([["A", 1], ["B", 2], ["C", 3], ["D", 4], ["A", 5]], columns=["Category", "Value"])
df2 = pd.DataFrame([["AB", 3], ["BB", 2], ["CB", 7], ["DB", 4], ["AB", 12]], columns=["SKU", "No of Items"])

wb = load_workbook("xlsx_file.xlsx")
sheets = ["Data 1", "Data 2"]

for (idx, df) in enumerate([df1, df2]):
    ws = wb.get_sheet_by_name(sheets[idx])
    rows = dataframe_to_rows(df)
    for (r_idx, row) in enumerate(rows):
        if r_idx != 0:
            for (c_idx, value) in enumerate(row[1:]):
                ws.cell(row=r_idx+1, column=c_idx+1, value=value)

wb.save("xlsx_file.xlsx")

1 个答案:

答案 0 :(得分:0)

大熊猫方面对于枢轴几乎一无所知,所以你应该避免使用to_excel()并使用openpyxl提供的实用程序从数据框转到工作表并返回。

您可能需要更改数据透视表的定义,在这种情况下,您主要依靠自己:openpyxl应保留结构,但不提供其他功能来管理它们。您将不得不依赖ECMA 376 / ISO 29500

中的数据透视表规范