擴展 GridView 控制項 - 支援 Excel 及 Word 匯出
摘要
GridView 匯出 Excel 及 Word 文件是蠻常使用的需求,此篇文章將擴展 GridView 控制項提供匯出 Excel 及 Word 文件的方法。一般在 GridView 匯出的常見下列問題也會在此一併被解決。
GridView 匯出的常見問題:
問題1. GridView 使用 RenderControl 方法產生的錯誤。
問題2. GridView 分頁的問題。
問題3. 匯出檔案名稱產生亂碼的問題。
問題4. 匯出內容產生亂碼的問題。
解決 GridView 匯出問題
我們先針對 GridView 匯出的問題,逐一處理解決
問題1. GridView 使用 RenderControl 方法產生的錯誤。
此問題參考上篇「使用 BasePage 來解決 GridView 執行 RenderControl 產生的錯誤」來解決。
問題2. GridView 分頁的問題。
在執行匯出時,若 GridView 有使用分頁(AllowPaging=True),則採下列步驟處理。
Step1.取消分頁,即設定 GridView.AllowPaging=False。
Step2.GridView 執行 DataBind,使其重新繫結所有資料,再使用 RenderCotnrol 輸出 HTML 程式碼。
Step3.還原分頁,即設定 GridView.AllowPaging=True。
問題3. 匯出檔案名稱產生亂碼的問題。
針對此問題,只需將檔案名稱經 UrlEncode 編碼,即可解決中文檔名的問題。
HttpUtility.UrlEncode(FileName, Encoding)
問題4. 匯出內容產生亂碼的問題。
使用 Response 輸出 <meta http-equiv='Content-Type'; content='text/html';charset='utf-8'> 來解決內容亂碼的問題。
擴展 GridView 控制項
我們繼承 GridView 命名為 TBGridView,其中新增 Export、ExportExcel、ExportWord 等匯出方法。
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Text
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Drawing
Namespace WebControls
< _
Description("TBGridView 控制項"), _
ToolboxData("<{0}:TBGridView runat=server></{0}:TBGridView>") _
> _
Public Class TBGridView
Inherits GridView
''' <summary>
''' GridView 控制項匯出 Excel 文件。
''' </summary>
Public Sub ExportExcel()
Export(Encoding.UTF8, "gridview.xls", "application/ms-excel")
End Sub
''' <summary>
''' GridView 控制項匯出 Word 文件。
''' </summary>
Public Sub ExportWord()
Export(Encoding.UTF8, "gridview.doc", "application/ms-word")
End Sub
''' <summary>
''' GridView 控制項匯出。
''' </summary>
''' <param name="Encoding">編碼方式。</param>
''' <param name="FileName">檔案名稱。</param>
''' <param name="ContentType">內容類型標頭。</param>
Public Sub Export(ByVal Encoding As Encoding, ByVal FileName As String, ByVal ContentType As String)
Dim oResponse As HttpResponse
Dim oStringWriter As System.IO.StringWriter
Dim oHtmlWriter As System.Web.UI.HtmlTextWriter
Dim bAllowPaging As Boolean
Dim sText As String
Dim sFileName As String
If TypeOf Me.Page Is TBBasePage Then
DirectCast(Me.Page, TBBasePage).IsVerifyRender = False '頁面不需驗證控制項
End If
'檔案名稱需經 UrlEncode 編碼,解決中文檔名的問題
sFileName = HttpUtility.UrlEncode(FileName, Encoding)
oResponse = HttpContext.Current.Response
oResponse.Clear()
sText = "<meta http-equiv='Content-Type'; content='text/html';charset='{0}'>"
sText = String.Format(sText, Encoding.WebName)
oResponse.Write(sText)
oResponse.AddHeader("content-disposition", "attachment;filename=" & sFileName)
oResponse.ContentEncoding = Encoding
oResponse.Charset = Encoding.WebName
oResponse.ContentType = "application/ms-excel"
' If you want the option to open the Excel file without saving than
' comment out the line below
' oResponse.Cache.SetCacheability(HttpCacheability.NoCache)
oStringWriter = New System.IO.StringWriter()
oHtmlWriter = New System.Web.UI.HtmlTextWriter(oStringWriter)
bAllowPaging = Me.AllowPaging
If bAllowPaging Then
Me.AllowPaging = False
If Me.RequiresDataBinding Then
Me.DataBind()
End If
End If
Me.RenderControl(oHtmlWriter)
If bAllowPaging Then
AllowPaging = bAllowPaging
End If
oResponse.Write(oStringWriter.ToString())
oResponse.End()
End Sub
End Class
End Namespace
測試程式
在頁面放置一個 GridView 控制項繫結資料並設定分頁,另外放置二個按鈕分別做「匯出 Excel 文件」及「匯出 Word 文件」的動作。
匯出按鈕撰寫的程式碼如下
Protected Sub btnExcportExcel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnExcportExcel.Click
GridView1.ExportExcel()
End Sub
Protected Sub btnExportWord_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnExportWord.Click
GridView1.ExportWord()
End Sub
匯出 Excel 文件的結果如下所示
匯出 Word 文件的結果如下所示