ASP程序快速生成Excel文件

ASP程序快速生成Excel文件

 

在一个web项目中,要求将数据生成Excel文件保存到本地,最早使用的方法是直接使用Microsoft的Office Web组件,但是总体感觉是慢(微软的通病)。然后使用SQL SERVER语句直接生成excel文件,速度是快了,但是标题等信息还需要再打开一次生成的文件进行修改,还有一个更重要问题就是当查询比较复杂的时候,就很难处理。后来又想用csv格式,但是存在分隔符好可能与数据存在冲突,出现问题。最后想到Office xp以上版本的EXCEL不是可以保存为xml格式么?那么是否可以直接以写文件的形式xml格式呢?于是立刻将一个测试的Excel文件保存成为xml格式,然后对其格式进行了分析研究,最终发现是可行的,而且速度比其他方式快多了,而且效果也好很多。
下面是一个生成的Excel文件的例子:
 
 
  1. <?xml version="1.0"  encoding="gb2312"?> 
  2.  
  3. <?mso-application progid="Excel.Sheet"?> 
  4.  
  5. <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
  6.  
  7. xmlns:o="urn:schemas-microsoft-com:office:office" 
  8.  
  9. xmlns:x="urn:schemas-microsoft-com:office:excel" 
  10.  
  11. xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
  12.  
  13. xmlns:html="http://www.w3.org/TR/REC-html40"> 
  14.  
  15. <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> 
  16.  
  17. </DocumentProperties> 
  18.  
  19. <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> 
  20.  
  21. <ProtectStructure>False</ProtectStructure> 
  22.  
  23. <ProtectWindows>False</ProtectWindows> 
  24.  
  25. </ExcelWorkbook> 
  26.  
  27. <Styles> 
  28.  
  29. <Style ss:ID="Default" ss:Name="Normal"> 
  30.  
  31. <Alignment ss:Vertical="Bottom"/> 
  32.  
  33. <Borders/> 
  34.  
  35. <Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/> 
  36.  
  37. <Interior/> 
  38.  
  39. <NumberFormat/> 
  40.  
  41. <Protection/> 
  42.  
  43. </Style> 
  44.  
  45. <Style ss:ID="s21"> 
  46.  
  47. <NumberFormat ss:Format="Currency"/> 
  48.  
  49. </Style> 
  50.  
  51. <Style ss:ID="s23"> 
  52.  
  53. <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/> 
  54.  
  55. </Style> 
  56.  
  57. </Styles> 
  58.  
  59. <Worksheet ss:Name="库存统计"> 
  60.  
  61. <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="4" x:FullColumns="1" 
  62.  
  63. x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"> 
  64.  
  65. <Column ss:Index="2" ss:AutoFitWidth="0" ss:Width="230.25"/> 
  66.  
  67. <Column ss:AutoFitWidth="0" ss:Width="86.25"/> 
  68.  
  69. <Row> 
  70.  
  71. <Cell ss:MergeAcross="6" ss:StyleID="s23"><Data ss:Type="String">2006年全年文具用品库存统计</Data></Cell> 
  72.  
  73. </Row> 
  74.  
  75. <Row> 
  76.  
  77. <Cell><Data ss:Type="String">物品编号</Data></Cell> 
  78.  
  79. <Cell><Data ss:Type="String">物品名称</Data></Cell> 
  80.  
  81. <Cell><Data ss:Type="String">型号规格</Data></Cell> 
  82.  
  83. <Cell><Data ss:Type="String">计量单位</Data></Cell> 
  84.  
  85. <Cell><Data ss:Type="String">进仓数量</Data></Cell> 
  86.  
  87. <Cell><Data ss:Type="String">出仓数量</Data></Cell> 
  88.  
  89. <Cell><Data ss:Type="String">库存</Data></Cell> 
  90.  
  91. </Row> 
  92.  
  93. <Row> 
  94.  
  95. <Cell><Data ss:Type="String">02001001</Data></Cell> 
  96.  
  97. <Cell><Data ss:Type="String">钢笔</Data></Cell> 
  98.  
  99. <Cell><Data ss:Type="String">钢笔</Data></Cell> 
  100.  
  101. <Cell><Data ss:Type="String">支</Data></Cell> 
  102.  
  103. <Cell><Data ss:Type="Number">30</Data></Cell> 
  104.  
  105. <Cell><Data ss:Type="Number">2</Data></Cell> 
  106.  
  107. <Cell><Data ss:Type="Number">28</Data></Cell> 
  108.  
  109. </Row> 
  110.  
  111. <Row> 
  112.  
  113. <Cell><Data ss:Type="String">02002001</Data></Cell> 
  114.  
  115. <Cell><Data ss:Type="String">签字笔</Data></Cell> 
  116.  
  117. <Cell><Data ss:Type="String">签字笔</Data></Cell> 
  118.  
  119. <Cell><Data ss:Type="String">支</Data></Cell> 
  120.  
  121. <Cell><Data ss:Type="Number">200</Data></Cell> 
  122.  
  123. <Cell><Data ss:Type="Number">54</Data></Cell> 
  124.  
  125. <Cell><Data ss:Type="Number">146</Data></Cell> 
  126.  
  127. </Row> 
  128.  
  129. </Table> 
  130.  
  131. <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> 
  132.  
  133. <ProtectObjects>False</ProtectObjects> 
  134.  
  135. <ProtectScenarios>False</ProtectScenarios> 
  136.  
  137. </WorksheetOptions> 
  138.  
  139. </Worksheet> 
  140.  
  141. </Workbook> 
