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

C#中如何使用ClosedXML生成Excel后通过SharpZipLib压缩文件?

C# 使用SharpZipLib压缩ClosedXML生成的Excel实现方案

前置准备

  • 通过NuGet包管理器安装依赖库:ICSharpCode.SharpZipLib
  • 先修正你原有代码的两处错误:
    1. XLWorkbook实例命名为ts,后续调用SaveAs方法时误用了不存在的变量wb,需要统一变量名
    2. 原有代码中XLWorkbook的using块结束后对象已释放,后续无法调用SaveAs方法,需要将MemoryStream的逻辑移到XLWorkbook的using块内部

完整修改后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:00:02