我如何从一个网页导出表excel

我怎样才能从一个网页导出表excel。 我想导出包含所有的格式和颜色。

从表格到Excel,最干净,最简单的输出是Jquery DataTables Table Tools插件。 您会得到一个对数据进行sorting,过滤,订购和分页的网格,只需添加几行代码和两个小文件即可导出到Excel,PDF,CSV,剪贴板和打印机。

这是所有需要的代码:

  $(document).ready( function () { $('#example').dataTable( { "sDom": 'T<"clear">lfrtip', "oTableTools": { "sSwfPath": "/swf/copy_cvs_xls_pdf.swf" } } ); } ); 

所以,快速部署,不受浏览器限制,不需要服务器端语言,而且最重要的是非常容易理解。 这是双赢的。 但是,它所具有的一个限制是对列进行严格的格式化。

如果格式和颜色是绝对的破坏者,我发现唯一100%可靠的跨浏览器方法是使用服务器端语言来处理代码中正确的Excel文件。 我select的解决scheme是PHPExcel这是迄今为止我发现的唯一一个,当你给它任何东西,除了HTML之外,从任何浏览器中积极地处理出口格式化到一个MODERN版本的Excel。 但让我澄清的是,这绝对不像第一个解决scheme那样容易,而且还是一个资源pipe理。 不过,从正面来看,它也可以直接输出到PDF。 而且,一旦你完成了configuration,每一次都能正常工作。

更新 – 2016年9月15日: TableTools已经停止,赞成一个名为“ button ”的新插件这些工具执行与旧的TableTools扩展相同的function,但更容易安装,他们利用现代浏览器的HTML5下载,能够回退到不支持HTML5标准的浏览器的原始Flash下载。 正如您从2011年发布此响应以来的众多评论中所看到的,TableTools的主要弱点已得到解决。 对于开发人员和用户而言,我仍然无法简单地推荐DataTables来处理大量的数据。

很久以前,我发现如果我们用Excel内容types发送Excel文件,Excel会打开一个带有表格的HTML文件。 考虑上面的文件:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Java Friends</title> </head> <body> <table style="font-weight: bold"> <tr style="background-color:red"><td>a</td><td>b</td></tr> <tr><td>1</td><td>2</td></tr> </table> </body> </html> 

我跑了以下书签:

 javascript:window.open('data:application/vnd.ms-excel,'+document.documentElement.innerHTML); 

事实上,我可以下载一个Excel文件。 但是 ,我没有得到预期的结果 – 该文件在OpenOffice.org Writer中打开。 这是我的问题:我没有在这台机器的Excel,所以我不能尝试更好。 另外,这个技巧或多或less是在六年前用旧版本的浏览器和MS Office的一个古老的版本工作的,所以我真的不能说它今天是否会工作。

无论如何,在上面的文档中,我添加了一个button,可以将整个文档作为Excel文件下载,理论上是:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Java Friends</title> </head> <body> <table style="font-weight: bold"> <tr style="background-color:red"><td>a</td><td>b</td></tr> <tr><td>1</td><td>2</td></tr> <tr> <td colspan="2"> <button onclick="window.open('data:application/vnd.ms-excel,'+document.documentElement.innerHTML);"> Get as Excel spreadsheet </button> </td> </tr> </table> </body> </html> 

将其保存在一个文件中,然后单击button。 我很想知道它是否有效,所以我要求你发表评论,甚至说它不起作用。

可以使用旧的Excel 2003 XML格式 (在OpenXML之前)创build一个包含所需XML的string,然后在客户端可以使用数据URI来使用XSL MIMEtypes打开文件,或者发送文件到服务器端使用Excel mimetype“Content-Type:application / vnd.ms-excel”的客户端。

  1. 打开Excel并创build一个你想要的格式和颜色的工作表。
  2. 将Excel工作簿另存为“XML Spreadsheet 2003(* .xml)”
  3. 在文本编辑器(如记事本)中打开生成的文件,并将值复制到应用程序中的string中
  4. 假设你使用客户端的方式与数据uri代码将如下所示:
    <script type="text/javascript"> var worksheet_template = '<?xml version="1.0"?><ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">'+ '<ss:Styles><ss:Style ss:ID="1"><ss:Font ss:Bold="1"/></ss:Style></ss:Styles><ss:Worksheet ss:Name="Sheet1">'+ '<ss:Table>{{ROWS}}</ss:Table></ss:Worksheet></ss:Workbook>'; var row_template = '<ss:Row ss:StyleID="1"><ss:Cell><ss:Data ss:Type="String">{{name}}</ss:Data></ss:Cell></ss:Row>'; </script>
    <script type="text/javascript"> var worksheet_template = '<?xml version="1.0"?><ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">'+ '<ss:Styles><ss:Style ss:ID="1"><ss:Font ss:Bold="1"/></ss:Style></ss:Styles><ss:Worksheet ss:Name="Sheet1">'+ '<ss:Table>{{ROWS}}</ss:Table></ss:Worksheet></ss:Workbook>'; var row_template = '<ss:Row ss:StyleID="1"><ss:Cell><ss:Data ss:Type="String">{{name}}</ss:Data></ss:Cell></ss:Row>'; </script> 
  5. 然后,您可以使用stringreplace来创build要插入工作表模板的行的集合
    <script type="text/javascript"> var rows = document.getElementById("my-table").getElementsByTagName('tr'), row_data = ''; for (var i = 0, length = rows.length; i < length; ++i) { row_data += row_template.replace('{{name}}', rows[i].getElementsByTagName('td')[0].innerHTML); } </script>
    <script type="text/javascript"> var rows = document.getElementById("my-table").getElementsByTagName('tr'), row_data = ''; for (var i = 0, length = rows.length; i < length; ++i) { row_data += row_template.replace('{{name}}', rows[i].getElementsByTagName('td')[0].innerHTML); } </script> 
  6. 收集完信息后,创build最终string并使用数据URI打开一个新窗口

    <script type="text/javascript"> var worksheet = worksheet_template.replace('{{ROWS}}', row_data); 

    <script type="text/javascript"> var worksheet = worksheet_template.replace('{{ROWS}}', row_data);

    window.open( '数据:应用程序/ vnd.ms-Excel中,' +工作表);
    </ SCRIPT>

