NPOI+SharpZipLib实现压缩多个Excel下载

简介:

导出excel是再常见不过的功能,其中NPOI是我一直使用的导出excel的框架。你可以猛击这里了解NPOI,最近有这样一个需求,当我想一次性导出多个excel文件时。我想在内存里面压缩后输出到浏览器进行下载。由此接触到了另外一个框架SharpZipLib,猛击这里了解。demo的代码贴在这里,以备后面查阅。

复制代码
using System;
using System.IO;
using NPOI.HSSF.UserModel;
using NPOI.HPSF;
using NPOI.SS.UserModel;

using ICSharpCode.SharpZipLib.Zip;

namespace NpoiAndZip
{
public partial class ExportDownloadExcel : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}

protected void btnOK_Click(object sender, EventArgs e)
{
string filename = "test.zip";
Response.ContentType = "application/zip";
Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", filename));
Response.Clear();

InitializeWorkbook();
GenerateData();
MemoryStream ms1 = new MemoryStream();
MemoryStream ms2=new MemoryStream();
MemoryStream ms3=new MemoryStream();
ms1 = WriteToStream(hssfworkbook);
ms2 = WriteToStream(hssfworkbook2);
ms3 = WriteToStream(hssfworkbook3);
MemoryStream st = new MemoryStream();
using (ZipFile zip = ZipFile.Create(st))
{
zip.BeginUpdate();
StreamDataSource d1=new StreamDataSource(ms1);
StreamDataSource d2 = new StreamDataSource(ms2);
StreamDataSource d3 = new StreamDataSource(ms3);
//添加文件
zip.Add(d1, "test1.xls");
zip.Add(d2, "test2.xls");
zip.Add(d3, "test3.xls");
zip.CommitUpdate();
}
Response.BinaryWrite(st.GetBuffer());
Response.End();
}

HSSFWorkbook hssfworkbook;
HSSFWorkbook hssfworkbook2;
HSSFWorkbook hssfworkbook3;
MemoryStream WriteToStream(HSSFWorkbook workbook)
{
//Write the stream data of workbook to the root directory
MemoryStream file = new MemoryStream();
workbook.Write(file);
return file;
}

void GenerateData()
{
ISheet sheet1 = hssfworkbook.CreateSheet("Sheet1");
ISheet sheet2 = hssfworkbook2.CreateSheet("Sheet1");
ISheet sheet3 = hssfworkbook3.CreateSheet("Sheet1");
sheet1.CreateRow(0).CreateCell(0).SetCellValue("This is a Sample");
sheet2.CreateRow(0).CreateCell(0).SetCellValue("This is a Sample");
sheet3.CreateRow(0).CreateCell(0).SetCellValue("This is a Sample");
int x = 1;
for (int i = 1; i <= 15; i++)
{
IRow row = sheet1.CreateRow(i);
for (int j = 0; j < 15; j++)
{
row.CreateCell(j).SetCellValue(x++);
}
}
for (int i = 1; i <= 15; i++)
{
IRow row = sheet2.CreateRow(i);
for (int j = 0; j < 15; j++)
{
row.CreateCell(j).SetCellValue(x++);
}
}
for (int i = 1; i <= 15; i++)
{
IRow row = sheet3.CreateRow(i);
for (int j = 0; j < 15; j++)
{
row.CreateCell(j).SetCellValue(x++);
}
}
}

void InitializeWorkbook()
{
hssfworkbook = new HSSFWorkbook();
hssfworkbook2 = new HSSFWorkbook();
hssfworkbook3 = new HSSFWorkbook();
////create a entry of DocumentSummaryInformation
DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company = "NPOI Team";
hssfworkbook.DocumentSummaryInformation = dsi;

////create a entry of SummaryInformation
SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
si.Subject = "NPOI SDK Example";
hssfworkbook.SummaryInformation = si;

////create a entry of DocumentSummaryInformation
DocumentSummaryInformation dsi2 = PropertySetFactory.CreateDocumentSummaryInformation();
dsi2.Company = "NPOI Team";
hssfworkbook2.DocumentSummaryInformation = dsi2;

////create a entry of SummaryInformation
SummaryInformation si2 = PropertySetFactory.CreateSummaryInformation();
si2.Subject = "NPOI SDK Example";
hssfworkbook2.SummaryInformation = si2;

////create a entry of DocumentSummaryInformation
DocumentSummaryInformation dsi3 = PropertySetFactory.CreateDocumentSummaryInformation();
dsi3.Company = "NPOI Team";
hssfworkbook3.DocumentSummaryInformation = dsi3;

////create a entry of SummaryInformation
SummaryInformation si3 = PropertySetFactory.CreateSummaryInformation();
si3.Subject = "NPOI SDK Example";
hssfworkbook3.SummaryInformation = si3;
}
}

//只有实现IStaticDataSource接口才能实现流操作
class StreamDataSource : IStaticDataSource
{
public byte[] bytes { get; set; }
public StreamDataSource(MemoryStream ms)
{
bytes = ms.GetBuffer();
}

public Stream GetSource()
{
Stream s = new MemoryStream(bytes);
return s;
}
}
}
复制代码
相关文章
|
28天前
|
数据格式 UED
记录一次NPOI库导出Excel遇到的小问题解决方案
【11月更文挑战第16天】本文记录了使用 NPOI 库导出 Excel 过程中遇到的三个主要问题及其解决方案:单元格数据格式错误、日期格式不正确以及合并单元格边框缺失。通过自定义单元格样式、设置数据格式和手动添加边框,有效解决了这些问题,提升了导出文件的质量和用户体验。
160 3
|
1月前
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
99 8
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
51 4
|
2月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
2月前
|
前端开发 JavaScript
💥【exceljs】纯前端如何实现Excel导出下载和上传解析?
本文介绍了用于处理Excel文件的库——ExcelJS,相较于SheetJS,ExcelJS支持更高级的样式自定义且易于使用。表格对比显示,ExcelJS在样式设置、内存效率及流式操作方面更具优势。主要适用于Node.js环境,也支持浏览器端使用。文中详细展示了如何利用ExcelJS实现前端的Excel导出下载和上传解析功能,并提供了示例代码。此外,还提供了在线调试的仓库链接和运行命令,方便读者实践。
417 5
|
3月前
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
50 6
|
5月前
|
JSON JavaScript 数据格式
vue 电子表格Excel的上传导入、导出下载、读取本地Excel、json转Excel
vue 电子表格Excel的上传导入、导出下载、读取本地Excel、json转Excel
384 0
|
19天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
2月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
143 4
|
4月前
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
51 0