使用EPPlus加载xlsm文件填充数据后Excel提示文件损坏
问题分析与解决
你的代码存在两个核心问题导致Excel提示文件损坏:
- Stream已被释放:
using var package会在方法执行完毕后自动释放package实例,此时返回的package.Stream已经处于不可用状态,Excel无法读取完整的文件内容。 - 未正确保存修改后的内容:直接返回原模板流,没有将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
相关产品推荐
相关产品推荐

