openpyxl使用OFFSET、INDIRECT组合公式时如何引用其他工作表单元格
问题解决方法
错误原因分析
- Excel公式括号嵌套错误:你把
OFFSET函数的参数错误放到了INDIRECT函数的入参中,INDIRECT函数仅支持2个入参,额外传入的偏移参数会直接导致公式语法错误 - 公式结构不完整:
AVERAGE函数缺少闭合右括号 - 工作表创建逻辑不合理:你按学员行数创建工作表,实际应该按题目数量创建对应题目工作表,且需要显式指定表名避免后续引用报错
- 字符串转义存在隐患:原写法中转义符使用不当易引发Python语法报错
修正方案
方案1:保留Excel公式写法
修正后的代码如下:
import pandas as pd import openpyxl from openpyxl import load_workbook, Workbook # 基础读写逻辑不变 quiz_excel=pd.read_csv(r'path_to_csv_file.csv') quiz_excel.to_excel(r'path_to_xlsx_file.xlsx', index=None, header=True) wb: Workbook = load_workbook(r'path_to_xlsx_file.xlsx') sheet = wb['Sheet1'] # 这里按实际题目数量填写即可,不要用学员行数max_row question_count = 20 for i in range(question_count): # 显式命名工作表为Q1、Q2...避免重名冲突 wb.create_sheet(f'Q{i+1}') # 修正公式写法:调整括号位置、闭合括号,用单引号包字符串避免内部双引号转义 # 示例公式逻辑为取Sheet1的AC列从第2行开始的3行数据求平均,可根据你的实际需求调整OFFSET参数 wb['Q1']['B2'] = '=AVERAGE(OFFSET(INDIRECT("Sheet1!AC1"),1,0,3,1))' # 最后保存工作簿即可生效 wb.save(r'path_to_xlsx_file.xlsx')
方案2:直接用Python计算平均值(更稳定,无公式兼容问题)
不需要依赖Excel函数,直接在Python侧算完写入单元格,运行效率更高:
# 接上述基础读写逻辑,读取Sheet1的AC列得分数据,跳过表头从第2行开始取数 score_col = [cell.value for cell in sheet['AC'][1:]] avg_score = sum(score_col)/len(score_col) wb['Q1']['B2'] = avg_score wb.save(r'path_to_xlsx_file.xlsx')
内容的提问来源于stack exchange,提问作者TesfaETH
相关产品推荐
相关产品推荐

