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;
}
}
}
复制代码

相关文章
|
2月前
|
JavaScript 前端开发
【导出Excel】Vue实现导出下载Excel文件(blob文件流)--亲测可用
【导出Excel】Vue实现导出下载Excel文件(blob文件流)--亲测可用
【导出Excel】Vue实现导出下载Excel文件(blob文件流)--亲测可用
|
2月前
|
前端开发 数据库
node使用node-xlsx实现excel的下载与导入,保证你看的明明白白
node使用node-xlsx实现excel的下载与导入,保证你看的明明白白
|
2月前
|
JSON Rust 前端开发
【sheetjs】纯前端如何实现Excel导出下载和上传解析?
本文介绍了如何使用`sheetjs`的`xlsx`库在前端实现Excel的导出和上传。项目依赖包括Vite、React、SheetJS和Arco-Design。对于导出,从后端获取JSON数据,通过`json_to_sheet`、`book_new`和`writeFile`函数生成并下载Excel文件。对于上传,使用`read`函数将上传的Excel文件解析为JSON并发送至后端。完整代码示例可在GitHub仓库[fullee/sheetjs-demo](https://github.com/fullee/sheetjs-demo)中查看。
92 10
|
2月前
|
C#
C#NPOI操作Excel详解
C#NPOI操作Excel详解
136 0
|
2月前
|
数据库
关于用NPOI导入Excel
关于用NPOI导入Excel
|
2月前
|
JavaScript 前端开发
vue下载Excel文件
vue下载Excel文件
|
2月前
|
JavaScript 前端开发
原生JavaScript JS导出blob后台文件流xlsx、xls文件自动下载(且规避乱码),解决导出Excel文件里面有[object Object]。
原生JavaScript JS导出blob后台文件流xlsx、xls文件自动下载(且规避乱码),解决导出Excel文件里面有[object Object]。
|
2月前
|
前端开发 Java
基于Java爬取微博数据(二) 正文长文本+导出数据Excel
【5月更文挑战第12天】基于Java爬取微博数据,正文长文本+导出数据Excel
|
2月前
|
Java
java导出复杂excel
java导出复杂excel