From 7f3d6636280418e0c3d778548fee9218890769e7 Mon Sep 17 00:00:00 2001 From: xuri Date: Tue, 25 Jul 2023 00:08:24 +0800 Subject: [PATCH] This closes #1584, fix graphic object counter issues - Optimize number format parser - Update documentation for the `AddFormControl` function - Update unit tests - Upgrade dependencies package --- go.mod | 8 +++---- go.sum | 16 +++++++++----- picture.go | 11 ++++------ pivotTable_test.go | 6 ++--- shape.go | 8 +++---- vml.go | 55 +++++++++++++++++++++++----------------------- 6 files changed, 52 insertions(+), 52 deletions(-) diff --git a/go.mod b/go.mod index 58a3d71555..8a6347ec41 100644 --- a/go.mod +++ b/go.mod @@ -7,11 +7,11 @@ require ( github.com/richardlehane/mscfb v1.0.4 github.com/stretchr/testify v1.8.0 github.com/xuri/efp v0.0.0-20230422071738-01f4e37c47e9 - github.com/xuri/nfp v0.0.0-20230503010013-3f38cdbb0b83 - golang.org/x/crypto v0.9.0 + github.com/xuri/nfp v0.0.0-20230723160540-a7d120392641 + golang.org/x/crypto v0.11.0 golang.org/x/image v0.5.0 - golang.org/x/net v0.10.0 - golang.org/x/text v0.9.0 + golang.org/x/net v0.12.0 + golang.org/x/text v0.11.0 ) require github.com/richardlehane/msoleps v1.0.3 // indirect diff --git a/go.sum b/go.sum index 35ed9c2945..7bc9eb62d0 100644 --- a/go.sum +++ b/go.sum @@ -17,13 +17,13 @@ github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PK github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/xuri/efp v0.0.0-20230422071738-01f4e37c47e9 h1:ge5g8vsTQclA5lXDi+PuiAFw5GMIlMHOB/5e1hsf96E= github.com/xuri/efp v0.0.0-20230422071738-01f4e37c47e9/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= -github.com/xuri/nfp v0.0.0-20230503010013-3f38cdbb0b83 h1:xVwnvkzzi+OiwhIkWOXvh1skFI6bagk8OvGuazM80Rw= -github.com/xuri/nfp v0.0.0-20230503010013-3f38cdbb0b83/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= +github.com/xuri/nfp v0.0.0-20230723160540-a7d120392641 h1:1SQuQwUorWlROdGAbsAJrMInj02yCUsYFNi/MzTJ6cA= +github.com/xuri/nfp v0.0.0-20230723160540-a7d120392641/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI= golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -32,8 +32,9 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -44,16 +45,19 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/picture.go b/picture.go index 9b026f567d..152ab9ac17 100644 --- a/picture.go +++ b/picture.go @@ -308,23 +308,20 @@ func (f *File) addSheetPicture(sheet string, rID int) error { // countDrawings provides a function to get drawing files count storage in the // folder xl/drawings. func (f *File) countDrawings() int { - var c1, c2 int + drawings := map[string]struct{}{} f.Pkg.Range(func(k, v interface{}) bool { if strings.Contains(k.(string), "xl/drawings/drawing") { - c1++ + drawings[k.(string)] = struct{}{} } return true }) f.Drawings.Range(func(rel, value interface{}) bool { if strings.Contains(rel.(string), "xl/drawings/drawing") { - c2++ + drawings[rel.(string)] = struct{}{} } return true }) - if c1 < c2 { - return c2 - } - return c1 + return len(drawings) } // addDrawingPicture provides a function to add picture by given sheet, diff --git a/pivotTable_test.go b/pivotTable_test.go index 24ccb4a0bc..2de3e07f89 100644 --- a/pivotTable_test.go +++ b/pivotTable_test.go @@ -113,7 +113,7 @@ func TestAddPivotTable(t *testing.T) { assert.NoError(t, err) assert.NoError(t, f.AddPivotTable(&PivotTableOptions{ DataRange: "Sheet1!$A$1:$E$31", - PivotTableRange: "Sheet2!$A$1:$AR$15", + PivotTableRange: "Sheet2!$A$1:$AN$17", Rows: []PivotTableField{{Data: "Month"}}, Columns: []PivotTableField{{Data: "Region", DefaultSubtotal: true}, {Data: "Type", DefaultSubtotal: true}, {Data: "Year"}}, Data: []PivotTableField{{Data: "Sales", Subtotal: "Min", Name: "Summarize by Min"}}, @@ -126,7 +126,7 @@ func TestAddPivotTable(t *testing.T) { })) assert.NoError(t, f.AddPivotTable(&PivotTableOptions{ DataRange: "Sheet1!$A$1:$E$31", - PivotTableRange: "Sheet2!$A$18:$AR$54", + PivotTableRange: "Sheet2!$A$20:$AR$60", Rows: []PivotTableField{{Data: "Month", DefaultSubtotal: true}, {Data: "Type"}}, Columns: []PivotTableField{{Data: "Region", DefaultSubtotal: true}, {Data: "Year"}}, Data: []PivotTableField{{Data: "Sales", Subtotal: "Product", Name: "Summarize by Product"}}, @@ -146,7 +146,7 @@ func TestAddPivotTable(t *testing.T) { })) assert.NoError(t, f.AddPivotTable(&PivotTableOptions{ DataRange: "dataRange", - PivotTableRange: "Sheet2!$A$57:$AJ$91", + PivotTableRange: "Sheet2!$A$65:$AJ$100", Rows: []PivotTableField{{Data: "Month", DefaultSubtotal: true}, {Data: "Year"}}, Columns: []PivotTableField{{Data: "Region", DefaultSubtotal: true}, {Data: "Type"}}, Data: []PivotTableField{{Data: "Sales", Subtotal: "Sum", Name: "Sum of Sales"}, {Data: "Sales", Subtotal: "Average", Name: "Average of Sales"}}, diff --git a/shape.go b/shape.go index 3f3dbe2e4f..73cc5a3c6b 100644 --- a/shape.go +++ b/shape.go @@ -50,13 +50,13 @@ func parseShapeOptions(opts *Shape) (*Shape, error) { } // AddShape provides the method to add shape in a sheet by given worksheet -// index, shape format set (such as offset, scale, aspect ratio setting and -// print settings) and properties set. For example, add text box (rect shape) -// in Sheet1: +// name and shape format set (such as offset, scale, aspect ratio setting and +// print settings). For example, add text box (rect shape) in Sheet1: // // lineWidth := 1.2 -// err := f.AddShape("Sheet1", "G6", +// err := f.AddShape("Sheet1", // &excelize.Shape{ +// Cell: "G6", // Type: "rect", // Line: excelize.ShapeLine{Color: "4286F4", Width: &lineWidth}, // Fill: excelize.Fill{Color: []string{"8EB9FF"}, Pattern: 1}, diff --git a/vml.go b/vml.go index cbe07e2119..b99a979d69 100644 --- a/vml.go +++ b/vml.go @@ -229,22 +229,19 @@ func (f *File) addComment(commentsXML string, opts vmlOptions) error { // countComments provides a function to get comments files count storage in // the folder xl. func (f *File) countComments() int { - c1, c2 := 0, 0 + comments := map[string]struct{}{} f.Pkg.Range(func(k, v interface{}) bool { if strings.Contains(k.(string), "xl/comments") { - c1++ + comments[k.(string)] = struct{}{} } return true }) for rel := range f.Comments { if strings.Contains(rel, "xl/comments") { - c2++ + comments[rel] = struct{}{} } } - if c1 < c2 { - return c2 - } - return c1 + return len(comments) } // commentsReader provides a function to get the pointer to the structure @@ -281,12 +278,12 @@ func (f *File) commentsWriter() { // XLSM or XLTM. Scroll value must be between 0 and 30000. // // Example 1, add button form control with macro, rich-text, custom button size, -// print property on Sheet1!A1, and let the button do not move or size with +// print property on Sheet1!A2, and let the button do not move or size with // cells: // // enable := true // err := f.AddFormControl("Sheet1", excelize.FormControl{ -// Cell: "A1", +// Cell: "A2", // Type: excelize.FormControlButton, // Macro: "Button1_Click", // Width: 140, @@ -321,12 +318,14 @@ func (f *File) commentsWriter() { // Checked: true, // }) // -// Example 3, add spin button form control on Sheet1!A2 to increase or decrease +// Example 3, add spin button form control on Sheet1!B1 to increase or decrease // the value of Sheet1!A1: // // err := f.AddFormControl("Sheet1", excelize.FormControl{ -// Cell: "A2", +// Cell: "B1", // Type: excelize.FormControlSpinButton, +// Width: 15, +// Height: 40, // CurrentVal: 7, // MinVal: 5, // MaxVal: 10, @@ -338,14 +337,17 @@ func (f *File) commentsWriter() { // the value of Sheet1!A1 by click the scroll arrows or drag the scroll box: // // err := f.AddFormControl("Sheet1", excelize.FormControl{ -// Cell: "A2", -// Type: excelize.FormControlScrollBar, -// CurrentVal: 50, -// MinVal: 10, -// MaxVal: 100, -// IncChange: 1, -// PageChange: 1, -// CellLink: "A1", +// Cell: "A2", +// Type: excelize.FormControlScrollBar, +// Width: 140, +// Height: 20, +// CurrentVal: 50, +// MinVal: 10, +// MaxVal: 100, +// IncChange: 1, +// PageChange: 1, +// CellLink: "A1", +// Horizontally: true, // }) func (f *File) AddFormControl(sheet string, opts FormControl) error { return f.addVMLObject(vmlOptions{ @@ -355,9 +357,9 @@ func (f *File) AddFormControl(sheet string, opts FormControl) error { // DeleteFormControl provides the method to delete form control in a worksheet // by given worksheet name and cell reference. For example, delete the form -// control in Sheet1!$A$30: +// control in Sheet1!$A$1: // -// err := f.DeleteFormControl("Sheet1", "A30") +// err := f.DeleteFormControl("Sheet1", "A1") func (f *File) DeleteFormControl(sheet, cell string) error { ws, err := f.workSheetReader(sheet) if err != nil { @@ -430,22 +432,19 @@ func (f *File) DeleteFormControl(sheet, cell string) error { // countVMLDrawing provides a function to get VML drawing files count storage // in the folder xl/drawings. func (f *File) countVMLDrawing() int { - c1, c2 := 0, 0 + drawings := map[string]struct{}{} f.Pkg.Range(func(k, v interface{}) bool { if strings.Contains(k.(string), "xl/drawings/vmlDrawing") { - c1++ + drawings[k.(string)] = struct{}{} } return true }) for rel := range f.VMLDrawing { if strings.Contains(rel, "xl/drawings/vmlDrawing") { - c2++ + drawings[rel] = struct{}{} } } - if c1 < c2 { - return c2 - } - return c1 + return len(drawings) } // decodeVMLDrawingReader provides a function to get the pointer to the