首页 > 解决方案 > 将多个 blob Excel 文件压缩成一个 zip 文件 javascript

问题描述

我实际上正在使用这个库: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 文件下载到一个存档中,而不是一个一个地下载它们?

标签: javascriptexcelzipblob

解决方案


你可以试试这个

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>


推荐阅读