asp 导出excel问题

yajun_snow 2009-08-11 10:09:58
response.contenttype="application/vnd.ms-excel:"
response.addheader "content-disposition","attachment;filename=form.xls"

用这种办法导出excel,数据量大的时候,就导不出excel。
请问应该怎么解决。
...全文
251 点赞 收藏 7
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
小官 2011-08-18
开发语言:ASP,开发环境:dreamweaver

从sql 2000数据库查询出的结果以表格的形式显示在页面上,却不知道怎么通过导出按钮导入excel ? 哪位大侠如果有代码还请不吝指教下?如果有代码可以发给我吗?287168917@qq.com,不胜感激~!
回复
Dadimamiilove 2009-08-14
以下我是应用别人的话哦~~
asp生成excel报表




1. 前言

报表打印通常是管理信息系统中的一个重要模块,而Excel凭借它功能强大、应用灵活、通用性强等的优势在报表打印中获得了广泛的应用。

最初的管理信息系统基本上是采用客户机/服务器(C/S)模式开发的,但随着WWW的广泛应用,目前的管理信息系统已经逐渐开始从C/S模式向浏览器/服务器(B/S)模式转变。B/S模式具有传统C/S模式所不及的很多特点,如更加开放、与软硬件无关、应用扩充和系统维护升级方便等等,目前已成为企业网上首选的计算模式,原先在C/S下的很多软件都开始移植到B/S模式下。由于B/S模式的特殊性,在C/S下相对较易实现的Excel报表打印功能在B/S下却成为一个难点。本文根据在实际的项目中总结的经验,以ASP为例,给出了一个较好的通用方法。

2. 功能实现

为了说明问题,这里举一个例子。系统平台是Windows 2000+SQL Server 2000+IIS 5.0+ASP 3,报表采用的是Excel,要求按照给定的报表格式生成图书销售统计的报表,并能够打印。

2.1 Excel报表模板的制作

首先根据给定的报表格式,制作一个Excel模板(就是要打印的报表的表格),当然其中需要从数据库中动态统计生成的数据留着空白。这个报表先在Excel中画好,然后保存为模板,存放在起来,这里为\test\book1.xlt。

2.2 Excel报表的生成与打印

这里采用了Excel的Application组件,该组件在安装Excel时安装到系统中。我们的操作也都是针对该组件。

(1) 建立Excel.Application对象

set objExcel=CreateObject("Excel.Application")

(2) 打开Excel模板

objExcel.Workbooks.Open(server.mappath("\test")&"\book1.xlt") '打开Excel模板

objExcel.Sheets(1).select '选中工作页

set sheetActive=objExcel.ActiveWorkbook.ActiveSheet

(3) Excel的常规添加操作

例如sheetActive.range("g4").value=date() ‘这里添加的是时间,当然也可以是你指定的任何数据

(4) Excel中添加数据库中的纪录

这里假设已有一个数据集adoRset,存放由Sql操作生成的统计数据。

num=7 ‘从Excel的第七行开始

do until adoRset.EOF ‘循环直至数据集中的数据写完

strRange="d"&num&":f"&num ‘设定要填写内容的单元区域

sheetActive.range(strRange).font.size=10 ‘设定字体大小

sheetActive.range(strRange).WrapText=false ‘设定文字回卷

sheetActive.range(strRange).ShrinkToFit=true ‘设定是否自动适应表格单元大小

sheetActive.range(strRange).value=array(adoRset("bookid"),adoRset("bookname"),adoRset("author")) ‘把数据集中的数据填写到相应的单元中

num=num+1

adoRset.MoveNext

loop

(5) Excel临时报表文件的保存及处理

实际运行中应该注意每次一个用户进行报表打印时都采用一个临时的Excel文件,而不是硬性规定文件名,因为如果用固定的文件名的话,只有第一次生成是成功的,后面的操作都会因为已存在同名文件而导致失败。所以我们需要每次都产生一个临时的而且不重复的文件名,这里可以采用自定义的getTemporaryFile()函数由来生成,然后存放在变量filename中,用变量filepos表示这些临时文件的路径。

