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

Posted

技术标签:

【中文标题】写入现有的 xlsx 文件,仅覆盖 Python 中的一些工作表【英文标题】:Write to an existing xlsx file, overwriting just some sheets in Python 【发布时间】:2018-08-24 17:52:53 【问题描述】:

我有一个包含几张工作表的 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")

【问题讨论】:

你能在某处上传一个示例 .XLSX 文件吗? @MaxU 完成。抱歉耽搁了。 您可以覆盖前两张纸,但我认为您不能保留您的数据中心 - 它们将被转换为静态数据集... 【参考方案1】:

pandas 方面对枢轴一无所知,因此您应该避免使用 to_excel() 并使用 openpyxl 提供的从数据框到工作表再返回的实用程序。

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

【讨论】:

我尝试使用您的this 答案,但它仍然破坏了数据透视表。知道我可能做错了什么吗? 问题中有指向 excel 文件的链接。我使用的代码也在那里。非常感谢。

以上是关于写入现有的 xlsx 文件,仅覆盖 Python 中的一些工作表的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 在现有的 excel 文件中修改和写入数据

python excel写入 openpyxls

Python Pandas - 如何在 Excel 工作表的特定列中写入

使用 Python 的 tarfile 时覆盖现有的只读文件

LibreOffice/OpenOffice 能否以编程方式向现有的 .docx/.xlsx/.pptx 文件添加密码?

如何重命名文件并覆盖 VBS 中的现有文件?