成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

ASP.NET中數據庫數據導入Excel并打印

2010-08-28 10:45:31來源:西部e網作者:

    眾所周知,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進行操作的方法,各有優劣,希望大家可以根據實際情況選用。


關鍵詞:ASP.NET
主站蜘蛛池模板: 莫力| 大渡口区| 大英县| 开远市| 台前县| 丹江口市| 嘉定区| 莱芜市| 浑源县| 长沙市| 泰兴市| 精河县| 清镇市| 富顺县| 永泰县| 手游| 惠来县| 获嘉县| 岫岩| 龙门县| 宕昌县| 灵璧县| 田东县| 香河县| 婺源县| 华阴市| 马龙县| 洛扎县| 镇坪县| 大渡口区| 绥宁县| 新安县| 镇赉县| 房山区| 三亚市| 彝良县| 赤城县| 垦利县| 枣阳市| 舟曲县| 三江|