使用openpyxl写入XLSM文件:设置单元格值不生效的解决办法
嘿,我明白你的困扰了——代码跑起来没报错,但目标单元格A1还是空空如也,对吧?咱们来拆解下问题,一步步修复:
首先排查最容易踩的坑:工作表索引搞错了
你代码里用了wb.worksheets[1],但Python里列表是0起始索引,这意味着你修改的是第二个工作表的A1单元格!如果你实际想改的是第一个工作表的A1,得改成wb.worksheets[0],或者更直观的用工作表名称调用,比如wb['Sheet1'](把Sheet1换成你实际的表名),这样就不会因为索引搞混工作表了。
处理XLSM文件必须加的参数:keep_vba=True
openpyxl默认处理xlsm(带宏的Excel文件)时会丢弃宏内容,而且如果不指定keep_vba=True,保存后的文件结构可能会出问题,导致你写入的数据无法正确持久化。哪怕你不需要保留宏,这个参数也能确保xlsm文件被正确读写。
还有个小细节:导入语句要对应
你代码里写了import openpyxl但直接调用load_workbook(),这其实会触发NameError(除非你实际代码里补了from openpyxl import load_workbook)。两种写法选一种就行:要么直接导入load_workbook,要么用openpyxl.load_workbook()调用。
修复后的完整代码
from openpyxl import load_workbook # 打开xlsm文件时指定keep_vba=True,确保文件结构正确 wb = load_workbook('Test.xlsm', keep_vba=True) # 选择第一个工作表(或者换成你要操作的表名,比如wb['Sheet1']) ws = wb.worksheets[0] # 给A1单元格赋值 ws.cell(row=1, column=1).value = 999999 # 保存文件 wb.save('Test.xlsm')
运行这段代码后,你再打开Test.xlsm的第一个工作表,A1应该就能看到999999啦!
内容的提问来源于stack exchange,提问作者nel_junior000




