擴展 GridView 控制項 - 支援 Excel 及 Word 匯出

擴展 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 文件」的動作。

image

匯出按鈕撰寫的程式碼如下


    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 文件的結果如下所示

image

匯出 Word 文件的結果如下所示

image

ASP.NET 魔法學院