ASP.NET中数据库数据导入Excel并打印
生活随笔
收集整理的這篇文章主要介紹了
ASP.NET中数据库数据导入Excel并打印
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
眾所周知,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=打印?.all.WebBrowser.ExecWB(6,1)>
<input
type=button?value=直接打印?.all.WebBrowser.ExecWB(6,6)>
<input
type=button?value=頁面設置?.all.WebBrowser.ExecWB(8,1)>
<input?
type=button?value=打印預覽?.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?impers/>到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進行操作的方法,各有優劣,希望大家可以根據實際情況選用。?
1、直接利用IE的打印功能。一般來說,這種方法可以做些擴展,而不是單單的調用javascript:print()這樣簡單,比如,可以使用如下代碼:
<OBJECT?
id=WebBrowser?classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2?height=0?width=0>
</OBJECT>
<input?
type=button?value=打印?.all.WebBrowser.ExecWB(6,1)>
<input
type=button?value=直接打印?.all.WebBrowser.ExecWB(6,6)>
<input
type=button?value=頁面設置?.all.WebBrowser.ExecWB(8,1)>
<input?
type=button?value=打印預覽?.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?impers/>到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進行操作的方法,各有優劣,希望大家可以根據實際情況選用。?
轉載于:https://www.cnblogs.com/hdjjun/archive/2008/06/17/1223753.html
總結
以上是生活随笔為你收集整理的ASP.NET中数据库数据导入Excel并打印的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我们是如何拿下Google和Facebo
- 下一篇: asp.net ajax控件工具集 Au