一、定義文件類型、字元編碼
|
Response.Clear(); Response.Buffer= true; Response.Charset="utf-8"; //下面這行很重要, attachment 參數表示作為附件下載,您可以改成 online線上開啟 //filename=FileFlow.xls 指定輸出檔案的名稱,注意其副檔名和指定檔案類型相符,可以為:.doc .xls .txt .htm Response.AppendHeader("Content-Disposition","attachment;filename=FileFlow.xls"); Response.ContentEncoding=System.Text.Encoding.GetEncoding("utf-8"); //Response.ContentType指定檔案類型 可以為application/ms-excel application/ms-word application/ms-txt application/ms-html 或其他瀏覽器可直接支援文檔 Response.ContentType = "application/ms-excel"; this.EnableViewState = false; |
二、定義一個輸入資料流
|
System.IO.StringWriter oStringWriter = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter); |
三、將目標資料繫結到輸入資料流輸出
|
this.RenderControl(oHtmlTextWriter); //this 表示輸出本頁,你也可以綁定datagrid,或其他支援obj.RenderControl()屬性的控制項 Response.Write(oStringWriter.ToString()); Response.End(); |
總結:本常式在Microsoft Visual Studio .NET 2003平台下測試通過,適用於C#和VB,當採用VB的時候將 this 關鍵字改成 me 。
第2種:
眾所周知,WEB上的列印是比較困難的,常見的WEB上列印的方法大概有三種:
1、直接利用IE的列印功能。一般來說,這種方法可以做些擴充,而不是單單的調用javascript:print()這樣簡單,比如,可以使用如下代碼:
<OBJECT id=WebBrowser classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 width=0> </OBJECT> <input type=button value=列印 onclick=document.all.WebBrowser.ExecWB(6,1)> <input type=button value=直接列印 onclick=document.all.WebBrowser.ExecWB(6,6)> <input type=button value=版面設定 onclick=document.all.WebBrowser.ExecWB(8,1)> <input type=button value=預覽列印 onclick=document.all.WebBrowser.ExecWB(7,1)> |
這種方法可以適用於簡單的資料列印,對系統要求不高,但不足之處在於可以控制的能力比較差,比如處理分頁等問題。
2、利用水晶報表或其他第三方工具,如微軟的Reporting service。水晶報表或其他第三方控制項的列印,一般是匯出到Excel,WORD,PDF等再進行列印的,效果比較好,但編程比較複雜,控制起來也不大方便,而且這些工具都是要收費的。
3、將資料庫的資料或要列印的內容匯出到Excel,Word中去列印。使用這種方法,可以在服務端或者用戶端進行。在服務端使用的話,要求服務端要安裝Word,Excel,在用戶端使用的話,要求用戶端在IE的安全設定上有一定要求。使用這種方法,可適應性比較強,控制較好。本文將以在ASP.NET中使用Excel為例子,介紹如何將資料匯出到Excel的幾種方法。
首先,先介紹在服務端使用Excel的方法。要在伺服器端使用Excel,必須要求伺服器端安裝Excel,並且要求一定的存取權限。比如,需要添加<identity impersonate="true"/>到web.config中。在本文中,要給予WEB目錄可寫的許可權。
接下來,使用VS.NET 2003建立一個VB.NET的工程,並添加引用。由於我們要使用的是Excel,所以添加一個關於COM的應用,這裡添加的是Microsoft Excel Object Library,之後,添加的代碼如下:
Imports System.Runtime.InteropServices.Marshal Imports Office Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '以COM方式處理Excel Dim oExcel As New Excel.Application Dim oBooks As Excel.Workbooks, oBook As Excel.Workbook Dim oSheets As Excel.Sheets, oSheet As Excel.Worksheet Dim oCells As Excel.Range Dim sFile As String, sTemplate As String '定義一個datatable Dim dt As DataTable = CType(Application.Item("MyDataTable"), DataTable) sFile = Server.MapPath(Request.ApplicationPath) & "\MyExcel.xls" '定義模版檔案 sTemplate = Server.MapPath(Request.ApplicationPath) & "\MyTemplate.xls" oExcel.Visible = False oExcel.DisplayAlerts = False '定義一個新的活頁簿 oBooks = oExcel.Workbooks oBooks.Open(Server.MapPath(Request.ApplicationPath) & "\MyTemplate.xls") oBook = oBooks.Item(1) oSheets = oBook.Worksheets oSheet = CType(oSheets.Item(1), Excel.Worksheet) '命名該sheet oSheet.Name = "First Sheet" oCells = oSheet.Cells '調用dumpdata過程,將資料匯入到Excel中去 DumpData(dt, oCells) '儲存 oSheet.SaveAs(sFile) oBook.Close() '退出Excel,並且釋放調用的COM資源 oExcel.Quit() ReleaseComObject(oCells) : ReleaseComObject(oSheet) ReleaseComObject(oSheets) : ReleaseComObject(oBook) ReleaseComObject(oBooks) : ReleaseComObject(oExcel) oExcel = Nothing : oBooks = Nothing : oBook = Nothing oSheets = Nothing : oSheet = Nothing : oCells = Nothing System.GC.Collect() Response.Redirect(sFile) End Sub '將DATATABLE的內容匯出到Excel的儲存格中去 Private Function DumpData(ByVal dt As DataTable, ByVal oCells As Excel.Range) As String Dim dr As DataRow, ary() As Object Dim iRow As Integer, iCol As Integer '輸出資料行標題 For iCol = 0 To dt.Columns.Count - 1 oCells(2, iCol + 1) = dt.Columns(iCol).ToString Next '將資料匯出到相應的儲存格 For iRow = 0 To dt.Rows.Count - 1 dr = dt.Rows.Item(iRow) ary = dr.ItemArray For iCol = 0 To UBound(ary) oCells(iRow + 3, iCol + 1) = ary(iCol).ToString Response.Write(ary(iCol).ToString & vbTab) Next Next End Function End Class |
在上面的代碼中,首先,先定義了一些關於Excel的對象,如application,workbook,sheets,sheet等,這些都是在使用Excel的COM對象時,必不可少的。之後,我們事先先定義了一個Excel的模版檔案,並且用Excel先開啟這個模版檔案,再調用一個自訂的過程dumpdata。在這個自訂的過程中,將datatable中的資料,逐一匯入到Excel的儲存格中去。讀者自己可以慢慢體會下,上面的代碼中,是如何將datatable中的資料匯出到Excel中去的。程式運行後,可以在當前的工作目錄下,產生名為myExcel.xls的Excel檔案,如:
相關資源:
http://www.codeproject.com/aspnet/DGExdel.asp