Python&Excel:尝试运行宏/刷新透视时出现问题

Python&Excel: Issue when trying to run a macro / refresh pivots

提问人:Tom4 提问时间:9/26/2023 最后编辑:Tom4 更新时间:9/26/2023 访问量:66

问:

我正在使用 Knime 生成一个 Excel,然后我使用 python 对文件进行一些调整。 我正在从 Knime 的输出中获取数据并将它们粘贴到预先格式化的 Template.xlsm 中,该模板在粘贴新数据后要刷新多个数据透视表。一切都在工作,直到最后一步,当我需要刷新枢轴时。

我尝试了不同的解决方案:

  • 在 Template.xlsm 中创建一个宏和一个按钮,以便当用户打开文件时,他可以直接刷新所有透视 -->这不起作用,因为我使用的是 openpyxl,并且当生成新文件时,所有形状都被删除了
  • 使用 win32com(代码如下)直接用 python 刷新透视表 -->它不起作用,因为我收到 PermissionError: [Errno 13] 权限被拒绝。
import win32com.client 
xl = win32com.client.DispatchEx("Excel.Application")
wb = xl.workbooks.open("path\file.xlsm")
xl.Visible = True
wb.RefreshAll()
xl.Quit()
  • 使用 Python 直接运行宏。在保存文件之前和保存文件之后,我都尝试了这两种方法(基本上再次阅读并尝试运行宏)。-->它不起作用,因为我总是收到错误:PermissionError:[Errno 13] 权限被拒绝。
import xlwings as xw
xl=win32com.client.Dispatch("Excel.Application")
xl.Workbooks.Open(os.path.abspath("excelsheet.xlsm"), ReadOnly=1)
xl.Application.Run("excelsheet.xlsm!modulename.macroname")
xl.Application.Save() the
xl.Application.Quit()

我认为这与以下事实有关:在我的组织中,我们在所有文件中都有一个强制性的敏感度级别标签。但是,我发现奇怪的是,当我仍在使用脚本处理它时(我的意思是在保存它并因此生成最终的 file.xlsm 之前),我无法运行宏。

  • 我还尝试通过使用 python 分配标签 ID 来自动设置敏感度级别(使用下面的代码)--> 我不断收到错误:PermissionError:[Errno 13] 权限被拒绝。
wb = xw.Book('file.xlsm')
labelinfo = wb.api.SensitivityLabel.CreateLabelInfo()
labelinfo.AssignmentMethod = 2
labelinfo.Justification = 'init'
labelinfo.LabelId = 'YOUR-ID-GOES-HERE'
wb.api.SensitivityLabel.SetLabel(labelinfo, labelinfo)

您有什么建议或方法可以最终绕过敏感度标签吗?

这是我不断收到的错误:

Executing the Python script failed: Traceback (most recent call last):
  File "<string>", line 208, in <module>
  File "C:\ProgramData\anaconda3\envs\py3_knime\lib\site-packages\openpyxl\workbook\workbook.py", line 407, in save
    save_workbook(self, filename)
  File "C:\ProgramData\anaconda3\envs\py3_knime\lib\site-packages\openpyxl\writer\excel.py", line 291, in save_workbook
    archive = ZipFile(filename, 'w', ZIP_DEFLATED, allowZip64=True)
  File "C:\ProgramData\anaconda3\envs\py3_knime\lib\zipfile.py", line 1248, in __init__
    self.fp = io.open(file, filemode)
PermissionError: [Errno 13] Permission denied: 'C: ...\file.xlsm'
胜过 win32com的 XLWINGS公司

评论

0赞 BigBen 9/26/2023
“我正在从 Knime 的输出中获取数据并将它们粘贴到预先格式化的 Template.xlsm 中” - 您是否以编程方式粘贴数据?
0赞 Tom4 9/26/2023
我正在从具有相同表/结构的 xlsx 到 xlsm 进行硬拷贝。我有一个 for 循环,可以迭代行和列。
0赞 DS_London 9/27/2023
需要明确的是,在代码上,您收到错误?或者你穿上了吗?win32comRefreshAllOpen

答:

0赞 taller 9/26/2023 #1

在测试之前,请使用 Windows 任务管理器关闭所有 Excel 实例。 需要保存更改。workbook.Close

# Env: pywin32 v305, Python 3.11, Excel 365
import win32com.client 
xl = win32com.client.DispatchEx("Excel.Application")
xl_file = r"d:/temp/py.xlsm"
wb = xl.workbooks.open(xl_file)
xl.Visible = True
wb.RefreshAll()
wb.Close(SaveChanges=1)
xl.Quit()

删除 ,代码也很好用。ReadOnly=1

import win32com.client
xl = win32com.client.Dispatch("Excel.Application")
xl_file = r"d:/temp/py.xlsm"
wb = xl.workbooks.open(xl_file)
xl.Application.Run("py.xlsm!mdl1.demo")
# save active workbook
wb.Close(SaveChanges=1)
xl.Quit()

评论

0赞 Tom4 9/26/2023
感谢您的回复。它还不起作用。我不断收到我刚刚在上面描述中发布的错误。
0赞 taller 9/26/2023
创建新的 xlsm 并测试代码。Excel 文件可能因 Excel 应用程序崩溃而被锁定。