如何在继续使用win32com之前等待Excel计算公式
我有一个用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()
这样做会计算两个工作表中的所有单元格。看起来每个函数在完成所有计算后才会返回结果,这正是你想要的效果。所以,除非我误解了你的问题,否则这个解决办法应该就足够了。