tablas - recorrer tabla javascript
¿Cómo exporto varias tablas html para sobresalir? (3)
Tengo una página web que tiene 3 tablas y me gustaría exportar las 3 de ellas al mismo archivo de Excel. Me gustaría tener cada tabla en su propia hoja, pero tenerlas todas en la misma hoja también está bien. Después de buscar en Google, todo lo que he visto es exportar una tabla a una hoja de Excel.
// función 1
$scope.exportXlsSheets = function (datasets) {
var xlsString = ''<?xml version="1.0"?>/
<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">'';
for(var key in dict){
var arr_of_entities= dict[key].arr;
xlsString += $scope.getSheet(arr_of_entities);
}
xlsString += ''</ss:Workbook>'';
var a = document.createElement(''a'');
a.href = ''data:application/vnd.ms-excel;base64,'' + $scope.base64(xlsString);
a.target = ''_blank'';
a.download = ''test1.xls'';
document.body.appendChild(a);
a.click();
}
$scope.base64 = function (s) {
return window.btoa(unescape(encodeURIComponent(s)))
}
// función 2
$scope.getSheet = function (sheetName, entities) {
var res = ''<ss:Worksheet ss:Name="''+sheetName+"></ss:Worksheet>/
<ss:Table>'';
var row = ''<ss:Row>'';
for ( i = 0; i < entities.length; i++) {
var entity = entities[i];
row += ''<ss:Cell>/
<ss:Data ss:Type="String">''+entity.value +''</ss:Data>/
</ss:Cell>'';
}
row += ''</ss:Row>'';
res += row;
return res;
}
Aquí hay una mejor solución que admite la exportación de tablas en el último formato de Excel, es decir, xlsx. La solución aceptada fallará en caso de que el número total de filas que se exportan exceda de 3407 en Chrome.
Un ejemplo del enlace de arriba: http://jsfiddle.net/6ckj281f/
html
<button onclick="saveFile()">Save XLSX file</button>
javascript
window.saveFile = function saveFile () {
var data1 = [{a:1,b:10},{a:2,b:20}];
var data2 = [{a:100,b:10},{a:200,b:20}];
var opts = [{sheetid:''One'',header:true},{sheetid:''Two'',header:false}];
var res = alasql(''SELECT INTO XLSX("restest344b.xlsx",?) FROM ?'',
[opts,[data1,data2]]);
}
var tablesToExcel = (function () {
var uri = ''data:application/vnd.ms-excel;base64,''
, template = ''<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><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets>''
, templateend = ''</x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head>''
, body = ''<body>''
, tablevar = ''<table>{table''
, tablevarend = ''}</table>''
, bodyend = ''</body></html>''
, worksheet = ''<x:ExcelWorksheet><x:Name>''
, worksheetend = ''</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>''
, worksheetvar = ''{worksheet''
, worksheetvarend = ''}''
, base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) }
, format = function (s, c) { return s.replace(/{(/w+)}/g, function (m, p) { return c[p]; }) }
, wstemplate = ''''
, tabletemplate = '''';
return function (table, name, filename) {
var tables = table;
for (var i = 0; i < tables.length; ++i) {
wstemplate += worksheet + worksheetvar + i + worksheetvarend + worksheetend;
tabletemplate += tablevar + i + tablevarend;
}
var allTemplate = template + wstemplate + templateend;
var allWorksheet = body + tabletemplate + bodyend;
var allOfIt = allTemplate + allWorksheet;
var ctx = {};
for (var j = 0; j < tables.length; ++j) {
ctx[''worksheet'' + j] = name[j];
}
for (var k = 0; k < tables.length; ++k) {
var exceltable;
if (!tables[k].nodeType) exceltable = document.getElementById(tables[k]);
ctx[''table'' + k] = exceltable.innerHTML;
}
//document.getElementById("dlink").href = uri + base64(format(template, ctx));
//document.getElementById("dlink").download = filename;
//document.getElementById("dlink").click();
window.location.href = uri + base64(format(allOfIt, ctx));
}
})();
Y el HTML
<html>
<head>
<title>JS to Excel</title>
</head>
<body>
<table id="1">
<tr><td>Hi</td></tr>
<tr><td>Hey</td></tr>
<tr><td>Hello</td></tr>
</table>
<table id="2">
<tr><td>Night</td></tr>
<tr><td>Evening</td></tr>
<tr><td>Nite</td></tr>
</table>
<a id="dlink" style="display:none;"></a>
<input type="button" onclick="tablesToExcel([''1'', ''2''], [''first'', ''second''], ''myfile.xls'')" value="Export to Excel">
<script src="~/Views/JS/JSExcel.js" type="text/javascript"></script>
</body>
</html>
NOTA: esto no funciona en IE (error de "datos demasiado pequeños") y en Firefox ambas tablas se colocan en la misma hoja.
También crédito a este hilo: HTML Table to Excel Javascript