使用 python 修改工作表时,不会调用 Excel VB 事件 RefreshAll

问题描述 投票:0回答:1

数据表

data sheet

数据表与下面的 VB 脚本绑定 VB Code

Sheet1 工作表具有数据透视表 Sheet1 sheet

txt_excel.txt txt_excel.txt file

我正在尝试使用 python 脚本更新数据表中的单元格值。但 RefreshAll 事件没有被触发并更新 Sheet1 工作表中的数据透视表。

这是从文本文件读取值并更新数据表的 Python 脚本

excel_filepath = "test_excel_file2.xlsm"
txt_filepath = "txt_excel.txt"
data_sheet = "data"
calc_sheet = "Sheet1"

df = pd.read_csv(txt_filepath, sep="|")
print(df)

wb = load_workbook(excel_filepath, keep_vba=True)
ws = wb[data_sheet]
ws.delete_rows(1,ws.max_row)
wb.save(excel_filepath)
ws.active = data_sheet
for r in dataframe_to_rows(df, index=False, header=True):
    ws.append(r)
wb.save(excel_filepath)

new_df = pd.read_excel(excel_filepath, sheet_name=None)
print(new_df[calc_sheet])

这里 new_df 变量没有返回更新后的值

如何解决这个问题?

python pandas excel vba openpyxl
1个回答
0
投票

如果您将代码更改为类似的内容,那么它将起作用;

使用 Xlwings 打开并更新 EXCEL 中的工作表,这允许更新数据透视表,并在使用

pd.read_excel
读取时保存后,它将获得更新数据。

import pandas as pd
import xlwings as xw


excel_filepath = "test_excel_file2.xlsm"
txt_filepath = "txt_excel.txt"
data_sheet = "data"
calc_sheet = "Sheet1"


df = pd.read_csv(txt_filepath, sep="|")
print(df)

with xw.App(visible=True) as app:
    wb = xw.Book(excel_filepath)
    ws = wb.sheets[data_sheet]

    ### Can clear the existing data but its not necessary
    # ws.range("A2:B5").clear_contents()

    ws["A1"].options(pd.DataFrame, header=1, index=False, expand='table').value = df
    wb.save()


new_df = pd.read_excel(excel_filepath, sheet_name=None)
print(new_df[calc_sheet])

控制台

  col  val
0   a   10
1   b    2
2   c    3
3   a   10
    Row Labels  Sum of val
0            a          20
1            b           2
2            c           3
3  Grand Total          25

© www.soinside.com 2019 - 2024. All rights reserved.