XLSX.jl读写Excel报错:XLSXFile实例不可写入问题求助
解决XLSX.jl中readxlsx读取后无法用writexlsx写入的问题
问题原因
XLSX.readxlsx返回的是只读状态的XLSXFile实例,这个方法仅用于解析读取Excel文件内容,不会初始化写入所需的内部结构,因此直接传入XLSX.writexlsx会触发"XLSXFile instance is not writable"断言错误。
官方推荐的替代方案(替换即将弃用的mode=rw)
目前XLSX.jl官方推荐使用XLSX.openxlsx搭配read=true, write=true参数,通过do块直接在打开的文件句柄中修改内容,退出块时自动保存修改,这是最适合小幅修改场景的方式:
using XLSX # 打开文件并启用读写模式,do块自动管理资源 XLSX.openxlsx("Dummy1.xlsx", read=true, write=true) do xf # 定位到目标工作表 target_sheet = xf["Mock-up"] # 执行小幅修改:更新单个单元格值 target_sheet["B3"] = "更新后的内容" # 退出do块时自动保存修改,无需手动调用writexlsx end
若需先读取再写入新文件的方案
如果需要基于原文件创建修改后的副本,可以提取原文件的数据,重新构建可写入的工作簿实例:
using XLSX # 读取原文件(只读) original_file = XLSX.readxlsx("Dummy1.xlsx") # 创建新文件并写入修改后的内容 XLSX.writexlsx("testXLSX.xlsx") do new_file # 遍历原文件所有工作表 for sheet_name in XLSX.sheetnames(original_file) original_sheet = original_file[sheet_name] # 在新文件中创建同名工作表 new_sheet = XLSX.addsheet!(new_file, sheet_name) # 复制原工作表的所有数据 new_sheet["A1:$(original_sheet.dimension.end)"] = original_sheet[:] # 执行修改操作,例如更新C5单元格 new_sheet["C5"] = 2024 end end
总结
- 小幅修改现有文件:优先使用
XLSX.openxlsx(read=true, write=true)的do块方式,这是官方替代mode=rw的标准写法,高效且自动处理资源。 - 创建修改后的副本:需要提取原文件数据,重新构建可写入的工作簿结构,再执行修改和保存。
内容的提问来源于stack exchange,提问作者Tim Gebbels
相关产品推荐
相关产品推荐

