2018-07-25 22:40:08 +08:00
package excelize
import (
2023-09-08 00:09:41 +08:00
"fmt"
2020-10-23 00:01:52 +08:00
"math"
2020-03-03 00:15:03 +08:00
"path/filepath"
2020-09-18 22:20:58 +08:00
"strings"
2018-07-25 22:40:08 +08:00
"testing"
"github.com/stretchr/testify/assert"
)
2019-01-09 23:12:53 +08:00
func TestStyleFill ( t * testing . T ) {
cases := [ ] struct {
label string
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
format * Style
2019-01-09 23:12:53 +08:00
expectFill bool
} { {
label : "no_fill" ,
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
format : & Style { Alignment : & Alignment { WrapText : true } } ,
2019-01-09 23:12:53 +08:00
expectFill : false ,
} , {
label : "fill" ,
2023-02-27 00:05:36 +08:00
format : & Style { Fill : Fill { Type : "pattern" , Pattern : 1 , Color : [ ] string { "000000" } } } ,
2019-01-09 23:12:53 +08:00
expectFill : true ,
} }
for _ , testCase := range cases {
xl := NewFile ( )
styleID , err := xl . NewStyle ( testCase . format )
2020-05-24 20:20:22 +08:00
assert . NoError ( t , err )
2019-01-09 23:12:53 +08:00
2022-11-12 00:02:11 +08:00
styles , err := xl . stylesReader ( )
assert . NoError ( t , err )
2019-01-09 23:12:53 +08:00
style := styles . CellXfs . Xf [ styleID ]
if testCase . expectFill {
2020-05-10 16:56:08 +08:00
assert . NotEqual ( t , * style . FillID , 0 , testCase . label )
2019-01-09 23:12:53 +08:00
} else {
2020-05-10 16:56:08 +08:00
assert . Equal ( t , * style . FillID , 0 , testCase . label )
2019-01-09 23:12:53 +08:00
}
}
2020-05-24 20:20:22 +08:00
f := NewFile ( )
2023-02-27 00:05:36 +08:00
styleID1 , err := f . NewStyle ( & Style { Fill : Fill { Type : "pattern" , Pattern : 1 , Color : [ ] string { "000000" } } } )
2020-05-24 20:20:22 +08:00
assert . NoError ( t , err )
2023-02-27 00:05:36 +08:00
styleID2 , err := f . NewStyle ( & Style { Fill : Fill { Type : "pattern" , Pattern : 1 , Color : [ ] string { "000000" } } } )
2020-05-24 20:20:22 +08:00
assert . NoError ( t , err )
assert . Equal ( t , styleID1 , styleID2 )
assert . NoError ( t , f . SaveAs ( filepath . Join ( "test" , "TestStyleFill.xlsx" ) ) )
2019-01-09 23:12:53 +08:00
}
2018-07-25 22:40:08 +08:00
func TestSetConditionalFormat ( t * testing . T ) {
cases := [ ] struct {
label string
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
format [ ] ConditionalFormatOptions
2018-07-25 22:40:08 +08:00
rules [ ] * xlsxCfRule
} { {
label : "3_color_scale" ,
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
format : [ ] ConditionalFormatOptions { {
Type : "3_color_scale" ,
Criteria : "=" ,
MinType : "num" ,
MidType : "num" ,
MaxType : "num" ,
MinValue : "-10" ,
MidValue : "0" ,
MaxValue : "10" ,
MinColor : "ff0000" ,
MidColor : "00ff00" ,
MaxColor : "0000ff" ,
} } ,
2018-07-25 22:40:08 +08:00
rules : [ ] * xlsxCfRule { {
Priority : 1 ,
Type : "colorScale" ,
ColorScale : & xlsxColorScale {
Cfvo : [ ] * xlsxCfvo { {
Type : "num" ,
2018-07-25 04:12:26 +08:00
Val : "-10" ,
2018-07-25 22:40:08 +08:00
} , {
Type : "num" ,
2018-07-25 04:12:26 +08:00
Val : "0" ,
2018-07-25 22:40:08 +08:00
} , {
Type : "num" ,
2018-07-25 04:12:26 +08:00
Val : "10" ,
2018-07-25 22:40:08 +08:00
} } ,
Color : [ ] * xlsxColor { {
RGB : "FFFF0000" ,
} , {
RGB : "FF00FF00" ,
} , {
RGB : "FF0000FF" ,
} } ,
} ,
} } ,
} , {
label : "3_color_scale default min/mid/max" ,
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
format : [ ] ConditionalFormatOptions { {
Type : "3_color_scale" ,
Criteria : "=" ,
MinType : "num" ,
MidType : "num" ,
MaxType : "num" ,
MinColor : "ff0000" ,
MidColor : "00ff00" ,
MaxColor : "0000ff" ,
} } ,
2018-07-25 22:40:08 +08:00
rules : [ ] * xlsxCfRule { {
Priority : 1 ,
Type : "colorScale" ,
ColorScale : & xlsxColorScale {
Cfvo : [ ] * xlsxCfvo { {
Type : "num" ,
2018-07-25 04:12:26 +08:00
Val : "0" ,
2018-07-25 22:40:08 +08:00
} , {
Type : "num" ,
2018-07-25 04:12:26 +08:00
Val : "50" ,
2018-07-25 22:40:08 +08:00
} , {
Type : "num" ,
2018-07-25 04:12:26 +08:00
Val : "0" ,
2018-07-25 22:40:08 +08:00
} } ,
Color : [ ] * xlsxColor { {
RGB : "FFFF0000" ,
} , {
RGB : "FF00FF00" ,
} , {
RGB : "FF0000FF" ,
} } ,
} ,
} } ,
} , {
label : "2_color_scale default min/max" ,
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
format : [ ] ConditionalFormatOptions { {
Type : "2_color_scale" ,
Criteria : "=" ,
MinType : "num" ,
MaxType : "num" ,
MinColor : "ff0000" ,
MaxColor : "0000ff" ,
} } ,
2018-07-25 22:40:08 +08:00
rules : [ ] * xlsxCfRule { {
Priority : 1 ,
Type : "colorScale" ,
ColorScale : & xlsxColorScale {
Cfvo : [ ] * xlsxCfvo { {
Type : "num" ,
2018-07-25 04:12:26 +08:00
Val : "0" ,
2018-07-25 22:40:08 +08:00
} , {
Type : "num" ,
2018-07-25 04:12:26 +08:00
Val : "0" ,
2018-07-25 22:40:08 +08:00
} } ,
Color : [ ] * xlsxColor { {
RGB : "FFFF0000" ,
} , {
RGB : "FF0000FF" ,
} } ,
} ,
} } ,
} }
for _ , testCase := range cases {
2020-11-10 23:48:09 +08:00
f := NewFile ( )
2018-07-25 22:40:08 +08:00
const sheet = "Sheet1"
2023-01-02 11:47:31 +08:00
const rangeRef = "A1:A1"
2023-02-07 00:08:11 +08:00
assert . NoError ( t , f . SetConditionalFormat ( sheet , rangeRef , testCase . format ) )
2020-11-10 23:48:09 +08:00
ws , err := f . workSheetReader ( sheet )
2019-04-15 11:22:57 +08:00
assert . NoError ( t , err )
2020-11-10 23:48:09 +08:00
cf := ws . ConditionalFormatting
2018-07-25 22:40:08 +08:00
assert . Len ( t , cf , 1 , testCase . label )
assert . Len ( t , cf [ 0 ] . CfRule , 1 , testCase . label )
2023-01-02 11:47:31 +08:00
assert . Equal ( t , rangeRef , cf [ 0 ] . SQRef , testCase . label )
2018-07-25 22:40:08 +08:00
assert . EqualValues ( t , testCase . rules , cf [ 0 ] . CfRule , testCase . label )
}
2023-02-07 00:08:11 +08:00
// Test creating a conditional format with a solid color data bar style
f := NewFile ( )
condFmts := [ ] ConditionalFormatOptions {
2024-04-03 08:44:46 +08:00
{ Type : "data_bar" , BarColor : "#A9D08E" , BarSolid : true , Format : intPtr ( 0 ) , Criteria : "=" , MinType : "min" , MaxType : "max" } ,
2023-02-07 00:08:11 +08:00
}
for _ , ref := range [ ] string { "A1:A2" , "B1:B2" } {
assert . NoError ( t , f . SetConditionalFormat ( "Sheet1" , ref , condFmts ) )
}
2023-02-08 00:03:45 +08:00
f = NewFile ( )
2024-01-21 00:05:28 +08:00
// Test creating a conditional format without cell reference
assert . Equal ( t , ErrParameterRequired , f . SetConditionalFormat ( "Sheet1" , "" , nil ) )
// Test creating a conditional format with invalid cell reference
assert . Equal ( t , ErrParameterInvalid , f . SetConditionalFormat ( "Sheet1" , "A1:A2:A3" , nil ) )
2023-02-08 00:03:45 +08:00
// Test creating a conditional format with existing extension lists
2023-02-07 00:08:11 +08:00
ws , ok := f . Sheet . Load ( "xl/worksheets/sheet1.xml" )
assert . True ( t , ok )
2023-09-08 00:09:41 +08:00
ws . ( * xlsxWorksheet ) . ExtLst = & xlsxExtLst { Ext : fmt . Sprintf ( ` <ext uri="%s"><x14:slicerList /></ext><ext uri="%s"><x14:sparklineGroups /></ext> ` , ExtURISlicerListX14 , ExtURISparklineGroups ) }
2023-02-08 00:03:45 +08:00
assert . NoError ( t , f . SetConditionalFormat ( "Sheet1" , "A1:A2" , [ ] ConditionalFormatOptions { { Type : "data_bar" , Criteria : "=" , MinType : "min" , MaxType : "max" , BarBorderColor : "#0000FF" , BarColor : "#638EC6" , BarSolid : true } } ) )
f = NewFile ( )
// Test creating a conditional format with invalid extension list characters
ws , ok = f . Sheet . Load ( "xl/worksheets/sheet1.xml" )
assert . True ( t , ok )
ws . ( * xlsxWorksheet ) . ExtLst = & xlsxExtLst { Ext : "<ext><x14:conditionalFormattings></x14:conditionalFormatting></x14:conditionalFormattings></ext>" }
2023-02-07 00:08:11 +08:00
assert . EqualError ( t , f . SetConditionalFormat ( "Sheet1" , "A1:A2" , condFmts ) , "XML syntax error on line 1: element <conditionalFormattings> closed by </conditionalFormatting>" )
2023-02-08 00:03:45 +08:00
// Test creating a conditional format with invalid icon set style
2023-11-11 00:04:05 +08:00
assert . Equal ( t , ErrParameterInvalid , f . SetConditionalFormat ( "Sheet1" , "A1:A2" , [ ] ConditionalFormatOptions { { Type : "icon_set" , IconStyle : "unknown" } } ) )
2023-11-10 09:25:59 +08:00
// Test unsupported conditional formatting rule types
2023-11-14 09:47:57 +08:00
assert . Equal ( t , ErrParameterInvalid , f . SetConditionalFormat ( "Sheet1" , "A1" , [ ] ConditionalFormatOptions { { Type : "unsupported" } } ) )
2023-12-30 14:41:16 +08:00
t . Run ( "multi_conditional_formatting_rules_priority" , func ( t * testing . T ) {
f := NewFile ( )
var condFmts [ ] ConditionalFormatOptions
for _ , color := range [ ] string {
"#264B96" , // Blue
"#F9A73E" , // Yellow
"#006F3C" , // Green
} {
condFmts = append ( condFmts , ConditionalFormatOptions {
Type : "data_bar" ,
Criteria : "=" ,
MinType : "num" ,
MaxType : "num" ,
MinValue : "0" ,
MaxValue : "5" ,
BarColor : color ,
BarSolid : true ,
} )
}
assert . NoError ( t , f . SetConditionalFormat ( "Sheet1" , "A1:A5" , condFmts ) )
assert . NoError ( t , f . SetConditionalFormat ( "Sheet1" , "B1:B5" , condFmts ) )
for r := 1 ; r <= 20 ; r ++ {
cell , err := CoordinatesToCellName ( 1 , r )
assert . NoError ( t , err )
assert . NoError ( t , f . SetCellValue ( "Sheet1" , cell , r ) )
cell , err = CoordinatesToCellName ( 2 , r )
assert . NoError ( t , err )
assert . NoError ( t , f . SetCellValue ( "Sheet1" , cell , r ) )
}
ws , ok := f . Sheet . Load ( "xl/worksheets/sheet1.xml" )
assert . True ( t , ok )
var priorities [ ] int
expected := [ ] int { 1 , 2 , 3 , 4 , 5 , 6 }
for _ , condFmt := range ws . ( * xlsxWorksheet ) . ConditionalFormatting {
for _ , rule := range condFmt . CfRule {
priorities = append ( priorities , rule . Priority )
}
}
assert . Equal ( t , expected , priorities )
assert . NoError ( t , f . Close ( ) )
} )
2018-07-25 22:40:08 +08:00
}
2019-04-26 00:24:25 +08:00
2022-08-27 00:45:46 +08:00
func TestGetConditionalFormats ( t * testing . T ) {
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
for _ , format := range [ ] [ ] ConditionalFormatOptions {
2024-04-03 08:44:46 +08:00
{ { Type : "cell" , Format : intPtr ( 1 ) , Criteria : "greater than" , Value : "6" } } ,
{ { Type : "cell" , Format : intPtr ( 1 ) , Criteria : "between" , MinValue : "6" , MaxValue : "8" } } ,
{ { Type : "time_period" , Format : intPtr ( 1 ) , Criteria : "yesterday" } } ,
{ { Type : "time_period" , Format : intPtr ( 1 ) , Criteria : "today" } } ,
{ { Type : "time_period" , Format : intPtr ( 1 ) , Criteria : "tomorrow" } } ,
{ { Type : "time_period" , Format : intPtr ( 1 ) , Criteria : "last 7 days" } } ,
{ { Type : "time_period" , Format : intPtr ( 1 ) , Criteria : "last week" } } ,
{ { Type : "time_period" , Format : intPtr ( 1 ) , Criteria : "this week" } } ,
{ { Type : "time_period" , Format : intPtr ( 1 ) , Criteria : "continue week" } } ,
{ { Type : "time_period" , Format : intPtr ( 1 ) , Criteria : "last month" } } ,
{ { Type : "time_period" , Format : intPtr ( 1 ) , Criteria : "this month" } } ,
{ { Type : "time_period" , Format : intPtr ( 1 ) , Criteria : "continue month" } } ,
{ { Type : "text" , Format : intPtr ( 1 ) , Criteria : "containing" , Value : "~!@#$%^&*()_+{}|:<>?\"';" } } ,
{ { Type : "text" , Format : intPtr ( 1 ) , Criteria : "not containing" , Value : "text" } } ,
{ { Type : "text" , Format : intPtr ( 1 ) , Criteria : "begins with" , Value : "prefix" } } ,
{ { Type : "text" , Format : intPtr ( 1 ) , Criteria : "ends with" , Value : "suffix" } } ,
{ { Type : "top" , Format : intPtr ( 1 ) , Criteria : "=" , Value : "6" } } ,
{ { Type : "bottom" , Format : intPtr ( 1 ) , Criteria : "=" , Value : "6" } } ,
{ { Type : "average" , AboveAverage : true , Format : intPtr ( 1 ) , Criteria : "=" } } ,
{ { Type : "duplicate" , Format : intPtr ( 1 ) , Criteria : "=" } } ,
{ { Type : "unique" , Format : intPtr ( 1 ) , Criteria : "=" } } ,
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
{ { Type : "3_color_scale" , Criteria : "=" , MinType : "num" , MidType : "num" , MaxType : "num" , MinValue : "-10" , MidValue : "50" , MaxValue : "10" , MinColor : "#FF0000" , MidColor : "#00FF00" , MaxColor : "#0000FF" } } ,
{ { Type : "2_color_scale" , Criteria : "=" , MinType : "num" , MaxType : "num" , MinColor : "#FF0000" , MaxColor : "#0000FF" } } ,
2023-03-14 00:58:20 +08:00
{ { Type : "data_bar" , Criteria : "=" , MinType : "num" , MaxType : "num" , MinValue : "-10" , MaxValue : "10" , BarBorderColor : "#0000FF" , BarColor : "#638EC6" , BarOnly : true , BarSolid : true , StopIfTrue : true } } ,
2023-02-08 00:03:45 +08:00
{ { Type : "data_bar" , Criteria : "=" , MinType : "min" , MaxType : "max" , BarBorderColor : "#0000FF" , BarColor : "#638EC6" , BarDirection : "rightToLeft" , BarOnly : true , BarSolid : true , StopIfTrue : true } } ,
2024-04-03 08:44:46 +08:00
{ { Type : "formula" , Format : intPtr ( 1 ) , Criteria : "=" } } ,
{ { Type : "blanks" , Format : intPtr ( 1 ) } } ,
{ { Type : "no_blanks" , Format : intPtr ( 1 ) } } ,
{ { Type : "errors" , Format : intPtr ( 1 ) } } ,
{ { Type : "no_errors" , Format : intPtr ( 1 ) } } ,
2023-02-22 22:46:36 +08:00
{ { Type : "icon_set" , IconStyle : "3Arrows" , ReverseIcons : true , IconsOnly : true } } ,
2022-08-27 00:45:46 +08:00
} {
f := NewFile ( )
2024-01-21 00:05:28 +08:00
err := f . SetConditionalFormat ( "Sheet1" , "A2:A1,B:B,2:2" , format )
2022-08-27 00:45:46 +08:00
assert . NoError ( t , err )
This closes #1358, made a refactor with breaking changes, see details:
This made a refactor with breaking changes:
Motivation and Context
When I decided to add set horizontal centered support for this library to resolve #1358, the reason I made this huge breaking change was:
- There are too many exported types for set sheet view, properties, and format properties, although a function using the functional options pattern can be optimized by returning an anonymous function, these types or property set or get function has no binding categorization, so I change these functions like `SetAppProps` to accept a pointer of options structure.
- Users can not easily find out which properties should be in the `SetSheetPrOptions` or `SetSheetFormatPr` categories
- Nested properties cannot proceed modify easily
Introduce 5 new export data types:
`HeaderFooterOptions`, `PageLayoutMarginsOptions`, `PageLayoutOptions`, `SheetPropsOptions`, and `ViewOptions`
Rename 4 exported data types:
- Rename `PivotTableOption` to `PivotTableOptions`
- Rename `FormatHeaderFooter` to `HeaderFooterOptions`
- Rename `FormatSheetProtection` to `SheetProtectionOptions`
- Rename `SparklineOption` to `SparklineOptions`
Remove 54 exported types:
`AutoPageBreaks`, `BaseColWidth`, `BlackAndWhite`, `CodeName`, `CustomHeight`, `Date1904`, `DefaultColWidth`, `DefaultGridColor`, `DefaultRowHeight`, `EnableFormatConditionsCalculation`, `FilterPrivacy`, `FirstPageNumber`, `FitToHeight`, `FitToPage`, `FitToWidth`, `OutlineSummaryBelow`, `PageLayoutOption`, `PageLayoutOptionPtr`, `PageLayoutOrientation`, `PageLayoutPaperSize`, `PageLayoutScale`, `PageMarginBottom`, `PageMarginFooter`, `PageMarginHeader`, `PageMarginLeft`, `PageMarginRight`, `PageMarginsOptions`, `PageMarginsOptionsPtr`, `PageMarginTop`, `Published`, `RightToLeft`, `SheetFormatPrOptions`, `SheetFormatPrOptionsPtr`, `SheetPrOption`, `SheetPrOptionPtr`, `SheetViewOption`, `SheetViewOptionPtr`, `ShowFormulas`, `ShowGridLines`, `ShowRowColHeaders`, `ShowRuler`, `ShowZeros`, `TabColorIndexed`, `TabColorRGB`, `TabColorTheme`, `TabColorTint`, `ThickBottom`, `ThickTop`, `TopLeftCell`, `View`, `WorkbookPrOption`, `WorkbookPrOptionPtr`, `ZeroHeight` and `ZoomScale`
Remove 2 exported constants:
`OrientationPortrait` and `OrientationLandscape`
Change 8 functions:
- Change the `func (f *File) SetPageLayout(sheet string, opts ...PageLayoutOption) error` to `func (f *File) SetPageLayout(sheet string, opts *PageLayoutOptions) error`
- Change the `func (f *File) GetPageLayout(sheet string, opts ...PageLayoutOptionPtr) error` to `func (f *File) GetPageLayout(sheet string) (PageLayoutOptions, error)`
- Change the `func (f *File) SetPageMargins(sheet string, opts ...PageMarginsOptions) error` to `func (f *File) SetPageMargins(sheet string, opts *PageLayoutMarginsOptions) error`
- Change the `func (f *File) GetPageMargins(sheet string, opts ...PageMarginsOptionsPtr) error` to `func (f *File) GetPageMargins(sheet string) (PageLayoutMarginsOptions, error)`
- Change the `func (f *File) SetSheetViewOptions(sheet string, viewIndex int, opts ...SheetViewOption) error` to `func (f *File) SetSheetView(sheet string, viewIndex int, opts *ViewOptions) error`
- Change the `func (f *File) GetSheetViewOptions(sheet string, viewIndex int, opts ...SheetViewOptionPtr) error` to `func (f *File) GetSheetView(sheet string, viewIndex int) (ViewOptions, error)`
- Change the `func (f *File) SetWorkbookPrOptions(opts ...WorkbookPrOption) error` to `func (f *File) SetWorkbookProps(opts *WorkbookPropsOptions) error`
- Change the `func (f *File) GetWorkbookPrOptions(opts ...WorkbookPrOptionPtr) error` to `func (f *File) GetWorkbookProps() (WorkbookPropsOptions, error)`
Introduce new function to instead of existing functions:
- New function `func (f *File) SetSheetProps(sheet string, opts *SheetPropsOptions) error` instead of `func (f *File) SetSheetPrOptions(sheet string, opts ...SheetPrOption) error` and `func (f *File) SetSheetFormatPr(sheet string, opts ...SheetFormatPrOption
2022-09-29 22:00:21 +08:00
opts , err := f . GetConditionalFormats ( "Sheet1" )
2022-08-27 00:45:46 +08:00
assert . NoError ( t , err )
2024-01-21 00:05:28 +08:00
assert . Equal ( t , format , opts [ "A2:A1 B1:B1048576 A2:XFD2" ] )
2022-08-27 00:45:46 +08:00
}
2023-12-28 16:38:13 +08:00
// Test get multiple conditional formats
2022-08-27 00:45:46 +08:00
f := NewFile ( )
2023-12-28 16:38:13 +08:00
expected := [ ] ConditionalFormatOptions {
{ Type : "data_bar" , Criteria : "=" , MinType : "num" , MaxType : "num" , MinValue : "-10" , MaxValue : "10" , BarBorderColor : "#0000FF" , BarColor : "#638EC6" , BarOnly : true , BarSolid : true , StopIfTrue : true } ,
{ Type : "data_bar" , Criteria : "=" , MinType : "min" , MaxType : "max" , BarBorderColor : "#0000FF" , BarColor : "#638EC6" , BarDirection : "rightToLeft" , BarOnly : true , BarSolid : false , StopIfTrue : true } ,
}
err := f . SetConditionalFormat ( "Sheet1" , "A1:A2" , expected )
assert . NoError ( t , err )
opts , err := f . GetConditionalFormats ( "Sheet1" )
assert . NoError ( t , err )
assert . Equal ( t , expected , opts [ "A1:A2" ] )
// Test get conditional formats on no exists worksheet
f = NewFile ( )
_ , err = f . GetConditionalFormats ( "SheetN" )
2022-08-28 00:16:41 +08:00
assert . EqualError ( t , err , "sheet SheetN does not exist" )
This closes #1425, breaking changes for sheet name (#1426)
- Checking and return error for invalid sheet name instead of trim invalid characters
- Add error return for the 4 functions: `DeleteSheet`, `GetSheetIndex`, `GetSheetVisible` and `SetSheetName`
- Export new error 4 constants: `ErrSheetNameBlank`, `ErrSheetNameInvalid`, `ErrSheetNameLength` and `ErrSheetNameSingleQuote`
- Rename exported error constant `ErrExistsWorksheet` to `ErrExistsSheet`
- Update unit tests for 90 functions: `AddChart`, `AddChartSheet`, `AddComment`, `AddDataValidation`, `AddPicture`, `AddPictureFromBytes`, `AddPivotTable`, `AddShape`, `AddSparkline`, `AddTable`, `AutoFilter`, `CalcCellValue`, `Cols`, `DeleteChart`, `DeleteComment`, `DeleteDataValidation`, `DeletePicture`, `DeleteSheet`, `DuplicateRow`, `DuplicateRowTo`, `GetCellFormula`, `GetCellHyperLink`, `GetCellRichText`, `GetCellStyle`, `GetCellType`, `GetCellValue`, `GetColOutlineLevel`, `GetCols`, `GetColStyle`, `GetColVisible`, `GetColWidth`, `GetConditionalFormats`, `GetDataValidations`, `GetMergeCells`, `GetPageLayout`, `GetPageMargins`, `GetPicture`, `GetRowHeight`, `GetRowOutlineLevel`, `GetRows`, `GetRowVisible`, `GetSheetIndex`, `GetSheetProps`, `GetSheetVisible`, `GroupSheets`, `InsertCol`, `InsertPageBreak`, `InsertRows`, `MergeCell`, `NewSheet`, `NewStreamWriter`, `ProtectSheet`, `RemoveCol`, `RemovePageBreak`, `RemoveRow`, `Rows`, `SearchSheet`, `SetCellBool`, `SetCellDefault`, `SetCellFloat`, `SetCellFormula`, `SetCellHyperLink`, `SetCellInt`, `SetCellRichText`, `SetCellStr`, `SetCellStyle`, `SetCellValue`, `SetColOutlineLevel`, `SetColStyle`, `SetColVisible`, `SetColWidth`, `SetConditionalFormat`, `SetHeaderFooter`, `SetPageLayout`, `SetPageMargins`, `SetPanes`, `SetRowHeight`, `SetRowOutlineLevel`, `SetRowStyle`, `SetRowVisible`, `SetSheetBackground`, `SetSheetBackgroundFromBytes`, `SetSheetCol`, `SetSheetName`, `SetSheetProps`, `SetSheetRow`, `SetSheetVisible`, `UnmergeCell`, `UnprotectSheet` and
`UnsetConditionalFormat`
- Update documentation of the set style functions
Co-authored-by: guoweikuang <weikuang.guo@shopee.com>
2022-12-23 00:54:40 +08:00
// Test get conditional formats with invalid sheet name
_ , err = f . GetConditionalFormats ( "Sheet:1" )
2023-11-11 00:04:05 +08:00
assert . Equal ( t , ErrSheetNameInvalid , err )
2022-08-27 00:45:46 +08:00
}
2020-03-03 00:15:03 +08:00
func TestUnsetConditionalFormat ( t * testing . T ) {
f := NewFile ( )
assert . NoError ( t , f . SetCellValue ( "Sheet1" , "A1" , 7 ) )
assert . NoError ( t , f . UnsetConditionalFormat ( "Sheet1" , "A1:A10" ) )
2023-02-27 00:05:36 +08:00
format , err := f . NewConditionalStyle ( & Style { Font : & Font { Color : "9A0511" } , Fill : Fill { Type : "pattern" , Color : [ ] string { "FEC7CE" } , Pattern : 1 } } )
2020-03-03 00:15:03 +08:00
assert . NoError ( t , err )
2024-04-03 08:44:46 +08:00
assert . NoError ( t , f . SetConditionalFormat ( "Sheet1" , "A1:A10" , [ ] ConditionalFormatOptions { { Type : "cell" , Criteria : ">" , Format : & format , Value : "6" } } ) )
2020-03-03 00:15:03 +08:00
assert . NoError ( t , f . UnsetConditionalFormat ( "Sheet1" , "A1:A10" ) )
This closes #1425, breaking changes for sheet name (#1426)
- Checking and return error for invalid sheet name instead of trim invalid characters
- Add error return for the 4 functions: `DeleteSheet`, `GetSheetIndex`, `GetSheetVisible` and `SetSheetName`
- Export new error 4 constants: `ErrSheetNameBlank`, `ErrSheetNameInvalid`, `ErrSheetNameLength` and `ErrSheetNameSingleQuote`
- Rename exported error constant `ErrExistsWorksheet` to `ErrExistsSheet`
- Update unit tests for 90 functions: `AddChart`, `AddChartSheet`, `AddComment`, `AddDataValidation`, `AddPicture`, `AddPictureFromBytes`, `AddPivotTable`, `AddShape`, `AddSparkline`, `AddTable`, `AutoFilter`, `CalcCellValue`, `Cols`, `DeleteChart`, `DeleteComment`, `DeleteDataValidation`, `DeletePicture`, `DeleteSheet`, `DuplicateRow`, `DuplicateRowTo`, `GetCellFormula`, `GetCellHyperLink`, `GetCellRichText`, `GetCellStyle`, `GetCellType`, `GetCellValue`, `GetColOutlineLevel`, `GetCols`, `GetColStyle`, `GetColVisible`, `GetColWidth`, `GetConditionalFormats`, `GetDataValidations`, `GetMergeCells`, `GetPageLayout`, `GetPageMargins`, `GetPicture`, `GetRowHeight`, `GetRowOutlineLevel`, `GetRows`, `GetRowVisible`, `GetSheetIndex`, `GetSheetProps`, `GetSheetVisible`, `GroupSheets`, `InsertCol`, `InsertPageBreak`, `InsertRows`, `MergeCell`, `NewSheet`, `NewStreamWriter`, `ProtectSheet`, `RemoveCol`, `RemovePageBreak`, `RemoveRow`, `Rows`, `SearchSheet`, `SetCellBool`, `SetCellDefault`, `SetCellFloat`, `SetCellFormula`, `SetCellHyperLink`, `SetCellInt`, `SetCellRichText`, `SetCellStr`, `SetCellStyle`, `SetCellValue`, `SetColOutlineLevel`, `SetColStyle`, `SetColVisible`, `SetColWidth`, `SetConditionalFormat`, `SetHeaderFooter`, `SetPageLayout`, `SetPageMargins`, `SetPanes`, `SetRowHeight`, `SetRowOutlineLevel`, `SetRowStyle`, `SetRowVisible`, `SetSheetBackground`, `SetSheetBackgroundFromBytes`, `SetSheetCol`, `SetSheetName`, `SetSheetProps`, `SetSheetRow`, `SetSheetVisible`, `UnmergeCell`, `UnprotectSheet` and
`UnsetConditionalFormat`
- Update documentation of the set style functions
Co-authored-by: guoweikuang <weikuang.guo@shopee.com>
2022-12-23 00:54:40 +08:00
// Test unset conditional format on not exists worksheet
2022-08-28 00:16:41 +08:00
assert . EqualError ( t , f . UnsetConditionalFormat ( "SheetN" , "A1:A10" ) , "sheet SheetN does not exist" )
This closes #1425, breaking changes for sheet name (#1426)
- Checking and return error for invalid sheet name instead of trim invalid characters
- Add error return for the 4 functions: `DeleteSheet`, `GetSheetIndex`, `GetSheetVisible` and `SetSheetName`
- Export new error 4 constants: `ErrSheetNameBlank`, `ErrSheetNameInvalid`, `ErrSheetNameLength` and `ErrSheetNameSingleQuote`
- Rename exported error constant `ErrExistsWorksheet` to `ErrExistsSheet`
- Update unit tests for 90 functions: `AddChart`, `AddChartSheet`, `AddComment`, `AddDataValidation`, `AddPicture`, `AddPictureFromBytes`, `AddPivotTable`, `AddShape`, `AddSparkline`, `AddTable`, `AutoFilter`, `CalcCellValue`, `Cols`, `DeleteChart`, `DeleteComment`, `DeleteDataValidation`, `DeletePicture`, `DeleteSheet`, `DuplicateRow`, `DuplicateRowTo`, `GetCellFormula`, `GetCellHyperLink`, `GetCellRichText`, `GetCellStyle`, `GetCellType`, `GetCellValue`, `GetColOutlineLevel`, `GetCols`, `GetColStyle`, `GetColVisible`, `GetColWidth`, `GetConditionalFormats`, `GetDataValidations`, `GetMergeCells`, `GetPageLayout`, `GetPageMargins`, `GetPicture`, `GetRowHeight`, `GetRowOutlineLevel`, `GetRows`, `GetRowVisible`, `GetSheetIndex`, `GetSheetProps`, `GetSheetVisible`, `GroupSheets`, `InsertCol`, `InsertPageBreak`, `InsertRows`, `MergeCell`, `NewSheet`, `NewStreamWriter`, `ProtectSheet`, `RemoveCol`, `RemovePageBreak`, `RemoveRow`, `Rows`, `SearchSheet`, `SetCellBool`, `SetCellDefault`, `SetCellFloat`, `SetCellFormula`, `SetCellHyperLink`, `SetCellInt`, `SetCellRichText`, `SetCellStr`, `SetCellStyle`, `SetCellValue`, `SetColOutlineLevel`, `SetColStyle`, `SetColVisible`, `SetColWidth`, `SetConditionalFormat`, `SetHeaderFooter`, `SetPageLayout`, `SetPageMargins`, `SetPanes`, `SetRowHeight`, `SetRowOutlineLevel`, `SetRowStyle`, `SetRowVisible`, `SetSheetBackground`, `SetSheetBackgroundFromBytes`, `SetSheetCol`, `SetSheetName`, `SetSheetProps`, `SetSheetRow`, `SetSheetVisible`, `UnmergeCell`, `UnprotectSheet` and
`UnsetConditionalFormat`
- Update documentation of the set style functions
Co-authored-by: guoweikuang <weikuang.guo@shopee.com>
2022-12-23 00:54:40 +08:00
// Test unset conditional format with invalid sheet name
2023-11-11 00:04:05 +08:00
assert . Equal ( t , ErrSheetNameInvalid , f . UnsetConditionalFormat ( "Sheet:1" , "A1:A10" ) )
This closes #1425, breaking changes for sheet name (#1426)
- Checking and return error for invalid sheet name instead of trim invalid characters
- Add error return for the 4 functions: `DeleteSheet`, `GetSheetIndex`, `GetSheetVisible` and `SetSheetName`
- Export new error 4 constants: `ErrSheetNameBlank`, `ErrSheetNameInvalid`, `ErrSheetNameLength` and `ErrSheetNameSingleQuote`
- Rename exported error constant `ErrExistsWorksheet` to `ErrExistsSheet`
- Update unit tests for 90 functions: `AddChart`, `AddChartSheet`, `AddComment`, `AddDataValidation`, `AddPicture`, `AddPictureFromBytes`, `AddPivotTable`, `AddShape`, `AddSparkline`, `AddTable`, `AutoFilter`, `CalcCellValue`, `Cols`, `DeleteChart`, `DeleteComment`, `DeleteDataValidation`, `DeletePicture`, `DeleteSheet`, `DuplicateRow`, `DuplicateRowTo`, `GetCellFormula`, `GetCellHyperLink`, `GetCellRichText`, `GetCellStyle`, `GetCellType`, `GetCellValue`, `GetColOutlineLevel`, `GetCols`, `GetColStyle`, `GetColVisible`, `GetColWidth`, `GetConditionalFormats`, `GetDataValidations`, `GetMergeCells`, `GetPageLayout`, `GetPageMargins`, `GetPicture`, `GetRowHeight`, `GetRowOutlineLevel`, `GetRows`, `GetRowVisible`, `GetSheetIndex`, `GetSheetProps`, `GetSheetVisible`, `GroupSheets`, `InsertCol`, `InsertPageBreak`, `InsertRows`, `MergeCell`, `NewSheet`, `NewStreamWriter`, `ProtectSheet`, `RemoveCol`, `RemovePageBreak`, `RemoveRow`, `Rows`, `SearchSheet`, `SetCellBool`, `SetCellDefault`, `SetCellFloat`, `SetCellFormula`, `SetCellHyperLink`, `SetCellInt`, `SetCellRichText`, `SetCellStr`, `SetCellStyle`, `SetCellValue`, `SetColOutlineLevel`, `SetColStyle`, `SetColVisible`, `SetColWidth`, `SetConditionalFormat`, `SetHeaderFooter`, `SetPageLayout`, `SetPageMargins`, `SetPanes`, `SetRowHeight`, `SetRowOutlineLevel`, `SetRowStyle`, `SetRowVisible`, `SetSheetBackground`, `SetSheetBackgroundFromBytes`, `SetSheetCol`, `SetSheetName`, `SetSheetProps`, `SetSheetRow`, `SetSheetVisible`, `UnmergeCell`, `UnprotectSheet` and
`UnsetConditionalFormat`
- Update documentation of the set style functions
Co-authored-by: guoweikuang <weikuang.guo@shopee.com>
2022-12-23 00:54:40 +08:00
// Save spreadsheet by the given path
2020-03-03 00:15:03 +08:00
assert . NoError ( t , f . SaveAs ( filepath . Join ( "test" , "TestUnsetConditionalFormat.xlsx" ) ) )
}
2019-04-26 00:24:25 +08:00
func TestNewStyle ( t * testing . T ) {
f := NewFile ( )
2023-02-01 00:11:08 +08:00
for i := 0 ; i < 18 ; i ++ {
_ , err := f . NewStyle ( & Style {
2023-02-27 00:05:36 +08:00
Fill : Fill { Type : "gradient" , Color : [ ] string { "FFFFFF" , "4E71BE" } , Shading : i } ,
2023-02-01 00:11:08 +08:00
} )
assert . NoError ( t , err )
}
f = NewFile ( )
2023-02-27 00:05:36 +08:00
styleID , err := f . NewStyle ( & Style { Font : & Font { Bold : true , Italic : true , Family : "Times New Roman" , Size : 36 , Color : "777777" } } )
2019-12-29 16:02:31 +08:00
assert . NoError ( t , err )
2022-11-12 00:02:11 +08:00
styles , err := f . stylesReader ( )
assert . NoError ( t , err )
2019-04-26 00:24:25 +08:00
fontID := styles . CellXfs . Xf [ styleID ] . FontID
2020-05-10 16:56:08 +08:00
font := styles . Fonts . Font [ * fontID ]
2019-12-23 00:07:40 +08:00
assert . Contains ( t , * font . Name . Val , "Times New Roman" , "Stored font should contain font name" )
2019-04-26 00:24:25 +08:00
assert . Equal ( t , 2 , styles . CellXfs . Count , "Should have 2 styles" )
2020-03-10 00:04:23 +08:00
_ , err = f . NewStyle ( & Style { } )
assert . NoError ( t , err )
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
_ , err = f . NewStyle ( nil )
assert . NoError ( t , err )
2020-10-04 21:07:39 +08:00
2024-02-24 09:11:31 +08:00
// Test gradient fills
f = NewFile ( )
styleID1 , err := f . NewStyle ( & Style { Fill : Fill { Type : "gradient" , Color : [ ] string { "FFFFFF" , "4E71BE" } , Shading : 1 , Pattern : 1 } } )
assert . NoError ( t , err )
styleID2 , err := f . NewStyle ( & Style { Fill : Fill { Type : "gradient" , Color : [ ] string { "FF0000" , "4E71BE" } , Shading : 1 , Pattern : 1 } } )
assert . NoError ( t , err )
assert . NotEqual ( t , styleID1 , styleID2 )
2021-09-28 22:02:31 +08:00
var exp string
2024-02-24 09:11:31 +08:00
f = NewFile ( )
2021-09-28 22:02:31 +08:00
_ , err = f . NewStyle ( & Style { CustomNumFmt : & exp } )
2023-09-28 08:53:54 +08:00
assert . Equal ( t , ErrCustomNumFmt , err )
2020-09-18 22:20:58 +08:00
_ , err = f . NewStyle ( & Style { Font : & Font { Family : strings . Repeat ( "s" , MaxFontFamilyLength + 1 ) } } )
2023-09-28 08:53:54 +08:00
assert . Equal ( t , ErrFontLength , err )
2020-09-18 22:20:58 +08:00
_ , err = f . NewStyle ( & Style { Font : & Font { Size : MaxFontSize + 1 } } )
2023-09-28 08:53:54 +08:00
assert . Equal ( t , ErrFontSize , err )
2020-10-04 21:07:39 +08:00
This closes #1425, breaking changes for sheet name (#1426)
- Checking and return error for invalid sheet name instead of trim invalid characters
- Add error return for the 4 functions: `DeleteSheet`, `GetSheetIndex`, `GetSheetVisible` and `SetSheetName`
- Export new error 4 constants: `ErrSheetNameBlank`, `ErrSheetNameInvalid`, `ErrSheetNameLength` and `ErrSheetNameSingleQuote`
- Rename exported error constant `ErrExistsWorksheet` to `ErrExistsSheet`
- Update unit tests for 90 functions: `AddChart`, `AddChartSheet`, `AddComment`, `AddDataValidation`, `AddPicture`, `AddPictureFromBytes`, `AddPivotTable`, `AddShape`, `AddSparkline`, `AddTable`, `AutoFilter`, `CalcCellValue`, `Cols`, `DeleteChart`, `DeleteComment`, `DeleteDataValidation`, `DeletePicture`, `DeleteSheet`, `DuplicateRow`, `DuplicateRowTo`, `GetCellFormula`, `GetCellHyperLink`, `GetCellRichText`, `GetCellStyle`, `GetCellType`, `GetCellValue`, `GetColOutlineLevel`, `GetCols`, `GetColStyle`, `GetColVisible`, `GetColWidth`, `GetConditionalFormats`, `GetDataValidations`, `GetMergeCells`, `GetPageLayout`, `GetPageMargins`, `GetPicture`, `GetRowHeight`, `GetRowOutlineLevel`, `GetRows`, `GetRowVisible`, `GetSheetIndex`, `GetSheetProps`, `GetSheetVisible`, `GroupSheets`, `InsertCol`, `InsertPageBreak`, `InsertRows`, `MergeCell`, `NewSheet`, `NewStreamWriter`, `ProtectSheet`, `RemoveCol`, `RemovePageBreak`, `RemoveRow`, `Rows`, `SearchSheet`, `SetCellBool`, `SetCellDefault`, `SetCellFloat`, `SetCellFormula`, `SetCellHyperLink`, `SetCellInt`, `SetCellRichText`, `SetCellStr`, `SetCellStyle`, `SetCellValue`, `SetColOutlineLevel`, `SetColStyle`, `SetColVisible`, `SetColWidth`, `SetConditionalFormat`, `SetHeaderFooter`, `SetPageLayout`, `SetPageMargins`, `SetPanes`, `SetRowHeight`, `SetRowOutlineLevel`, `SetRowStyle`, `SetRowVisible`, `SetSheetBackground`, `SetSheetBackgroundFromBytes`, `SetSheetCol`, `SetSheetName`, `SetSheetProps`, `SetSheetRow`, `SetSheetVisible`, `UnmergeCell`, `UnprotectSheet` and
`UnsetConditionalFormat`
- Update documentation of the set style functions
Co-authored-by: guoweikuang <weikuang.guo@shopee.com>
2022-12-23 00:54:40 +08:00
// Test create numeric custom style
2022-03-24 00:19:30 +08:00
numFmt := "####;####"
2020-10-04 21:07:39 +08:00
f . Styles . NumFmts = nil
styleID , err = f . NewStyle ( & Style {
2022-03-24 00:19:30 +08:00
CustomNumFmt : & numFmt ,
2020-10-04 21:07:39 +08:00
} )
assert . NoError ( t , err )
2024-02-24 09:11:31 +08:00
assert . Equal ( t , 1 , styleID )
2020-10-04 21:07:39 +08:00
assert . NotNil ( t , f . Styles )
assert . NotNil ( t , f . Styles . CellXfs )
assert . NotNil ( t , f . Styles . CellXfs . Xf )
nf := f . Styles . CellXfs . Xf [ styleID ]
assert . Equal ( t , 164 , * nf . NumFmtID )
This closes #1425, breaking changes for sheet name (#1426)
- Checking and return error for invalid sheet name instead of trim invalid characters
- Add error return for the 4 functions: `DeleteSheet`, `GetSheetIndex`, `GetSheetVisible` and `SetSheetName`
- Export new error 4 constants: `ErrSheetNameBlank`, `ErrSheetNameInvalid`, `ErrSheetNameLength` and `ErrSheetNameSingleQuote`
- Rename exported error constant `ErrExistsWorksheet` to `ErrExistsSheet`
- Update unit tests for 90 functions: `AddChart`, `AddChartSheet`, `AddComment`, `AddDataValidation`, `AddPicture`, `AddPictureFromBytes`, `AddPivotTable`, `AddShape`, `AddSparkline`, `AddTable`, `AutoFilter`, `CalcCellValue`, `Cols`, `DeleteChart`, `DeleteComment`, `DeleteDataValidation`, `DeletePicture`, `DeleteSheet`, `DuplicateRow`, `DuplicateRowTo`, `GetCellFormula`, `GetCellHyperLink`, `GetCellRichText`, `GetCellStyle`, `GetCellType`, `GetCellValue`, `GetColOutlineLevel`, `GetCols`, `GetColStyle`, `GetColVisible`, `GetColWidth`, `GetConditionalFormats`, `GetDataValidations`, `GetMergeCells`, `GetPageLayout`, `GetPageMargins`, `GetPicture`, `GetRowHeight`, `GetRowOutlineLevel`, `GetRows`, `GetRowVisible`, `GetSheetIndex`, `GetSheetProps`, `GetSheetVisible`, `GroupSheets`, `InsertCol`, `InsertPageBreak`, `InsertRows`, `MergeCell`, `NewSheet`, `NewStreamWriter`, `ProtectSheet`, `RemoveCol`, `RemovePageBreak`, `RemoveRow`, `Rows`, `SearchSheet`, `SetCellBool`, `SetCellDefault`, `SetCellFloat`, `SetCellFormula`, `SetCellHyperLink`, `SetCellInt`, `SetCellRichText`, `SetCellStr`, `SetCellStyle`, `SetCellValue`, `SetColOutlineLevel`, `SetColStyle`, `SetColVisible`, `SetColWidth`, `SetConditionalFormat`, `SetHeaderFooter`, `SetPageLayout`, `SetPageMargins`, `SetPanes`, `SetRowHeight`, `SetRowOutlineLevel`, `SetRowStyle`, `SetRowVisible`, `SetSheetBackground`, `SetSheetBackgroundFromBytes`, `SetSheetCol`, `SetSheetName`, `SetSheetProps`, `SetSheetRow`, `SetSheetVisible`, `UnmergeCell`, `UnprotectSheet` and
`UnsetConditionalFormat`
- Update documentation of the set style functions
Co-authored-by: guoweikuang <weikuang.guo@shopee.com>
2022-12-23 00:54:40 +08:00
// Test create currency custom style
2020-10-04 21:07:39 +08:00
f . Styles . NumFmts = nil
styleID , err = f . NewStyle ( & Style {
NumFmt : 32 , // must not be in currencyNumFmt
} )
assert . NoError ( t , err )
2024-02-24 09:11:31 +08:00
assert . Equal ( t , 2 , styleID )
2020-10-04 21:07:39 +08:00
assert . NotNil ( t , f . Styles )
assert . NotNil ( t , f . Styles . CellXfs )
assert . NotNil ( t , f . Styles . CellXfs . Xf )
nf = f . Styles . CellXfs . Xf [ styleID ]
assert . Equal ( t , 32 , * nf . NumFmtID )
2021-09-28 22:02:31 +08:00
This closes #1425, breaking changes for sheet name (#1426)
- Checking and return error for invalid sheet name instead of trim invalid characters
- Add error return for the 4 functions: `DeleteSheet`, `GetSheetIndex`, `GetSheetVisible` and `SetSheetName`
- Export new error 4 constants: `ErrSheetNameBlank`, `ErrSheetNameInvalid`, `ErrSheetNameLength` and `ErrSheetNameSingleQuote`
- Rename exported error constant `ErrExistsWorksheet` to `ErrExistsSheet`
- Update unit tests for 90 functions: `AddChart`, `AddChartSheet`, `AddComment`, `AddDataValidation`, `AddPicture`, `AddPictureFromBytes`, `AddPivotTable`, `AddShape`, `AddSparkline`, `AddTable`, `AutoFilter`, `CalcCellValue`, `Cols`, `DeleteChart`, `DeleteComment`, `DeleteDataValidation`, `DeletePicture`, `DeleteSheet`, `DuplicateRow`, `DuplicateRowTo`, `GetCellFormula`, `GetCellHyperLink`, `GetCellRichText`, `GetCellStyle`, `GetCellType`, `GetCellValue`, `GetColOutlineLevel`, `GetCols`, `GetColStyle`, `GetColVisible`, `GetColWidth`, `GetConditionalFormats`, `GetDataValidations`, `GetMergeCells`, `GetPageLayout`, `GetPageMargins`, `GetPicture`, `GetRowHeight`, `GetRowOutlineLevel`, `GetRows`, `GetRowVisible`, `GetSheetIndex`, `GetSheetProps`, `GetSheetVisible`, `GroupSheets`, `InsertCol`, `InsertPageBreak`, `InsertRows`, `MergeCell`, `NewSheet`, `NewStreamWriter`, `ProtectSheet`, `RemoveCol`, `RemovePageBreak`, `RemoveRow`, `Rows`, `SearchSheet`, `SetCellBool`, `SetCellDefault`, `SetCellFloat`, `SetCellFormula`, `SetCellHyperLink`, `SetCellInt`, `SetCellRichText`, `SetCellStr`, `SetCellStyle`, `SetCellValue`, `SetColOutlineLevel`, `SetColStyle`, `SetColVisible`, `SetColWidth`, `SetConditionalFormat`, `SetHeaderFooter`, `SetPageLayout`, `SetPageMargins`, `SetPanes`, `SetRowHeight`, `SetRowOutlineLevel`, `SetRowStyle`, `SetRowVisible`, `SetSheetBackground`, `SetSheetBackgroundFromBytes`, `SetSheetCol`, `SetSheetName`, `SetSheetProps`, `SetSheetRow`, `SetSheetVisible`, `UnmergeCell`, `UnprotectSheet` and
`UnsetConditionalFormat`
- Update documentation of the set style functions
Co-authored-by: guoweikuang <weikuang.guo@shopee.com>
2022-12-23 00:54:40 +08:00
// Test set build-in scientific number format
2021-09-28 22:02:31 +08:00
styleID , err = f . NewStyle ( & Style { NumFmt : 11 } )
assert . NoError ( t , err )
assert . NoError ( t , f . SetCellStyle ( "Sheet1" , "A1" , "B1" , styleID ) )
assert . NoError ( t , f . SetSheetRow ( "Sheet1" , "A1" , & [ ] float64 { 1.23 , 1.234 } ) )
rows , err := f . GetRows ( "Sheet1" )
assert . NoError ( t , err )
assert . Equal ( t , [ ] [ ] string { { "1.23E+00" , "1.23E+00" } } , rows )
2021-12-03 00:19:11 +08:00
f = NewFile ( )
This closes #1425, breaking changes for sheet name (#1426)
- Checking and return error for invalid sheet name instead of trim invalid characters
- Add error return for the 4 functions: `DeleteSheet`, `GetSheetIndex`, `GetSheetVisible` and `SetSheetName`
- Export new error 4 constants: `ErrSheetNameBlank`, `ErrSheetNameInvalid`, `ErrSheetNameLength` and `ErrSheetNameSingleQuote`
- Rename exported error constant `ErrExistsWorksheet` to `ErrExistsSheet`
- Update unit tests for 90 functions: `AddChart`, `AddChartSheet`, `AddComment`, `AddDataValidation`, `AddPicture`, `AddPictureFromBytes`, `AddPivotTable`, `AddShape`, `AddSparkline`, `AddTable`, `AutoFilter`, `CalcCellValue`, `Cols`, `DeleteChart`, `DeleteComment`, `DeleteDataValidation`, `DeletePicture`, `DeleteSheet`, `DuplicateRow`, `DuplicateRowTo`, `GetCellFormula`, `GetCellHyperLink`, `GetCellRichText`, `GetCellStyle`, `GetCellType`, `GetCellValue`, `GetColOutlineLevel`, `GetCols`, `GetColStyle`, `GetColVisible`, `GetColWidth`, `GetConditionalFormats`, `GetDataValidations`, `GetMergeCells`, `GetPageLayout`, `GetPageMargins`, `GetPicture`, `GetRowHeight`, `GetRowOutlineLevel`, `GetRows`, `GetRowVisible`, `GetSheetIndex`, `GetSheetProps`, `GetSheetVisible`, `GroupSheets`, `InsertCol`, `InsertPageBreak`, `InsertRows`, `MergeCell`, `NewSheet`, `NewStreamWriter`, `ProtectSheet`, `RemoveCol`, `RemovePageBreak`, `RemoveRow`, `Rows`, `SearchSheet`, `SetCellBool`, `SetCellDefault`, `SetCellFloat`, `SetCellFormula`, `SetCellHyperLink`, `SetCellInt`, `SetCellRichText`, `SetCellStr`, `SetCellStyle`, `SetCellValue`, `SetColOutlineLevel`, `SetColStyle`, `SetColVisible`, `SetColWidth`, `SetConditionalFormat`, `SetHeaderFooter`, `SetPageLayout`, `SetPageMargins`, `SetPanes`, `SetRowHeight`, `SetRowOutlineLevel`, `SetRowStyle`, `SetRowVisible`, `SetSheetBackground`, `SetSheetBackgroundFromBytes`, `SetSheetCol`, `SetSheetName`, `SetSheetProps`, `SetSheetRow`, `SetSheetVisible`, `UnmergeCell`, `UnprotectSheet` and
`UnsetConditionalFormat`
- Update documentation of the set style functions
Co-authored-by: guoweikuang <weikuang.guo@shopee.com>
2022-12-23 00:54:40 +08:00
// Test currency number format
2021-12-03 00:19:11 +08:00
customNumFmt := "[$$-409]#,##0.00"
style1 , err := f . NewStyle ( & Style { CustomNumFmt : & customNumFmt } )
assert . NoError ( t , err )
style2 , err := f . NewStyle ( & Style { NumFmt : 165 } )
assert . NoError ( t , err )
assert . Equal ( t , style1 , style2 )
style3 , err := f . NewStyle ( & Style { NumFmt : 166 } )
assert . NoError ( t , err )
assert . Equal ( t , 2 , style3 )
f = NewFile ( )
f . Styles . NumFmts = nil
f . Styles . CellXfs . Xf = nil
2023-05-11 09:08:38 +08:00
style4 , err := f . NewStyle ( & Style { NumFmt : 160 } )
2021-12-03 00:19:11 +08:00
assert . NoError ( t , err )
2022-04-28 15:33:25 +08:00
assert . Equal ( t , 0 , style4 )
2021-12-03 00:19:11 +08:00
f = NewFile ( )
f . Styles . NumFmts = nil
f . Styles . CellXfs . Xf = nil
2023-05-11 09:08:38 +08:00
style5 , err := f . NewStyle ( & Style { NumFmt : 160 } )
2021-12-03 00:19:11 +08:00
assert . NoError ( t , err )
2022-04-28 15:33:25 +08:00
assert . Equal ( t , 0 , style5 )
2022-11-12 00:02:11 +08:00
This closes #1425, breaking changes for sheet name (#1426)
- Checking and return error for invalid sheet name instead of trim invalid characters
- Add error return for the 4 functions: `DeleteSheet`, `GetSheetIndex`, `GetSheetVisible` and `SetSheetName`
- Export new error 4 constants: `ErrSheetNameBlank`, `ErrSheetNameInvalid`, `ErrSheetNameLength` and `ErrSheetNameSingleQuote`
- Rename exported error constant `ErrExistsWorksheet` to `ErrExistsSheet`
- Update unit tests for 90 functions: `AddChart`, `AddChartSheet`, `AddComment`, `AddDataValidation`, `AddPicture`, `AddPictureFromBytes`, `AddPivotTable`, `AddShape`, `AddSparkline`, `AddTable`, `AutoFilter`, `CalcCellValue`, `Cols`, `DeleteChart`, `DeleteComment`, `DeleteDataValidation`, `DeletePicture`, `DeleteSheet`, `DuplicateRow`, `DuplicateRowTo`, `GetCellFormula`, `GetCellHyperLink`, `GetCellRichText`, `GetCellStyle`, `GetCellType`, `GetCellValue`, `GetColOutlineLevel`, `GetCols`, `GetColStyle`, `GetColVisible`, `GetColWidth`, `GetConditionalFormats`, `GetDataValidations`, `GetMergeCells`, `GetPageLayout`, `GetPageMargins`, `GetPicture`, `GetRowHeight`, `GetRowOutlineLevel`, `GetRows`, `GetRowVisible`, `GetSheetIndex`, `GetSheetProps`, `GetSheetVisible`, `GroupSheets`, `InsertCol`, `InsertPageBreak`, `InsertRows`, `MergeCell`, `NewSheet`, `NewStreamWriter`, `ProtectSheet`, `RemoveCol`, `RemovePageBreak`, `RemoveRow`, `Rows`, `SearchSheet`, `SetCellBool`, `SetCellDefault`, `SetCellFloat`, `SetCellFormula`, `SetCellHyperLink`, `SetCellInt`, `SetCellRichText`, `SetCellStr`, `SetCellStyle`, `SetCellValue`, `SetColOutlineLevel`, `SetColStyle`, `SetColVisible`, `SetColWidth`, `SetConditionalFormat`, `SetHeaderFooter`, `SetPageLayout`, `SetPageMargins`, `SetPanes`, `SetRowHeight`, `SetRowOutlineLevel`, `SetRowStyle`, `SetRowVisible`, `SetSheetBackground`, `SetSheetBackgroundFromBytes`, `SetSheetCol`, `SetSheetName`, `SetSheetProps`, `SetSheetRow`, `SetSheetVisible`, `UnmergeCell`, `UnprotectSheet` and
`UnsetConditionalFormat`
- Update documentation of the set style functions
Co-authored-by: guoweikuang <weikuang.guo@shopee.com>
2022-12-23 00:54:40 +08:00
// Test create style with unsupported charset style sheet
2022-11-12 00:02:11 +08:00
f . Styles = nil
f . Pkg . Store ( defaultXMLPathStyles , MacintoshCyrillicCharset )
_ , err = f . NewStyle ( & Style { NumFmt : 165 } )
assert . EqualError ( t , err , "XML syntax error on line 1: invalid UTF-8" )
2023-02-02 22:02:32 +08:00
// Test create cell styles reach maximum
f = NewFile ( )
f . Styles . CellXfs . Xf = make ( [ ] xlsxXf , MaxCellStyles )
f . Styles . CellXfs . Count = MaxCellStyles
_ , err = f . NewStyle ( & Style { NumFmt : 0 } )
assert . Equal ( t , ErrCellStyles , err )
2022-11-12 00:02:11 +08:00
}
2023-10-17 08:52:34 +08:00
func TestConditionalStyle ( t * testing . T ) {
2022-11-12 00:02:11 +08:00
f := NewFile ( )
2023-10-17 08:52:34 +08:00
expected := & Style { Protection : & Protection { Hidden : true , Locked : true } }
idx , err := f . NewConditionalStyle ( expected )
2023-08-17 11:34:28 +08:00
assert . NoError ( t , err )
2023-10-17 08:52:34 +08:00
style , err := f . GetConditionalStyle ( idx )
assert . NoError ( t , err )
assert . Equal ( t , expected , style )
2023-08-17 11:34:28 +08:00
_ , err = f . NewConditionalStyle ( & Style { DecimalPlaces : intPtr ( 4 ) , NumFmt : 165 , NegRed : true } )
assert . NoError ( t , err )
_ , err = f . NewConditionalStyle ( & Style { DecimalPlaces : intPtr ( - 1 ) } )
assert . NoError ( t , err )
2023-10-17 08:52:34 +08:00
expected = & Style { NumFmt : 1 }
idx , err = f . NewConditionalStyle ( expected )
assert . NoError ( t , err )
style , err = f . GetConditionalStyle ( idx )
2023-08-17 11:34:28 +08:00
assert . NoError ( t , err )
2024-01-09 20:56:20 +08:00
assert . Equal ( t , expected . NumFmt , style . NumFmt )
assert . Zero ( t , * style . DecimalPlaces )
2023-08-17 11:34:28 +08:00
_ , err = f . NewConditionalStyle ( & Style { NumFmt : 27 } )
assert . NoError ( t , err )
numFmt := "general"
_ , err = f . NewConditionalStyle ( & Style { CustomNumFmt : & numFmt } )
assert . NoError ( t , err )
numFmt1 := "0.00"
_ , err = f . NewConditionalStyle ( & Style { CustomNumFmt : & numFmt1 } )
assert . NoError ( t , err )
This closes #1425, breaking changes for sheet name (#1426)
- Checking and return error for invalid sheet name instead of trim invalid characters
- Add error return for the 4 functions: `DeleteSheet`, `GetSheetIndex`, `GetSheetVisible` and `SetSheetName`
- Export new error 4 constants: `ErrSheetNameBlank`, `ErrSheetNameInvalid`, `ErrSheetNameLength` and `ErrSheetNameSingleQuote`
- Rename exported error constant `ErrExistsWorksheet` to `ErrExistsSheet`
- Update unit tests for 90 functions: `AddChart`, `AddChartSheet`, `AddComment`, `AddDataValidation`, `AddPicture`, `AddPictureFromBytes`, `AddPivotTable`, `AddShape`, `AddSparkline`, `AddTable`, `AutoFilter`, `CalcCellValue`, `Cols`, `DeleteChart`, `DeleteComment`, `DeleteDataValidation`, `DeletePicture`, `DeleteSheet`, `DuplicateRow`, `DuplicateRowTo`, `GetCellFormula`, `GetCellHyperLink`, `GetCellRichText`, `GetCellStyle`, `GetCellType`, `GetCellValue`, `GetColOutlineLevel`, `GetCols`, `GetColStyle`, `GetColVisible`, `GetColWidth`, `GetConditionalFormats`, `GetDataValidations`, `GetMergeCells`, `GetPageLayout`, `GetPageMargins`, `GetPicture`, `GetRowHeight`, `GetRowOutlineLevel`, `GetRows`, `GetRowVisible`, `GetSheetIndex`, `GetSheetProps`, `GetSheetVisible`, `GroupSheets`, `InsertCol`, `InsertPageBreak`, `InsertRows`, `MergeCell`, `NewSheet`, `NewStreamWriter`, `ProtectSheet`, `RemoveCol`, `RemovePageBreak`, `RemoveRow`, `Rows`, `SearchSheet`, `SetCellBool`, `SetCellDefault`, `SetCellFloat`, `SetCellFormula`, `SetCellHyperLink`, `SetCellInt`, `SetCellRichText`, `SetCellStr`, `SetCellStyle`, `SetCellValue`, `SetColOutlineLevel`, `SetColStyle`, `SetColVisible`, `SetColWidth`, `SetConditionalFormat`, `SetHeaderFooter`, `SetPageLayout`, `SetPageMargins`, `SetPanes`, `SetRowHeight`, `SetRowOutlineLevel`, `SetRowStyle`, `SetRowVisible`, `SetSheetBackground`, `SetSheetBackgroundFromBytes`, `SetSheetCol`, `SetSheetName`, `SetSheetProps`, `SetSheetRow`, `SetSheetVisible`, `UnmergeCell`, `UnprotectSheet` and
`UnsetConditionalFormat`
- Update documentation of the set style functions
Co-authored-by: guoweikuang <weikuang.guo@shopee.com>
2022-12-23 00:54:40 +08:00
// Test create conditional style with unsupported charset style sheet
2022-11-12 00:02:11 +08:00
f . Styles = nil
f . Pkg . Store ( defaultXMLPathStyles , MacintoshCyrillicCharset )
2023-08-17 11:34:28 +08:00
_ , err = f . NewConditionalStyle ( & Style { Font : & Font { Color : "9A0511" } , Fill : Fill { Type : "pattern" , Color : [ ] string { "FEC7CE" } , Pattern : 1 } } )
2022-11-12 00:02:11 +08:00
assert . EqualError ( t , err , "XML syntax error on line 1: invalid UTF-8" )
2023-10-17 08:52:34 +08:00
// Test get conditional style with invalid style index
_ , err = f . GetConditionalStyle ( 1 )
assert . Equal ( t , newInvalidStyleID ( 1 ) , err )
// Test get conditional style with unsupported charset style sheet
f . Styles = nil
f . Pkg . Store ( defaultXMLPathStyles , MacintoshCyrillicCharset )
_ , err = f . GetConditionalStyle ( 1 )
assert . EqualError ( t , err , "XML syntax error on line 1: invalid UTF-8" )
2023-10-20 00:04:31 +08:00
f = NewFile ( )
// Test get conditional style with background color and empty pattern type
idx , err = f . NewConditionalStyle ( & Style { Fill : Fill { Type : "pattern" , Color : [ ] string { "FEC7CE" } , Pattern : 1 } } )
assert . NoError ( t , err )
f . Styles . Dxfs . Dxfs [ 0 ] . Fill . PatternFill . PatternType = ""
f . Styles . Dxfs . Dxfs [ 0 ] . Fill . PatternFill . FgColor = nil
f . Styles . Dxfs . Dxfs [ 0 ] . Fill . PatternFill . BgColor = & xlsxColor { Theme : intPtr ( 6 ) }
style , err = f . GetConditionalStyle ( idx )
assert . NoError ( t , err )
assert . Equal ( t , "pattern" , style . Fill . Type )
assert . Equal ( t , [ ] string { "A5A5A5" } , style . Fill . Color )
2019-04-26 00:24:25 +08:00
}
func TestGetDefaultFont ( t * testing . T ) {
f := NewFile ( )
2022-11-12 00:02:11 +08:00
s , err := f . GetDefaultFont ( )
assert . NoError ( t , err )
2019-04-26 00:24:25 +08:00
assert . Equal ( t , s , "Calibri" , "Default font should be Calibri" )
This closes #1425, breaking changes for sheet name (#1426)
- Checking and return error for invalid sheet name instead of trim invalid characters
- Add error return for the 4 functions: `DeleteSheet`, `GetSheetIndex`, `GetSheetVisible` and `SetSheetName`
- Export new error 4 constants: `ErrSheetNameBlank`, `ErrSheetNameInvalid`, `ErrSheetNameLength` and `ErrSheetNameSingleQuote`
- Rename exported error constant `ErrExistsWorksheet` to `ErrExistsSheet`
- Update unit tests for 90 functions: `AddChart`, `AddChartSheet`, `AddComment`, `AddDataValidation`, `AddPicture`, `AddPictureFromBytes`, `AddPivotTable`, `AddShape`, `AddSparkline`, `AddTable`, `AutoFilter`, `CalcCellValue`, `Cols`, `DeleteChart`, `DeleteComment`, `DeleteDataValidation`, `DeletePicture`, `DeleteSheet`, `DuplicateRow`, `DuplicateRowTo`, `GetCellFormula`, `GetCellHyperLink`, `GetCellRichText`, `GetCellStyle`, `GetCellType`, `GetCellValue`, `GetColOutlineLevel`, `GetCols`, `GetColStyle`, `GetColVisible`, `GetColWidth`, `GetConditionalFormats`, `GetDataValidations`, `GetMergeCells`, `GetPageLayout`, `GetPageMargins`, `GetPicture`, `GetRowHeight`, `GetRowOutlineLevel`, `GetRows`, `GetRowVisible`, `GetSheetIndex`, `GetSheetProps`, `GetSheetVisible`, `GroupSheets`, `InsertCol`, `InsertPageBreak`, `InsertRows`, `MergeCell`, `NewSheet`, `NewStreamWriter`, `ProtectSheet`, `RemoveCol`, `RemovePageBreak`, `RemoveRow`, `Rows`, `SearchSheet`, `SetCellBool`, `SetCellDefault`, `SetCellFloat`, `SetCellFormula`, `SetCellHyperLink`, `SetCellInt`, `SetCellRichText`, `SetCellStr`, `SetCellStyle`, `SetCellValue`, `SetColOutlineLevel`, `SetColStyle`, `SetColVisible`, `SetColWidth`, `SetConditionalFormat`, `SetHeaderFooter`, `SetPageLayout`, `SetPageMargins`, `SetPanes`, `SetRowHeight`, `SetRowOutlineLevel`, `SetRowStyle`, `SetRowVisible`, `SetSheetBackground`, `SetSheetBackgroundFromBytes`, `SetSheetCol`, `SetSheetName`, `SetSheetProps`, `SetSheetRow`, `SetSheetVisible`, `UnmergeCell`, `UnprotectSheet` and
`UnsetConditionalFormat`
- Update documentation of the set style functions
Co-authored-by: guoweikuang <weikuang.guo@shopee.com>
2022-12-23 00:54:40 +08:00
// Test get default font with unsupported charset style sheet
2022-11-12 00:02:11 +08:00
f . Styles = nil
f . Pkg . Store ( defaultXMLPathStyles , MacintoshCyrillicCharset )
_ , err = f . GetDefaultFont ( )
assert . EqualError ( t , err , "XML syntax error on line 1: invalid UTF-8" )
2019-04-26 00:24:25 +08:00
}
func TestSetDefaultFont ( t * testing . T ) {
f := NewFile ( )
2022-11-12 00:02:11 +08:00
assert . NoError ( t , f . SetDefaultFont ( "Arial" ) )
styles , err := f . stylesReader ( )
assert . NoError ( t , err )
s , err := f . GetDefaultFont ( )
assert . NoError ( t , err )
2021-11-16 00:40:44 +08:00
assert . Equal ( t , s , "Arial" , "Default font should change to Arial" )
2019-04-26 00:24:25 +08:00
assert . Equal ( t , * styles . CellStyles . CellStyle [ 0 ] . CustomBuiltIn , true )
This closes #1425, breaking changes for sheet name (#1426)
- Checking and return error for invalid sheet name instead of trim invalid characters
- Add error return for the 4 functions: `DeleteSheet`, `GetSheetIndex`, `GetSheetVisible` and `SetSheetName`
- Export new error 4 constants: `ErrSheetNameBlank`, `ErrSheetNameInvalid`, `ErrSheetNameLength` and `ErrSheetNameSingleQuote`
- Rename exported error constant `ErrExistsWorksheet` to `ErrExistsSheet`
- Update unit tests for 90 functions: `AddChart`, `AddChartSheet`, `AddComment`, `AddDataValidation`, `AddPicture`, `AddPictureFromBytes`, `AddPivotTable`, `AddShape`, `AddSparkline`, `AddTable`, `AutoFilter`, `CalcCellValue`, `Cols`, `DeleteChart`, `DeleteComment`, `DeleteDataValidation`, `DeletePicture`, `DeleteSheet`, `DuplicateRow`, `DuplicateRowTo`, `GetCellFormula`, `GetCellHyperLink`, `GetCellRichText`, `GetCellStyle`, `GetCellType`, `GetCellValue`, `GetColOutlineLevel`, `GetCols`, `GetColStyle`, `GetColVisible`, `GetColWidth`, `GetConditionalFormats`, `GetDataValidations`, `GetMergeCells`, `GetPageLayout`, `GetPageMargins`, `GetPicture`, `GetRowHeight`, `GetRowOutlineLevel`, `GetRows`, `GetRowVisible`, `GetSheetIndex`, `GetSheetProps`, `GetSheetVisible`, `GroupSheets`, `InsertCol`, `InsertPageBreak`, `InsertRows`, `MergeCell`, `NewSheet`, `NewStreamWriter`, `ProtectSheet`, `RemoveCol`, `RemovePageBreak`, `RemoveRow`, `Rows`, `SearchSheet`, `SetCellBool`, `SetCellDefault`, `SetCellFloat`, `SetCellFormula`, `SetCellHyperLink`, `SetCellInt`, `SetCellRichText`, `SetCellStr`, `SetCellStyle`, `SetCellValue`, `SetColOutlineLevel`, `SetColStyle`, `SetColVisible`, `SetColWidth`, `SetConditionalFormat`, `SetHeaderFooter`, `SetPageLayout`, `SetPageMargins`, `SetPanes`, `SetRowHeight`, `SetRowOutlineLevel`, `SetRowStyle`, `SetRowVisible`, `SetSheetBackground`, `SetSheetBackgroundFromBytes`, `SetSheetCol`, `SetSheetName`, `SetSheetProps`, `SetSheetRow`, `SetSheetVisible`, `UnmergeCell`, `UnprotectSheet` and
`UnsetConditionalFormat`
- Update documentation of the set style functions
Co-authored-by: guoweikuang <weikuang.guo@shopee.com>
2022-12-23 00:54:40 +08:00
// Test set default font with unsupported charset style sheet
2022-11-12 00:02:11 +08:00
f . Styles = nil
f . Pkg . Store ( defaultXMLPathStyles , MacintoshCyrillicCharset )
assert . EqualError ( t , f . SetDefaultFont ( "Arial" ) , "XML syntax error on line 1: invalid UTF-8" )
2019-04-26 00:24:25 +08:00
}
2020-03-10 00:04:23 +08:00
func TestStylesReader ( t * testing . T ) {
f := NewFile ( )
This closes #1425, breaking changes for sheet name (#1426)
- Checking and return error for invalid sheet name instead of trim invalid characters
- Add error return for the 4 functions: `DeleteSheet`, `GetSheetIndex`, `GetSheetVisible` and `SetSheetName`
- Export new error 4 constants: `ErrSheetNameBlank`, `ErrSheetNameInvalid`, `ErrSheetNameLength` and `ErrSheetNameSingleQuote`
- Rename exported error constant `ErrExistsWorksheet` to `ErrExistsSheet`
- Update unit tests for 90 functions: `AddChart`, `AddChartSheet`, `AddComment`, `AddDataValidation`, `AddPicture`, `AddPictureFromBytes`, `AddPivotTable`, `AddShape`, `AddSparkline`, `AddTable`, `AutoFilter`, `CalcCellValue`, `Cols`, `DeleteChart`, `DeleteComment`, `DeleteDataValidation`, `DeletePicture`, `DeleteSheet`, `DuplicateRow`, `DuplicateRowTo`, `GetCellFormula`, `GetCellHyperLink`, `GetCellRichText`, `GetCellStyle`, `GetCellType`, `GetCellValue`, `GetColOutlineLevel`, `GetCols`, `GetColStyle`, `GetColVisible`, `GetColWidth`, `GetConditionalFormats`, `GetDataValidations`, `GetMergeCells`, `GetPageLayout`, `GetPageMargins`, `GetPicture`, `GetRowHeight`, `GetRowOutlineLevel`, `GetRows`, `GetRowVisible`, `GetSheetIndex`, `GetSheetProps`, `GetSheetVisible`, `GroupSheets`, `InsertCol`, `InsertPageBreak`, `InsertRows`, `MergeCell`, `NewSheet`, `NewStreamWriter`, `ProtectSheet`, `RemoveCol`, `RemovePageBreak`, `RemoveRow`, `Rows`, `SearchSheet`, `SetCellBool`, `SetCellDefault`, `SetCellFloat`, `SetCellFormula`, `SetCellHyperLink`, `SetCellInt`, `SetCellRichText`, `SetCellStr`, `SetCellStyle`, `SetCellValue`, `SetColOutlineLevel`, `SetColStyle`, `SetColVisible`, `SetColWidth`, `SetConditionalFormat`, `SetHeaderFooter`, `SetPageLayout`, `SetPageMargins`, `SetPanes`, `SetRowHeight`, `SetRowOutlineLevel`, `SetRowStyle`, `SetRowVisible`, `SetSheetBackground`, `SetSheetBackgroundFromBytes`, `SetSheetCol`, `SetSheetName`, `SetSheetProps`, `SetSheetRow`, `SetSheetVisible`, `UnmergeCell`, `UnprotectSheet` and
`UnsetConditionalFormat`
- Update documentation of the set style functions
Co-authored-by: guoweikuang <weikuang.guo@shopee.com>
2022-12-23 00:54:40 +08:00
// Test read styles with unsupported charset
2020-03-10 00:04:23 +08:00
f . Styles = nil
2021-12-27 23:34:14 +08:00
f . Pkg . Store ( defaultXMLPathStyles , MacintoshCyrillicCharset )
2022-11-12 00:02:11 +08:00
styles , err := f . stylesReader ( )
assert . EqualError ( t , err , "XML syntax error on line 1: invalid UTF-8" )
assert . EqualValues ( t , new ( xlsxStyleSheet ) , styles )
2020-03-10 00:04:23 +08:00
}
func TestThemeReader ( t * testing . T ) {
f := NewFile ( )
This closes #1425, breaking changes for sheet name (#1426)
- Checking and return error for invalid sheet name instead of trim invalid characters
- Add error return for the 4 functions: `DeleteSheet`, `GetSheetIndex`, `GetSheetVisible` and `SetSheetName`
- Export new error 4 constants: `ErrSheetNameBlank`, `ErrSheetNameInvalid`, `ErrSheetNameLength` and `ErrSheetNameSingleQuote`
- Rename exported error constant `ErrExistsWorksheet` to `ErrExistsSheet`
- Update unit tests for 90 functions: `AddChart`, `AddChartSheet`, `AddComment`, `AddDataValidation`, `AddPicture`, `AddPictureFromBytes`, `AddPivotTable`, `AddShape`, `AddSparkline`, `AddTable`, `AutoFilter`, `CalcCellValue`, `Cols`, `DeleteChart`, `DeleteComment`, `DeleteDataValidation`, `DeletePicture`, `DeleteSheet`, `DuplicateRow`, `DuplicateRowTo`, `GetCellFormula`, `GetCellHyperLink`, `GetCellRichText`, `GetCellStyle`, `GetCellType`, `GetCellValue`, `GetColOutlineLevel`, `GetCols`, `GetColStyle`, `GetColVisible`, `GetColWidth`, `GetConditionalFormats`, `GetDataValidations`, `GetMergeCells`, `GetPageLayout`, `GetPageMargins`, `GetPicture`, `GetRowHeight`, `GetRowOutlineLevel`, `GetRows`, `GetRowVisible`, `GetSheetIndex`, `GetSheetProps`, `GetSheetVisible`, `GroupSheets`, `InsertCol`, `InsertPageBreak`, `InsertRows`, `MergeCell`, `NewSheet`, `NewStreamWriter`, `ProtectSheet`, `RemoveCol`, `RemovePageBreak`, `RemoveRow`, `Rows`, `SearchSheet`, `SetCellBool`, `SetCellDefault`, `SetCellFloat`, `SetCellFormula`, `SetCellHyperLink`, `SetCellInt`, `SetCellRichText`, `SetCellStr`, `SetCellStyle`, `SetCellValue`, `SetColOutlineLevel`, `SetColStyle`, `SetColVisible`, `SetColWidth`, `SetConditionalFormat`, `SetHeaderFooter`, `SetPageLayout`, `SetPageMargins`, `SetPanes`, `SetRowHeight`, `SetRowOutlineLevel`, `SetRowStyle`, `SetRowVisible`, `SetSheetBackground`, `SetSheetBackgroundFromBytes`, `SetSheetCol`, `SetSheetName`, `SetSheetProps`, `SetSheetRow`, `SetSheetVisible`, `UnmergeCell`, `UnprotectSheet` and
`UnsetConditionalFormat`
- Update documentation of the set style functions
Co-authored-by: guoweikuang <weikuang.guo@shopee.com>
2022-12-23 00:54:40 +08:00
// Test read theme with unsupported charset
2022-10-28 00:31:55 +08:00
f . Pkg . Store ( defaultXMLPathTheme , MacintoshCyrillicCharset )
2022-11-13 00:40:04 +08:00
theme , err := f . themeReader ( )
assert . EqualError ( t , err , "XML syntax error on line 1: invalid UTF-8" )
2023-10-20 00:04:31 +08:00
assert . EqualValues ( t , & decodeTheme { } , theme )
2020-03-10 00:04:23 +08:00
}
func TestSetCellStyle ( t * testing . T ) {
f := NewFile ( )
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
// Test set cell style on not exists worksheet
2022-08-28 00:16:41 +08:00
assert . EqualError ( t , f . SetCellStyle ( "SheetN" , "A1" , "A2" , 1 ) , "sheet SheetN does not exist" )
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
// Test set cell style with invalid style ID
2023-11-11 00:04:05 +08:00
assert . Equal ( t , newInvalidStyleID ( - 1 ) , f . SetCellStyle ( "Sheet1" , "A1" , "A2" , - 1 ) )
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
// Test set cell style with not exists style ID
2023-11-11 00:04:05 +08:00
assert . Equal ( t , newInvalidStyleID ( 10 ) , f . SetCellStyle ( "Sheet1" , "A1" , "A2" , 10 ) )
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
// Test set cell style with unsupported charset style sheet
2022-11-12 00:02:11 +08:00
f . Styles = nil
f . Pkg . Store ( defaultXMLPathStyles , MacintoshCyrillicCharset )
assert . EqualError ( t , f . SetCellStyle ( "Sheet1" , "A1" , "A2" , 1 ) , "XML syntax error on line 1: invalid UTF-8" )
2020-03-10 00:04:23 +08:00
}
2020-05-24 20:20:22 +08:00
func TestGetStyleID ( t * testing . T ) {
2022-11-12 00:02:11 +08:00
f := NewFile ( )
styleID , err := f . getStyleID ( & xlsxStyleSheet { } , nil )
assert . NoError ( t , err )
assert . Equal ( t , - 1 , styleID )
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
// Test get style ID with unsupported charset style sheet
2022-11-12 00:02:11 +08:00
f . Styles = nil
f . Pkg . Store ( defaultXMLPathStyles , MacintoshCyrillicCharset )
_ , err = f . getStyleID ( & xlsxStyleSheet {
CellXfs : & xlsxCellXfs { } ,
Fonts : & xlsxFonts {
Font : [ ] * xlsxFont { { } } ,
} ,
} , & Style { NumFmt : 0 , Font : & Font { } } )
assert . EqualError ( t , err , "XML syntax error on line 1: invalid UTF-8" )
2020-05-24 20:20:22 +08:00
}
func TestGetFillID ( t * testing . T ) {
2022-11-12 00:02:11 +08:00
styles , err := NewFile ( ) . stylesReader ( )
assert . NoError ( t , err )
assert . Equal ( t , - 1 , getFillID ( styles , & Style { Fill : Fill { Type : "unknown" } } ) )
2020-05-24 20:20:22 +08:00
}
2020-10-04 21:07:39 +08:00
2020-10-23 00:01:52 +08:00
func TestThemeColor ( t * testing . T ) {
for _ , clr := range [ ] [ ] string {
{ "FF000000" , ThemeColor ( "000000" , - 0.1 ) } ,
{ "FF000000" , ThemeColor ( "000000" , 0 ) } ,
{ "FF33FF33" , ThemeColor ( "00FF00" , 0.2 ) } ,
{ "FFFFFFFF" , ThemeColor ( "000000" , 1 ) } ,
{ "FFFFFFFF" , ThemeColor ( strings . Repeat ( string ( rune ( math . MaxUint8 + 1 ) ) , 6 ) , 1 ) } ,
{ "FFFFFFFF" , ThemeColor ( strings . Repeat ( string ( rune ( - 1 ) ) , 6 ) , 1 ) } ,
} {
assert . Equal ( t , clr [ 0 ] , clr [ 1 ] )
}
2020-10-04 21:07:39 +08:00
}
2021-12-01 19:11:51 +08:00
func TestGetNumFmtID ( t * testing . T ) {
f := NewFile ( )
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
fs1 , err := parseFormatStyleSet ( & Style { Protection : & Protection { Hidden : false , Locked : false } , NumFmt : 10 } )
2021-12-01 19:11:51 +08:00
assert . NoError ( t , err )
id1 := getNumFmtID ( & xlsxStyleSheet { } , fs1 )
Breaking change: changed the function signature for 11 exported functions
* Change
`func (f *File) NewConditionalStyle(style string) (int, error)`
to
`func (f *File) NewConditionalStyle(style *Style) (int, error)`
* Change
`func (f *File) NewStyle(style interface{}) (int, error)`
to
`func (f *File) NewStyle(style *Style) (int, error)`
* Change
`func (f *File) AddChart(sheet, cell, opts string, combo ...string) error`
to
`func (f *File) AddChart(sheet, cell string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddChartSheet(sheet, opts string, combo ...string) error`
to
`func (f *File) AddChartSheet(sheet string, chart *ChartOptions, combo ...*ChartOptions) error`
* Change
`func (f *File) AddShape(sheet, cell, opts string) error`
to
`func (f *File) AddShape(sheet, cell string, opts *Shape) error`
* Change
`func (f *File) AddPictureFromBytes(sheet, cell, opts, name, extension string, file []byte) error`
to
`func (f *File) AddPictureFromBytes(sheet, cell, name, extension string, file []byte, opts *PictureOptions) error`
* Change
`func (f *File) AddTable(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AddTable(sheet, reference string, opts *TableOptions) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) AutoFilter(sheet, hCell, vCell, opts string) error`
to
`func (f *File) AutoFilter(sheet, reference string, opts *AutoFilterOptions) error`
* Change
`func (f *File) SetPanes(sheet, panes string) error`
to
`func (f *File) SetPanes(sheet string, panes *Panes) error`
* Change
`func (sw *StreamWriter) AddTable(hCell, vCell, opts string) error`
to
`func (sw *StreamWriter) AddTable(reference string, opts *TableOptions) error`
* Change
`func (f *File) SetConditionalFormat(sheet, reference, opts string) error`
to
`func (f *File) SetConditionalFormat(sheet, reference string, opts []ConditionalFormatOptions) error`
* Add exported types:
* AutoFilterListOptions
* AutoFilterOptions
* Chart
* ChartAxis
* ChartDimension
* ChartLegend
* ChartLine
* ChartMarker
* ChartPlotArea
* ChartSeries
* ChartTitle
* ConditionalFormatOptions
* PaneOptions
* Panes
* PictureOptions
* Shape
* ShapeColor
* ShapeLine
* ShapeParagraph
* TableOptions
* This added support for set sheet visible as very hidden
* Return error when missing required parameters for set defined name
* Update unit test and comments
2022-12-30 00:50:08 +08:00
fs2 , err := parseFormatStyleSet ( & Style { Protection : & Protection { Hidden : false , Locked : false } , NumFmt : 0 } )
2021-12-01 19:11:51 +08:00
assert . NoError ( t , err )
id2 := getNumFmtID ( & xlsxStyleSheet { } , fs2 )
assert . NotEqual ( t , id1 , id2 )
assert . NoError ( t , f . SaveAs ( filepath . Join ( "test" , "TestStyleNumFmt.xlsx" ) ) )
2021-12-03 00:19:11 +08:00
}
2023-08-24 23:51:07 +08:00
func TestGetThemeColor ( t * testing . T ) {
assert . Empty ( t , ( & File { } ) . getThemeColor ( & xlsxColor { } ) )
f := NewFile ( )
assert . Empty ( t , f . getThemeColor ( nil ) )
var theme int
assert . Equal ( t , "FFFFFF" , f . getThemeColor ( & xlsxColor { Theme : & theme } ) )
assert . Equal ( t , "FFFFFF" , f . getThemeColor ( & xlsxColor { RGB : "FFFFFF" } ) )
assert . Equal ( t , "FF8080" , f . getThemeColor ( & xlsxColor { Indexed : 2 , Tint : 0.5 } ) )
assert . Empty ( t , f . getThemeColor ( & xlsxColor { Indexed : len ( IndexedColorMapping ) , Tint : 0.5 } ) )
}
func TestGetStyle ( t * testing . T ) {
f := NewFile ( )
expected := & Style {
Border : [ ] Border {
{ Type : "left" , Color : "0000FF" , Style : 3 } ,
{ Type : "right" , Color : "FF0000" , Style : 6 } ,
{ Type : "top" , Color : "00FF00" , Style : 4 } ,
{ Type : "bottom" , Color : "FFFF00" , Style : 5 } ,
{ Type : "diagonalUp" , Color : "A020F0" , Style : 7 } ,
{ Type : "diagonalDown" , Color : "A020F0" , Style : 7 } ,
} ,
Fill : Fill { Type : "gradient" , Shading : 16 , Color : [ ] string { "0000FF" , "00FF00" } } ,
Font : & Font {
Bold : true , Italic : true , Underline : "single" , Family : "Arial" ,
Size : 8.5 , Strike : true , Color : "777777" , ColorIndexed : 1 , ColorTint : 0.1 ,
} ,
Alignment : & Alignment {
Horizontal : "center" ,
Indent : 1 ,
JustifyLastLine : true ,
ReadingOrder : 1 ,
RelativeIndent : 1 ,
ShrinkToFit : true ,
TextRotation : 180 ,
Vertical : "center" ,
WrapText : true ,
} ,
Protection : & Protection { Hidden : true , Locked : true } ,
NumFmt : 49 ,
}
styleID , err := f . NewStyle ( expected )
assert . NoError ( t , err )
style , err := f . GetStyle ( styleID )
assert . NoError ( t , err )
assert . Equal ( t , expected . Border , style . Border )
assert . Equal ( t , expected . Fill , style . Fill )
assert . Equal ( t , expected . Font , style . Font )
assert . Equal ( t , expected . Alignment , style . Alignment )
assert . Equal ( t , expected . Protection , style . Protection )
assert . Equal ( t , expected . NumFmt , style . NumFmt )
2024-01-09 20:56:20 +08:00
assert . Nil ( t , style . DecimalPlaces )
2023-08-24 23:51:07 +08:00
expected = & Style {
Fill : Fill { Type : "pattern" , Pattern : 1 , Color : [ ] string { "0000FF" } } ,
}
styleID , err = f . NewStyle ( expected )
assert . NoError ( t , err )
style , err = f . GetStyle ( styleID )
assert . NoError ( t , err )
assert . Equal ( t , expected . Fill , style . Fill )
2024-01-09 20:56:20 +08:00
assert . Nil ( t , style . DecimalPlaces )
expected = & Style { NumFmt : 2 }
styleID , err = f . NewStyle ( expected )
assert . NoError ( t , err )
style , err = f . GetStyle ( styleID )
assert . NoError ( t , err )
assert . Equal ( t , expected . NumFmt , style . NumFmt )
assert . Equal ( t , 2 , * style . DecimalPlaces )
2023-08-24 23:51:07 +08:00
expected = & Style { NumFmt : 27 }
styleID , err = f . NewStyle ( expected )
assert . NoError ( t , err )
style , err = f . GetStyle ( styleID )
assert . NoError ( t , err )
assert . Equal ( t , expected . NumFmt , style . NumFmt )
2024-01-09 20:56:20 +08:00
assert . Nil ( t , style . DecimalPlaces )
2023-08-24 23:51:07 +08:00
expected = & Style { NumFmt : 165 }
styleID , err = f . NewStyle ( expected )
assert . NoError ( t , err )
style , err = f . GetStyle ( styleID )
assert . NoError ( t , err )
assert . Equal ( t , expected . NumFmt , style . NumFmt )
2024-01-09 20:56:20 +08:00
assert . Equal ( t , 2 , * style . DecimalPlaces )
2023-08-24 23:51:07 +08:00
2024-01-09 20:56:20 +08:00
decimal := 4
expected = & Style { NumFmt : 165 , DecimalPlaces : & decimal , NegRed : true }
2023-08-24 23:51:07 +08:00
styleID , err = f . NewStyle ( expected )
assert . NoError ( t , err )
style , err = f . GetStyle ( styleID )
assert . NoError ( t , err )
2024-01-09 20:56:20 +08:00
assert . Equal ( t , 0 , style . NumFmt )
assert . Equal ( t , * expected . DecimalPlaces , * style . DecimalPlaces )
assert . Equal ( t , "[$$-409]#,##0.0000;[Red][$$-409]#,##0.0000" , * style . CustomNumFmt )
for _ , val := range [ ] [ ] interface { } {
{ "$#,##0" , 0 } ,
{ "$#,##0.0" , 1 } ,
{ "_($* #,##0_);_($* (#,##0);_($* \"-\"_);_(@_)" , 0 } ,
{ "_($* #,##000_);_($* (#,##000);_($* \"-\"_);_(@_)" , 0 } ,
{ "_($* #,##0.0000_);_($* (#,##0.0000);_($* \"-\"????_);_(@_)" , 4 } ,
} {
numFmtCode := val [ 0 ] . ( string )
expected = & Style { CustomNumFmt : & numFmtCode }
styleID , err = f . NewStyle ( expected )
assert . NoError ( t , err )
style , err = f . GetStyle ( styleID )
assert . NoError ( t , err )
assert . Equal ( t , val [ 1 ] . ( int ) , * style . DecimalPlaces , numFmtCode )
}
for _ , val := range [ ] string {
";$#,##0" ,
";$#,##0;" ,
";$#,##0.0" ,
";$#,##0.0;" ,
"$#,##0;0.0" ,
"_($* #,##0_);;_($* \"-\"_);_(@_)" ,
"_($* #,##0.0_);_($* (#,##0.00);_($* \"-\"_);_(@_)" ,
} {
expected = & Style { CustomNumFmt : & val }
styleID , err = f . NewStyle ( expected )
assert . NoError ( t , err )
style , err = f . GetStyle ( styleID )
assert . NoError ( t , err )
assert . Nil ( t , style . DecimalPlaces )
}
2023-08-24 23:51:07 +08:00
// Test get style with custom color index
f . Styles . Colors = & xlsxStyleColors {
2023-09-08 00:09:41 +08:00
IndexedColors : & xlsxIndexedColors {
2023-08-24 23:51:07 +08:00
RgbColor : [ ] xlsxColor { { RGB : "FF012345" } } ,
} ,
}
assert . Equal ( t , "012345" , f . getThemeColor ( & xlsxColor { Indexed : 0 } ) )
2023-11-03 00:12:43 +08:00
f . Styles . Fonts . Font [ 0 ] . U = & attrValString { }
f . Styles . CellXfs . Xf [ 0 ] . FontID = intPtr ( 0 )
style , err = f . GetStyle ( styleID )
assert . NoError ( t , err )
assert . Equal ( t , "single" , style . Font . Underline )
2023-08-24 23:51:07 +08:00
// Test get style with invalid style index
style , err = f . GetStyle ( - 1 )
assert . Nil ( t , style )
assert . Equal ( t , err , newInvalidStyleID ( - 1 ) )
// Test get style with unsupported charset style sheet
f . Styles = nil
f . Pkg . Store ( defaultXMLPathStyles , MacintoshCyrillicCharset )
style , err = f . GetStyle ( 1 )
assert . Nil ( t , style )
assert . EqualError ( t , err , "XML syntax error on line 1: invalid UTF-8" )
}