使用editpyxl写入xlsx公式遇错误,寻求解决方案
解决editpyxl写入Excel公式的问题
问题根源
使用editpyxl 0.1.10写入公式时遇到两个核心限制:
- 空单元格报错:editpyxl仅识别Excel文件中实际存在的单元格(带内容、格式或公式的单元格),空单元格在OpenXML结构中不存在,直接调用
cell()会抛出IndexError。 - 类型不匹配报错:当单元格是普通文本/数值类型时,editpyxl不支持直接将其修改为公式类型,会抛出
AttributeError。
解决方案
方案1:使用editpyxl手动处理单元格创建与类型转换
由于editpyxl对单元格操作的限制,需要手动构建公式类型的单元格:
import editpyxl from lxml.etree import Element wb = editpyxl.Workbook() wb.open("test.xlsx") ws = wb['Sheet1'] ns_x = ws._nsmap['x'] sheet_data = ws._worksheet.find(f"{{{ns_x}}}sheetData") # 定位或创建第3行 row_elem = None for row in sheet_data.findall(f"{{{ns_x}}}row"): if row.get('r') == '3': row_elem = row break if not row_elem: row_elem = Element(f"{{{ns_x}}}row", r="3") sheet_data.append(row_elem) # 定位或创建C3公式单元格 cell_elem = None for cell in row_elem.findall(f"{{{ns_x}}}c"): if cell.get('r') == 'C3': cell_elem = cell break if not cell_elem: # 创建新的公式类型单元格 cell_elem = Element(f"{{{ns_x}}}c", r="C3", t="f") f_elem = Element(f"{{{ns_x}}}f") f_elem.text = "SUM(A2:A6)" cell_elem.append(f_elem) row_elem.append(cell_elem) else: # 转换现有单元格为公式类型 if cell_elem.get('t') != 'f': row_elem.remove(cell_elem) cell_elem = Element(f"{{{ns_x}}}c", r="C3", t="f") f_elem = Element(f"{{{ns_x}}}f") f_elem.text = "SUM(A2:A6)" cell_elem.append(f_elem) row_elem.append(cell_elem) else: # 直接修改已有公式 f_elem = cell_elem.find(f"{{{ns_x}}}f") f_elem.text = "SUM(A2:A6)" wb.save()
方案2:改用openpyxl(推荐)
editpyxl功能轻量,对公式的支持不完善。如果可以更换库,openpyxl是更成熟的选择,代码简洁且无上述限制:
import openpyxl wb = openpyxl.load_workbook("test.xlsx") ws = wb['Sheet1'] ws['C3'] = "=SUM(A2:A6)" wb.save("test.xlsx")
内容的提问来源于stack exchange,提问作者Fernandezaginer
相关产品推荐
相关产品推荐

