眾所周知
WEB上的打印是比較困難的
常見的WEB上打印的方法大概有三種
直接利用IE的打印功能
一般來說
這種方法可以做些擴展
而不是單單的調用javascript:print()這樣簡單
比如
可以使用如下代碼
<OBJECT
id=WebBrowser classid=CLSID:
F
A
D
A
B
C
FD
A
height=
width=
>
</OBJECT>
<input
type=button value=打印 onclick=document
all
WebBrowser
ExecWB(
)>
<input
type=button value=直接打印 onclick=document
all
WebBrowser
ExecWB(
)>
<input
type=button value=頁面設置 onclick=document
all
WebBrowser
ExecWB(
)>
<input
type=button value=打印預覽 onclick=document
all
WebBrowser
ExecWB(
)>
這種方法可以適用於簡單的數據打印
對系統要求不高
但不足之處在於可以控制的能力比較差
比如處理分頁等問題
利用水晶報表或其他第三方工具
如微軟的Reporting service
水晶報表或其他第三方控件的打印
一般是導出到Excel
WORD
PDF等再進行打印的
效果比較好
但編程比較復雜
控制起來也不大方便
而且這些工具都是要收費的
將數據庫的數據或要打印的內容導出到Excel
Word中去打印
使用這種方法
可以在服務端或者客戶端進行
在服務端使用的話
要求服務端要安裝Word
Excel
在客戶端使用的話
要求客戶端在IE的安全設置上有一定要求
使用這種方法
可適應性比較強
控制較好
本文將以在ASP
NET中使用Excel為例子
介紹如何將數據導出到Excel的幾種方法
首先
先介紹在服務端使用Excel的方法
要在服務器端使用Excel
必須要求服務器端安裝Excel
並且要求一定的訪問權限
比如
需要添加<identity impersonate=
true
/>到nfig中
在本文中
要給予WEB目錄可寫的權限
接下來
使用VS
NET
新建一個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(
)
oSheets = oBook
Worksheets
oSheet = CType(oSheets
Item(
)
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 =
To dt
Columns
Count
oCells(
iCol +
) = dt
Columns(iCol)
ToString
Next
將數據導出到相應的單元格
For iRow =
To dt
Rows
Count
dr = dt
Rows
Item(iRow)
ary = dr
ItemArray
For iCol =
To UBound(ary)
oCells(iRow +
iCol +
) = 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 =
To dt
Columns
Count
Response
Write(dt
Columns(iCol)
ToString & vbTab)
Next
Response
Write(vbCrLf)
輸出數據
For Each dr In dt
Rows
ary = dr
ItemArray
For i =
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
)
DataGrid
DataSource = dt
DataGrid
DataBind()
DataGrid
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 = em(
DataGrid
)
outerhtml
Set oExcel = CreateObject(
Excel
Application
)
Set oBook = oExcel
Workbooks
Add
oBook
HTMLProject
HTMLProjectItems(
Sheet
)
Text = sHTML
oBook
HTMLProject
From:http://tw.wingwit.com/Article/program/net/201311/13741.html