|
![]() |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
常常看到有些人问怎么把Table的资料转到Excel里面去,很多人在遇到这个问题都先考虑用execl.appliction,我用过感觉很不好,首先必需要把握它的一些内部用法,其次它在客户端使用时涉及安全性,使用不太好,以下给大家介绍三众方式: 方式一:用单纯的文本格式实现 该方式相称简朴,以下给出代码,各位就轻易明白 <% set fso=server.createobject("scripting.filesystemobject") strExcelFile=server.MapPath("txtToExcel.xls") if fso.fileExists(strExcelFile) then fso.deletefile strExcelFile Set xslFile = fso.CreateTextFile(strExcelFile , True) xslFile.WriteLine("df" & vbTab & "345" & vbLf & "fe" & vbTab & "mon" &vbLf) xslFile.Close set fso=nothing response.write "OK" %> 原理: 相信大家都知道,Excel是可以打开文本文件的(什么?你不知道,先回去做两个月的文员再来编程,太不懂打破规则了),而对于里面的文本内容 Excel则会这样处理:假如碰到[制表符]Tab键则跳下一列,假如碰到[换行符]则换下一行,所以根据这个规则我们整理一下就可以产生单一表格式 Excel文件了, 长处: 把握简朴,纯粹的文字整理而已(哈!原来不就是文字游戏而已,哼!提到游戏就精神了吧) 缺点: 效率较低,把一个较多内容的table转成Excel档要则执行较长的循环(),而文档格式只能是规则的行列格式,对表格不能做更多的设置 方式二:用OWC实现: 此方式也简朴(OWC!不又要学新东西了?放心,异常简朴,只要你具备男国足的头脑就OK,什么?还不够,拖出去海扁九九八十二下,不好意思,打上瘾,多了一下),只是少为人知而已(在网上我没看到其他人用过),同样先给出代码: <script language="javascript"> function exportExcel(atblData){ if (typeof(EXPORT_OBJECT)!="object"){ document.body.insertAdjacentHTML("afterBegin","<OBJECT style=\\\'display:none\\\' classid=clsid:0002E510-0000-0000-C000-000000000046 id=EXPORT_OBJECT></Object>"); } with (EXPORT_OBJECT){ DataType = "HTMLData"; HTMLData =atblData.outerHTML; try{ ActiveSheet.Export("C:\\owcToExcel.xls", 0); alert(\\\'汇出完毕\\\'); } catch (e){ alert(\\\'汇出Excel表失败,请确定已安装Excel2000(或更高版本),并且没打开同名xls文件\\\'); } } } </script> <table id="tblData"> <tr><td>gdsssa</td><td>445</td></tr> <tr><td>gdsssa</td><td>445</td></tr> </table> <input type="button" value="export" onclick="exportExcel(tblData)"> 原理: 大家应该看出这是前端脚本html实现,其实这是利用OWC的功能来转出Excel档,我们只需整理出一个Table档(我还不会做这个 Table档呢!哐啷,晕了),基本上我们整理出的Table在网页上是什么样子,在Excel上就是什么样子,但要注重:<style>在 Excel里不起作用 长处: 把握也很简朴,而且可以在前台实现,并且不会设计权限问题,为前台产生Excel档存到客户端而伤透脑筋的兄弟姐妹们,这个方式,走过路过,千万别错过了 缺点: 客户端必需安装Excel2000或更高版本(不过这个一般都不成问题的了),而且样式表的内容不能输出。 方式三:利用XML来产生 这个嘛,先不给代码,首先讲讲道理,咳咳咳,注重啦,这可是异常这节课的重点和难点,而且每年必考,所以(所你个头啊,也不看看别人都睡着了,还不讲点有用的),啊!不好意思,拿错讲稿了。至于这个原理嘛,大家先自己随便编一个Excel档,然后把它另存为*.htm文件,再打开,是不是根我们一般的网页内容异常相似(唉!什么还是老样子,用文本编辑器打开啊!讲漏一点都不行),那么我们是不是只需要整理出这些文字出来就可以了,哈哈!又是文字游戏(盯那么大的眼睛干嘛,一提到游戏就精神),要害是怎样整理出这份文本文字档案呢 (用第一个方式不就行了吗?哦!怎么我没想到,对,是太麻烦了)?我们分析一下这些文字,第一部分是<style>样式表的定义,第二部分是 Excel特有的定义内容,第三部分是则是最认识的Table数据了,那么对于这三部分,前两部分基本是固定了,我整理一下基本只需要这些: <html xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"> <head> <meta http-equiv="Content-Type" content="text/html;"/> <style> .xl24{mso-style-parent:style0;mso-number-format:"@";text-align:right;} </style> <xml> <x:ExcelWorkbook> <x:ExcelWorksheets> <x:ExcelWorksheet> <x:Name>Sheet1</x:Name> <x:WorksheetOptions> <x:ProtectContents>False</x:ProtectContents> <x:ProtectObjects>False</x:ProtectObjects> <x:ProtectScenarios>False</x:ProtectScenarios> </x:WorksheetOptions> </x:ExcelWorksheet> </x:ExcelWorksheets> </x:ExcelWorkbook> </xml> </head> (哇!压缩了这么多,难怪MS的软件都这么大),当然可能我也把一些有用的删掉了,各位发现有枉杀的帮我平反一下(不要以为学习这么轻易,当然要做点事啦) 然后是第三部分,这一部分假如还是通过循环来读出然后再整理成Table的html脚本,那就太不思进取了,众所周知,我们可以通过recordset来读取数据的指定内容,而且可以通过save来直接把那些内容生成一个xml文件,所以我们只需要根据这个xml文件写一个xsl文件来转变就...哈,取得西经了,那么这个方式是我认为最好的,因为我们可以任意设定Table的样式,同时不必诸多循环,有效解决Excel一些自做智慧的小动作(那些小动作?你在Excel输入3423423423424这串数字看看,还有日期时间格式之类的), 思路就说完了,怎么实现就靠各人自己动手了。 这种方式的长处是你可以定制很好的格式的Excel文件,只要你xsl会写,包括统计都可以做出来,所以懂xsl的人估计来到这里比较明白了,而且效率很高,不用再慢慢循环了 缺点嘛:就是技术要求高了一点,至于算有多高,各人不同了。 最后附上我的代码,希望大家不要停留于抄代码,能有所改进,当然有更好的方式别忘记通知一下我哦! ===========xmlToExcel.asp============= <% Set Conn=Server.CreateObject("ADODB.Connection") Conn.Open "Provider = Microsoft.Jet.OLEDB.4.0; Data Source ="& Server.MapPath("comp_apply.mdb") \\\'strSelect="select dept_no,dept_name,dept_check from dept_data" strSelect="select * from user_data" \\\'改变该SQL语句则可改变excel的内容 Set rs=server.createobject("adodb.recordset") rs.open strSelect,conn,1,1 set fso=server.createobject("scripting.filesystemobject") strXmlFile=server.MapPath("xmlToExcelTmp.xml") strXslFile=server.MapPath("xmlToExcel.xsl") strExcelFile=server.MapPath("xmlToExcel.xls") if fso.fileExists(strXmlFile) then fso.deletefile strXmlFile rs.save strXmlFile,1 rs.close Conn.close set Conn=nothing set xmlDoc=server.createobject("microsoft.xmldom") set xslDoc=server.createobject("microsoft.xmldom") xslDoc.load(strXslFile) xmlDoc.load(strXmlFile) xmlDoc.loadXml(xmlDoc.transformNode(xslDoc)) if fso.fileExists(strExcelFile) then fso.deletefile strExcelFile Set xslFile = fso.CreateTextFile(strExcelFile , True) xslFile.WriteLine(xmlDoc.xml) xslFile.Close fso.deletefile strXmlFile set fso=nothing response.redirect "xmlToExcel.xls" %> ==============xmlToExcel.xsl============= <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s=\\\'uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882\\\' xmlns:dt=\\\'uuid:C2F41010-65B3-11d1-A29F-00AA00C14882\\\' xmlns:rs=\\\'urn:schemas-microsoft-com:rowset\\\' xmlns:z=\\\'#RowsetSchema\\\'> <xsl:output method="html" indent="yes" /> <xsl:template match="xml/rs:data"> <html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"> <head> <meta http-equiv="Content-Type" content="text/html;charset=gb2312" /> <style> .xl24{mso-style-parent:style0;mso-number-format:"@";text-align:right;} </style> <xml> <x:ExcelWorkbook> <x:ExcelWorksheets> <x:ExcelWorksheet> <x:Name>Sheet1</x:Name> <x:WorksheetOptions> <x:ProtectContents>False</x:ProtectContents> <x:ProtectObjects>False</x:ProtectObjects> <x:ProtectScenarios>False</x:ProtectScenarios> </x:WorksheetOptions> </x:ExcelWorksheet> </x:ExcelWorksheets> </x:ExcelWorkbook> </xml> </head> <body> <table border="1" cellpadding="0" cellspacing="0"> <tr><xsl:for-each select="/xml/s:Schema/s:ElementType/s:AttributeType"> <th><xsl:value-of select="@name" /></th> </xsl:for-each> </tr> <xsl:apply-templates select="z:row" /> </table> </body> </html> </xsl:template> <xsl:template match="z:row"> <xsl:variable name="position"><xsl:value-of select="position()" /></xsl:variable> <tr><xsl:for-each select="/xml/s:Schema/s:ElementType/s:AttributeType"> <!-- 读取定义好的数据列名 --> <xsl:variable name="strColumn"><xsl:value-of select="@name" /></xsl:variable> <xsl:variable name="strValue"><xsl:value-of select="/xml/rs:data/z:row[position()=$position]/@*[name() = $strColumn]" /></xsl:variable> <td class="xl24"> <xsl:value-of select="$strValue" /> </td> </xsl:for-each> </tr> </xsl:template> </xsl:stylesheet> 补充一下:对于第三种方式因为Recordset 用 Save方式后有时对于那些null的字段在row中不会有它的字段名,所以我现在通过去ElementType那里读取字段名,以保证不造成到时的 Excel的纵列方位出错,但这个问题在.net里的DataSet确很好解决,因为DataSet中假如遇到这种null的数据它也会有< columnName />这样的空节点出现 返回类别: 教程 上一教程: SESSION对象在各浏览器中的有效范围 下一教程: ASP面向对象编程探讨及比较 您可以阅读与"怎样把数据汇到EXCEL中的心得经验"相关的教程: · 怎样把数据库结构显示出来的源代码 · ASP中将TABLE表中的数据成功导成EXCEL做法 · 如何在ASP中通过ODBC调用EXCEL中的数据 · 将EXCEL中的数据导入至MSSQL SERVER中 · ACCESS数据库在ASP中的应用 |
![]() ![]() |
快精灵印艺坊 版权所有 |
首页![]() ![]() ![]() ![]() ![]() ![]() ![]() |