Skip to content

Commit

Permalink
Move hyperlinks references on added rows and columns (#184)
Browse files Browse the repository at this point in the history
* Push down and right hyperlinks references
* Test push down and right hyperlinks
  • Loading branch information
IagoSRL authored Mar 9, 2024
1 parent 128dfda commit 40aed53
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 0 deletions.
19 changes: 19 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -1312,6 +1312,16 @@ class Workbook {
}

});

// Update hyperlinks refs
sheet.findall("hyperlinks/hyperlink").forEach(function (hyperlink) {
var ref = self.splitRef(hyperlink.attrib.ref);
var colNumber = self.charToNum(ref.col);
if (colNumber > currentCol) {
ref.col = self.numToChar(colNumber + numCols);
hyperlink.attrib.ref = self.joinRef(ref);
}
});
}
// Look for any merged cell, named table or named range definitions below
// `currentRow` and push down by `numRows` (used when rows are inserted).
Expand Down Expand Up @@ -1414,6 +1424,15 @@ class Workbook {
}

});

// Update hyperlinks refs
sheet.findall("hyperlinks/hyperlink").forEach(function (hyperlink) {
var ref = self.splitRef(hyperlink.attrib.ref);
if (ref.row > currentRow) {
ref.row += numRows;
hyperlink.attrib.ref = self.joinRef(ref);
}
});
}
getWidthCell(numCol, sheet) {
var defaultWidth = sheet.root.find("sheetFormatPr").attrib["defaultColWidth"];
Expand Down
60 changes: 60 additions & 0 deletions test/crud-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -684,6 +684,66 @@ describe("CRUD operations", function() {
});
});

it("moved hyperlinks in sheet", function(done) {
fs.readFile(path.join(__dirname, "templates", "test-moved-hyperlinks.xlsx"), function(err, data) {
expect(err).toBeNull();

var t = new XlsxTemplate(data);

t.substitute(1, {
email: "[email protected]",
subject: "hello",
url: "http://www.google.com",
domain: "google",
rows: [{
name: 'One',
amount: 1,
}, {
name: 'Two',
amount: 2,
}, {
name: 'Three',
amount: 3,
}],
list: ['A', 'B', 'C', 'D']
});

var newData = t.generate();

var sharedStrings = etree.parse(t.archive.file("xl/sharedStrings.xml").asText()).getroot(),
sheet1 = etree.parse(t.archive.file("xl/worksheets/sheet1.xml").asText()).getroot(),
rels = etree.parse(t.archive.file("xl/worksheets/_rels/sheet1.xml.rels").asText()).getroot()
;

// Every hyperlink has being substituted
expect(rels.find("./Relationship[@Id='rId1']").attrib.Target).toEqual("mailto:[email protected]?subject=Hello%20hello");
expect(rels.find("./Relationship[@Id='rId2']").attrib.Target).toEqual("http://www.google.com");
expect(rels.find("./Relationship[@Id='rId3']").attrib.Target).toEqual("mailto:[email protected]?subject=Hello%20hello");
expect(rels.find("./Relationship[@Id='rId4']").attrib.Target).toEqual("http://www.google.com");
expect(rels.find("./Relationship[@Id='rId5']").attrib.Target).toEqual("mailto:[email protected]?subject=Hello%20hello");
expect(rels.find("./Relationship[@Id='rId6']").attrib.Target).toEqual("http://www.google.com");

// Hyperlinks have moved
expect(sheet1.find("./hyperlinks/hyperlink[@ref='B7']")).not.toBeNull(); // before table and list - unchanged
expect(sheet1.find("./hyperlinks/hyperlink[@ref='C7']")).not.toBeNull(); // before table and list - unchanged

expect(sheet1.find("./hyperlinks/hyperlink[@ref='B14']")).toBeNull(); // pushed down
expect(sheet1.find("./hyperlinks/hyperlink[@ref='B16']")).not.toBeNull(); // pushed down
expect(sheet1.find("./hyperlinks/hyperlink[@ref='C14']")).toBeNull(); // pushed down
expect(sheet1.find("./hyperlinks/hyperlink[@ref='C16']")).not.toBeNull(); // pushed down

expect(sheet1.find("./hyperlinks/hyperlink[@ref='F14']")).toBeNull(); // pushed down and accross
expect(sheet1.find("./hyperlinks/hyperlink[@ref='I16']")).not.toBeNull(); // pushed down and accross
expect(sheet1.find("./hyperlinks/hyperlink[@ref='G14']")).toBeNull(); // pushed down and accross
expect(sheet1.find("./hyperlinks/hyperlink[@ref='J16']")).not.toBeNull(); // pushed down and accross

// XXX: For debugging only
fs.writeFileSync("test/output/test-moved-hyperlinks.xlsx", newData, "binary");

done();
});
});

it("moves named tables, named cells and merged cells", function(done) {

fs.readFile(path.join(__dirname, "templates", "test-named-tables.xlsx"), function(err, data) {
Expand Down
Binary file added test/templates/test-moved-hyperlinks.xlsx
Binary file not shown.

0 comments on commit 40aed53

Please sign in to comment.