C#中如何使用ClosedXML生成Excel后通过SharpZipLib压缩文件?
C# 使用SharpZipLib压缩ClosedXML生成的Excel实现方案
前置准备
- 通过NuGet包管理器安装依赖库:
ICSharpCode.SharpZipLib - 先修正你原有代码的两处错误:
- XLWorkbook实例命名为
ts,后续调用SaveAs方法时误用了不存在的变量wb,需要统一变量名 - 原有代码中XLWorkbook的using块结束后对象已释放,后续无法调用SaveAs方法,需要将MemoryStream的逻辑移到XLWorkbook的using块内部
- XLWorkbook实例命名为
完整修改后的代码
using ICSharpCode.SharpZipLib.Zip; using ClosedXML.Excel; using System.Data; using System.IO; public FileResult Export() { DataTable test = new DataTable("test"); test.Columns.AddRange(new DataColumn[] { new DataColumn("Name") }); foreach (var record in recordtest) { test.Rows.Add(record.name); } using (XLWorkbook ts = new XLWorkbook()) { var testSheet = ts.Worksheets.Add(test); testSheet.Cell("D4").Value = "First Name"; testSheet.Range("A4:A5").Merge(); testSheet.Range("A4:Q5").Columns().Style.Fill.BackgroundColor = XLColor.Almond; using (MemoryStream excelStream = new MemoryStream()) { // 将生成的Excel写入内存流 ts.SaveAs(excelStream); // 生成压缩包 using (MemoryStream zipStream = new MemoryStream()) { using (ZipOutputStream zipOutput = new ZipOutputStream(zipStream)) { // 设置压缩级别 0-9,数字越大压缩比越高、耗时越长 zipOutput.SetLevel(6); // 定义压缩包内的Excel文件名 string excelFileName = string.Format("test-{0:yyyyMMdd}.xlsx", DateTime.Now); ZipEntry entry = new ZipEntry(excelFileName); entry.DateTime = DateTime.Now; zipOutput.PutNextEntry(entry); // 将Excel流写入压缩包 excelStream.Position = 0; excelStream.CopyTo(zipOutput); zipOutput.CloseEntry(); zipOutput.Finish(); // 返回压缩包文件 string zipFileName = string.Format("test-{0:yyyyMMdd}.zip", DateTime.Now); return File(zipStream.ToArray(), "application/zip", zipFileName); } } } } }
核心逻辑说明
- 原有生成Excel的业务逻辑完全不需要修改,仅调整最终输出环节的处理
ZipEntry对应的名称就是用户解压压缩包后看到的Excel文件名称,可根据需求自定义- 所有流操作都用
using包裹,自动释放资源避免内存泄漏
内容的提问来源于stack exchange,提问作者ericso
相关产品推荐
相关产品推荐

