2010年6月13日 星期日

ASP.NET 數個 Gridview 資料轉匯到同一個 Excel 檔中 - 不同分頁 - 使用 NPOI

使用的是 NPOI 的函示庫,你可以在下列 Ref 參考文件中找到更詳細的說明資料,我僅就運用例子作說明

Ref 0: http://npoi.codeplex.com/
Ref 1: http://msdn.microsoft.com/zh-tw/ee818993.aspx
Ref 2: http://pz0513.blog.51cto.com/443986/115553
Tutorials: http://npoi.codeplex.com/documentation
NPOI Library : Binary Download、Examples

** 必要載入與宣告 **

在 .NET 開發環境中,要將你所抓回來的 *.DLL 加入到參考。
在程式運用呼叫時,要載入函示庫
Imports NPOI.HSSF.UserModel
Imports System.IO

** 呼叫方式 **:因為採用 sub procedure 方式處理,所以在觸發點,我是利用 excel_array 來傳遞數個 Gridview 資料與要表現的內容參數,使其能在 sub 中順利列印
Dim excel_array(,) As String = {{"測試囉", "gridview1", "工作表的標題欄", "備註1"}, {"測試囉222", "gridview2", "工作表的標題欄222", "備註2"}}
npoi_excel(excel_array, "file_name.xls", 3) '資料陣列、檔名、Gridview 數量


** 副程式 npoi_excel 程式片段 **
Sub npoi_excel(ByVal excel_array As Array, ByVal filename As String, ByVal size As Integer) 'NPOI_Excel 多工作表匯出
Dim i, j, m As Integer '資料陣列、檔名、Gridview 數量
Dim gv(size) As GridView
Dim workbook As New HSSFWorkbook '使用 NPOI 函示庫 要載入 Imports NPOI.HSSF.UserModel
Dim ms As New MemoryStream
Dim mysheet(size) As HSSFSheet '定義工作頁
Dim up_row As Integer
Dim up_column As Integer '記錄 Gridview 的 Row 與 Column 上限
Dim region As NPOI.HSSF.Util.Region

For i = 0 To size - 1
mysheet(i) = workbook.CreateSheet(excel_array(i, 0))
gv(i) = New GridView
gv(i) = CType(FindControl(excel_array(i, 1)), GridView) '取得對應的 Gridview 物件
up_row = gv(i).Rows.Count - 1
up_column = gv(i).Columns.Count - 1

region = New NPOI.HSSF.Util.Region(0, 0, 0, up_column) '合併儲存格
mysheet(i).AddMergedRegion(region)
mysheet(i).CreateRow(0).CreateCell(0).SetCellValue(excel_array(i, 2)) '印 Caption

For m = 0 To up_row
For j = 0 To up_column
mysheet(i).CreateRow(m + 1).CreateCell(j).SetCellValue(gv(i).Rows(m).Cells(j).Text) '插入各個細項資料
Next
Next
'結尾提示文字,可以用以表現資料產出時間
mysheet(i).CreateRow(up_row + 3).CreateCell(0).SetCellValue("資料產出時間:" & Now.ToString) '時間記錄
mysheet(i).CreateRow(up_row + 4).CreateCell(0).SetCellValue(excel_array(i, 3)) '備註
Next

workbook.Write(ms)
Response.AddHeader("Content-Disposition", String.Format("attachment; filename=" & filename))
Response.BinaryWrite(ms.ToArray)
ms.Close()
ms.Dispose()
End Sub


註:以這種方式來產生 Excel 不會有 Rendercontrol 的錯誤,也不需要額外再加入一些程式片段,對於規則性的資料表現是相當不錯的方法。

缺點當然就是你在前端以 HTML TABEL 產出的資料部分,就無法輕易的轉匯到 Excel 工作表中。如要轉匯 Table 內容,並以迴圈插入值,需要以 ASP Table 來建立,關於這點改天再來說明。

原文轉載 http://blog.xuite.net/tolarku/blog/30309069

沒有留言:

張貼留言