值得注意的是,旧版浏览器不支持数据URIscheme,所以您可能需要为不支持它的浏览器生成文件服务器端。

您可能还需要对数据URI内容执行base64编码,这可能需要一个js库 ,并且在数据URI中的MIMEtypes之后添加string“; base64”。

Excel有一个叫做“Web查询”的鲜为人知的function,可以让你从几乎每个网页中检索数据,而无需额外的编程。

Web查询基本上直接从Excel中运行HTTP请求,并将部分或全部接收到的数据(以及可选的格式)复制到工作表中。

在定义了networking查询之后,您可以随时刷新它,甚至不用离开excel。 因此,您不必实际“导出”数据并将其保存到文件中,而应该像数据库一样刷新数据。

你甚至可以使用URL参数,让Excel提示你input某些过滤条件等。

然而我迄今为止注意到的缺点是:

  • dynamic加载的数据不可访问,因为Javascript没有执行
  • url长度有限

这是一个关于如何在Excel中创buildWeb查询的问题。 它链接到一个Microsoft帮助网站有关如何从网页获取外部数据

这是一个PHP,但你也许能够改变它为JavaScript:

 <?php> $colgroup = str_repeat("<col width=86>",5); $data = ""; $time = date("M d, yg:ia"); $excel = "<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\"> <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"> <html> <head> <meta http-equiv=\"Content-type\" content=\"text/html;charset=utf-8\" /> <style id=\"Classeur1_16681_Styles\"> .xl4566 { color: red; } </style> </head> <body> <div id=\"Classeur1_16681\" align=center x:publishsource=\"Excel\"> <table x:str border=0 cellpadding=0 cellspacing=0 style=\"border-collapse: collapse\"> <colgroup>$colgroup</colgroup> <tr><td class=xl2216681><b>Col1</b></td><td class=xl2216681><b>Col2</b></td><td class=xl2216681 ><b>Col3</b></td><td class=xl2216681 ><b>Col4</b></td><td class=xl2216681 ><b>Col5</b></td></tr> <tr><td class=xl4566>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr> </table> </div> </body> </html>"; $fname = "Export".time().".xls"; $file = fopen($fname,"w+"); fwrite($file,$excel); fclose($file); header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment; filename="'.basename($fname).'"'); readfile($fname); unlink($fname); ?> 

首先,我build议尝试导出Html,并希望用户的Excel实例捡起它。 我的经验表明,这个解决scheme充满了与Macintosh客户端不兼容的问题,并且向用户抛出所述文件不是指定格式的错误。 最防弹的用户友好型解决scheme是服务器端解决scheme,您可以使用库来构build实际的Excel文件并将其发回给用户。 下一个最好的解决scheme和更通用的解决scheme是使用Open XML格式。 我已经遇到了几个与旧版本的Excel不兼容的问题,但总的来说,这应该会给你一个解决scheme,可以在包括Macs在内的任何版本的Excel上工作。

打开XML

mozilla仍然支持base 64的URI。 这使您可以使用javascriptdynamic地编写二进制内容:

 <a href="data:application/vnd.ms-excel<base64 encoded binary excel content here>"> download xls</a> 

如果你的excel文件不是很花哨(没有图表,公式,macros),你可以挖掘格式,并为你的文件组成字节,然后用base64编码并放入href

请参阅https://developer.mozilla.org/en/data_URIs

此代码仅适用于IE,因此只有在您知道所有用户都将使用IE的情况下才有用(例如,在某些企业环境中)。

 <script Language="javascript"> function ExportHTMLTableToExcel() { var thisTable = document.getElementById("tbl").innerHTML; window.clipboardData.setData("Text", thisTable); var objExcel = new ActiveXObject ("Excel.Application"); objExcel.visible = true; var objWorkbook = objExcel.Workbooks.Add; var objWorksheet = objWorkbook.Worksheets(1); objWorksheet.Paste; } </script> 

