You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:15:37