来源:www.cncfan.com | 2006-8-9 | (有2569人读过)
生成报表是做系统经常遇到的事,一些企业或者单位往往要求EXCEL格式的报表! 第一种方式
程序代码
Set fs = server.CreateObject("scripting.filesystemobject") '--假设你想让生成的EXCEL文件做如下的存放 filename = "c:\online.xls" '-创建EXCEL文件 set myfile = fs.CreateTextFile(filename,true)
rs.Open sql,conn if rs.EOF and rs.BOF then
else
dim strLine,responsestr strLine="" For each x in rs.fields strLine= strLine & x.name & chr(9) Next
'--将表的列名先写入EXCEL myfile.writeline strLine
Do while Not rs.EOF strLine=""
for each x in rs.Fields strLine= strLine & x.value & chr(9) next '--将表的数据写入EXCEL myfile.writeline strLine
rs.MoveNext loop
end if
Set fs=Nothing
这方法的好处是不管有多少条记录 速度上是没问题 但是有一个很严重的缺点 就是生成的EXCEL文件的格式不能得到很好的控制 例如 单元格的格式不能改变等
第二种方法 用EXCEL组件+EXCEL模板 原理是打开一个存在的EXCEL模板文件 然后写入数据后在另存为所要的报表文件 优点:格式能很好的控制 缺点:速度上很慢 (因为控件接口很费资源) 看了微软的说明又想到了用数组做中转的方法 只要打开一个接口写入所有数据,于是问题得到了解决,可是新的问题出来了,100万或者更高的记录时 数组就的空间分配就成了问题了. 工夫不负有心人 ,经过几天努力 终于完美解决
就是记录多时分批写入~~~~~~~~~
程序代码
sub writetoarr(lines,begin_rs,begin_exl) '============================================================================== '过程writetoarr(lines,begin_rs,begin_exl)写入EXCEL 'lines:要写入的记录条数 'begin_rs:从第几条记录开始 'begin_exl:要写入的EXCEL开始位置 '============================================================================== redim temparr(lines-1,11) '--将表的列名存放到数组 '--将表的数据存放到数组 ii=1 For i = begin_rs To begin_rs+lines-1 j=0 'response.write ii&"<br>" For each x in rs.fields temparr(ii-1,j)=x.value j=j+1 Next ii=ii+1 rs.movenext Next
objExcelSheet.Range("A"&begin_exl).Resize(lines, 12).Value = temparr redim temparr(0,0)
response.write "从A"&begin_exl&"开始写到A"&begin_exl+lines&"<br>" response.write "从第"&begin_rs&"条到"&begin_rs+lines&"条记录<br>" response.write "共写入"&lines&"行<br>" response.write "-------------------------<br>"
end sub
maxk=rs.recordcount beginrs=1 '从第几条记录开始,一般是1 beginexl=2 '从excel的第几行开始写,一般是2 liness=200 '每次操作多少条记录,不建议超过10万
do while maxk>0 if maxk>liness then call writetoarr(liness,beginrs,beginexl) beginrs=beginrs+liness beginexl=beginexl+liness maxk=maxk-liness else call writetoarr(maxk,beginrs,beginexl) exit do end if loop
|