Response.End()后无法执行剩余代码的替代方案?多Excel生成问题
解决思路与代码方案
你遇到的问题核心就是Response.End()——这个方法会立刻终止当前请求的响应流程,所以第一个Excel生成后,后续调用GenerateExcelSheet(dtSplit)的代码根本没机会执行。要实现下载两个Excel相关文件,有两种实用方案:
方案1:生成含两个工作表的单个Excel文件(推荐)
原来用HTML输出模拟Excel的方式只能生成单工作表,改用专业的Excel操作库(比如EPPlus)就能在一个文件里创建多个工作表,一次性完成下载。
代码实现
首先通过NuGet安装EPPlus包,然后替换原有代码:
if (dt.Rows.Count > 0 || dtSplit.Rows.Count > 0) { GenerateMultiSheetExcel(dt, dtSplit); } private void GenerateMultiSheetExcel(DataTable dt, DataTable dtSplit) { string fileName = $"Foodlist-{DateTime.Now.ToString("ddMMMyyyy-hh:mm:tt")}.xlsx"; Response.ClearContent(); Response.Buffer = true; Response.AddHeader("content-disposition", $"attachment; filename={fileName}"); Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; using (var package = new ExcelPackage()) { // 添加第一个工作表 if (dt.Rows.Count > 0) { var worksheet = package.Workbook.Worksheets.Add("主列表"); worksheet.Cells["A1"].LoadFromDataTable(dt, true); // 可按需添加样式设置,比如自动调整列宽:worksheet.Cells.AutoFitColumns(); } // 添加第二个工作表 if (dtSplit.Rows.Count > 0) { var worksheet = package.Workbook.Worksheets.Add("拆分列表"); worksheet.Cells["A1"].LoadFromDataTable(dtSplit, true); } // 将Excel内容写入响应流 package.SaveAs(Response.OutputStream); } Response.End(); }
这种方式用户只需下载一个文件,打开后就能看到两个工作表,既避免了浏览器拦截多次下载的问题,体验也更流畅。
方案2:生成两个独立Excel并打包为ZIP下载
如果必须要两个单独的Excel文件,可以把它们打包成ZIP压缩包后再输出给用户。
代码实现
if (dt.Rows.Count > 0 || dtSplit.Rows.Count > 0) { GenerateZippedExcels(dt, dtSplit); } private void GenerateZippedExcels(DataTable dt, DataTable dtSplit) { string zipFileName = $"Foodlists-{DateTime.Now.ToString("ddMMMyyyy-hh:mm:tt")}.zip"; Response.ClearContent(); Response.Buffer = true; Response.AddHeader("content-disposition", $"attachment; filename={zipFileName}"); Response.ContentType = "application/zip"; using (var memoryStream = new MemoryStream()) { using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) { // 生成第一个Excel并加入ZIP if (dt.Rows.Count > 0) { var entry = archive.CreateEntry($"Foodlist-{DateTime.Now.ToString("ddMMMyyyy-hh:mm:tt")}.xls"); using (var entryStream = entry.Open()) using (var writer = new StreamWriter(entryStream)) { // 复用你原有生成Excel表格的逻辑 writer.Write("<table>"); // 此处填充第一个DataTable的表格内容 writer.Write("</table>"); } } // 生成第二个Excel并加入ZIP if (dtSplit.Rows.Count > 0) { var entry = archive.CreateEntry($"Foodlist-Split-{DateTime.Now.ToString("ddMMMyyyy-hh:mm:tt")}.xls"); using (var entryStream = entry.Open()) using (var writer = new StreamWriter(entryStream)) { writer.Write("<table>"); // 此处填充第二个DataTable的表格内容 writer.Write("</table>"); } } } // 将ZIP内容写入响应流 memoryStream.Position = 0; memoryStream.CopyTo(Response.OutputStream); } Response.End(); }
用户下载ZIP包后,解压就能得到两个独立的Excel文件。如果介意HTML模拟Excel的格式提示,也可以用EPPlus生成标准.xlsx文件后再打包。
内容的提问来源于stack exchange,提问作者Prageeth Liyanage
相关产品推荐
相关产品推荐

