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

使用EPPlus加载xlsm文件填充数据后Excel提示文件损坏

问题分析与解决

你的代码存在两个核心问题导致Excel提示文件损坏:

  1. Stream已被释放:using var package会在方法执行完毕后自动释放package实例,此时返回的package.Stream已经处于不可用状态,Excel无法读取完整的文件内容。
  2. 未正确保存修改后的内容:直接返回原模板流,没有将EPPlus修改后的内容写入到一个新的可读取流中,导致文件内容不完整。

修正后的代码

数据填充方法

public Stream PopulateTemplateWithData()
{
    // 创建新的内存流用于保存修改后的文件
    var outputStream = new MemoryStream();
    // 将原模板流复制到临时流,避免原流被占用
    _templateStream.CopyTo(outputStream);
    _templateStream.Position = 0; // 重置原流位置,防止后续复用出错

    using var package = new ExcelPackage(outputStream);
    var propName = package.Workbook.Names[PROP];
    var propWorksheet = propName.Worksheet;
    var propCell = propWorksheet.Cells[propName.Start.Row, propName.Start.Column];
    propCell.Value = _inputData.Prop;

    // 将修改后的内容保存到输出流
    package.Save();
    // 重置流的起始位置,确保下载时从开头读取
    outputStream.Position = 0;
    return outputStream;
}

控制器方法

public IActionResult DownloadPopulatedWorkbook()
{
    var stream = PopulateTemplateWithData();
    // 确保返回的Content-Type正确,也可使用"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.macroenabled.12"
    return File(stream, "application/vnd.ms-excel.sheet.macroenabled.12", "example.xlsm");
}

额外注意事项

  • 确保_templateStream在每次使用时都处于起始位置(Position = 0),避免因流位置偏移导致读取不完整。
  • EPPlus不会修改xlsm文件中的宏内容,仅处理单元格数据,若宏存在依赖逻辑需确保数据填充符合宏的预期。

内容的提问来源于stack exchange,提问作者Sean Ivins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:34:54