我如何从网页导出表格到Excel?我希望导出的内容包含所有格式和颜色。
迄今为止,从表格导出到Excel最干净,最简单的方法是使用Jquery DataTables Table Tools插件。 你可以得到一个排序、过滤、排序和分页数据的网格,只需添加几行额外的代码和两个小文件,便可导出Excel、PDF、CSV、复制到剪贴板和打印。
这就是所需的所有代码:
$(document).ready( function () {
$('#example').dataTable( {
"sDom": 'T<"clear">lfrtip',
"oTableTools": {
"sSwfPath": "/swf/copy_cvs_xls_pdf.swf"
}
} );
} );
因此,它可以快速部署,没有浏览器限制,不需要服务器端语言,最重要的是非常容易理解。这是一个双赢局面。然而,它的唯一限制是对列的严格格式限制。
如果格式和颜色绝对不能妥协,我发现唯一可靠的跨浏览器方法是使用服务器端语言从代码中处理正确的Excel文件。我选择的解决方案是 PHPExcel。到目前为止,我发现它是唯一能够在任何浏览器上将带有格式的内容正面地导出到最新版本的Excel的解决方案,只需提供HTML。但请让我澄清一下,它绝对不像第一个解决方案那样容易,并且还会消耗一定的资源。但是,好的一面是它也可以直接输出PDF。一旦配置好了,它就可以每次都正常工作。
更新-2016年9月15日: TableTools已停止支持,转而推出一个名为“buttons”的新插件。这些工具执行与旧TableTools扩展相同的功能,但安装要容易得多,并且它们利用HTML5下载现代浏览器,具有回退到原始Flash下载的功能,供不支持HTML5标准的浏览器使用。从我在2011年发布此响应以来的许多评论中可以看出,TableTools的主要弱点得到了解决。对于开发人员和用户都可以轻松处理大量数据,我仍然极力推荐DataTables。
很久以前,我发现如果我们以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,因此我无法更好地尝试它。此外,这个技巧大约六年前使用旧版浏览器和古董版本的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>
将它保存在一个文件中,然后单击按钮。我非常希望知道它是否奏效,所以我请您评论,即使只是说它没有奏效。
document.getElementById('id').innerHTML
调用ID以仅选择性地抓取表格,否则所有内容都会被导出到电子表格中。但在旧版IE中无法工作,只会在标题中打开一个包含所有HTML的新窗口。 - Abraham Brookes可以使用旧的Excel 2003 XML格式(即OpenXML之前)创建一个包含所需XML的字符串,然后在客户端上使用数据URI使用XSL MIME类型打开文件,或者从服务器端以Excel MIME类型“Content-Type:application/vnd.ms-excel”将文件发送到客户端。
<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 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>
Once you have the information collected, create the final string and open a new window using the data URI
<script type="text/javascript">
var worksheet = worksheet_template.replace('{{ROWS}}', row_data);
window.open('data:application/vnd.ms-excel,'+worksheet); </script>
<?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); ?>
mozilla仍然支持base 64 URI。这使您可以使用javascript动态地组合二进制内容:
<a href="data:application/vnd.ms-excel<base64 encoded binary excel content here>"> download xls</a>
如果您的Excel文件不太复杂(没有图表、公式、宏等),您可以深入了解其格式,组合文件字节,然后用base64编码并放入href中。
这段代码只适用于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>
假设:
给定URL
转换必须在客户端完成
系统为Windows、Mac和Linux
Windows解决方案:
Python代码打开IE窗口并访问它: theurl变量包含URL(“http://”)
ie = Dispatch("InternetExplorer.Application")
ie.Visible = 1
ie.Navigate(theurl)
from win32com.client import Dispatch
ie.Document.all('username').value=usr
ie.Document.all('password').value=psw
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可能适用于此,它具有点击、按键(可以使用热键),但我所知道的没有像AppleScript那样简单易用的Linux API。
<td style="background-color: ...
。 - Pekka