1. 程式人生 > >Asp.Net中如何將資料匯出到excel

Asp.Net中如何將資料匯出到excel

 一、定義文件型別、字元編碼  
   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檔案,如下圖: