使用openpyxl复制Excel时,如何读取单元格计算值而非公式?
解决openpyxl复制Excel时公式引用错误及获取计算值的问题
一、修复公式引用错误
你遇到的公式计算错误,核心原因是跳过原A列后,公式里的列引用没同步调整——原文件E列的=SUM(B1:D1),复制到新文件D列后,仍然指向B1:D1,但新文件里原B/C/D列已经变成了A/B/C列,导致引用错位。
要解决这个问题,需要在复制时:
- 跳过原A列
- 对公式单元格的列引用做偏移调整(原列号减1)
代码实现
先写两个辅助函数处理列名和列号的转换,再调整复制逻辑:
def col_letter_to_num(letter): # 把列字母(如B)转为列号(如2) num = 0 for c in letter: num = num * 26 + (ord(c.upper()) - ord('A') + 1) return num def col_num_to_letter(num): # 把列号(如2)转为列字母(如B) letter = '' while num > 0: num, remainder = divmod(num - 1, 26) letter = chr(ord('A') + remainder) + letter return letter def adjust_formula_col(formula): # 调整公式中的列引用,去掉原A列后,所有列号减1 import re pattern = r'([A-Z]+)(\d+)' def replace_match(match): col_letter = match.group(1) row_num = match.group(2) col_num = col_letter_to_num(col_letter) new_col_num = col_num - 1 if new_col_num < 1: return match.group(0) new_col_letter = col_num_to_letter(new_col_num) return f"{new_col_letter}{row_num}" return re.sub(pattern, replace_match, formula) # 主复制逻辑 from openpyxl import load_workbook ORG_EXCEL_FILE = load_workbook("workbook.xlsx") NEW_EXCEL_FILE = load_workbook("TEST.xlsx") ORG_FILE_SHEET = ORG_EXCEL_FILE["Sheet1"] NEW_FILE_SHEET = NEW_EXCEL_FILE["Sheet1"] for row_idx, row in enumerate(ORG_FILE_SHEET.iter_rows(values_only=False), start=1): new_col_idx = 1 # 新文件列从1开始计数 for col_idx, cell in enumerate(row, start=1): if col_idx == 1: # 跳过原文件A列 continue if cell.data_type == 'f': # 判断是否为公式单元格 adjusted_formula = adjust_formula_col(cell.value) NEW_FILE_SHEET.cell(row=row_idx, column=new_col_idx).value = adjusted_formula else: NEW_FILE_SHEET.cell(row=row_idx, column=new_col_idx).value = cell.value new_col_idx += 1 NEW_EXCEL_FILE.save("TEST.xlsx")
修改后,原E列的=SUM(B1:D1)会自动转为=SUM(A1:C1),新文件就能正确计算结果。
二、获取单元格的准确计算值
openpyxl本身没有公式计算能力,data_only=True只能读取Excel/WPS等软件已经计算并保存到文件中的结果。如果开启后返回None,说明原文件从未被这类软件打开计算并保存过。
解决办法
方法1:手动预处理原文件
用Excel或WPS打开原文件,等待公式计算完成后保存,再用data_only=True读取:
ORG_EXCEL_FILE = load_workbook("workbook.xlsx", data_only=True) # 此时cell.value会返回计算后的数值,而非公式
方法2:用win32com调用Excel自动计算(仅Windows环境)
通过调用本地Excel程序自动计算并保存,再用openpyxl读取:
import win32com.client as win32 from openpyxl import load_workbook # 调用Excel计算并保存 excel = win32.gencache.EnsureDispatch('Excel.Application') wb = excel.Workbooks.Open(r"C:\你的文件路径\workbook.xlsx") wb.Save() wb.Close() excel.Quit() # 读取计算结果 ORG_EXCEL_FILE = load_workbook("workbook.xlsx", data_only=True) print(ORG_EXCEL_FILE["Sheet1"]["E1"].value) # 输出计算后的数值,比如6
方法3:用pandas读取计算结果
借助pandas的Excel读取能力直接获取计算值,需提前安装pandas和openpyxl:
import pandas as pd df = pd.read_excel("workbook.xlsx", sheet_name="Sheet1", engine="openpyxl") print(df.iloc[0, 4]) # 原E列第1行的计算结果(索引从0开始)
内容的提问来源于stack exchange,提问作者SM079
相关产品推荐
相关产品推荐

