You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用xlwings向xlsm插入非英文Excel公式后无法自动计算的问题咨询

解决xlwings写入Excel公式后显示#NAME?的问题

我一看你这情况就明白咋回事了——这大概率是Excel的自动计算没触发,或者xlwings写入公式后没让Excel重新计算一遍。毕竟你手动回车能出结果,说明公式本身是对的(ZEILE()是德语版的ROW()函数对吧),就是Excel没意识到要算它。

给你几个靠谱的解决办法,按优先级来:

方法1:写入公式后强制触发Excel计算

直接在代码里加一行让工作簿重新计算的命令,这是最直接的,百万级单元格也能一次性搞定:

import xlwings as xw
workbook = xw.Book('filename.xlsm')
import_sheet = workbook.sheets['my_sheet']
# 设置数值
import_sheet['A1'].value = 401 
# 设置函数
import_sheet['B1'].value = '=ZEILE()'
# 强制工作簿重新计算
workbook.app.calculate()
# 也可以针对单个工作表计算:import_sheet.calculate()

方法2:检查并设置Excel的自动计算模式

有时候Excel可能被改成了手动计算模式,这时候写入新公式它也不会自动算。你可以在代码里直接把计算模式改回自动:

# 把Excel设置为自动计算模式
workbook.app.calculation = 'automatic'

改回自动模式后,后续写入的公式都会自动触发计算,不用再手动干预。

方法3:用Excel原生API写入本地化公式(进阶)

如果上面两种都不行,试试直接调用Excel的VBA接口来写入公式,这种方式更贴近Excel原生操作,适配本地化函数名的效果更好:

import_sheet['B1'].api.FormulaLocal = '=ZEILE()'

这里用FormulaLocal是因为你用的是德语本地化函数名,要是用Formula的话得换成英文函数名=ROW(),这点要注意。

另外提个小建议:处理百万级单元格时,尽量批量写入公式而不是单个循环,比如用import_sheet['B1:B1000000'].value = '=ZEILE()',xlwings批量操作的性能比循环单个单元格高太多。

内容的提问来源于stack exchange,提问作者Cribber

火山引擎 最新活动