如何将多个HTML表格导出到Excel?

6
我有一个网页上有三个表格,我想将它们全部导出到同一个Excel文件中。 我希望每个表格在自己的工作表中,但也可以把它们都放在同一个工作表中。 经过一些搜索,我只看到了将一个表格导出到一个Excel工作表中的方法。

2
你想用什么语言,在什么环境下完成这个任务?你自己已经付出了多少努力?你拥有足够的徽章和声望,应该知道规则。 - Tom Zych
1
如果你改变主意了,请告诉我。据我所知,你只能将HTML文件保存为XLS扩展名。这不是真正的XLS文件,你也不能有超过一个表格是HTML表格。 - alex.pulver
1
你尝试过 http://excelbuilderjs.com/ 吗?它可以将多个工作表打包到一个工作簿中,而且不需要后端支持(但如果没有后端支持,你需要像 downloadify 这样的东西来将文件传递给用户)。 - Stephen
你可以检查我的实现示例 - Veysel
你可以查看我的工作示例。 - Veysel
显示剩余4条评论
3个回答

13
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));

    }
})();

还有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>

注:此方法不适用于IE(会出现“数据过小”的错误),在Firefox中两个表格都会放在同一张表格中。

同时也要感谢这篇文章:HTML Table to Excel Javascript


1
当我在使用多个表格时,发现这个方法不太好用。在我的情况下,https://dev59.com/_10b5IYBdhLWcg3wA9LI 这个方法效果很好。但需要注意的一点是表格名称中的'/'字符。 - Lion.k
我在这段代码中遇到了错误:“x:ExcelWorksheet”元素的前缀“x”未绑定。 - Ignacio Chiazzo
1
我尝试了这个,两个选项卡都在Excel中创建了,但第一个选项卡包含了两个表格的数据,而第二个选项卡是空的。 - Keisha W
对于我的需求,https://github.com/hhurz/tableExport.jquery.plugin/ 做得非常好。 - pixelDino

2

//函数 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)))
        }

//函数 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;
    }

它是在Angular中,但这并不重要。 - Ehud
这个答案指引了我正确的方向。它支持将数据放在不同的工作表上。输出的是SpreadsheetML而不是HTML。更多信息请参见此答案:https://dev59.com/FHVC5IYBdhLWcg3w51lv#150368 - John Galambos
1
@Ehud,你能否提供一下jsfiddle吗?这样我们就可以更容易地理解datasets是以哪种格式传递的了。 - Liz.

-2

这里有一个更好的解决方案,支持在最新的Excel格式(即xlsx)中导出表格。如果导出的总行数超过Chrome浏览器的3407行限制,则接受的解决方案将失败。

上面链接中的一个示例: 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]]);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接