asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

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


发布日期:2022年09月21日
 
ASP.NET中数据库数据导入Excel并打印

众所周知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

上一篇:ASP.NET中的DataGrid的属性

下一篇:ASP.NET 2.0高级数据处理之数据绑定