【问题标题】:How can I export tables to Excel from a webpage [closed]如何将表格从网页导出到 Excel [关闭]
【发布时间】:2011-07-28 07:18:57
【问题描述】:

如何将表格从网页导出到 Excel。我希望导出包含所有格式和颜色。

【问题讨论】:

  • 最简单的方法可能是导出一个HTML文档,Excel可以打开。
  • @Pekka 我试过了,它会丢失所有格式/css/列大小等
  • @user 你在哪里声明列大小等等?我对将数据导出到 Excel 不是很熟悉,但您可能需要将它们声明为内联,即 <td style="background-color: ...
  • @user - 这里至少有两个不同的问题:1) 格式化数据,使其在 Excel 中正确显示,2) 使用 Javascript 导出数据,以便正确设置 mime 类型,提示用户保存文件。你想解决这两个问题吗?
  • 为什么这被认为是“基于意见的”?这是一个非常简单的技术问题。

标签: javascript jquery export-to-excel


【解决方案1】:

从表格到 Excel 的最简洁、最简单的导出方法是 Jquery DataTables Table Tools plugin. 您将获得一个网格,可以对数据进行排序、过滤、排序和分页,并且只需要几行额外的代码和两个小文件,您可以导出到 Excel、PDF、CSV、剪贴板和打印机。

这就是所有需要的代码:

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

因此,快速部署、没有浏览器限制、不需要服务器端语言,最重要的是非常容易理解。这是双赢的。不过,它确实有限制的一件事是列的严格格式。

如果格式和颜色是绝对的破坏者,那么我发现的唯一 100% 可靠的跨浏览器方法是使用服务器端语言从您的代码中处理正确的 Excel 文件。我选择的解决方案是PHPExcel,它是迄今为止我发现的唯一一个当您只提供 HTML 时,它可以从任何浏览器积极处理导出到现代版本的 Excel。不过让我澄清一下,它绝对不像第一个解决方案那么容易,而且有点耗费资源。但是,从好的方面来说,它也可以直接输出为 PDF。而且,一旦您对其进行了配置,它每次都能正常工作。

更新 - 2016 年 9 月 15 日: TableTools 已停止使用,取而代之的是名为“buttons”的新插件。这些工具执行与旧 TableTools 扩展相同的功能,但更容易使用安装,他们利用现代浏览器的 HTML5 下载,能够回退到不支持 HTML5 标准的浏览器的原始 Flash 下载。正如您从我 2011 年发布此回复以来的许多 cmets 中看到的那样,TableTools 的主要弱点已得到解决。对于开发人员和用户来说,我仍然不能推荐足够简单的 DataTables 来处理大量数据。

【讨论】:

  • DataTables 完全是 Javascript。只是 TableTools 元素使用了 Flash,而且它很小。我绝不会心甘情愿地在我的任何产品中使用 Flash!
  • 我理解,我同意。但仍然——无论多么微不足道——那里有一个 .swf 对象,没有 Flash 就无法运行。
  • 这样一个很棒的解决方案,但可惜它需要 Flash。
  • 你好,你能展示一个完整的例子吗,我太菜鸟了,没有这个例子就无法工作!
  • @PramodGaikwad,不,Datatables 将取代 NG-table。它们实际上具有相同的功能,但 Datatables 更加成熟,并且具有许多更多的功能。有一个专门为 Angular 创建的数据表的衍生产品:l-lin.github.io/angular-datatables/#/welcome
【解决方案2】:

很久以前,我发现如果我们使用 Excel 内容类型发送一个带有表格的 HTML 文件,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>
  </table>    
</body>
</html>

我在上面运行了以下书签:

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

事实上,我将它作为 Excel 文件下载。 但是,我没有得到预期的结果 - 该文件已在 OpenOffice.org Writer 中打开。那是我的问题:我在这台机器上没有 Excel,所以我不能更好地尝试它。此外,这个技巧在 6 年前或多或少适用于旧版浏览器和 MS Office 的旧版,所以我真的不能说它是否适用于今天。

无论如何,在上面的文档中,我添加了一个按钮,理论上可以将整个文档下载为 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>

将其保存在文件中,然后单击按钮。我很想知道它是否有效,所以即使你说它无效,我也请你发表评论。