此外如果这些临时文件不处理的话久而久之会成为文件垃圾,因此在每个用户提交Excel报表打印请求时要先删除临时目录下所有原先产生的临时打印文件。

临时文件的处理主要代码如下:

function getTemporaryFile(myFileSystem)

dim tempFile,dotPos

tempFile=myFileSystem.getTempName

dotPos=instr(1,tempFile,".")

getTemporaryFile=mid(tempFile,1,dotPos)&"xls"

end function

set myFs=createObject("scripting.FileSystemObject")

filePos=server.mappath("\test") & "\tmp\" '要存放打印临时文件的临时目录

fileName=getTemporaryFile(myFs) '取得一个临时文件名

myFs.DeleteFile filePos&"*.xls" '删除该目录下所有原先产生的临时打印文件

set myFs=nothing

Excel临时文件的保存代码为:

objExcel.ActiveWorkbook.saveas filePos&filename

(6) 退出Excel应用

objExcel.quit

set objExcel=Nothing

(7) Excel报表的打印

前面的步骤已经生成了Excel报表,下一步进行打印,采用的策略可以有两种:

方案一:提供上面生成的Excel报表临时文件链接给用户,用户可以直接点击在浏览器中打开Excel报表并通过浏览器的打印功能进行打印,也可以点击右键然后另存到本地后再作打印等相关处理。

方案二:生成Excel报表后直接在客户端加载到浏览器,当然在没有完全加载时应该提示“正在加载,请等待”等字样。

2.3 系统配置与注意事项

虽然以上代码很简单,但实际应用不当经常会出现错误,所以下面要讲到的系统配置和注意事项非常关键。

(1) 千万要保证以上代码输入的正确性,否则一旦运行错误,Excel对象会滞留内存,难以消除,导致下一次调用时速度狂慢,并产生内存不可读写的Windows错误。这时的解决方法就是注销当前用户,如果还不行,就只能Reset了。

(2) 一定要设置好负责打印功能的asp文件的权限。方法是:在IIS管理中,选择该asp文件,右键然后选“属性”/“文件安全性”/"匿名访问和验证控制“,在这里IIS默认是匿名访问,应该选择验证访问(这里基本验证和集成Windows验证两种方式均可,但前者不够安全),这一点无比重要,否则应用当中会出错的。

(3) 有的时候报表分为多页,而且我们希望每一页有相同的表头,要求表头每页都自动打印,可以在Excel模板中进行设置。方法如下:选择菜单"文件"/"页面设置"/"工作表",然后在"顶端标题行"输入你表头的行数(如:表头为1-3行即填入:$1:$3)。



3.总结

以上我们给出了一个采用ASP写的在B/S模式下实现EXCEL报表的生成与打印的例子,在实际当中已经得到了良好的应用。事实也证明,这个例子的代码虽然不难写,但一定要注意系统的配置,这也是无数次失败后得出的经验。
回复
Dadimamiilove 2009-08-13
下面是动态表格的代码:
<table id="list" width="100%" border="1" align="center">
<%
If not(rs.eof and rs.bof) Then
Dim n
n=100/(k+1)
'first line
Response.Write" <tr> "&vbcrlf
'列名
For i=0 to k-1
.Write " <td width=""n&%"" nowrap=""nowrap"" class=""STYLE4""> <div align=""center""> "&Str(i)&" </div> </td> "&vbcrlf
Next
Response.Write" <td width=""n&%"" nowrap=""nowrap"" class=""STYLE4""> <div align=""center""> 详细 </div> </td> "&vbcrlf
Response.Write" </tr> "&vbcrlf
'next line
Do While not rs.eof
Dim s
Response.Write" <tr> "&vbcrlf
For i=0 to k-1
s=rs(i)
Response.write " <td width=""n&%"" nowrap=""nowrap"" class=""STYLE4""> <div align=""center""> "&s&" </div> </td> "&vbcrlf
Next
Response.write " <td nowrap=""nowrap"" class=""STYLE4""> <div align=""center""> <A HREF=""details.asp?""NO=""rs(""NO"")""> 详细 </A> | <A HREF=""editinfo.asp?""NO=""rs(""NO"")""> 修改 </A> </div> </td> "&vbcrlf
Response.Write" <tr> "&vbcrlf
rs.MoveNext
Loop
Else Response.write " <tr> <td align=""center""> 无符合条件的记录! </td> </tr> "
End If
%>
</table>

