将多个Blob Excel文件压缩到一个zip文件中

时间:2019-05-29 15:53:27

标签: javascript excel zip blob

我实际上正在使用这个库:https://github.com/SheetJS/js-xlsx。 我用它来创建和下载XLSX文件,该文件从我的网站中提取了一个表。效果确实不错,但是我现在正在尝试做一些更复杂的事情。

我试图同时下载所有表,这意味着下载多个XLSX文件。它确实适用于我的实际代码:

function saveAll(dataAll){
    for (let i=0;i<dataAll.length;++i) {
        let ws_name = "SheetJS";
        let data = dataAll[i];

        let wb = new Workbook();
        console.log(data);
        let ws = sheet_from_array_of_arrays(data.content, null, data.mois, data.annee);

        /* add worksheet to workbook */
        wb.SheetNames.push(ws_name);
        wb.Sheets[ws_name] = ws;

        let wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: true, type: 'binary'});

        saveAs(new Blob([s2ab(wbout)],{type: "application/octet-stream"}), data.prenom_nom + " PVA " + data.mois + " " + data.annee + ".xlsx");
    }
}

现在,我想将所有这些xlsx文件下载到一个唯一的ZIP或tar.gz文件中,但是我有点受阻。我尝试使用zip.js库,但没有成功。

我的dataAll参数是对象数组,每个对象都包含.content(它是矩阵)以及在文件名上使用的其他一些参数。

如何才能仅在一个存档中下载所有这些xlsx文件,而不是一个一个地下载它们?

1 个答案:

答案 0 :(得分:0)

您可以尝试

var zip = new JSZip();
for(var i=1;i<3;i++)
{
    var workbook = XLSX.utils.book_new();
    var ws1 = XLSX.utils.table_to_sheet(document.getElementById('tbl'+i));
    XLSX.utils.book_append_sheet(workbook, ws1, "Sheet1");
    let wbout = XLSX.write(workbook, {bookType: 'xlsx', bookSST: true, type: 'binary'});
    
    zip.file("shubham"+i+".xlsx", wbout, {binary: true});
}
    
zip.generateAsync({type:"blob"})
.then(function(content) {
    // see FileSaver.js
    saveAs(content, "example.zip");
});
<!Doctype html>
<html lang="en">

<head>

    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width" , initial-scale=1, shrink>
    <meta name="theme-color" content="#000000">

    <title>ES6</title>
    <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.8/FileSaver.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.2.0/jszip.min.js"></script>
</head>


<body>
<table id="tbl1">
    <tr><td>Name</td><td>Age</td></tr>
    <tr><td>Shubham</td><td>22</td></tr>
</table>
<table id="tbl2">
    <tr><td>Name</td><td>Age</td></tr>
    <tr><td>Shubham</td><td>22</td></tr>
</table>
</body>
<script>

</script>

</html>