NPOI一個不依賴Office安裝程序的導(dǎo)入導(dǎo)出Excel與Word動態(tài)鏈接庫,去年的時候在WPF(C/S)上用它做過一個數(shù)據(jù)庫導(dǎo)入導(dǎo)出Excel的程序。前段時間看了看發(fā)現(xiàn)根本看不懂了。。。
記錄一下NPOI在.Net中的使用心得吧。
功能說明:從數(shù)據(jù)庫中獲取一個DataTable導(dǎo)出成Excel并發(fā)送到客戶端
主要步驟:
1、從數(shù)據(jù)庫獲取并完善DataTable內(nèi)容(刪除不必要的列新增必要的列)
2、生成*.xls文件并寫入內(nèi)存流
3、發(fā)送內(nèi)存流到客戶端,形成文件下載
詳細(xì)說明:
1、獲取數(shù)據(jù)源
直接調(diào)用SQL語句獲取數(shù)據(jù)源DataTable就可以了,下面進(jìn)行DataTable數(shù)據(jù)的維護(hù)。
// 獲取數(shù)據(jù)源(注:數(shù)據(jù)源的來源不做詳細(xì)說明)
DataTable data = CBLLTransportSendCar.GetSaleReport(time, dQueryDate, out strError);
// 刪除不必要的列【 i 】為列索引從【0】開始
data.Columns.RemoveAt(i);
// 添加新列
data.Columns.Add("ColumnName",typeof(string)); 2、用NPOI創(chuàng)建Excel
先到NPOI官網(wǎng)下載【*.dll】動態(tài)鏈接庫并引入到項目中(引用所有*.dll)
網(wǎng)址:
http://npoi.codeplex.com/ ; string[] strHead = {"Column1","Column2","Column3"}; MemoryStream ms = new MemoryStream(); try
{
IWorkbook workbook = new HSSFWorkbook(); // 創(chuàng)建Workbook對象
ISheet sheet = workbook.CreateSheet("Sheet1"); // 創(chuàng)建工作表
// 設(shè)置表頭
IRow row = sheet.CreateRow(0); // 創(chuàng)建一行、指定行號為第一行
for (int i = 0; i < strHead.Length; i++)
{
ICell cell = row.CreateCell(i); // 創(chuàng)建一列
cell.SetCellValue(strHead[i]); // 設(shè)置列的內(nèi)容
}
// 設(shè)置內(nè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); // 創(chuàng)建一列
cell.SetCellValue(dt.Rows[j][i].ToString()); // 設(shè)置列的內(nèi)容
}
}
workbook.Write(ms); // Excel寫入內(nèi)存流中
ms.Flush();
ms.Position = 0; // 指定內(nèi)存流起始值
if (workbook != null)
{
workbook.Clear(); // 關(guān)閉
}
}
catch (Exception ex)
{
}
3、 發(fā)送流到客戶端以形成下載文件行駛
如要是下載實體文件(即存放在服務(wù)器本地的文件)直接鏈接到文件的相對路徑就可以了,但是此文中的Excel文件則是存放在內(nèi)存流中,需要特殊處理。處理方式很簡單,就是修改請求的報頭就可以了,告訴協(xié)議“我發(fā)送的是一個文件你丫別把他當(dāng)HTML輸出了!”
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); // 設(shè)置流的字符編碼,Windows的為【gb2312】
Response.ContentType = "application/octet-stream"; // 通知協(xié)議說我攜帶的是一個流不是HTML
Response.AppendHeader("Content-Disposition", "filename=" + strTitle + "銷售報表.xls"); // 【filename】說明這個文件的文件名以及格式
Response.BinaryWrite(ms.GetBuffer()); // 從內(nèi)存流中以無符號字節(jié)數(shù)組形式發(fā)送
2014-12-05補(bǔ)充
今天利用NPOI導(dǎo)出Excel的時候設(shè)計到了單元格的合并,很簡單,只需要一個方法就可以了。我們先看一下想要的效果 代碼:
IWorkbook workbook = new HSSFWorkbook(); // 創(chuàng)建Workbook對象
ISheet sheet = workbook.CreateSheet("Sheet1"); // 創(chuàng)建工作表
// 設(shè)置表頭
IRow row = sheet.CreateRow(0); // 創(chuàng)建一行
ICell cell1 = row.CreateCell(0);
cell1.SetCellValue("機(jī)臺號");
sheet.AddMergedRegion(new CellRangeAddress(0, 1, 0, 0)); // 設(shè)置合并單元格
sheet.AddMergedRegion(new CellRangeAddress(firstRowNumber, lastRowNumber, firstColumnNumber, lastRowNumber));
前兩個參數(shù)表示從第幾行到第幾行合并,后兩個參數(shù)表示從第幾列到第幾列合并!