在生成该文件的时候一定要注意以下几个问题,不然生成的文件用EXCEL打开的时候会产生错误。
1.
该句一定要加encoding="gb2312",不然在处理style定义的时候如果包含“宋体”等文字会产生错误。直接用EXCEL保存出来的XML文件是不包含这个编码定义。这个问题很奇怪,我一直搞不明白为什么Excel直接生成的就行,而我自己处理加工的就不行。

 

2. <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="4" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
这句里面的ExpandedColumnCount和ExpandedRowCount的数字一定要正确。ExpandedColumnCount是表格的列数,ExpandedRowCount是表格的行数。

 

3.年全年文具用品库存统计</Data></Cell> <Cell ss:MergeAcross="6" ss:StyleID="s23"><Data ss:Type="String">2006
这句里面的ss:MergeAcross="6"也要注意,不能超出第2个问题中定义的列数。
ss:StyleID="s23"是表示该单元格使用的显示格式是style里面的s23定义,就是:
<Style ss:ID="s23">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
</Style>

 

4. 设置sheet的名字
要设置sheet的名字可以在该行设置:<Worksheet ss:Name="库存统计">

 

 

下面是生成该文件的一个ASP程序:
 
 
  1. <!--#include file="include/conn.asp"-->  
  2.  
  3. <%  
  4.  
  5. dim rs,,recordcount,datas,sql,heads,filepath,fso,f,filename,crlf  
  6.  
  7. crlf=chr(10)&chr(13)  
  8.  
  9. recordcount=0  ‘设置记录总数为0  
  10.  
  11. ‘生成一个excel文件名  
  12.  
  13.        if month(now)>9 then 
  14.  
  15.               if day(now)>9 then 
  16.  
  17.                      filename=year(now) & month(now) & day(now) & replace(time,":","") & ".xls" 
  18.  
  19.               else 
  20.  
  21.                      filename=year(now) & month(now) & "0" & day(now) & replace(time,":","") & ".xls" 
  22.  
  23.               end if  
  24.  
  25.        else 
  26.  
  27.               if day(now)>9 then 
  28.  
  29.                      filename=year(now) & "0" & month(now) & day(now) & replace(time,":","") & ".xls" 
  30.  
  31.               else 
  32.  
  33.                      filename=year(now) & "0" & month(now) & "0" & day(now) & replace(time,":","") & ".xls" 
  34.  
  35.               end if  
  36.  
  37. ‘获取生成临时excel文件的目录  
  38.  
  39.        filepath=server.mappath("./excel/"& filename)  
  40.  
  41.        openconn()   ‘打开数据库连接  
  42.  
  43.        sql="SELECT WPID, Name, Standard, Unit,instocks,outstocks FROM wupin order by wpid" 
  44.  
  45.        set rs=conn.execute(sql)  ‘打开记录集  
  46.  
  47. ‘生成行列数据  
  48.  
  49.        do while not rs.eof   
  50.  
  51.               datas=datas & "<Row>" & crlf & _  
  52.  
  53.               ProcessColXMlData(rs(0),3) & crlf & _  
  54.  
  55.               ProcessColXMlData(rs(1),3) & crlf & _  
  56.  
  57.               ProcessColXMlData(rs(2),3) & crlf & _  
  58.  
  59.               ProcessColXMlData(rs(3),3) & crlf & _  
  60.  
  61.               ProcessColXMlData(rs(4),1) & crlf & _  
  62.  
  63.               ProcessColXMlData(rs(5),1) & crlf & _  
  64.  
  65.               ProcessColXMlData((rs(4)-rs(5)),1) & crlf & _  
  66.  
  67.               "</Row>" & crlf  
  68.  
  69.               recordcount=recordcount+1 ‘记录总数+1  
  70.  
  71.               rs.movenext  
  72.  
  73.        loop  
  74.  
  75.        closeconn(3)  ‘关闭数据库连接  
  76.  
  77.        Set fso = CreateObject("Scripting.FileSystemObject")  
  78.  
  79.        set f=fso.CreateTextFile(filepath,2) ‘常见一个要输出的文本文件  
  80.  
  81. ‘写excel的文件头  
  82.  
  83.        f.write "<?xml version=""1.0""  encoding=""gb2312""?>" & crlf &  _  
  84.  
  85.               "<?mso-application progid=""Excel.Sheet""?>" & crlf &  _  
  86.  
  87.               "<Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet""" & crlf &  _  
  88.  
  89.               "xmlns:o=""urn:schemas-microsoft-com:office:office""" & crlf &  _  
  90.  
  91.               "xmlns:x=""urn:schemas-microsoft-com:office:excel""" & crlf &  _  
  92.  
  93.               "xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet""" & crlf &  _  
  94.  
  95.               "xmlns:html=""http://www.w3.org/TR/REC-html40"">" & crlf &  _  
  96.  
  97.               "<DocumentProperties xmlns=""urn:schemas-microsoft-com:office:office"">" & crlf &  _  
  98.  
  99.               "</DocumentProperties>" & crlf &  _  
  100.  
  101.               "<ExcelWorkbook xmlns=""urn:schemas-microsoft-com:office:excel"">" & crlf &  _  
  102.  
  103.               "<ProtectStructure>False</ProtectStructure>" & crlf &  _  
  104.  
  105.               "<ProtectWindows>False</ProtectWindows>" & crlf &  _  
  106.  
  107.               "</ExcelWorkbook>" & crlf &  _  
  108.  
  109.               "<Styles>" & crlf &  _  
  110.  
  111.               "<Style ss:ID=""Default"" ss:Name=""Normal"">" & crlf &  _  
  112.  
  113.                      "<Alignment ss:Vertical=""Bottom""/>" & crlf &  _  
  114.  
  115.                      "<Borders/>" & crlf &  _  
  116.  
  117.                      "<Font ss:FontName=""宋体"" x:CharSet=""134"" ss:Size=""12""/>" & crlf &  _  
  118.  
  119.                      "<Interior/>" & crlf &  _  
  120.  
  121.                      "<NumberFormat/>" & crlf &  _  
  122.  
  123.                      "<Protection/>" & crlf &  _  
  124.  
  125.               "</Style>" & crlf &  _  
  126.  
  127.               "<Style ss:ID=""s21"">" & crlf &  _  
  128.  
  129.                      "<NumberFormat ss:Format=""Currency""/>" & crlf &  _  
  130.  
  131.               "</Style>" & crlf &  _  
  132.  
  133.               "<Style ss:ID=""s23"">" & crlf &  _  
  134.  
  135.                      "<Alignment ss:Horizontal=""Center"" ss:Vertical=""Bottom""/>" & crlf &  _  
  136.  
  137.               "</Style>" & crlf &  _  
  138.  
  139.               "</Styles>" & crlf &  _  
  140.  
  141.               "<Worksheet ss:Name=""库存统计"">" & crlf & _  
  142.  
  143.               "<Table ss:ExpandedColumnCount=""7"" ss:ExpandedRowCount="""&(recordcount+2)&""" x:FullColumns=""1""" & crlf & _  
  144.  
  145.           "x:FullRows=""1"" ss:DefaultColumnWidth=""54"" ss:DefaultRowHeight=""14.25"">" & crlf & _  
  146.  
  147.           "<Column ss:Index=""2"" ss:AutoFitWidth=""0"" ss:Width=""230.25""/>" & crlf & _  
  148.  
  149.           "<Column ss:AutoFitWidth=""0"" ss:Width=""86.25""/>" & crlf & _  
  150.  
  151.           "<Row>" & crlf  
  152.  
  153. ‘写标题行  
  154.  
  155.           f.write "<Cell ss:MergeAcross=""6"" ss:StyleID=""s23""><Data ss:Type=""String"">"&syear&"年全年"&GetClassName(classid)&"库存统计</Data></Cell>" & crlf  
  156.  
  157. ‘写表格标题  
  158.  
  159.           f.write "</Row>" & crlf & _  
  160.  
  161.           "<Row>" & crlf & _  
  162.  
  163.            "<Cell><Data ss:Type=""String"">物品编号</Data></Cell>" & crlf &_  
  164.  
  165.            "<Cell><Data ss:Type=""String"">物品名称</Data></Cell>" & crlf &_  
  166.  
  167.            "<Cell><Data ss:Type=""String"">型号规格</Data></Cell>" & crlf &_  
  168.  
  169.            "<Cell><Data ss:Type=""String"">计量单位</Data></Cell>" & crlf &_  
  170.  
  171.            "<Cell><Data ss:Type=""String"">进仓数量</Data></Cell>" & crlf &_  
  172.  
  173.            "<Cell><Data ss:Type=""String"">出仓数量</Data></Cell>" & crlf &_  
  174.  
  175.            "<Cell><Data ss:Type=""String"">库存</Data></Cell>" & crlf &_  
  176.  
  177.            "</Row>" & crlf  
  178.  
  179. ‘写数据  
  180.  
  181.        f.write datas  
  182.  
  183. ‘写excel文件尾  
  184.  
  185.        f.write "</Table>" & crlf & _  
  186.  
  187.               "<WorksheetOptions xmlns=""urn:schemas-microsoft-com:office:excel"">" & crlf & _  
  188.  
  189.                      "<ProtectObjects>False</ProtectObjects>" & crlf & _  
  190.  
  191.                      "<ProtectScenarios>False</ProtectScenarios>" & crlf & _  
  192.  
  193.               "</WorksheetOptions>" & crlf & _  
  194.  
  195.               "</Worksheet>" & crlf & _  
  196.  
  197.               "</Workbook>" & crlf  
  198.  
  199.        f.close 
  200.  
  201.        set fso=nothing  
  202.  
  203.    ‘转向excel文件,提供下载  
  204.  
  205.        response.redirect("./excel/"& filename)  
  206.  
  207. end if  
  208. ‘该函数根据数据类型处理字段的输出格式  
  209.  
  210. Function ProcessColXMlData(data,dataType)  
  211.  
  212.        if len(data)=0 or isnull(data) or data="" then data="" 
  213.  
  214.        select case dataType  
  215.  
  216.               case 1 '整型  
  217.  
  218.                      ProcessColXMlData="<Cell><Data ss:Type=""Number"">"&data&"</Data></Cell>" 
  219.  
  220.               case 2 '货币  
  221.  
  222.                      ProcessColXMlData="<Cell ss:StyleID=""s21""><Data ss:Type=""Number"">"&data&"</Data></Cell>" 
  223.  
  224.               case 3 '字符串  
  225.  
  226.                      ProcessColXMlData="<Cell><Data ss:Type=""String"">"&data&"</Data></Cell>"     
  227.  
  228.               case 4 '日期  
  229.                      ProcessColXMlData="<Cell ss:StyleID=""s22""><Data ss:Type=""DateTime"">"&data&"</Data></Cell>" 
  230.               end select 
  231. End Function 
  232. %> 

 

总结:使用该方法生成EXCEL文件不单速度快,而且灵活,可以适合多种样式的表格数据,唯一缺陷是不支持图表。
 

 

参考资料:

HOWTO: Use Visual Basic or ASP to Create an XML Spreadsheet for Excel 2002

如何使用 Visual Basic 或 ASP 创建 Excel 2002 和 Excel 2003 的 XML 表格

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值