如何用Python将.xlsm单元格计算值转为常量复制到.xlsx?
问题描述
我目录下有若干.xlsm文件,需要编写Python代码生成同名.xlsx文件。.xlsm文件的Q1单元格是求和公式(比如=A1+B1),得把该单元格的计算结果以常量形式复制到对应.xlsx的Q1里,不能复制公式。现在的代码复制的是公式,导致.xlsx里的值出错。以后可能要复制更多带复杂公式的单元格,要求直接拿计算好的数据,不用重新计算,而且只复制指定单元格,不是整个文件。现有代码如下:
import os import openpyxl for filename in os.listdir(): if filename.endswith('.xlsm'): xlsm_wb = openpyxl.load_workbook(filename) xlsm_sheet = xlsm_wb.active xlsx_wb = openpyxl.Workbook() xlsx_sheet = xlsx_wb.active xlsx_sheet['Q1'] = xlsm_sheet['Q1'].value xlsx_wb.save(filename[:-1] + 'x')
修改方案
问题核心是openpyxl默认加载文件时不会读取公式的计算结果,直接取.value拿到的是公式文本。要获取计算后的值,只需在加载.xlsm文件时加上data_only=True参数,同时优化文件名处理逻辑,避免出错。
修改后的代码:
import os import openpyxl for filename in os.listdir(): if filename.endswith('.xlsm'): # 加载文件时启用data_only,读取计算后的单元格值而非公式 xlsm_wb = openpyxl.load_workbook(filename, data_only=True) xlsm_sheet = xlsm_wb.active xlsx_wb = openpyxl.Workbook() xlsx_sheet = xlsx_wb.active # 直接复制计算后的常量值 xlsx_sheet['Q1'] = xlsm_sheet['Q1'].value # 更稳妥的文件名替换方式 xlsx_filename = filename.replace('.xlsm', '.xlsx') xlsx_wb.save(xlsx_filename)
注意事项
data_only=True依赖Excel最后一次保存时的计算结果,如果.xlsm文件从未用Excel打开并计算保存过,可能会读取到空值或旧值,建议先在Excel中打开文件并保存一次。- 后续要复制其他带公式的单元格,只需新增
xlsx_sheet['目标单元格'] = xlsm_sheet['源单元格'].value这类代码即可,核心逻辑不变。
内容的提问来源于stack exchange,提问作者alon
相关产品推荐
相关产品推荐

