使用node.js(Electron)压缩未压缩的xlsx文件

时间:2016-12-15 17:24:19

标签: node.js electron

我有一个解压缩的xlsx文件,在其中我编辑了一些文件,以便能够生成包含新数据的新xlsx文件。 在linux中重新压缩xlsx中的文件我只需要进入终端并输入

find . -type f | xargs zip ../newfile.xlsx

进入xlsx文件所在的文件夹。 现在的问题是我如何使用node.js做到这一点?

2 个答案:

答案 0 :(得分:2)

解决方法是压缩xlsx中包含的文件的直接列表,出于某种原因,如果我们尝试压缩文件已损坏的文件夹。

如果使用JSZIP

,代码如下所示
var fs = require('fs');
var JSZip = require("jszip");
var zip = new JSZip();
var file = [];
file.push("_rels/.rels");
file.push("docProps/core.xml");
file.push("docProps/app.xml");
file.push("docProps/custom.xml");
file.push("[Content_Types].xml");
file.push("xl/_rels/workbook.xml.rels");
file.push("xl/styles.xml");
file.push("xl/pivotTables/_rels/pivotTable3.xml.rels");
file.push("xl/pivotTables/_rels/pivotTable1.xml.rels");
file.push("xl/pivotTables/_rels/pivotTable2.xml.rels");
file.push("xl/pivotTables/pivotTable3.xml");
file.push("xl/pivotTables/pivotTable1.xml");
file.push("xl/pivotTables/pivotTable2.xml");
file.push("xl/workbook.xml");
file.push("xl/worksheets/_rels/sheet2.xml.rels");
file.push("xl/worksheets/_rels/sheet1.xml.rels");
file.push("xl/worksheets/_rels/sheet3.xml.rels");
file.push("xl/worksheets/sheet4.xml");
file.push("xl/worksheets/sheet1.xml");
file.push("xl/worksheets/sheet3.xml");
file.push("xl/worksheets/sheet2.xml");
file.push("xl/sharedStrings.xml");
file.push("xl/pivotCache/_rels/pivotCacheDefinition1.xml.rels");
file.push("xl/pivotCache/pivotCacheDefinition1.xml");
file.push("xl/pivotCache/pivotCacheRecords1.xml");

for (var i = 0; i < file.length; i++) {
  zip.file(file[i], fs.readFileSync("/home/user/xlsx_FILES/"+file[i]));
}

zip.generateAsync({type:"blob"}).then(function(content) {
  // see FileSaver.js
  saveAs(content, "yourfile.xlsx");
});

答案 1 :(得分:1)

查看archiver,一个nodejs的压缩库。库的docs看起来很全面。该库还允许您附加档案并利用流式api来附加和创建新档案。

以下是其文档中的示例代码段,其中显示了如何使用该库。

// require modules
var fs = require('fs');
var archiver = require('archiver');

// create a file to stream archive data to.
var output = fs.createWriteStream(__dirname + '/example.zip');
var archive = archiver('zip', {
    store: true // Sets the compression method to STORE.
});

// listen for all archive data to be written
output.on('close', function() {
  console.log(archive.pointer() + ' total bytes');
  console.log('archiver has been finalized and the output file descriptor has closed.');
});

// good practice to catch this error explicitly
archive.on('error', function(err) {
  throw err;
});

// pipe archive data to the file
archive.pipe(output);