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));
前兩個參數表示從第幾行到第幾行合并,后兩個參數表示從第幾列到第幾列合并!