You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:25:18