【讨论】:

  • 让它在最后添加替换:window.open('data:application/vnd.ms-excel,' + document.getElementById('table').outerHTML.replace(/ / g, '%20'));
  • 替代方式(推荐):window.open('data:application/vnd.ms-excel,' + encodeURIComponent(document.getElementById('table').outerHTML));
  • 在 Firefox 中完美运行,将您的表格包装在一个 div 中,然后使用 document.getElementById('id').innerHTML 调用 id 以选择性地仅抓取表格,否则您的所有内容都会导出到电子表格中。但在旧 IE 中不起作用,只是打开一个标题中包含所有 html 的新窗口
  • 这个简单的解决方案效果很好。查看这个重复的问题,以便能够设置文件名,并设置工作表名称。同类型的解决方案; stackoverflow.com/questions/17126453/…
  • 由于更严格的安全措施,这不再适用于 Office 365。 Excel 文件必须是 TRUE Excel 文档,否则打开时会报错。
【解决方案3】:

可以使用旧的Excel 2003 XML format(在 OpenXML 之前)创建包含所需 XML 的字符串,然后在客户端您可以使用数据 URI 使用 XSL mime 类型打开文件,或发送使用服务器端的 Excel mimetype "Content-Type: application/vnd.ms-excel" 将文件发送到客户端。

  1. 打开 Excel 并使用所需的格式和颜色创建工作表。
  2. 将 Excel 工作簿另存为“XML 电子表格 2003 (*.xml)”
  3. 在记事本等文本编辑器中打开生成的文件,然后将值复制到应用程序中的字符串中
  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>
    
    
  5. 然后您可以使用字符串替换来创建要插入到工作表模板中的行集合
    
    <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. 收集完信息后,创建最终字符串并使用数据 URI 打开一个新窗口

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

    window.open('data:application/vnd.ms-excel,'+worksheet); </script>

值得注意的是,旧浏览器不支持数据URI方案,因此您可能需要为那些不支持它的浏览器生成文件服务器端。

您可能还需要对数据 URI 内容执行 base64 编码,这可能需要 js library,以及在数据 URI 中的 mime 类型后添加字符串 ';base64'。

【讨论】:

  • 虽然使用 OpenXML 很不错,但如果没有 javascript 生成器上的大量工作,此解决方案将不适用于具有 colspans 或 rowspans 的表
  • 感谢您教我一些东西,而不是告诉我使用插件,非常感谢。值得一提的是,这种方法在今天仍然很有效。
  • 有趣,尝试了这种方法。我刚刚得到整个 '+ ''+ '
    值将我的字符串写入一个单元格,包括一个单元格中的所有行。我错过了什么?
【解决方案4】:

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

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

定义网络查询后,您可以随时刷新它,甚至无需离开 Excel。因此,您不必实际“导出”数据并将其保存到文件中 - 您宁愿像从数据库中一样刷新数据。

您甚至可以通过让 excel 提示您某些过滤条件等来使用 URL 参数...

但是到目前为止我注意到的缺点是:

  • 无法访问动态加载的数据,因为未执行 Javascript
  • 网址长度有限

Here 是一个关于如何在 Excel 中创建 Web 查询的问题。它链接到Microsoft Help site about How-To Get external data from a Web page

【讨论】:

  • 如果 url 在登录墙后面也不起作用。
  • 它适用于基本身份验证和基于表单的身份验证,但对于后者,您可能必须单击“编辑查询”重新输入凭据并从时间获取新的 cookie
【解决方案5】:

这是一个 php,但您也许可以将其更改为 javascript:

