[摘 要] 在基于B/S結構進行開發的應用系統中,“文件導出”是一項很重要的功能,利用它可以導出相關的業務數據,以便進行資料保存或者不同業務間的數據交互。本文就如何利用NPOI導出一個真正的Excel文件進行研究與分析。
[關鍵詞] NPOI; 導出; Excel文件
doi : 10 . 3969 / j . issn . 1673 - 0194 . 2013 . 15. 061
[中圖分類號] TP294 [文獻標識碼] A [文章編號] 1673 - 0194(2013)15- 0093- 02
1 導出Excel文件的傳統方法
在進行Excel文件導出時,傳統的方法一般都是利用Excel程序自身能夠識別網頁中的表格內容這種特性來實現的。當Web服務程序在響應客戶端瀏覽請求時,先輸出MIME類型,然后輸出表格等HTML內容。比如(以C #代碼為例):
Response.Clear();
Response.Buffer = 1;
Response.AddHeader(\"Content-Disposition\",\"attachment;filename=test.xls\");
Response.ContentType =\"application/ms-excel\";
StringWriter sw= new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
GridView1.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();
其中GridView1為Web服務端的GridView控件的ID。利用此方法的前提是需要重載VerifyRenderingInServerForm函數,取消其函數內容。
通過這種方法,可以將Web頁面中的表格內容以HTML代碼的方式輸出到客戶端瀏覽器,并提示保存名為test.xls的Excel文件。用記事本打開該文件,會發現其內容是HTML標記的網頁文件,并非真正的二進制Excel文件。
2 Excel文件導出的其他幾種可行方法
想要導出真正的二進制Excel文件,一是可以利用Excel應用程序對象創建Excel文件,然后輸出二進制流到客戶端瀏覽器進行保存;二是可以利用第三方的Excel類庫,比如MyXlS、Koogra和NPOI等,直接生成二進制的Excel文件,然后輸出二進制流到客戶端瀏覽器進行保存。
利用Excel程序對象創建Excel文件首先要添加Microsoft.Office.Interop.Excel引用,并在代碼中添加引用using Microsoft.Office.Interop.Excel ,然后新建一個ApplicationClass 實例,通過Excel應用程序實例進行相關的Excel文件操作,將創建的臨時Excel文件讀到內存流中,然后以二進制方式輸出,并在最后將此實例釋放。
使用Excel應用程序對象創建Excel文件,需要在服務器端安裝Office,而且還需要設定權限允許.NET訪問COM+,并且在服務器端會看到Excel程序窗口一閃而過,當然可以讓程序窗口不顯示,但是任務管理器里還是會有Excel程序的進程,如果多個用戶同時請求導出Excel文件,會產生多個Excel程序的進程,消耗過多的服務器資源,可能導致服務器宕機。另外Excel程序會把只包含數字的列進行類型轉換,原本是文本型的,Excel程序會將其轉成數值型,比如000123會變成123。如果內容以“=”開頭,Excel程序還會把它當成公式執行,然后報錯等,不便于原始格式Excel的生成。
使用第三方Excel類庫的優勢就是不需要在服務器上安裝微軟的Office,避免版權問題,而且使用起來比Office PIA的API更加方便,更人性化,但幾種Excel類庫各有千秋。比如MyXlS 是一個免費開源的類庫,側重于Excel的輸出。可以設置到單個單元格,但讀取功能很弱。Koogra與MyXlS恰恰相反,是一個非常好用Excel讀取類庫,其最新版可以支持Excel 2007格式,可是在測試過程中發現Koogra讀不了MyXlS輸出的XLS文件。而NPOI不僅支持導出Excel,還支持導入Excel,并能“理解”OLE2文檔結構。對于Excel文件來講,NPOI不單是能創建Excel文件,而且能更深入地執行Excel文件的各種操作,比如支持單元格的格式設置、合并單元格、對齊設置、使用邊框、字體設置、背景和紋理設置、寬度和高度設置等,還能使用Excel公式、創建圖形、設置打印機屬性、鎖定列、設置密碼等多項操作。
3 利用NPOI導出Excel文件的實現
基于上述分析,我們使用NPOI類庫實現Excel文件的導出。該類庫是POI的.NET版本。POI是一套用Java寫成的庫,能夠幫助開發者在沒有安裝微軟Office的情況下讀寫Office 97、Office 2003版本的文件。最新的NPOI有.Net 2.0、3.5和4.0三個版本,支持Excel、Word的97、2003和2007格式。
利用NPOI實現Excel文件導出的步驟:
3.1 添加NPOI的引用
先在項目工程里引用NPOI.DLL,然后在代碼開始處添加引用:
using NPOI.SS.Util;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
3.2 創建工作簿
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
Sheet sheet1= hssfworkbook.CreateSheet(title);//創建標題為title內容的工作簿
3.3 設置單元格樣式
………
Row row1 = sheet1.CreateRow(0);//創建行對象
Cell cell1 = row1.CreateCell(0);//根據行對象創建單元格對象
CellStyle style = hssfworkbook.CreateCellStyle();//創建樣式對象
Font font = hssfworkbook.CreateFont();//創建字體對象
style.Alignment = HorizontalAlignment.CENTER;//設置水平居中
style.VerticalAlignment = VerticalAlignment.CENTER;//設置垂直居中
font.FontHeight = 18 * 20;//設置字體
style.SetFont(font);//設置樣式的字體
cell1.CellStyle = style;//設置單元格的樣式
………
3.4 合并相關單元格
………
CellRangeAddress region = new CellRangeAddress(0, 0, 0, 11);//設置合并區域為0行0列到0行11列
sheet1.AddMergedRegion(region);//為工作簿sheet1添加合并區域
………
3.5 單元格賦值
………
string title = \"2013年度教學任務分配表\";
cell1.SetCellValue(title);//為單元格賦值
………
3.6 導出Excel文件
………
MemoryStream s = new MemoryStream();
hssfworkbook.Write(s);
hssfworkbook.Dispose();
Response.Clear();
Response.Buffer = 1;
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader(\"Content-Disposition\",\"attachment;filename=\" +Server.UrlEncode(\"教學任務分配表.xls\"));
Response.BinaryWrite(s.ToArray());
s.Dispose();
Response.End();