分享
 
 
 

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

王朝asp·作者佚名  2008-05-21
窄屏简体版  字體: |||超大  

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

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

<OBJECTid=WebBrowser classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 width=0></OBJECT><inputtype=button value=打印 onclick=document.all.WebBrowser.ExecWB(6,1)><inputtype=button value=直接打印 onclick=document.all.WebBrowser.ExecWB(6,6)><inputtype=button value=页面设置 onclick=document.all.WebBrowser.ExecWB(8,1)><inputtype=button value=打印预览 onclick=document.all.WebBrowser.ExecWB(7,1)>

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

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

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

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

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

Imports System.Runtime.InteropServices.MarshalImports OfficePrivate 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

NextEnd FunctionEnd 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 SubPrivate 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)

NextEnd FunctionEnd 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 = dtDataGrid1.DataBind()

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有