2018-07-25 22:40:08 +08:00
|
|
|
package excelize
|
|
|
|
|
|
|
|
import (
|
2020-03-03 00:15:03 +08:00
|
|
|
"fmt"
|
|
|
|
"path/filepath"
|
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
|
|
|
|
format string
|
|
|
|
expectFill bool
|
|
|
|
}{{
|
|
|
|
label: "no_fill",
|
|
|
|
format: `{"alignment":{"wrap_text":true}}`,
|
|
|
|
expectFill: false,
|
|
|
|
}, {
|
|
|
|
label: "fill",
|
|
|
|
format: `{"fill":{"type":"pattern","pattern":1,"color":["#000000"]}}`,
|
|
|
|
expectFill: true,
|
|
|
|
}}
|
|
|
|
|
|
|
|
for _, testCase := range cases {
|
|
|
|
xl := NewFile()
|
|
|
|
styleID, err := xl.NewStyle(testCase.format)
|
|
|
|
if err != nil {
|
2019-04-26 00:24:25 +08:00
|
|
|
t.Fatal(err)
|
2019-01-09 23:12:53 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
styles := xl.stylesReader()
|
|
|
|
style := styles.CellXfs.Xf[styleID]
|
|
|
|
if testCase.expectFill {
|
|
|
|
assert.NotEqual(t, style.FillID, 0, testCase.label)
|
|
|
|
} else {
|
|
|
|
assert.Equal(t, style.FillID, 0, testCase.label)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-25 22:40:08 +08:00
|
|
|
func TestSetConditionalFormat(t *testing.T) {
|
|
|
|
cases := []struct {
|
|
|
|
label string
|
|
|
|
format string
|
|
|
|
rules []*xlsxCfRule
|
|
|
|
}{{
|
|
|
|
label: "3_color_scale",
|
|
|
|
format: `[{
|
|
|
|
"type":"3_color_scale",
|
|
|
|
"criteria":"=",
|
|
|
|
"min_type":"num",
|
|
|
|
"mid_type":"num",
|
|
|
|
"max_type":"num",
|
|
|
|
"min_value": "-10",
|
|
|
|
"mid_value": "0",
|
|
|
|
"max_value": "10",
|
|
|
|
"min_color":"ff0000",
|
|
|
|
"mid_color":"00ff00",
|
|
|
|
"max_color":"0000ff"
|
|
|
|
}]`,
|
|
|
|
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",
|
|
|
|
format: `[{
|
|
|
|
"type":"3_color_scale",
|
|
|
|
"criteria":"=",
|
|
|
|
"min_type":"num",
|
|
|
|
"mid_type":"num",
|
|
|
|
"max_type":"num",
|
|
|
|
"min_color":"ff0000",
|
|
|
|
"mid_color":"00ff00",
|
|
|
|
"max_color":"0000ff"
|
|
|
|
}]`,
|
|
|
|
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",
|
|
|
|
format: `[{
|
|
|
|
"type":"2_color_scale",
|
|
|
|
"criteria":"=",
|
|
|
|
"min_type":"num",
|
|
|
|
"max_type":"num",
|
|
|
|
"min_color":"ff0000",
|
|
|
|
"max_color":"0000ff"
|
|
|
|
}]`,
|
|
|
|
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 {
|
|
|
|
xl := NewFile()
|
|
|
|
const sheet = "Sheet1"
|
|
|
|
const cellRange = "A1:A1"
|
|
|
|
|
|
|
|
err := xl.SetConditionalFormat(sheet, cellRange, testCase.format)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("%s", err)
|
|
|
|
}
|
|
|
|
|
2019-04-15 11:22:57 +08:00
|
|
|
xlsx, err := xl.workSheetReader(sheet)
|
|
|
|
assert.NoError(t, err)
|
2018-07-25 22:40:08 +08:00
|
|
|
cf := xlsx.ConditionalFormatting
|
|
|
|
assert.Len(t, cf, 1, testCase.label)
|
|
|
|
assert.Len(t, cf[0].CfRule, 1, testCase.label)
|
|
|
|
assert.Equal(t, cellRange, cf[0].SQRef, testCase.label)
|
|
|
|
assert.EqualValues(t, testCase.rules, cf[0].CfRule, testCase.label)
|
|
|
|
}
|
|
|
|
}
|
2019-04-26 00:24:25 +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"))
|
|
|
|
format, err := f.NewConditionalStyle(`{"font":{"color":"#9A0511"},"fill":{"type":"pattern","color":["#FEC7CE"],"pattern":1}}`)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NoError(t, f.SetConditionalFormat("Sheet1", "A1:A10", fmt.Sprintf(`[{"type":"cell","criteria":">","format":%d,"value":"6"}]`, format)))
|
|
|
|
assert.NoError(t, f.UnsetConditionalFormat("Sheet1", "A1:A10"))
|
|
|
|
// Test unset conditional format on not exists worksheet.
|
|
|
|
assert.EqualError(t, f.UnsetConditionalFormat("SheetN", "A1:A10"), "sheet SheetN is not exist")
|
|
|
|
// Save xlsx file by the given path.
|
|
|
|
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()
|
2019-08-21 23:03:34 +08:00
|
|
|
styleID, err := f.NewStyle(`{"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)
|
2019-04-26 00:24:25 +08:00
|
|
|
styles := f.stylesReader()
|
|
|
|
fontID := styles.CellXfs.Xf[styleID].FontID
|
|
|
|
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)
|
2020-04-06 00:23:27 +08:00
|
|
|
_, err = f.NewStyle(Style{})
|
|
|
|
assert.EqualError(t, err, "invalid parameter type")
|
2019-04-26 00:24:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestGetDefaultFont(t *testing.T) {
|
|
|
|
f := NewFile()
|
|
|
|
s := f.GetDefaultFont()
|
|
|
|
assert.Equal(t, s, "Calibri", "Default font should be Calibri")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSetDefaultFont(t *testing.T) {
|
|
|
|
f := NewFile()
|
|
|
|
f.SetDefaultFont("Ariel")
|
|
|
|
styles := f.stylesReader()
|
|
|
|
s := f.GetDefaultFont()
|
|
|
|
assert.Equal(t, s, "Ariel", "Default font should change to Ariel")
|
|
|
|
assert.Equal(t, *styles.CellStyles.CellStyle[0].CustomBuiltIn, true)
|
|
|
|
}
|
2020-03-10 00:04:23 +08:00
|
|
|
|
|
|
|
func TestStylesReader(t *testing.T) {
|
|
|
|
f := NewFile()
|
|
|
|
// Test read styles with unsupport charset.
|
|
|
|
f.Styles = nil
|
|
|
|
f.XLSX["xl/styles.xml"] = MacintoshCyrillicCharset
|
|
|
|
assert.EqualValues(t, new(xlsxStyleSheet), f.stylesReader())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestThemeReader(t *testing.T) {
|
|
|
|
f := NewFile()
|
|
|
|
// Test read theme with unsupport charset.
|
|
|
|
f.XLSX["xl/theme/theme1.xml"] = MacintoshCyrillicCharset
|
|
|
|
assert.EqualValues(t, new(xlsxTheme), f.themeReader())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSetCellStyle(t *testing.T) {
|
|
|
|
f := NewFile()
|
|
|
|
// Test set cell style on not exists worksheet.
|
|
|
|
assert.EqualError(t, f.SetCellStyle("SheetN", "A1", "A2", 1), "sheet SheetN is not exist")
|
|
|
|
}
|