<?php>
$colgroup = str_repeat("<col width=86>",5);
$data = "";
$time = date("M d, y g: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); ?>    

【讨论】:

    【解决方案6】:

    首先,我建议尝试导出 Html,并希望用户的 Excel 实例能够接受它。我的经验是,这个解决方案充满了问题,包括与 Macintosh 客户端不兼容,并向用户抛出一个错误,即有问题的文件不是指定的格式。最防弹、用户友好的解决方案是服务器端解决方案,您可以在其中使用库来构建实际的 Excel 文件并将其发送回用户。下一个最佳解决方案和更通用的解决方案是使用 Open XML 格式。我遇到了一些罕见的与旧版本 Excel 的兼容性问题,但总的来说,这应该为您提供适用于包括 Mac 在内的任何 Excel 版本的解决方案。

    Open XML

    【讨论】:

      【解决方案7】:

      mozilla 仍然支持 base 64 URI。这允许您使用 javascript 动态组合二进制内容:

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

      如果您的 excel 文件不是很花哨(没有图表、公式、宏),您可以深入研究格式并为您的文件编写字节,然后使用 base64 对其进行编码并放入 href

      参考 https://developer.mozilla.org/en/data_URIs

      【讨论】:

        【解决方案8】:

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

        困难的部分是“将表格复制到剪贴板”,因为没有从 JavaScript 访问剪贴板的标准方法。见这篇博文:Accessing the System Clipboard with JavaScript – A Holy Grail?

        现在您只需要 HTML 格式的表格。我建议使用 jQuery 和 html() 方法。

        【讨论】:

          【解决方案9】:

          此代码仅适用于 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>
          

          【讨论】:

          • 我尝试使用此代码,它确实在 excel 中打开了表格,但格式不正确,看起来它只是将 html 代码复制到表格中。像这样: SARTIN, DAN BALAEZ, BARBARA 有什么建议吗?
          • 那是因为他使用了innerHTML。他得到的元素是表格,所以它应该是outerHTML。我进行了编辑
          • 在创建 ActiveXObject 时出现错误:“自动化服务器无法创建对象”。我该如何解决?
          【解决方案10】:

          假设:

          1. 给定的网址

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

          3. 系统为 Windows、Mac 和 linux

          Windows 解决方案:

          打开ie窗口并可以访问它的python代码: theurl 变量包含 url ('http://')

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

          注意:如果页面不能直接访问,但需要登录,则需要通过输入表单数据并使用 python 模拟用户操作来处理此问题

          这里是例子

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

          从网页中检索数据的方式相同。假设 id 为“el1”的元素包含数据。 将元素文本检索到变量中

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

          那么当数据在python变量中时,您可以使用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 解决方案:

          只有提示:使用 AppleScript - 它具有与 win32com.client Dispatch 类似的简单 API

          Linux 解决方案:

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

          【讨论】:

            【解决方案11】:

            简单的谷歌搜索出现了这个:

            如果数据实际上是一个 HTML 页面并且不是由 ASP、PHP 或其他脚本语言创建的,并且您使用的是 Internet Explorer 6,并且您的计算机上安装了 Excel,只需右键单击页面并浏览菜单。您应该看到“导出到 Microsoft Excel”。如果所有这些条件都满足,请单击菜单项,经过几次提示后,它将被导入 Excel。

            如果你不能这样做,他提供了另一种“拖放”方法:

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

            【讨论】:

              【解决方案12】:

              现在有一个更好的方法。

              用于 JavaScript 的 OpenXML SDK。

              https://openxmlsdkjs.codeplex.com/

              【讨论】:

              • hmmm,下载并尝试在最新的 chrome 中运行示例,但出现错误:(
              【解决方案13】:

              有两种实用的方法可以自动执行此操作,而在所有浏览器中只能使用一种解决方案。 首先,您应该使用 open xml 规范来构建 excel 工作表。 Microsoft 提供的免费插件使这种格式也可用于旧版办公版本。自office 2007以来,开放xml是标准的。这两种方式很明显是服务器端或客户端。

              客户端实现使用新的 CSS 标准,允许您存储数据,而不仅仅是数据的 URL。这是一个很好的方法,因为您不需要任何服务器调用,只需要数据和一些 javascript。致命的缺点是微软在当前的 IE(我不知道 IE9)版本中不支持它的所有部分。 Microsoft 将数据限制为图像,但我们需要一个文档。在Firefox中它工作得很好。对我来说,IE 是杀戮点。

              另一种方法是使用服务器端实现。所有语言都应该有很多开放 XML 的实现。你只需要抓住一个。在大多数情况下,修改 Viewmodel 以生成 Document 是最简单的方法,但可以肯定的是,您可以将所有数据从客户端发送回服务器并执行相同操作。

              【讨论】:

              • 投反对票的人能否评论一下投反对票的原因是什么?
              【解决方案14】:
                 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, '');
                 }
              

              【讨论】:

                猜你喜欢
                • 2012-07-11
                • 2014-01-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-04-06
                • 1970-01-01
                • 2015-02-22
                • 2019-10-10
                相关资源
                最近更新 更多