700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > ASP.NET中数据库数据导入Excel并打印

ASP.NET中数据库数据导入Excel并打印

时间:2019-07-27 15:52:15

相关推荐

ASP.NET中数据库数据导入Excel并打印

众所周知,WEB上的打印是比较困难的,常见的WEB上打印的方法大概有三种:

1、直接利用IE的打印功能。一般来说,这种方法可以做些扩展,而不是单单的调用javascript:print()这样简单,比如,可以使用如下代码:

<OBJECT

id=WebBrowserclassid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2height=0width=0>

</OBJECT>

<input

type=buttonvalue=打印.all.WebBrowser.ExecWB(6,1)>

<input

type=buttonvalue=直接打印.all.WebBrowser.ExecWB(6,6)>

<input

type=buttonvalue=页面设置.all.WebBrowser.ExecWB(8,1)>

<input

type=buttonvalue=打印预览.all.WebBrowser.ExecWB(7,1)>

这种方法可以适用于简单的数据打印,对系统要求不高,但不足之处在于可以控制的能力比较差,比如处理分页等问题。

2、利用水晶报表或其他第三方工具,如微软的Reportingservice。水晶报表或其他第三方控件的打印,一般是导出到Excel,WORD,PDF等再进行打印的,效果比较好,但编程比较复杂,控制起来也不大方便,而且这些工具都是要收费的。

3、将数据库的数据或要打印的内容导出到Excel,Word中去打印。使用这种方法,可以在服务端或者客户端进行。在服务端使用的话,要求服务端要安装Word,Excel,在客户端使用的话,要求客户端在IE的安全设置上有一定要求。使用这种方法,可适应性比较强,控制较好。本文将以在中使用Excel为例子,介绍如何将数据导出到Excel的几种方法。

首先,先介绍在服务端使用Excel的方法。要在服务器端使用Excel,必须要求服务器端安装Excel,并且要求一定的访问权限。比如,需要添加<identityimpers/>到web.config中。在本文中,要给予WEB目录可写的权限。

接下来,使用新建一个的工程,并添加引用。由于我们要使用的是Excel,所以添加一个关于COM的应用,这里添加的是MicrosoftExcelObjectLibrary,之后,添加的代码如下:

ImportsSystem.Runtime.InteropServices.Marshal

ImportsOffice

PrivateSubPage_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load

'以COM方式处理Excel

DimoExcelAsNewExcel.Application

DimoBooksAsExcel.Workbooks,oBookAsExcel.Workbook

DimoSheetsAsExcel.Sheets,oSheetAsExcel.Worksheet

DimoCellsAsExcel.Range

DimsFileAsString,sTemplateAsString

'定义一个datatable

DimdtAsDataTable=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=FirstSheet

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)

EndSub

'将DATATABLE的内容导出到Excel的单元格中去

PrivateFunctionDumpData(ByValdtAsDataTable,ByValoCellsAsExcel.Range)AsString

DimdrAsDataRow,ary()AsObject

DimiRowAsInteger,iColAsInteger

'输出列标题

ForiCol=0Todt.Columns.Count-1

oCells(2,iCol+1)=dt.Columns(iCol).ToString

Next

'将数据导出到相应的单元格

ForiRow=0Todt.Rows.Count-1

dr=dt.Rows.Item(iRow)

ary=dr.ItemArray

ForiCol=0ToUBound(ary)

oCells(iRow+3,iCol+1)=ary(iCol).ToString

Response.Write(ary(iCol).ToString&vbTab)

Next

Next

EndFunction

EndClass

在上面的代码中,首先,先定义了一些关于Excel的对象,如application,workbook,sheets,sheet等,这些都是在使用Excel的COM对象时,必不可少的。之后,我们事先先定义了一个Excel的模版文件,并且用Excel先打开这个模版文件,再调用一个自定义的过程dumpdata。在这个自定义的过程中,将datatable中的数据,逐一导入到Excel的单元格中去。读者自己可以慢慢体会下,上面的代码中,是如何将datatable中的数据导出到Excel中去的。程序运行后,可以在当前的工作目录下,生成名为myExcel.xls的Excel文件,

大家可能觉得上面的代码比较复杂,因为上面对于对打印要求比较高的应用,是十分有效的。如果只是单单对数据进行导出,还可以使用简单的格式,比如使用以下的代码:

PrivateSubPage_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load

DimdtAsDataTable=CType(Application.Item(MyDataTable),DataTable)

Response.ContentType=application/ms-Excel

Response.AddHeader(Content-Disposition,inline;filename=test.xls)

Response.Write(ConvertDtToTDF(dt))

EndSub

PrivateFunctionConvertDtToTDF(ByValdtAsDataTable)AsString

DimdrAsDataRow,ary()AsObject,iAsInteger

DimiColAsInteger

'输出列标题

ForiCol=0Todt.Columns.Count-1

Response.Write(dt.Columns(iCol).ToString&vbTab)

Next

Response.Write(vbCrLf)

'输出数据

ForEachdrIndt.Rows

ary=dr.ItemArray

Fori=0ToUBound(ary)

Response.Write(ary(i).ToString&vbTab)

Next

Response.Write(vbCrLf)

Next

EndFunction

EndClass

在上面的代码中,首先将浏览器的输出类型设置为application/ms-Excel,并设置Excel的输出类型是在浏览器中输出,默认的名字为test.xls,之后,将调用自定义的过程,该自定义的过程将一个datatable里的数据以字符串流的形式输出,其中每个datatable里的数据之间以TAB制表符分隔,最后再输出到浏览器,

上面的这种方法,表现的形式比较简单,但也可以满足数据导出的基本要求。那如果要进一步修饰一下的话,要如何做呢?这里提供一个方法,可以将要导出的数据先绑定到datagrid,然后再打印该datagrid。这时就可以对要打印出来的datagrid进行格式化,设置datagrid的format等属性。代码如下:

ProtectedOverridesSubRender(ByValwriterAsSystem.Web.UI.HtmlTextWriter)

DimdtAsDataTable=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)

EndSub

如果要转到Word里面打印的话,也同样可以用上面的方法,只需要将其中的代码改成:

Response.ContentType=application/ms-word

Response.AddHeader(Content-Disposition,inline;filename=test.doc)

最后,来看一下,如何调用客户端的Excel进行打印,就是让客户一点击打印的按钮,就可以自动打开客户端的Excel,将要打印的内容导入。要实现这样的效果,必须要求客户端的IE浏览器设置中,在其中的安全-本地Intranet-自定义级别中,将下载未签名ACTIVX中设置为启动或提示。代码如下:

<scriptlanguage=vbscript>

Subexportbutton_onclick

DimsHTML,oExcel,oBook

SHTML=document.all.item(DataGrid1).outerhtml

SetoExcel=CreateObject(Excel.Application)

SetoBook=oExcel.Workbooks.Add

oBook.HTMLProject.HTMLProjectItems(Sheet1).Text=sHTML

oBook.HTMLProject.RefreshDocument

oExcel.Visible=true

oExcel.UserControl=true

EndSub

</script>

在CODE-BEHIND的代码中,只需要这样写就可以了:

DimdtAsDataTable=CType(Application.Item(MyDataTable),DataTable)

DataGrid1.DataSource=dt

DataGrid1.DataBind()

当运行程序时,用户只需要点击EXPORTTOExcel的按钮,此时IE浏览器会提示是否允许ACTIVX控件交互,则选择是,就可以打开客户端的Excel进行打印操作了。

以上是在中,常用的几种对Excel进行操作的方法,各有优劣,希望大家可以根据实际情况选用。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。