From c514b3b0d4190e466e114d2576d0cab503fa7965 Mon Sep 17 00:00:00 2001 From: Jonathan Durand <38976316+jdugh@users.noreply.github.com> Date: Sun, 29 May 2022 20:22:33 +0200 Subject: [PATCH] add customXml in the order list for rebuild (#154) * add customXml in the order list for rebuild to prevent error on remove sheet * Remove the useless customXML type in order list ; in the sort function of rebuild, if the type of Relationship is not in the `order` list, go to the end ; adding test code --- src/index.js | 6 ++++++ test/crud-test.ts | 30 ++++++++++++++++++++++++++++++ test/templates/custom-xml.xlsx | Bin 0 -> 12507 bytes 3 files changed, 36 insertions(+) create mode 100644 test/templates/custom-xml.xlsx diff --git a/src/index.js b/src/index.js index 707dd73..ec8ed12 100755 --- a/src/index.js +++ b/src/index.js @@ -147,6 +147,12 @@ module.exports = (function() { .sort(function(rel1, rel2){ //using order var index1 = order.indexOf( path.basename(rel1.attrib.Type) ); var index2 = order.indexOf( path.basename(rel2.attrib.Type) ); + // If the attrib.Type is not in the order list, go to the end of sort + // Maybe we can do it more gracefully with the boolean operator + if ( index1 < 0 && index2 >= 0 ) return 1; // rel1 go after rel2 + if ( index1 >= 0 && index2 < 0 ) return -1; // rel1 go before rel2 + if ( index1 < 0 && index2 < 0 ) return 0; // change nothing + if ((index1 + index2) == 0) { if(rel1.attrib.Id && rel2.attrib.Id) return rel1.attrib.Id.substring(3) - rel2.attrib.Id.substring(3); return rel1._id - rel2._id; diff --git a/test/crud-test.ts b/test/crud-test.ts index 3557a62..ed4822c 100644 --- a/test/crud-test.ts +++ b/test/crud-test.ts @@ -1243,4 +1243,34 @@ describe("CRUD operations", function() { }); }); }); + + describe("Rebuild file", function() { + it("Rebuild archive file with custom Relationship workbook rels after delete a sheet", function (done) { + fs.readFile(path.join(__dirname, 'templates', 'custom-xml.xlsx'), function(err, buffer) { + expect(err).toBeNull(); + // Create a template + var t = new XlsxTemplate(buffer); + + t.deleteSheet("Sheet2"); + var newData = t.generate(); + var wbrels = etree.parse(t.archive.file("xl/_rels/workbook.xml.rels").asText()).getroot(); + expect(wbrels.find("Relationship[@Id='rId1']").attrib.Target).toEqual("worksheets/sheet1.xml"); + expect(wbrels.find("Relationship[@Id='rId1']").attrib.Type).toEqual("http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet"); + expect(wbrels.find("Relationship[@Id='rId2']").attrib.Target).toEqual("worksheets/sheet3.xml"); + expect(wbrels.find("Relationship[@Id='rId2']").attrib.Type).toEqual("http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet"); + expect(wbrels.find("Relationship[@Id='rId3']").attrib.Target).toEqual("theme/theme1.xml"); + expect(wbrels.find("Relationship[@Id='rId3']").attrib.Type).toEqual("http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"); + expect(wbrels.find("Relationship[@Id='rId4']").attrib.Target).toEqual("styles.xml"); + expect(wbrels.find("Relationship[@Id='rId4']").attrib.Type).toEqual("http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"); + expect(wbrels.find("Relationship[@Id='rId5']").attrib.Target).toEqual("sharedStrings.xml"); + expect(wbrels.find("Relationship[@Id='rId5']").attrib.Type).toEqual("http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings"); + expect(wbrels.find("Relationship[@Id='rId6']").attrib.Target).toEqual("xmlMaps.xml"); + expect(wbrels.find("Relationship[@Id='rId6']").attrib.Type).toEqual("http://schemas.openxmlformats.org/officeDocument/2006/relationships/xmlMaps"); + expect(wbrels.find("Relationship[@Id='rId7']").attrib.Target).toEqual("connections.xml"); + expect(wbrels.find("Relationship[@Id='rId7']").attrib.Type).toEqual("http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections"); + fs.writeFileSync('test/output/custom-xml.xlsx', newData, 'binary'); + done(); + }); + }); + }); }); diff --git a/test/templates/custom-xml.xlsx b/test/templates/custom-xml.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..66bffa17575d0b48d3d0733fd98edeb6100baeb4 GIT binary patch literal 12507 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 literal 0 HcmV?d00001