JScript导成EXCEL

<script language="javascript">

function tableToExcel()

{

window.clipboardData.setData("Text",document.all('theObjTable').outerHTML);

try

{

var ExApp = new ActiveXObject("Excel.Application")

var ExWBk = ExApp.workbooks.add()

var ExWSh = ExWBk.worksheet*(1)

**App.DisplayAlerts = false

ExApp.visible = true

}

catch(e)

{

alert("您的电脑没有安装Microsoft Excel软件!")

return false

}

ExWBk.worksheets(1).Paste;

}

</script>

<input type="button" value="导入到excel" onclick="tableToExcel()">

定义页面显示数据的table的ID 然后调用这个函数 一切OK!

<script language="javascript">

</script>

<input type="button" value="导入到excel" onclick="tableToExcel()">
回复
yajun_snow 2009-08-11
[Quote=引用楼主 yajun_snow 的回复:]
          response.contenttype="application/vnd.ms-excel:"
          response.addheader "content-disposition","attachment;filename=form.xls"

用这种办法导出excel,数据量大的时候,就导不出excel。
请问应该怎么解决。
[/Quote]

不太明白。有没有例子提供下,谢谢
回复
天下如山 2009-08-11
学习 没遇到 ,就当做学习
回复
cpp2017 2009-08-11
数据量大的时候建立生成多个.xls,分开下载.
回复
asasas20020 2009-08-11
1,首先在D:\test\生成test_1.xls和test_2.xls两个文件
(在程序逻辑里把原来大的文件分成小的文件,比如超过20个sheet就再生成一个excel)
2,生成多个文件的连接。这里以生成上述两个文件为例

FilesDownLoad.asp
<%

Dim strOutFileName

Dim fso 'FSO

Dim fs

Dim f

Dim i

Set fso = Server.CreateObject("Scripting.FileSystemObject")

Set fs = fso.GetFolder("D:\test").Files

i=0

For Each f In fs

i=i+1

strOutFileName = "/download.asp?ReportName=" & "test" & "_" & Cstr(i) & _

"&ReportPath=" & "D:\test" & "/" & f.Name

%>

<BR><BR><A name="reportlink" href="<%= strOutFileName %>"><%= "test" & "_" & Cstr(i)%></A>

<%

Next

%>


3,点击连接后,下载
download.asp

<%



Dim objStream

Const ADO_TYPE_BINARY = 1



Select Case Right(Request("ReportPath"), 4)

Case ".xls"

Response.ContentType = "application/vnd.ms-excel"

Case ".csv"

Response.ContentType = "application/x-csv"

Case Else



Response.ContentType = "text/plain"

End Select

Response.AddHeader "content-disposition","attachment;filename=" & Request("ReportName") & Right(Request("ReportPath"), 4)



Set objStream = Server.CreateObject("ADODB.Stream")

objStream.Open

objStream.Type = ADO_TYPE_BINARY

objStream.LoadFromFile Request("ReportPath")

Response.BinaryWrite objStream.Read

objStream.Close

Set objStream = Nothing

%>
回复
发动态
发帖子
ASP
创建于2007-09-28

2.8w+

社区成员

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
申请成为版主
社区公告
暂无公告