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

写入现有的xlsx文件,只覆盖Python中的一些工作表,python,python-3.x,pandas,openpyxl,pandas.excelwriter,Python,Python 3.x,Pandas,Openpyxl,Pandas.excelwriter,我有一个excel文件,里面有几张表格,比如,data1,data2和数据透视图 表Data 1和Data 2各有一个表。 工作表Pivots只有数据源为data1和data2上的表的pivot表 我想做的是用两个数据帧中的数据重写数据表,分别是df1和df2,同时保持数据透视表链接到相同的数据表。其思想是运行一个脚本,替换data1和data2并刷新透视表以获得更新的数据 pd.ExcelWriter(xlsx\u文件)无法工作,因为它会替换该文件。 下面的方法是根据答案改编的 这失败了,因为

我有一个excel文件,里面有几张表格,比如,
data1
data2
数据透视图

Data 1
Data 2
各有一个表。 工作表
Pivots
只有数据源为
data1
data2
上的表的pivot表

我想做的是用两个数据帧中的数据重写数据表,分别是
df1
df2
,同时保持数据透视表链接到相同的数据表。其思想是运行一个脚本,替换
data1
data2
并刷新透视表以获得更新的数据

pd.ExcelWriter(xlsx\u文件)
无法工作,因为它会替换该文件。 下面的方法是根据答案改编的

这失败了,因为工作表
Pivots
确实将数据保留在单元格中,但pivot表及其所有格式都消失了。这只是硬价值观

我也仔细阅读了一个又一个问题,但没能让它起作用

我如何着手做这个简单的任务


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

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]})

正如下面一位用户所问,我将在这里留下我在他的解决方案提案中失败的尝试(数据透视及其所有格式都消失了,只保留了它们的硬值)


熊猫一方对数据透视一无所知,因此您应该避免使用
到_excel()
,并使用openpyxl提供的实用程序从数据帧到工作表再返回


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

您能在某处上传一个示例.XLSX文件吗?@MaxU Done。抱歉耽搁了。您可以覆盖前两张工作表,但我认为您无法保留数据透视-它们将转换为静态数据集…我尝试使用您的答案,但它仍然破坏了数据透视表。你知道我做错了什么吗?问题是excel文件的链接。我使用的代码也在那里。非常感谢你。
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")