`
yesjavame
  • 浏览: 693119 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

ASP程序快速生成Excel文件

阅读更多

ASP程序快速生成Excel文件

在一个web项目中,要求将数据生成Excel文件保存到本地,最早使用的方法是直接使用MicrosoftOffice Web组件,但是总体感觉是慢(微软的通病)。然后使用SQL SERVER语句直接生成excel文件,速度是快了,但是标题等信息还需要再打开一次生成的文件进行修改,还有一个更重要问题就是当查询比较复杂的时候,就很难处理。后来又想用csv格式,但是存在分隔符好可能与数据存在冲突,出现问题。最后想到Office xp以上版本的EXCEL不是可以保存为xml格式么?那么是否可以直接以写文件的形式xml格式呢?于是立刻将一个测试的Excel文件保存成为xml格式,然后对其格式进行了分析研究,最终发现是可行的,而且速度比其他方式快多了,而且效果也好很多。

下面是一个生成的Excel文件的例子:

<?xml version="1.0" encoding="gb2312"?>

<?mso-application progid="Excel.Sheet"?>

<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"

xmlns:o="urn:schemas-microsoft-com:office:office"

xmlns:x="urn:schemas-microsoft-com:office:excel"

xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"

xmlns:html="http://www.w3.org/TR/REC-html40">

<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">

</DocumentProperties>

<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">

<ProtectStructure>False</ProtectStructure>

<ProtectWindows>False</ProtectWindows>

</ExcelWorkbook>

<Styles>

<Style ss:ID="Default" ss:Name="<city w:st="on"><place w:st="on">Normal</place></city>">

<Alignment ss:Vertical="Bottom"/>

<Borders/>

<Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>

<Interior/>

<NumberFormat/>

<Protection/>

</Style>

<Style ss:ID="s21">

<NumberFormat ss:Format="Currency"/>

</Style>

<Style ss:ID="s23">

<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>

</Style>

</Styles>

<Worksheet ss:Name="库存统计">

<Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="4" x:FullColumns="1"

x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">

<Column ss:Index="2" ss:AutoFitWidth="0" ss:Width="230.25"/>

<Column ss:AutoFitWidth="0" ss:Width="86.25"/>

<Row>

<Cell ss:MergeAcross="6" ss:StyleID="s23"><Data ss:Type="String">2006年全年文具用品库存统计</Data></Cell>

</Row>

<Row>

<Cell><Data ss:Type="String">物品编号</Data></Cell>

<Cell><Data ss:Type="String">物品名称</Data></Cell>

<Cell><Data ss:Type="String">型号规格</Data></Cell>

<Cell><Data ss:Type="String">计量单位</Data></Cell>

<Cell><Data ss:Type="String">进仓数量</Data></Cell>

<Cell><Data ss:Type="String">出仓数量</Data></Cell>

<Cell><Data ss:Type="String">库存</Data></Cell>

</Row>

<Row>

<Cell><Data ss:Type="String">02001001</Data></Cell>

<Cell><Data ss:Type="String">钢笔</Data></Cell>

<Cell><Data ss:Type="String">钢笔</Data></Cell>

<Cell><Data ss:Type="String"></Data></Cell>

<Cell><Data ss:Type="Number">30</Data></Cell>

<Cell><Data ss:Type="Number">2</Data></Cell>

<Cell><Data ss:Type="Number">28</Data></Cell>

</Row>

<Row>

<Cell><Data ss:Type="String">02002001</Data></Cell>

<Cell><Data ss:Type="String">签字笔</Data></Cell>

<Cell><Data ss:Type="String">签字笔</Data></Cell>

<Cell><Data ss:Type="String"></Data></Cell>

<Cell><Data ss:Type="Number">200</Data></Cell>

<Cell><Data ss:Type="Number">54</Data></Cell>

<Cell><Data ss:Type="Number">146</Data></Cell>

</Row>

</Table>

<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">

<ProtectObjects>False</ProtectObjects>

<ProtectScenarios>False</ProtectScenarios>

</WorksheetOptions>

</Worksheet>

</Workbook>

在生成该文件的时候一定要注意以下几个问题,不然生成的文件用EXCEL打开的时候会产生错误。

1. <?xml version="1.0" encoding="gb2312"?>

该句一定要加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">

这句里面的ExpandedColumnCountExpandedRowCount的数字一定要正确。ExpandedColumnCount是表格的列数,ExpandedRowCount是表格的行数。

3. <Cell ss:MergeAcross="6" ss:StyleID="s23"><Data ss:Type="String">2006年全年文具用品库存统计</Data></Cell>

这句里面的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程序:

<!--#include file="include/conn.asp"-->

<%

dim rs,,recordcount,datas,sql,heads,filepath,fso,f,filename,crlf

crlf=chr(10)&chr(13)

recordcount=0 设置记录总数为0

生成一个excel文件名

if month(now)>9 then

if day(now)>9 then

filename=year(now) & month(now) & day(now) & replace(time,":","") & ".xls"

else

filename=year(now) & month(now) & "0" & day(now) & replace(time,":","") & ".xls"

end if

else

if day(now)>9 then

filename=year(now) & "0" & month(now) & day(now) & replace(time,":","") & ".xls"

else

filename=year(now) & "0" & month(now) & "0" & day(now) & replace(time,":","") & ".xls"

end if

获取生成临时excel文件的目录

filepath=server.mappath("./excel/"& filename)

openconn() 打开数据库连接

sql="SELECT WPID, Name, Standard, Unit,instocks,outstocks FROM wupin order by wpid"

set rs=conn.execute(sql) 打开记录集

生成行列数据

do while not rs.eof

datas=datas & "<Row>" & crlf & _

ProcessColXMlData(rs(0),3) & crlf & _

ProcessColXMlData(rs(1),3) & crlf & _

ProcessColXMlData(rs(2),3) & crlf & _

ProcessColXMlData(rs(3),3) & crlf & _

ProcessColXMlData(rs(4),1) & crlf & _

ProcessColXMlData(rs(5),1) & crlf & _

ProcessColXMlData((rs(4)-rs(5)),1) & crlf & _

"</Row>" & crlf

recordcount=recordcount+1 ‘记录总数+1

rs.movenext

loop

closeconn(3) 关闭数据库连接

Set fso = CreateObject("Scripting.FileSystemObject")

set f=fso.CreateTextFile(filepath,2) ‘常见一个要输出的文本文件

excel的文件头

f.write "<?xml version=""1.0"" encoding=""gb2312""?>" & crlf & _

"<?mso-application progid=""Excel.Sheet""?>" & crlf & _

"<Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet""" & crlf & _

"xmlns:o=""urn:schemas-microsoft-com:office:office""" & crlf & _

"xmlns:x=""urn:schemas-microsoft-com:office:excel""" & crlf & _

"xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet""" & crlf & _

"xmlns:html=""http://www.w3.org/TR/REC-html40"">" & crlf & _

"<DocumentProperties xmlns=""urn:schemas-microsoft-com:office:office"">" & crlf & _

"</DocumentProperties>" & crlf & _

"<ExcelWorkbook xmlns=""urn:schemas-microsoft-com:office:excel"">" & crlf & _

"<ProtectStructure>False</ProtectStructure>" & crlf & _

"<ProtectWindows>False</ProtectWindows>" & crlf & _

"</ExcelWorkbook>" & crlf & _

"<Styles>" & crlf & _

"<Style ss:ID=""Default"" ss:Name=""<place w:st="on"><city w:st="on">Normal</city></place>"">" & crlf & _

"<Alignment ss:Vertical=""Bottom""/>" & crlf & _

"<Borders/>" & crlf & _

"<Font ss:FontName=""宋体"" x:CharSet=""134"" ss:Size=""12""/>" & crlf & _

"<Interior/>" & crlf & _

"<NumberFormat/>" & crlf & _

"<Protection/>" & crlf & _

"</Style>" & crlf & _

"<Style ss:ID=""s21"">" & crlf & _

"<NumberFormat ss:Format=""Currency""/>" & crlf & _

"</Style>" & crlf & _

"<Style ss:ID=""s23"">" & crlf & _

"<Alignment ss:Horizontal=""Center"" ss:Vertical=""Bottom""/>" & crlf & _

"</Style>" & crlf & _

"</Styles>" & crlf & _

"<Worksheet ss:Name=""库存统计"">" & crlf & _

"<Table ss:ExpandedColumnCount=""7"" ss:ExpandedRowCount="""&(recordcount+2)&""" x:FullColumns=""1""" & crlf & _

"x:FullRows=""1"" ss:DefaultColumnWidth=""54"" ss:DefaultRowHeight=""14.25"">" & crlf & _

"<Column ss:Index=""2"" ss:AutoFitWidth=""0"" ss:Width=""230.25""/>" & crlf & _

"<Column ss:AutoFitWidth=""0"" ss:Width=""86.25""/>" & crlf & _

"<Row>" & crlf

写标题行

f.write "<Cell ss:MergeAcross=""6"" ss:StyleID=""s23""><Data ss:Type=""String"">"&syear&"年全年"&GetClassName(classid)&"库存统计</Data></Cell>" & crlf

写表格标题

f.write "</Row>" & crlf & _

"<Row>" & crlf & _

"<Cell><Data ss:Type=""String"">物品编号</Data></Cell>" & crlf &_

"<Cell><Data ss:Type=""String"">物品名称</Data></Cell>" & crlf &_

"<Cell><Data ss:Type=""String"">型号规格</Data></Cell>" & crlf &_

"<Cell><Data ss:Type=""String"">计量单位</Data></Cell>" & crlf &_

"<Cell><Data ss:Type=""String"">进仓数量</Data></Cell>" & crlf &_

"<Cell><Data ss:Type=""String"">出仓数量</Data></Cell>" & crlf &_

"<Cell><Data ss:Type=""String"">库存</Data></Cell>" & crlf &_

"</Row>" & crlf

写数据

f.write datas

excel文件尾

f.write "</Table>" & crlf & _

"<WorksheetOptions xmlns=""urn:schemas-microsoft-com:office:excel"">" & crlf & _

"<ProtectObjects>False</ProtectObjects>" & crlf & _

"<ProtectScenarios>False</ProtectScenarios>" & crlf & _

"</WorksheetOptions>" & crlf & _

"</Worksheet>" & crlf & _

"</Workbook>" & crlf

f.close

set fso=nothing

转向excel文件,提供下载

response.redirect("./excel/"& filename)

end if

该函数根据数据类型处理字段的输出格式

Function ProcessColXMlData(data,dataType)

if len(data)=0 or isnull(data) or data="" then data=""

select case dataType

case 1 '整型

ProcessColXMlData="<Cell><Data ss:Type=""Number"">"&data&"</Data></Cell>"

case 2 '货币

ProcessColXMlData="<Cell ss:StyleID=""s21""><Data ss:Type=""Number"">"&data&"</Data></Cell>"

case 3 '字符串

ProcessColXMlData="<Cell><Data ss:Type=""String"">"&data&"</Data></Cell>"

case 4 '日期

ProcessColXMlData="<Cell ss:StyleID=""s22""><Data ss:Type=""DateTime"">"&data&"</Data></Cell>"

end select

End Function

%>

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

参考资料:

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

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

http://support.microsoft.com/kb/285891

分享到:
评论

相关推荐

    asp.net生成Excel文件

    如果你的压缩包文件"WebExeclOper"包含了示例代码或项目,那么可能包含了一个ASP.NET应用程序,演示了如何通过代码生成Excel文件。通过分析这些文件,你可以学习到具体的实现细节,如如何导入库、创建工作簿对象、...

    ASP生成EXCEL并自动下载

    这部分涉及使用asp.net(ASP的后续版本)来生成Excel文件。与纯ASP不同,asp.net可以更方便地利用.NET框架提供的类库,如Microsoft.Office.Interop.Excel,这允许直接操作Excel对象模型。不过,这种方式需要在...

    asp生成excel文件

    本文将深入探讨如何使用ASP生成Excel文件,这是一项常见的需求,尤其是在需要导出数据为Excel格式以便于进一步分析或共享的场景中。 ### ASP生成Excel文件的关键步骤 1. **创建或覆盖目标Excel文件** 在ASP代码...

    Asp生成Excel文件的类

    在ASP(Active Server Pages)开发中,生成Excel文件是一项常见的需求,例如为了导出数据报表或者让用户方便地下载数据。Asp生成Excel文件主要依赖于特定的类库或组件,这些类库通常提供了将HTML、数据或其他格式...

    ASP导出生成Excel

    在本场景中,我们关注的是如何使用ASP技术来导出数据并生成Excel文件,尤其是涉及与数据库交互的情况。这在数据分析、报表生成或者用户需要下载结构化数据时非常实用。 1. **ASP基础**: ASP是IIS(Internet ...

    asp 在线生成excel文件源码实例

    在这个"asp在线生成excel文件源码实例"中,我们主要探讨的是如何使用ASP来从ACCESS数据库提取数据,并将其转换为Excel文件供用户下载。 首先,我们需要了解ASP与ACCESS数据库的交互。在ASP中,我们通常使用ADO...

    使用.net将数据生成excel文件

    在.NET框架中,生成Excel文件是一项常见的任务,尤其在数据导出、报表生成或数据分析等场景下。本文将深入探讨如何使用.NET技术来创建Excel文件,主要关注如何通过编程方式生成Excel,而不是依赖于调用客户端的Excel...

    html,word,excel文件生成(Asp)

    - 对于Word和Excel文件的生成,Asp可以结合Microsoft Office的对象模型,如Word.Application和Excel.Application,通过COM组件在服务器上操作Office应用程序。 - 使用DODB.Stream对象,可以处理二进制数据,这对于...

    asp生成excel报表

    使用`Scripting.FileSystemObject`可以进行文件的创建和管理,这是生成Excel文件时创建或覆盖目标文件的基础。 #### C. ADODB.Stream对象 `ADODB.Stream`对象用于处理二进制数据流,如保存Excel文件。通过设置类型...

    asp 生成 excel

    在ASP中生成Excel文件,首先需要通过VBScript创建Excel应用程序对象,这可以通过`Server.CreateObject`方法实现。例如: ```vbscript Set objExcel = Server.CreateObject("Excel.Application") ``` 这样就创建...

    C#,asp.net在线生成Excel

    本主题聚焦于使用C#和ASP.NET技术在线生成Excel文件。C#是一种面向对象的编程语言,常用于开发Windows桌面应用和Web应用,而ASP.NET是微软提供的一个用于构建Web应用程序的框架,它可以与C#完美结合,提供服务器端的...

    asp.net+Ajax实现Excel文件导出

    这个方法会生成Excel文件,然后将其作为HTTP响应的附件返回。可以使用之前引入的库来创建工作簿,添加工作表,填充数据,并设置样式。 5. **设置HTTP响应头**:在返回Excel文件时,需要正确设置HTTP响应头,包括...

    ASP+模板生成Word、Excel灵活多变的办法

    由于工作的需要,我需要为客户做一个在线生成Excel及Word报表程序,参考了网上很多办法,大多数都是采用Excel.Application(http://www.blueidea.com/tech/program/2006/3547.asp)组件来生成,发现容易出错,而且对于...

    使用gridview生成excel文件

    在.NET开发环境中,使用GridView控件生成Excel文件是一种常见的数据导出方法,尤其适用于Web应用程序。GridView能够方便地展示数据库中的数据,并且可以被轻松地转换为Excel格式,供用户下载。下面我们将深入探讨...

    Asp.net 创建Excel文件

    在Asp.net中创建Excel文件是一项常见的需求,特别是在数据导出、报表生成或者数据分析场景下。这个场景描述中提到的方法是不依赖任何特定的控件,而是直接通过代码实现,这样可以提高程序的灵活性和效率。下面将详细...

    ASP生成EXCEL源码好使

    总的来说,掌握这些知识点可以帮助你理解和构建自己的ASP生成Excel文件的系统,这在数据导出和报表生成场景中非常实用。不过,需要注意的是,由于是在服务器端生成,需要确保服务器有足够的权限和资源来执行这些操作...

    asp生成excel

    ### ASP生成Excel报表知识点 #### 一、ASP与Excel报表生成背景 在Web开发领域,ASP(Active Server Pages)是一种服务器端脚本环境,用于创建动态网页或网站。随着网络应用的发展,用户对数据处理的需求越来越高,...

    c# asp.net 与 excel文件转换

    3. 下载文件:生成Excel文件流,并通过HTTP响应提供给用户下载。 在这个压缩包中,"Solution1"可能是包含项目源代码的解决方案文件,"MyDB.mdf"和"MyDB_log.ldf"是SQL Server Compact Edition的数据库文件,用于...

    asp.net 访问Excel文件源码

    总的来说,访问Excel文件在ASP.NET应用中是一个常见的需求,无论是为了数据导入导出、报表生成还是数据分析。通过VB.NET,我们可以借助不同的工具和策略来实现这一目标,确保数据的准确无误地读取和写入。

Global site tag (gtag.js) - Google Analytics