ASP.NET中数据库数据导入Excel并打印
生活随笔
收集整理的這篇文章主要介紹了
ASP.NET中数据库数据导入Excel并打印
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
眾所周知,WEB上的打印是比較困難的,常見的WEB上打印的方法大概有三種:
1、直接利用IE的打印功能。一般來說,這種方法可以做些擴(kuò)展,而不是單單的調(diào)用javascript:print()這樣簡(jiǎn)單,比如,可以使用如下代碼:
<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=頁面設(shè)置?.all.WebBrowser.ExecWB(8,1)>
<input?
type=button?value=打印預(yù)覽?.all.WebBrowser.ExecWB(7,1)>
這種方法可以適用于簡(jiǎn)單的數(shù)據(jù)打印,對(duì)系統(tǒng)要求不高,但不足之處在于可以控制的能力比較差,比如處理分頁等問題。?
2、利用水晶報(bào)表或其他第三方工具,如微軟的Reporting?service。水晶報(bào)表或其他第三方控件的打印,一般是導(dǎo)出到Excel,WORD,PDF等再進(jìn)行打印的,效果比較好,但編程比較復(fù)雜,控制起來也不大方便,而且這些工具都是要收費(fèi)的。
3、將數(shù)據(jù)庫的數(shù)據(jù)或要打印的內(nèi)容導(dǎo)出到Excel,Word中去打印。使用這種方法,可以在服務(wù)端或者客戶端進(jìn)行。在服務(wù)端使用的話,要求服務(wù)端要安裝Word,Excel,在客戶端使用的話,要求客戶端在IE的安全設(shè)置上有一定要求。使用這種方法,可適應(yīng)性比較強(qiáng),控制較好。本文將以在ASP.NET中使用Excel為例子,介紹如何將數(shù)據(jù)導(dǎo)出到Excel的幾種方法。
首先,先介紹在服務(wù)端使用Excel的方法。要在服務(wù)器端使用Excel,必須要求服務(wù)器端安裝Excel,并且要求一定的訪問權(quán)限。比如,需要添加<identity?impers/>到web.config中。在本文中,要給予WEB目錄可寫的權(quán)限。
接下來,使用VS.NET?2003新建一個(gè)VB.NET的工程,并添加引用。由于我們要使用的是Excel,所以添加一個(gè)關(guān)于COM的應(yīng)用,這里添加的是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
'定義一個(gè)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
'定義一個(gè)新的工作簿
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
'調(diào)用dumpdata過程,將數(shù)據(jù)導(dǎo)入到Excel中去
DumpData(dt,?oCells)
'保存
oSheet.SaveAs(sFile)
oBook.Close()
'退出Excel,并且釋放調(diào)用的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的內(nèi)容導(dǎo)出到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
'輸出列標(biāo)題
For?iCol?=?0?To?dt.Columns.Count?-?1
oCells(2,?iCol?+?1)?=?dt.Columns(iCol).ToString
Next
'將數(shù)據(jù)導(dǎo)出到相應(yīng)的單元格
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
在上面的代碼中,首先,先定義了一些關(guān)于Excel的對(duì)象,如application,workbook,sheets,sheet等,這些都是在使用Excel的COM對(duì)象時(shí),必不可少的。之后,我們事先先定義了一個(gè)Excel的模版文件,并且用Excel先打開這個(gè)模版文件,再調(diào)用一個(gè)自定義的過程dumpdata。在這個(gè)自定義的過程中,將datatable中的數(shù)據(jù),逐一導(dǎo)入到Excel的單元格中去。讀者自己可以慢慢體會(huì)下,上面的代碼中,是如何將datatable中的數(shù)據(jù)導(dǎo)出到Excel中去的。程序運(yùn)行后,可以在當(dāng)前的工作目錄下,生成名為myExcel.xls的Excel文件,
大家可能覺得上面的代碼比較復(fù)雜,因?yàn)樯厦鎸?duì)于對(duì)打印要求比較高的應(yīng)用,是十分有效的。如果只是單單對(duì)數(shù)據(jù)進(jìn)行導(dǎo)出,還可以使用簡(jiǎn)單的格式,比如使用以下的代碼:
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
'?輸出列標(biāo)題
For?iCol?=?0?To?dt.Columns.Count?-?1
Response.Write(dt.Columns(iCol).ToString?&?vbTab)
Next
Response.Write(vbCrLf)
'輸出數(shù)據(jù)
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
在上面的代碼中,首先將瀏覽器的輸出類型設(shè)置為application/ms-Excel,并設(shè)置Excel的輸出類型是在瀏覽器中輸出,默認(rèn)的名字為test.xls,之后,將調(diào)用自定義的過程,該自定義的過程將一個(gè)datatable里的數(shù)據(jù)以字符串流的形式輸出,其中每個(gè)datatable里的數(shù)據(jù)之間以TAB制表符分隔,最后再輸出到瀏覽器,
上面的這種方法,表現(xiàn)的形式比較簡(jiǎn)單,但也可以滿足數(shù)據(jù)導(dǎo)出的基本要求。那如果要進(jìn)一步修飾一下的話,要如何做呢?這里提供一個(gè)方法,可以將要導(dǎo)出的數(shù)據(jù)先綁定到datagrid,然后再打印該datagrid。這時(shí)就可以對(duì)要打印出來的datagrid進(jìn)行格式化,設(shè)置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
如果要轉(zhuǎn)到Word里面打印的話,也同樣可以用上面的方法,只需要將其中的代碼改成:
Response.ContentType?=?application/ms-word
Response.AddHeader(Content-Disposition,?inline;filename=test.doc)
最后,來看一下,如何調(diào)用客戶端的Excel進(jìn)行打印,就是讓客戶一點(diǎn)擊打印的按鈕,就可以自動(dòng)打開客戶端的Excel,將要打印的內(nèi)容導(dǎo)入。要實(shí)現(xiàn)這樣的效果,必須要求客戶端的IE瀏覽器設(shè)置中,在其中的安全-本地Intranet-自定義級(jí)別中,將下載未簽名ACTIVX中設(shè)置為啟動(dòng)或提示。代碼如下:
<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()
當(dāng)運(yùn)行程序時(shí),用戶只需要點(diǎn)擊EXPORT?TO?Excel的按鈕,此時(shí)IE瀏覽器會(huì)提示是否允許ACTIVX控件交互,則選擇是,就可以打開客戶端的Excel進(jìn)行打印操作了。
以上是在ASP.NET中,常用的幾種對(duì)Excel進(jìn)行操作的方法,各有優(yōu)劣,希望大家可以根據(jù)實(shí)際情況選用。?
1、直接利用IE的打印功能。一般來說,這種方法可以做些擴(kuò)展,而不是單單的調(diào)用javascript:print()這樣簡(jiǎn)單,比如,可以使用如下代碼:
<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=頁面設(shè)置?.all.WebBrowser.ExecWB(8,1)>
<input?
type=button?value=打印預(yù)覽?.all.WebBrowser.ExecWB(7,1)>
這種方法可以適用于簡(jiǎn)單的數(shù)據(jù)打印,對(duì)系統(tǒng)要求不高,但不足之處在于可以控制的能力比較差,比如處理分頁等問題。?
2、利用水晶報(bào)表或其他第三方工具,如微軟的Reporting?service。水晶報(bào)表或其他第三方控件的打印,一般是導(dǎo)出到Excel,WORD,PDF等再進(jìn)行打印的,效果比較好,但編程比較復(fù)雜,控制起來也不大方便,而且這些工具都是要收費(fèi)的。
3、將數(shù)據(jù)庫的數(shù)據(jù)或要打印的內(nèi)容導(dǎo)出到Excel,Word中去打印。使用這種方法,可以在服務(wù)端或者客戶端進(jìn)行。在服務(wù)端使用的話,要求服務(wù)端要安裝Word,Excel,在客戶端使用的話,要求客戶端在IE的安全設(shè)置上有一定要求。使用這種方法,可適應(yīng)性比較強(qiáng),控制較好。本文將以在ASP.NET中使用Excel為例子,介紹如何將數(shù)據(jù)導(dǎo)出到Excel的幾種方法。
首先,先介紹在服務(wù)端使用Excel的方法。要在服務(wù)器端使用Excel,必須要求服務(wù)器端安裝Excel,并且要求一定的訪問權(quán)限。比如,需要添加<identity?impers/>到web.config中。在本文中,要給予WEB目錄可寫的權(quán)限。
接下來,使用VS.NET?2003新建一個(gè)VB.NET的工程,并添加引用。由于我們要使用的是Excel,所以添加一個(gè)關(guān)于COM的應(yīng)用,這里添加的是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
'定義一個(gè)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
'定義一個(gè)新的工作簿
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
'調(diào)用dumpdata過程,將數(shù)據(jù)導(dǎo)入到Excel中去
DumpData(dt,?oCells)
'保存
oSheet.SaveAs(sFile)
oBook.Close()
'退出Excel,并且釋放調(diào)用的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的內(nèi)容導(dǎo)出到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
'輸出列標(biāo)題
For?iCol?=?0?To?dt.Columns.Count?-?1
oCells(2,?iCol?+?1)?=?dt.Columns(iCol).ToString
Next
'將數(shù)據(jù)導(dǎo)出到相應(yīng)的單元格
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
在上面的代碼中,首先,先定義了一些關(guān)于Excel的對(duì)象,如application,workbook,sheets,sheet等,這些都是在使用Excel的COM對(duì)象時(shí),必不可少的。之后,我們事先先定義了一個(gè)Excel的模版文件,并且用Excel先打開這個(gè)模版文件,再調(diào)用一個(gè)自定義的過程dumpdata。在這個(gè)自定義的過程中,將datatable中的數(shù)據(jù),逐一導(dǎo)入到Excel的單元格中去。讀者自己可以慢慢體會(huì)下,上面的代碼中,是如何將datatable中的數(shù)據(jù)導(dǎo)出到Excel中去的。程序運(yùn)行后,可以在當(dāng)前的工作目錄下,生成名為myExcel.xls的Excel文件,
大家可能覺得上面的代碼比較復(fù)雜,因?yàn)樯厦鎸?duì)于對(duì)打印要求比較高的應(yīng)用,是十分有效的。如果只是單單對(duì)數(shù)據(jù)進(jìn)行導(dǎo)出,還可以使用簡(jiǎn)單的格式,比如使用以下的代碼:
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
'?輸出列標(biāo)題
For?iCol?=?0?To?dt.Columns.Count?-?1
Response.Write(dt.Columns(iCol).ToString?&?vbTab)
Next
Response.Write(vbCrLf)
'輸出數(shù)據(jù)
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
在上面的代碼中,首先將瀏覽器的輸出類型設(shè)置為application/ms-Excel,并設(shè)置Excel的輸出類型是在瀏覽器中輸出,默認(rèn)的名字為test.xls,之后,將調(diào)用自定義的過程,該自定義的過程將一個(gè)datatable里的數(shù)據(jù)以字符串流的形式輸出,其中每個(gè)datatable里的數(shù)據(jù)之間以TAB制表符分隔,最后再輸出到瀏覽器,
上面的這種方法,表現(xiàn)的形式比較簡(jiǎn)單,但也可以滿足數(shù)據(jù)導(dǎo)出的基本要求。那如果要進(jìn)一步修飾一下的話,要如何做呢?這里提供一個(gè)方法,可以將要導(dǎo)出的數(shù)據(jù)先綁定到datagrid,然后再打印該datagrid。這時(shí)就可以對(duì)要打印出來的datagrid進(jìn)行格式化,設(shè)置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
如果要轉(zhuǎn)到Word里面打印的話,也同樣可以用上面的方法,只需要將其中的代碼改成:
Response.ContentType?=?application/ms-word
Response.AddHeader(Content-Disposition,?inline;filename=test.doc)
最后,來看一下,如何調(diào)用客戶端的Excel進(jìn)行打印,就是讓客戶一點(diǎn)擊打印的按鈕,就可以自動(dòng)打開客戶端的Excel,將要打印的內(nèi)容導(dǎo)入。要實(shí)現(xiàn)這樣的效果,必須要求客戶端的IE瀏覽器設(shè)置中,在其中的安全-本地Intranet-自定義級(jí)別中,將下載未簽名ACTIVX中設(shè)置為啟動(dòng)或提示。代碼如下:
<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()
當(dāng)運(yùn)行程序時(shí),用戶只需要點(diǎn)擊EXPORT?TO?Excel的按鈕,此時(shí)IE瀏覽器會(huì)提示是否允許ACTIVX控件交互,則選擇是,就可以打開客戶端的Excel進(jìn)行打印操作了。
以上是在ASP.NET中,常用的幾種對(duì)Excel進(jìn)行操作的方法,各有優(yōu)劣,希望大家可以根據(jù)實(shí)際情況選用。?
轉(zhuǎn)載于:https://www.cnblogs.com/hdjjun/archive/2008/06/17/1223753.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET中数据库数据导入Excel并打印的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我们是如何拿下Google和Facebo
- 下一篇: 一步一步学Silverlight 2系列