From be63395670fc6a9cb00ce5b7299f5d86fb767f21 Mon Sep 17 00:00:00 2001 From: skypesky <2565978507@qq.com> Date: Thu, 6 May 2021 01:13:25 +0800 Subject: [PATCH 1/3] fix issue 1676 Broken internal link on Google sheets --- lib/xlsx/xform/sheet/hyperlink-xform.js | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/lib/xlsx/xform/sheet/hyperlink-xform.js b/lib/xlsx/xform/sheet/hyperlink-xform.js index 3fb560a6d..3d826d4a0 100644 --- a/lib/xlsx/xform/sheet/hyperlink-xform.js +++ b/lib/xlsx/xform/sheet/hyperlink-xform.js @@ -6,11 +6,19 @@ class HyperlinkXform extends BaseXform { } render(xmlStream, model) { - xmlStream.leafNode('hyperlink', { - ref: model.address, - 'r:id': model.rId, - tooltip: model.tooltip, - }); + if (this.isInternalLink(model)) { + xmlStream.leafNode('hyperlink', { + ref: model.address, + location: model.target, + tooltip: model.tooltip, + }); + } else { + xmlStream.leafNode('hyperlink', { + ref: model.address, + 'r:id': model.rId, + tooltip: model.tooltip, + }); + } } parseOpen(node) { @@ -30,6 +38,11 @@ class HyperlinkXform extends BaseXform { parseClose() { return false; } + + isInternalLink(model) { + // @example: Sheet2!D3, return true + return model.target && /[^!]+![a-zA-Z]+[\d]+/.test(model.target); + } } module.exports = HyperlinkXform; From 59036b79103cb7eb9e634716fb098ac0447292cd Mon Sep 17 00:00:00 2001 From: skypesky <2565978507@qq.com> Date: Thu, 6 May 2021 08:21:48 +0800 Subject: [PATCH 2/3] Update hyperlink-xform.js --- lib/xlsx/xform/sheet/hyperlink-xform.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/xlsx/xform/sheet/hyperlink-xform.js b/lib/xlsx/xform/sheet/hyperlink-xform.js index 3d826d4a0..dd7bd27c9 100644 --- a/lib/xlsx/xform/sheet/hyperlink-xform.js +++ b/lib/xlsx/xform/sheet/hyperlink-xform.js @@ -41,7 +41,7 @@ class HyperlinkXform extends BaseXform { isInternalLink(model) { // @example: Sheet2!D3, return true - return model.target && /[^!]+![a-zA-Z]+[\d]+/.test(model.target); + return model.target && /^[^!]+![a-zA-Z]+[\d]+$/.test(model.target); } } From d7b67987fbdc72b44ccc2eac83bd775029ac8be4 Mon Sep 17 00:00:00 2001 From: ye skypesky <2678630761@qq.com> Date: Sun, 21 Nov 2021 00:52:39 +0800 Subject: [PATCH 3/3] fix(issue 1676): add unit test --- lib/xlsx/xform/sheet/hyperlink-xform.js | 8 +++++++- spec/unit/xlsx/xform/sheet/hyperlink-xform.spec.js | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/xlsx/xform/sheet/hyperlink-xform.js b/lib/xlsx/xform/sheet/hyperlink-xform.js index dd7bd27c9..88f4ee2ec 100644 --- a/lib/xlsx/xform/sheet/hyperlink-xform.js +++ b/lib/xlsx/xform/sheet/hyperlink-xform.js @@ -9,8 +9,9 @@ class HyperlinkXform extends BaseXform { if (this.isInternalLink(model)) { xmlStream.leafNode('hyperlink', { ref: model.address, - location: model.target, + 'r:id': model.rId, tooltip: model.tooltip, + location: model.target, }); } else { xmlStream.leafNode('hyperlink', { @@ -28,6 +29,11 @@ class HyperlinkXform extends BaseXform { rId: node.attributes['r:id'], tooltip: node.attributes.tooltip, }; + + // This is an internal link + if (node.attributes.location) { + this.model.target = node.attributes.location; + } return true; } return false; diff --git a/spec/unit/xlsx/xform/sheet/hyperlink-xform.spec.js b/spec/unit/xlsx/xform/sheet/hyperlink-xform.spec.js index 4292dfe9d..9e25bbc61 100644 --- a/spec/unit/xlsx/xform/sheet/hyperlink-xform.spec.js +++ b/spec/unit/xlsx/xform/sheet/hyperlink-xform.spec.js @@ -15,6 +15,18 @@ const expectations = [ xml: '', tests: ['render', 'renderIn', 'parse'], }, + { + title: 'Internal Link', + create() { + return new HyperlinkXform(); + }, + preparedModel: {address: 'B6', rId: 'rId1', target: 'sheet1!B2'}, + get parsedModel() { + return this.preparedModel; + }, + xml: '', + tests: ['render', 'renderIn', 'parse'], + }, ]; describe('HyperlinkXform', () => {