ASP.NET中資料庫資料匯入Excel、Word並列印

來源:互聯網
上載者:User

作者: 廖煜嶸編譯
時間: 2004-12-20
出處: 天極網
責任編輯: 方舟

 眾所周知,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檔案,如:

大家可能覺得上面的代碼比較複雜,因為上面對於對列印要求比較高的應用,是十分有效。如果只是單單對資料進行匯出,還可以使用簡單的格式,比如使用以下的代碼:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 Dim dt As DataTable = CType(Application.Item("MyDataTable"), DataTable)

 Response.ContentType = "application/ms-Excel"

 Response.AddHeader("Content-Disposition", "inline;filename=test.xls")

 Response.Write(ConvertDtToTDF(dt))
End Sub

Private Function ConvertDtToTDF(ByVal dt As DataTable) As String
 Dim dr As DataRow, ary() As Object, i As Integer
 Dim iCol As Integer

 ' 輸出資料行標題
 For iCol = 0 To dt.Columns.Count - 1
  Response.Write(dt.Columns(iCol).ToString & vbTab)
 Next
 Response.Write(vbCrLf)

 '輸出資料
 For Each dr In dt.Rows
  ary = dr.ItemArray
  For i = 0 To UBound(ary)
   Response.Write(ary(i).ToString & vbTab)
  Next
  Response.Write(vbCrLf)
 Next
End Function
End Class

  在上面的代碼中,首先將瀏覽器的輸出類型設定為application/ms-Excel,並設定Excel的輸出類型是在瀏覽器中輸出,預設的名字為test.xls,之後,將調用自訂的過程,該自訂的過程將一個datatable裡的資料以字串流的形式輸出,其中每個datatable裡的資料之間以TAB定位字元分隔,最後再輸出到瀏覽器,輸出效果如:

  上面的這種方法,表現的形式比較簡單,但也可以滿足資料匯出的基本要求。那如果要進一步修飾一下的話,要如何做呢?這裡提供一個方法,可以將要匯出的資料先綁定到datagrid,然後再列印該datagrid。這時就可以對要列印出來的datagrid進行格式化,設定datagrid的format等屬性。代碼如下:

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
 Dim dt As DataTable = CType(Application.Item("MyDataTable"), DataTable)

 Response.ContentType = "application/ms-Excel"

 Response.AddHeader("Content-Disposition", "inline;filename=test.xls")

 DataGrid1.DataSource = dt
 DataGrid1.DataBind()
 DataGrid1.RenderControl(writer)
End Sub

  列印出來的效果如:

  如果要轉到Word裡面列印的話,也同樣可以用上面的方法,只需要將其中的代碼改成:

Response.ContentType = "application/ms-word"
Response.AddHeader("Content-Disposition", "inline;filename=test.doc")

  最後,來看一下,如何調用用戶端的Excel進行列印,就是讓客戶一點擊"列印"的按鈕,就可以自動開啟用戶端的Excel,將要列印的內容匯入。要實現這樣的效果,必須要求用戶端的IE瀏覽器設定中,在其中的"安全-本地Intranet-自訂層級中",將"下載未簽名ACTIVX"中設定為啟動或提示。代碼如下:

<script language="vbscript">
 Sub exportbutton_onclick
  Dim sHTML, oExcel, oBook
  SHTML = document.all.item("DataGrid1").outerhtml
  Set oExcel = CreateObject("Excel.Application")
  Set oBook = oExcel.Workbooks.Add
  oBook.HTMLProject.HTMLProjectItems("Sheet1").Text = sHTML
  oBook.HTMLProject.RefreshDocument
  oExcel.Visible = true
  oExcel.UserControl = true
 End Sub
</script>

  在CODE-BEHIND的代碼中,只需要這樣寫就可以了:

Dim dt As DataTable = CType(Application.Item("MyDataTable"), DataTable)
DataGrid1.DataSource = dt
DataGrid1.DataBind()

  當運行程式時,使用者只需要點擊EXPORT TO Excel的按鈕,此時IE瀏覽器會提示是否允許ACTIVX控制項互動,則選擇"是",就可以開啟用戶端的Excel進行列印操作了。

  以上是在ASP.NET中,常用的幾種對Excel進行操作的方法,各有優劣,希望大家可以根據實際情況選用。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.