使用C# SpreadsheetLight保存后Excel文件损坏问题求助
问题修复方案
核心问题分析
你的代码导致Excel文件损坏的主要原因有3个:
- 提前关闭FileStream:创建SLDocument后立即关闭文件流,SpreadsheetLight尚未完整读取或缓存文件内容,导致文档数据不完整。
- 路径转义错误:保存路径里的反斜杠未转义,导致实际保存路径解析异常,生成的文件结构损坏。
- 无效操作干扰文档状态:
writeRow方法里的空循环、无意义的工作表遍历操作,破坏了文档的正常结构。
具体修复步骤
1. 修复文件流读取逻辑
把init方法里的文件流操作改为直接用文件名构造SLDocument(避免手动管理流的生命周期):
public bool init(string _file_name) { this.file_name = _file_name; try { // 直接用文件名初始化,避免流关闭过早导致的数据不完整 this.doc = new SLDocument(this.file_name); this.sheets = doc.GetSheetNames(); } catch (IOException) { MessageBox.Show("Fisierul este deschis de un alt utilizator. Nu poate fi accesat!!!!"); return false; } return true; }
2. 修复writeRow方法的无效操作与路径问题
删除无用代码,实际写入单元格值,并修复路径转义问题:
public bool writeRow(string[] data, string sheet, int row) { if (!this.sheets.Contains(sheet)) return false; this.doc.SelectWorksheet(sheet); // 实际执行单元格写入操作 for (int i = 0; i < data.Length; i++) { this.doc.SetCellValue(row, i + 1, data[i]); } this.doc.DocumentProperties.Creator = "CP"; // 使用@符号避免路径转义错误,或改用双反斜杠 string savePath = @"E:\C-SHARP\PONTAJ\PONTAJ\BUBU.XLSX"; this.doc.SaveAs(savePath); MessageBox.Show("Saved!"); return true; }
3. 清理无用变量
删除代码中未使用的MemoryStream ms变量,避免混淆逻辑。
额外注意事项
- 确保使用最新版本的SpreadsheetLight,旧版本可能存在Office Open XML格式兼容性问题。
- 源文件尽量使用标准
.xlsx格式,避免残留.xlsm的宏相关结构,导致Excel校验文件时失败。 - 操作完成后,记得调用
doc.Dispose()释放资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Petrescu Cristian
相关产品推荐
相关产品推荐

