熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

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

2013-11-13 10:27:59  來源: .NET編程 

  眾所周知WEB上的打印是比較困難的常見的WEB上打印的方法大概有三種
  
  直接利用IE的打印功能一般來說這種方法可以做些擴展而不是單單的調用javascript:print()這樣簡單比如可以使用如下代碼
  
  <OBJECT
  id=WebBrowser classid=CLSID:FADABCFDA height= width=
  </OBJECT>
  <input
  type=button value=打印 onclick=documentallWebBrowserExecWB()>
  <input
  type=button value=直接打印 onclick=documentallWebBrowserExecWB()>
  <input
  type=button value=頁面設置 onclick=documentallWebBrowserExecWB()>
  <input
  type=button value=打印預覽 onclick=documentallWebBrowserExecWB()>
  
  這種方法可以適用於簡單的數據打印對系統要求不高但不足之處在於可以控制的能力比較差比如處理分頁等問題
  
  利用水晶報表或其他第三方工具如微軟的Reporting service水晶報表或其他第三方控件的打印一般是導出到ExcelWORDPDF等再進行打印的效果比較好但編程比較復雜控制起來也不大方便而且這些工具都是要收費的
  
  將數據庫的數據或要打印的內容導出到ExcelWord中去打印使用這種方法可以在服務端或者客戶端進行在服務端使用的話要求服務端要安裝WordExcel在客戶端使用的話要求客戶端在IE的安全設置上有一定要求使用這種方法可適應性比較強控制較好本文將以在ASPNET中使用Excel為例子介紹如何將數據導出到Excel的幾種方法
  
  首先先介紹在服務端使用Excel的方法要在服務器端使用Excel必須要求服務器端安裝Excel並且要求一定的訪問權限比如需要添加<identity impersonate=true/>到nfig中在本文中要給予WEB目錄可寫的權限
  
  接下來使用VSNET 新建一個VBNET的工程並添加引用由於我們要使用的是Excel所以添加一個關於COM的應用這裡添加的是Microsoft Excel Object Library之後添加的代碼如下
  
  Imports SystemRuntimeInteropServicesMarshal
  Imports Office
  Private Sub Page_Load(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles MyBaseLoad
  以COM方式處理Excel
  Dim oExcel As New ExcelApplication
  Dim oBooks As ExcelWorkbooks oBook As ExcelWorkbook
  Dim oSheets As ExcelSheets oSheet As ExcelWorksheet
  Dim oCells As ExcelRange
  Dim sFile As String sTemplate As String
  定義一個datatable
  Dim dt As DataTable = CType(ApplicationItem(MyDataTable) DataTable)
  
  sFile = ServerMapPath(RequestApplicationPath) & \MyExcelxls
  定義模版文件
  sTemplate = ServerMapPath(RequestApplicationPath) & \MyTemplatexls
  oExcelVisible = False
  oExcelDisplayAlerts = False
  定義一個新的工作簿
  oBooks = oExcelWorkbooks
  oBooksOpen(ServerMapPath(RequestApplicationPath) & \MyTemplatexls) oBook = oBooksItem()
  oSheets = oBookWorksheets
  oSheet = CType(oSheetsItem() ExcelWorksheet)
  
  命名該sheet
  oSheetName = First Sheet
  oCells = oSheetCells
  調用dumpdata過程將數據導入到Excel中去
  DumpData(dt oCells)
  保存
  oSheetSaveAs(sFile)
  oBookClose()
  
  退出Excel並且釋放調用的COM資源
  oExcelQuit()
  ReleaseComObject(oCells) : ReleaseComObject(oSheet)
  ReleaseComObject(oSheets) : ReleaseComObject(oBook)
  ReleaseComObject(oBooks) : ReleaseComObject(oExcel)
  oExcel = Nothing : oBooks = Nothing : oBook = Nothing
  oSheets = Nothing : oSheet = Nothing : oCells = Nothing
  SystemGCCollect()
  ResponseRedirect(sFile)
  End Sub
  
  將DATATABLE的內容導出到Excel的單元格中去
  Private Function DumpData(ByVal dt As DataTable ByVal oCells As ExcelRange) As String
  Dim dr As DataRow ary() As Object
  Dim iRow As Integer iCol As Integer
  
  輸出列標題
  For iCol = To dtColumnsCount
  oCells( iCol + ) = dtColumns(iCol)ToString
  Next
  
  將數據導出到相應的單元格
  For iRow = To dtRowsCount
  dr = dtRowsItem(iRow)
  ary = drItemArray
  For iCol = To UBound(ary)
  oCells(iRow + iCol + ) = ary(iCol)ToString
  ResponseWrite(ary(iCol)ToString & vbTab)
  Next
  Next
  End Function
  End Class
  
  在上面的代碼中首先先定義了一些關於Excel的對象如applicationworkbooksheetssheet等這些都是在使用Excel的COM對象時必不可少的之後我們事先先定義了一個Excel的模版文件並且用Excel先打開這個模版文件再調用一個自定義的過程dumpdata在這個自定義的過程中將datatable中的數據逐一導入到Excel的單元格中去讀者自己可以慢慢體會下上面的代碼中是如何將datatable中的數據導出到Excel中去的程序運行後可以在當前的工作目錄下生成名為myExcelxls的Excel文件如下圖
   
  大家可能覺得上面的代碼比較復雜因為上面對於對打印要求比較高的應用是十分有效的如果只是單單對數據進行導出還可以使用簡單的格式比如使用以下的代碼
  
  Private Sub Page_Load(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles MyBaseLoad
  Dim dt As DataTable = CType(ApplicationItem(MyDataTable) DataTable)
  
  ResponseContentType = application/msExcel
  
  ResponseAddHeader(ContentDisposition inline;filename=testxls)
  
  ResponseWrite(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 = To dtColumnsCount
  ResponseWrite(dtColumns(iCol)ToString & vbTab)
  Next
  ResponseWrite(vbCrLf)
  
  輸出數據
  For Each dr In dtRows
  ary = drItemArray
  For i = To UBound(ary)
  ResponseWrite(ary(i)ToString & vbTab)
  Next
  ResponseWrite(vbCrLf)
  Next
  End Function
  End Class
  
  在上面的代碼中首先將浏覽器的輸出類型設置為application/msExcel並設置Excel的輸出類型是在浏覽器中輸出默認的名字為testxls之後將調用自定義的過程該自定義的過程將一個datatable裡的數據以字符串流的形式輸出其中每個datatable裡的數據之間以TAB制表符分隔最後再輸出到浏覽器輸出效果如下圖
   
  上面的這種方法表現的形式比較簡單但也可以滿足數據導出的基本要求那如果要進一步修飾一下的話要如何做呢?這裡提供一個方法可以將要導出的數據先綁定到datagrid然後再打印該datagrid這時就可以對要打印出來的datagrid進行格式化設置datagrid的format等屬性代碼如下
  
  Protected Overrides Sub Render(ByVal writer As SystemWebUIHtmlTextWriter)
  Dim dt As DataTable = CType(ApplicationItem(MyDataTable) DataTable)
  
  ResponseContentType = application/msExcel
  
  ResponseAddHeader(ContentDisposition inline;filename=testxls)
  
  DataGridDataSource = dt
  DataGridDataBind()
  DataGridRenderControl(writer)
  End Sub
  
  打印出來的效果如下圖
  
  如果要轉到Word裡面打印的話也同樣可以用上面的方法只需要將其中的代碼改成
  
  ResponseContentType = application/msword
  ResponseAddHeader(ContentDisposition inline;filename=testdoc)
  
  最後來看一下如何調用客戶端的Excel進行打印就是讓客戶一點擊打印的按鈕就可以自動打開客戶端的Excel將要打印的內容導入要實現這樣的效果必須要求客戶端的IE浏覽器設置中在其中的安全本地Intranet自定義級別中下載未簽名ACTIVX中設置為啟動或提示代碼如下
  
  <script language=vbscript
  Sub exportbutton_onclick
  Dim sHTML oExcel oBook
  SHTML = em(DataGrid)outerhtml
  Set oExcel = CreateObject(ExcelApplication)
  Set oBook = oExcelWorkbooksAdd
  oBookHTMLProjectHTMLProjectItems(Sheet)Text = sHTML
  oBookHTMLProject
From:http://tw.wingwit.com/Article/program/net/201311/13741.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.