使用xlsxwriter写入Excel SUMIFS公式时的引号处理问题
问题描述
使用xlsxwriter库编写Python脚本向Excel文件写入SUMIFS公式时触发异常,初步怀疑问题与Python字符串的引号处理规则相关,暂未确认根因。
需要写入的目标公式如下:
=SUMIFS('datasheet'!N:N,'datasheet'!D:D,'Sch B'!B:B,'datasheet'!J:J,"G")
基于xlsxwriter官方文档提供的示例代码修改时,在代码第23行添加上述SUMIFS公式的环节,公式中条件值"G"对应的引号部分出现语法/写入异常,可复现问题的完整代码如下:
import xlsxwriter # Create a workbook and add a worksheet. workbook = xlsxwriter.Workbook('output.xlsx') worksheet = workbook.add_worksheet() # Some data we want to write to the worksheet. expenses = ( ['Rent', 1000], ['Gas', 100], ['Food', 300], ['Gym', 50], ) # Start from the first cell. Rows and columns are zero indexed. row = 0 col = 0 # Iterate over the data and write it out row by row. for item, cost in expenses: worksheet.write(row, col, item) worksheet.write(row, col + 1, cost) worksheet.write_formula(row, col + 2, "=SUMIFS('datasheet'!N:N,'datasheet'!D:D,'Sch B '!B:B,'datasheet'!J:J,"G")") row += 1 workbook.close()
问题根因
异常由两个问题共同导致:
- Python字符串语法冲突:传入
write_formula方法的公式整体用双引号"包裹,而公式内部表示文本条件的"G"也使用了双引号,Python解析时会把,"G"位置的第一个双引号识别为外层字符串的结束标记,后续的G")"会被识别为非法语法,直接触发报错。 - 工作表名拼写错误:问题代码里的工作表名写为
'Sch B '(末尾多了一个空格),和目标公式里的'Sch B'不一致,即使解决语法问题,打开Excel后公式也会报引用错误。
解决方案
修复字符串转义问题、修正工作表名拼写即可,两种常用写法可选:
- 写法1:保留外层双引号包裹公式,对公式内部的双引号加反斜杠
\转义,告诉Python这是字符串内部的普通字符,核心代码行如下:worksheet.write_formula(row, col + 2, "=SUMIFS('datasheet'!N:N,'datasheet'!D:D,'Sch B'!B:B,'datasheet'!J:J,\"G\")") - 写法2:改用单引号包裹整个公式字符串,此时内部的双引号不需要额外转义,注意公式里包裹工作表名的单引号需要加反斜杠转义即可,核心代码行如下:
worksheet.write_formula(row, col + 2, '=SUMIFS(\'datasheet\'!N:N,\'datasheet\'!D:D,\'Sch B\'!B:B,\'datasheet\'!J:J,"G")')
修复后的完整可运行代码:
import xlsxwriter # 创建工作簿和工作表 workbook = xlsxwriter.Workbook('output.xlsx') worksheet = workbook.add_worksheet() # 待写入的测试数据 expenses = ( ['Rent', 1000], ['Gas', 100], ['Food', 300], ['Gym', 50], ) # 从首个单元格开始写入,行列索引从0开始计数 row = 0 col = 0 # 逐行写入数据和公式 for item, cost in expenses: worksheet.write(row, col, item) worksheet.write(row, col + 1, cost) worksheet.write_formula(row, col + 2, "=SUMIFS('datasheet'!N:N,'datasheet'!D:D,'Sch B'!B:B,'datasheet'!J:J,\"G\")") row += 1 workbook.close()
运行代码生成的Excel文件中,公式可正常计算,无语法报错或引用错误。
内容的提问来源于stack exchange,提问作者Chandler Shores
相关产品推荐
相关产品推荐

