如何在继续使用win32com之前等待Excel计算公式

3 投票
2 回答
5677 浏览
提问于 2025-04-18 14:21

我有一个用win32com写的Python脚本,它可以把多个Excel文件合并成一个电子表格,并把它保存为PDF格式。

现在的情况是,输出的结果几乎全是#NAME?,这是因为在输出文件之前,Excel文件的内容还没有计算完成(这可能需要花费一分钟的时间)。

我该如何强制工作簿计算出值,并在计算完成之前不继续执行其他操作呢?

excel = win32.Dispatch('Excel.Application')

# moving stuff to this spreadsheet
wb1 = excel.Workbooks.Open(filepath1)
ws1 = excel.ActiveSheet

# from this spreadsheet
wb2 = excel.Workbooks.Open(filepath2)
ws2 = excel.ActiveSheet

# supposedly this should do it, but I haven't seen results
ws1.EnableCalculation = True
ws2.EnableCalculation = True

ws1.Calculate
ws2.Calculate

wb1.Cells(2, 4).Value = wb2.Cells(1,1).Value # doing stuff with values

# right here I need it to wait and calculate everything
# so when I export it, I see the values, not the formula or "#NAME?"

wb1.Save()
ws1.ExportAsFixedFormat(0, r'C:\filename.pdf')

wb1.Close(True)
wb2.Close(True)
excel.Application(Quit)

我做过一个有点傻的事情,虽然对单元格有效,但对图表没用,就是遍历整个工作表,把每个单元格的值设置为它自己,这样公式就被数值覆盖了。

不过,图表的值还是没有更新。

range = ws1.UsedRange
num_rows = range.Row + range.Rows.Count - 1
num_cols = range.Column + range.Columns.Count - 1

for i in range(1, num_rows ):
    for j in range(1, num_cols ):
        ws1.Cells(i, j).Value = ws1.Cells(i, j).Value 

2 个回答

0

根据我之前的评论:

问题其实是别的原因,我在这里回答了这个问题:https://stackoverflow.com/a/25495515/2374028

如果你使用任何一种脚本语言,比如Python的win32com,它不会自动包含插件,而我的计算是用到了这些插件,所以它就直接跳过了这些计算。

0

你需要注意用()这种方式来调用函数:

ws1.Calculate()
ws2.Calculate()

这样做会计算两个工作表中的所有单元格。看起来每个函数在完成所有计算后才会返回结果,这正是你想要的效果。所以,除非我误解了你的问题,否则这个解决办法应该就足够了。

撰写回答