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', () => {