假设:

  1. 给定的url

  2. 转换必须在客户端完成

  3. 系统是Windows,Mac和Linux

Windows的解决scheme:

python代码,打开ie窗口并有权访问它:theurlvariables包含url('http://')

 ie = Dispatch("InternetExplorer.Application") ie.Visible = 1 ie.Navigate(theurl) 

注意:如果页面不是直接访问,而是login,则需要通过input表单数据并使用python模拟用户操作来处理

这里是例子

 from win32com.client import Dispatch ie.Document.all('username').value=usr ie.Document.all('password').value=psw 

用于从网页中检索数据的相同方式。 假设id为'el1'的元素包含数据。 将元素文本检索到variables

 el1 = ie.Document.all('el1').value 

那么当数据在Pythonvariables中时,可以使用python以类似的方式打开excel屏幕:

 from win32com.client import Dispatch xlApp = Dispatch("Excel.Application") xlWb = xlApp.Workbooks.Open("Read.xls") xlSht = xlWb.WorkSheets(1) xlSht.Cells(row, col).Value = el1 

Mac解决scheme:

只有提示:使用AppleScript – 它具有简单和类似于win32com.client调度的API

Linux的解决scheme:

java.awt.Robot可能会为此工作,它有点击,按键(热键可以使用),但没有Linux的API,我知道这可以像简单的AppleScript

这实际上比您想象的要简单:“只需”将HTML表格(即:表格的HTML代码)复制到剪贴板中。 Excel知道如何解码HTML表格; 它甚至会尝试保留这些属性。

困难的部分是“将表格复制到剪贴板”,因为没有标准的方式从JavaScript访问剪贴板。 看到这个博客文章: 使用JavaScript访问系统剪贴板 – 圣杯?

现在你所需要的就是将表格作为HTML。 我build议jQuery和html()方法。

简单的谷歌search出现了这样的:

如果数据实际上是一个HTML页面,并且尚未由ASP,PHP或其他一些脚本语言创build,并且您正在使用Internet Explorer 6,并且您的计算机上已安装了Excel,只需右键单击该页面并查看通过菜单。 您应该看到“导出到Microsoft Excel”。 如果所有这些条件都是正确的,点击菜单项,并在几个提示后,它将被导入到Excel。

如果你不能这样做,他会给出一个备用的“拖放”方法:

http://www.mrkent.com/tools/converter/

现在有一个更好的方法。

用于JavaScript的OpenXML SDK。

https://openxmlsdkjs.codeplex.com/

实际上有两种方法可以自动执行此操作,而只有一种解决scheme可以在所有浏览器中使用。 首先,您应该使用打开的xml规范来构buildExcel工作表。 有免费的微软提供的插件,使这种格式也适用于旧版本的Office。 开放的xml是自2007年以来的标准。这两种方式在服务器端或客户端是显而易见的。

客户端实现使用CSS的新标准,允许您存储数据,而不仅仅是数据的URL。 这是一个很好的方法,因为你不需要任何servercall,只是数据和一些JavaScript。 杀死不足的是,微软不支持在当前的IE(我不知道有关IE9)发布的所有部分。 微软限制数据是一个图像,但我们将需要一个文件。 在Firefox中,它工作得很好。 对我来说IE是杀人的地方。

另一种方法是使用服务器端实现。 所有语言都应该有很多开放的XML实现。 你只需要抓一个。 在大多数情况下,这将是修改视图模型以生成文档的最简单方法,但是可以确保您可以将来自Clientside的所有数据发送回服务器并执行相同操作。

  function normalexport() { try { var i; var j; var mycell; var tableID = "tblInnerHTML"; var drop = document.getElementById('<%= ddl_sections.ClientID %>'); var objXL = new ActiveXObject("Excel.Application"); var objWB = objXL.Workbooks.Add(); var objWS = objWB.ActiveSheet; var str = filterNum(drop.options[drop.selectedIndex].text); objWB.worksheets("Sheet1").activate; //activate dirst worksheet var XlSheet = objWB.activeSheet; //activate sheet XlSheet.Name = str; //rename for (i = 0; i < document.getElementById("ctl00_ContentPlaceHolder1_1").rows.length - 1; i++) { for (j = 0; j < document.getElementById("ctl00_ContentPlaceHolder1_1").rows(i).cells.length; j++) { mycell = document.getElementById("ctl00_ContentPlaceHolder1_1").rows(i).cells(j); objWS.Cells(i + 1, j + 1).Value = mycell.innerText; // objWS.Cells(i + 1, j + 1).style.backgroundColor = mycell.style.backgroundColor; } } objWS.Range("A1", "L1").Font.Bold = true; // objWS.Range("A1", "L1").Font.ColorIndex = 2; // objWS.Range("A1", "Z1").Interior.ColorIndex = 47; objWS.Range("A1", "Z1").EntireColumn.AutoFit(); //objWS.Range("C1", "C1").ColumnWidth = 50; objXL.Visible = true; } catch (err) { alert("Error. Scripting for ActiveX might be disabled") return } idTmr = window.setInterval("Cleanup();", 1); } function filterNum(str) { return str.replace(/[ / ]/g, ''); }