NPOI一个不依赖Office安装程序的导入导出Excel与Word动态链接库,去年的时候在WPF(C/S)上用它做过一个数据库导入导出Excel的程序。前段时间看了看发现根本看不懂了。。。
记录一下NPOI在.Net中的使用心得吧。
功能说明:从数据库中获取一个DataTable导出成Excel并发送到客户端
主要步骤:
1、从数据库获取并完善DataTable内容(删除不必要的列新增必要的列)
2、生成*.xls文件并写入内存流
3、发送内存流到客户端,形成文件下载
详细说明:
1、获取数据源
直接调用SQL语句获取数据源DataTable就可以了,下面进行DataTable数据的维护。
// 获取数据源(注:数据源的来源不做详细说明)
DataTable data = CBLLTransportSendCar.GetSaleReport(time, dQueryDate, out strError);
// 删除不必要的列【 i 】为列索引从【0】开始
data.Columns.RemoveAt(i);
// 添加新列
data.Columns.Add("ColumnName",typeof(string)); 2、用NPOI创建Excel
先到NPOI官网下载【*.dll】动态链接库并引入到项目中(引用所有*.dll)
网址:
http://npoi.codeplex.com/ ; string[] strHead = {"Column1","Column2","Column3"}; MemoryStream ms = new MemoryStream(); try
{
IWorkbook workbook = new HSSFWorkbook(); // 创建Workbook对象
ISheet sheet = workbook.CreateSheet("Sheet1"); // 创建工作表
// 设置表头
IRow row = sheet.CreateRow(0); // 创建一行、指定行号为第一行
for (int i = 0; i < strHead.Length; i++)
{
ICell cell = row.CreateCell(i); // 创建一列
cell.SetCellValue(strHead[i]); // 设置列的内容
}
// 设置内容
for (int j = 0; j < dt.Rows.Count; j++)
{
IRow rowCotent = sheet.CreateRow(j + 1);
for (int i = 0; i < strHead.Length; i++)
{
ICell cell = rowCotent.CreateCell(i); // 创建一列
cell.SetCellValue(dt.Rows[j][i].ToString()); // 设置列的内容
}
}
workbook.Write(ms); // Excel写入内存流中
ms.Flush();
ms.Position = 0; // 指定内存流起始值
if (workbook != null)
{
workbook.Clear(); // 关闭
}
}
catch (Exception ex)
{
}
3、 发送流到客户端以形成下载文件行驶
如要是下载实体文件(即存放在服务器本地的文件)直接链接到文件的相对路径就可以了,但是此文中的Excel文件则是存放在内存流中,需要特殊处理。处理方式很简单,就是修改请求的报头就可以了,告诉协议“我发送的是一个文件你丫别把他当HTML输出了!”
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); // 设置流的字符编码,Windows的为【gb2312】
Response.ContentType = "application/octet-stream"; // 通知协议说我携带的是一个流不是HTML
Response.AppendHeader("Content-Disposition", "filename=" + strTitle + "销售报表.xls"); // 【filename】说明这个文件的文件名以及格式
Response.BinaryWrite(ms.GetBuffer()); // 从内存流中以无符号字节数组形式发送
2014-12-05补充
今天利用NPOI导出Excel的时候设计到了单元格的合并,很简单,只需要一个方法就可以了。我们先看一下想要的效果 代码:
IWorkbook workbook = new HSSFWorkbook(); // 创建Workbook对象
ISheet sheet = workbook.CreateSheet("Sheet1"); // 创建工作表
// 设置表头
IRow row = sheet.CreateRow(0); // 创建一行
ICell cell1 = row.CreateCell(0);
cell1.SetCellValue("机台号");
sheet.AddMergedRegion(new CellRangeAddress(0, 1, 0, 0)); // 设置合并单元格
sheet.AddMergedRegion(new CellRangeAddress(firstRowNumber, lastRowNumber, firstColumnNumber, lastRowNumber));
前两个参数表示从第几行到第几行合并,后两个参数表示从第几列到第几列合并!