Skip to content

Commit 3747cd9

Browse files
committed
New function GetHyperLinkCells has been added
- Update unit tests - Run publish job when a tag is pushed
1 parent bda29c9 commit 3747cd9

File tree

4 files changed

+71
-1
lines changed

4 files changed

+71
-1
lines changed

.github/workflows/publish.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ on:
33
push:
44
branches:
55
- main
6+
tags:
7+
- v*
68
jobs:
79

810
build:
@@ -77,6 +79,7 @@ jobs:
7779

7880
publish:
7981
needs: build
82+
if: startsWith(github.ref, 'refs/tags/')
8083
runs-on: ubuntu-24.04
8184
environment: production
8285
permissions:

cmd/main.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ func regInteropFunc(f *excelize.File, fn map[string]interface{}) interface{} {
384384
"GetDefinedName": GetDefinedName(f),
385385
"GetDocProps": GetDocProps(f),
386386
"GetFormControls": GetFormControls(f),
387+
"GetHyperLinkCells": GetHyperLinkCells(f),
387388
"GetHeaderFooter": GetHeaderFooter(f),
388389
"GetMergeCells": GetMergeCells(f),
389390
"GetPageLayout": GetPageLayout(f),
@@ -2298,6 +2299,34 @@ func GetFormControls(f *excelize.File) func(this js.Value, args []js.Value) inte
22982299
}
22992300
}
23002301

2302+
// GetHyperLinkCells returns cell references which contain hyperlinks in a
2303+
// given worksheet name and link type. The optional parameter 'linkType' use for
2304+
// specific link type, the optional values are "External" for website links,
2305+
// "Location" for moving to one of cell in this workbook, "None" for no links.
2306+
// If linkType is empty, it will return all hyperlinks in the worksheet.
2307+
func GetHyperLinkCells(f *excelize.File) func(this js.Value, args []js.Value) interface{} {
2308+
return func(this js.Value, args []js.Value) interface{} {
2309+
ret := map[string]interface{}{"result": js.ValueOf([]interface{}{}), "error": nil}
2310+
if err := prepareArgs(args, []argsRule{
2311+
{types: []js.Type{js.TypeString}},
2312+
{types: []js.Type{js.TypeString}},
2313+
}); err != nil {
2314+
ret["error"] = err.Error()
2315+
return js.ValueOf(ret)
2316+
}
2317+
result, err := f.GetHyperLinkCells(args[0].String(), args[1].String())
2318+
if err != nil {
2319+
ret["error"] = err.Error()
2320+
}
2321+
excepted := make([]interface{}, len(result))
2322+
for i, cell := range result {
2323+
excepted[i] = cell
2324+
}
2325+
ret["result"] = excepted
2326+
return js.ValueOf(ret)
2327+
}
2328+
}
2329+
23012330
// GetHeaderFooter provides a function to get worksheet header and footer by
23022331
// given worksheet name.
23032332
func GetHeaderFooter(f *excelize.File) func(this js.Value, args []js.Value) interface{} {

cmd/main_test.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2113,7 +2113,7 @@ func TestSetCellFormula(t *testing.T) {
21132113
assert.Equal(t, errArgType.Error(), ret.Get("error").String())
21142114
}
21152115

2116-
func TestSetCellHyperLink(t *testing.T) {
2116+
func TestCellHyperLink(t *testing.T) {
21172117
f := NewFile(js.Value{}, []js.Value{})
21182118
assert.True(t, f.(js.Value).Get("error").IsNull())
21192119

@@ -2122,6 +2122,23 @@ func TestSetCellHyperLink(t *testing.T) {
21222122
ret := f.(js.Value).Call("SetCellHyperLink", js.ValueOf("Sheet1"), js.ValueOf("A3"), js.ValueOf(display), js.ValueOf("External"), js.ValueOf(map[string]interface{}{"Display": display, "Tooltip": tooltip}))
21232123
assert.True(t, ret.Get("error").IsNull())
21242124

2125+
ret = f.(js.Value).Call("GetHyperLinkCells", js.ValueOf("Sheet1"), js.ValueOf(""))
2126+
assert.True(t, ret.Get("error").IsNull())
2127+
assert.Equal(t, 1, ret.Get("result").Length())
2128+
assert.Equal(t, "A3", ret.Get("result").Index(0).String())
2129+
2130+
ret = f.(js.Value).Call("GetHyperLinkCells", js.ValueOf("Sheet1"), js.ValueOf("External"))
2131+
assert.True(t, ret.Get("error").IsNull())
2132+
assert.Equal(t, 1, ret.Get("result").Length())
2133+
2134+
ret = f.(js.Value).Call("GetHyperLinkCells", js.ValueOf("Sheet1"), js.ValueOf("Location"))
2135+
assert.True(t, ret.Get("error").IsNull())
2136+
assert.Equal(t, 0, ret.Get("result").Length())
2137+
2138+
ret = f.(js.Value).Call("GetHyperLinkCells", js.ValueOf("Sheet1"), js.ValueOf("None"))
2139+
assert.True(t, ret.Get("error").IsNull())
2140+
assert.Equal(t, 0, ret.Get("result").Length())
2141+
21252142
ret = f.(js.Value).Call("SetCellHyperLink")
21262143
assert.EqualError(t, errArgNum, ret.Get("error").String())
21272144

@@ -2130,6 +2147,15 @@ func TestSetCellHyperLink(t *testing.T) {
21302147

21312148
ret = f.(js.Value).Call("SetCellHyperLink", js.ValueOf("Sheet1"), js.ValueOf("A3"), js.ValueOf(display), js.ValueOf("External"), js.ValueOf(map[string]interface{}{"Display": true, "Tooltip": tooltip}))
21322149
assert.Equal(t, errArgType.Error(), ret.Get("error").String())
2150+
2151+
ret = f.(js.Value).Call("GetHyperLinkCells")
2152+
assert.EqualError(t, errArgNum, ret.Get("error").String())
2153+
2154+
ret = f.(js.Value).Call("GetHyperLinkCells", js.ValueOf("SheetN"), js.ValueOf(""))
2155+
assert.Equal(t, "sheet SheetN does not exist", ret.Get("error").String())
2156+
2157+
ret = f.(js.Value).Call("GetHyperLinkCells", js.ValueOf("Sheet1"), js.ValueOf(nil))
2158+
assert.Equal(t, errArgType.Error(), ret.Get("error").String())
21332159
}
21342160

21352161
func TestSetCellInt(t *testing.T) {

src/index.d.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2477,6 +2477,18 @@ declare module 'excelize-wasm' {
24772477
*/
24782478
GetFormControls(sheet: string): { formControls: FormControl[], error: string | null }
24792479

2480+
/**
2481+
* GetHyperLinkCells returns cell references which contain hyperlinks in a
2482+
* given worksheet name and link type. The optional parameter 'linkType' use
2483+
* for specific link type, the optional values are "External" for website
2484+
* links, "Location" for moving to one of cell in this workbook, "None" for
2485+
* no links. If linkType is empty, it will return all hyperlinks in the
2486+
* worksheet.
2487+
* @param sheet The worksheet name
2488+
* @param linkType The cell hyperlink type
2489+
*/
2490+
GetHyperLinkCells(sheet: string, linkType: string): { result: string[], error: string | null }
2491+
24802492
/**
24812493
* GetHeaderFooter provides a function to get worksheet header and footer by
24822494
* given worksheet name.

0 commit comments

Comments
 (0)