如何从网页将表格导出到Excel。我希望导出包含所有格式和颜色。
<td style="background-color: ...
如何从网页将表格导出到Excel。我希望导出包含所有格式和颜色。
<td style="background-color: ...
Answers:
从表到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"
}
} );
} );
因此,部署迅速,没有浏览器限制,不需要服务器端语言,并且最重要的是非常容易理解。这是双赢。但是,它确实有局限性,那就是严格格式化列。
如果格式化和颜色是绝对的突破口,我发现的唯一100%可靠的跨浏览器方法是使用服务器端语言来处理代码中的适当Excel文件。我选择的解决方案是PHPExcel, 这是我迄今为止发现的唯一一种,当您只提供HTML格式的内容时,它可以通过任何浏览器将格式格式化为Excel的现代版本导出。不过,让我澄清一下,它绝对不像第一个解决方案那么简单,而且有点耗费资源。但是,从正面看,它也可以直接输出到PDF。而且,一旦您对其进行配置,它每次都可以工作。
更新-2016年9月15日: TableTools已停产,取而代之的是名为“ 按钮 ” 的新插件。这些工具执行与旧TableTools扩展程序相同的功能,但FAR易于安装,并且可将HTML5下载用于现代浏览器,对于不支持HTML5标准的浏览器,可以回退到原始Flash下载。从2011年我发布此回复以来的许多评论中可以看出,TableTools的主要弱点已得到解决。对于开发人员和用户,我仍然不能推荐足够简单的DataTables来处理大量数据。
很久以前,我发现如果我们使用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,因此无法更好地尝试。此外,此技巧大约在六年前与较旧的浏览器和旧版本的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
以选择性地仅抓取表格,否则所有内容都将导出到电子表格中。不过,在旧版IE中不起作用,只是打开一个新窗口,其中包含所有html标题
可以使用旧的Excel 2003 XML格式(在OpenXML之前)创建一个包含所需XML的字符串,然后在客户端可以使用数据URI通过XSL mime类型打开文件,或发送文件服务器端使用Excel模仿类型“ 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>
收集完信息后,创建最终字符串并使用数据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库,并在数据URI的mime类型后面添加字符串'; base64'。
Excel具有一个鲜为人知的功能,称为“ Web查询”,它使您几乎可以从每个网页检索数据而无需进行其他编程。
Web查询基本上是直接从Excel内部运行HTTP请求,并将部分或全部接收到的数据(以及可选的格式)复制到工作表中。
定义网络查询后,您可以随时刷新它,甚至不用离开excel。因此,您不必实际“导出”数据并将其保存到文件中,而是希望像从数据库中那样刷新数据。
您甚至可以通过让excel提示您输入某些过滤条件等来使用URL参数。
但是到目前为止,我注意到的缺点是:
这是有关如何在Excel中创建Web查询的问题。它链接到有关如何从网页获取外部数据的Microsoft帮助站点。
这是一个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); ?>
Mozilla仍支持基本64个URI。这使您可以使用javascript动态编写二进制内容:
<a href="data:application/vnd.ms-excel<base64 encoded binary excel content here>"> download xls</a>
如果您的excel文件不是很好(没有图表,公式,宏),则可以深入研究格式并为文件编写字节,然后使用base64对其进行编码并放入href中
这实际上比您想象的要简单:“只需”将HTML表(即表的HTML代码)复制到剪贴板。Excel知道如何解码HTML表。它甚至会尝试保留属性。
困难的部分是“将表复制到剪贴板中”,因为没有标准方法可以从JavaScript访问剪贴板。请参阅此博客文章:使用JavaScript访问系统剪贴板–圣杯?
现在,您所需要的只是表格为HTML。我建议使用jQuery和html()方法。
该代码仅是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解决方案:
可以打开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一样简单
简单的谷歌搜索出现了这个:
如果数据实际上是HTML页面,并且不是由ASP,PHP或其他脚本语言创建的,并且您使用的是Internet Explorer 6,并且您的计算机上已安装Excel,则只需右键单击该页面并查看通过菜单。您应该看到“导出到Microsoft Excel”。如果所有这些条件都成立,请单击菜单项,并在出现几次提示后将其导入Excel。
如果您无法做到这一点,他会提供另一种“拖放”方法:
有两种自动执行此操作的方法,而所有浏览器只能使用一种解决方案。首先,您应该使用开放的xml规范来构建Excel工作表。Microsoft提供了免费的插件,使该格式也可用于较早的Office版本。自Office 2007以来,开放xml是标准的。这两种方式在服务器端或客户端都很明显。
客户端实现使用CSS的新标准,该标准允许您存储数据,而不仅仅是存储数据的URL。这是一种很好的方法,因为您不需要任何服务器调用,只需数据和一些javascript。致命的缺点是,Microsoft在当前的IE(我不了解IE9)版本中不支持它的所有部分。Microsoft将数据限制为图像,但我们需要一个文档。在Firefox中,它工作得很好。对我来说,IE是杀手point。
另一种方法是使用服务器端实现。所有语言都应该有很多开放XML的实现。您只需要掌握一张。在大多数情况下,这是修改Viewmodel以生成Document的最简单方法,但可以确保将所有数据从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, '');
}