Export 7 errors so users can act differently on different type of errors

pull/2/head
xuri 3 years ago
parent 3325c3946d
commit 44a13aa402
No known key found for this signature in database
GPG Key ID: BA5E5BB1C948EDF7

@ -17,7 +17,7 @@ func TestAdjustMergeCells(t *testing.T) {
}, },
}, },
}, },
}, rows, 0, 0), `cannot convert cell "A" to coordinates: invalid cell name "A"`) }, rows, 0, 0), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.EqualError(t, f.adjustMergeCells(&xlsxWorksheet{ assert.EqualError(t, f.adjustMergeCells(&xlsxWorksheet{
MergeCells: &xlsxMergeCells{ MergeCells: &xlsxMergeCells{
Cells: []*xlsxMergeCell{ Cells: []*xlsxMergeCell{
@ -26,7 +26,7 @@ func TestAdjustMergeCells(t *testing.T) {
}, },
}, },
}, },
}, rows, 0, 0), `cannot convert cell "B" to coordinates: invalid cell name "B"`) }, rows, 0, 0), newCellNameToCoordinatesError("B", newInvalidCellNameError("B")).Error())
assert.NoError(t, f.adjustMergeCells(&xlsxWorksheet{ assert.NoError(t, f.adjustMergeCells(&xlsxWorksheet{
MergeCells: &xlsxMergeCells{ MergeCells: &xlsxMergeCells{
Cells: []*xlsxMergeCell{ Cells: []*xlsxMergeCell{
@ -265,12 +265,12 @@ func TestAdjustAutoFilter(t *testing.T) {
AutoFilter: &xlsxAutoFilter{ AutoFilter: &xlsxAutoFilter{
Ref: "A:B1", Ref: "A:B1",
}, },
}, rows, 0, 0), `cannot convert cell "A" to coordinates: invalid cell name "A"`) }, rows, 0, 0), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.EqualError(t, f.adjustAutoFilter(&xlsxWorksheet{ assert.EqualError(t, f.adjustAutoFilter(&xlsxWorksheet{
AutoFilter: &xlsxAutoFilter{ AutoFilter: &xlsxAutoFilter{
Ref: "A1:B", Ref: "A1:B",
}, },
}, rows, 0, 0), `cannot convert cell "B" to coordinates: invalid cell name "B"`) }, rows, 0, 0), newCellNameToCoordinatesError("B", newInvalidCellNameError("B")).Error())
} }
func TestAdjustHelper(t *testing.T) { func TestAdjustHelper(t *testing.T) {
@ -281,8 +281,8 @@ func TestAdjustHelper(t *testing.T) {
f.Sheet.Store("xl/worksheets/sheet2.xml", &xlsxWorksheet{ f.Sheet.Store("xl/worksheets/sheet2.xml", &xlsxWorksheet{
AutoFilter: &xlsxAutoFilter{Ref: "A1:B"}}) AutoFilter: &xlsxAutoFilter{Ref: "A1:B"}})
// testing adjustHelper with illegal cell coordinates. // testing adjustHelper with illegal cell coordinates.
assert.EqualError(t, f.adjustHelper("Sheet1", rows, 0, 0), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.adjustHelper("Sheet1", rows, 0, 0), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.EqualError(t, f.adjustHelper("Sheet2", rows, 0, 0), `cannot convert cell "B" to coordinates: invalid cell name "B"`) assert.EqualError(t, f.adjustHelper("Sheet2", rows, 0, 0), newCellNameToCoordinatesError("B", newInvalidCellNameError("B")).Error())
// testing adjustHelper on not exists worksheet. // testing adjustHelper on not exists worksheet.
assert.EqualError(t, f.adjustHelper("SheetN", rows, 0, 0), "sheet SheetN is not exist") assert.EqualError(t, f.adjustHelper("SheetN", rows, 0, 0), "sheet SheetN is not exist")
} }
@ -298,7 +298,7 @@ func TestAdjustCalcChain(t *testing.T) {
assert.NoError(t, f.InsertRow("Sheet1", 1)) assert.NoError(t, f.InsertRow("Sheet1", 1))
f.CalcChain.C[1].R = "invalid coordinates" f.CalcChain.C[1].R = "invalid coordinates"
assert.EqualError(t, f.InsertCol("Sheet1", "A"), `cannot convert cell "invalid coordinates" to coordinates: invalid cell name "invalid coordinates"`) assert.EqualError(t, f.InsertCol("Sheet1", "A"), newCellNameToCoordinatesError("invalid coordinates", newInvalidCellNameError("invalid coordinates")).Error())
f.CalcChain = nil f.CalcChain = nil
assert.NoError(t, f.InsertCol("Sheet1", "A")) assert.NoError(t, f.InsertCol("Sheet1", "A"))
} }

@ -1857,7 +1857,7 @@ func TestCalcCellValue(t *testing.T) {
// ABS // ABS
"=ABS()": "ABS requires 1 numeric argument", "=ABS()": "ABS requires 1 numeric argument",
`=ABS("X")`: "strconv.ParseFloat: parsing \"X\": invalid syntax", `=ABS("X")`: "strconv.ParseFloat: parsing \"X\": invalid syntax",
"=ABS(~)": `invalid column name "~"`, "=ABS(~)": newInvalidColumnNameError("~").Error(),
// ACOS // ACOS
"=ACOS()": "ACOS requires 1 numeric argument", "=ACOS()": "ACOS requires 1 numeric argument",
`=ACOS("X")`: "strconv.ParseFloat: parsing \"X\": invalid syntax", `=ACOS("X")`: "strconv.ParseFloat: parsing \"X\": invalid syntax",
@ -2699,15 +2699,15 @@ func TestCalcCellValue(t *testing.T) {
// COLUMN // COLUMN
"=COLUMN(1,2)": "COLUMN requires at most 1 argument", "=COLUMN(1,2)": "COLUMN requires at most 1 argument",
"=COLUMN(\"\")": "invalid reference", "=COLUMN(\"\")": "invalid reference",
"=COLUMN(Sheet1)": "invalid column name \"Sheet1\"", "=COLUMN(Sheet1)": newInvalidColumnNameError("Sheet1").Error(),
"=COLUMN(Sheet1!A1!B1)": "invalid column name \"Sheet1\"", "=COLUMN(Sheet1!A1!B1)": newInvalidColumnNameError("Sheet1").Error(),
// COLUMNS // COLUMNS
"=COLUMNS()": "COLUMNS requires 1 argument", "=COLUMNS()": "COLUMNS requires 1 argument",
"=COLUMNS(1)": "invalid reference", "=COLUMNS(1)": "invalid reference",
"=COLUMNS(\"\")": "invalid reference", "=COLUMNS(\"\")": "invalid reference",
"=COLUMNS(Sheet1)": "invalid column name \"Sheet1\"", "=COLUMNS(Sheet1)": newInvalidColumnNameError("Sheet1").Error(),
"=COLUMNS(Sheet1!A1!B1)": "invalid column name \"Sheet1\"", "=COLUMNS(Sheet1!A1!B1)": newInvalidColumnNameError("Sheet1").Error(),
"=COLUMNS(Sheet1!Sheet1)": "invalid column name \"Sheet1\"", "=COLUMNS(Sheet1!Sheet1)": newInvalidColumnNameError("Sheet1").Error(),
// HLOOKUP // HLOOKUP
"=HLOOKUP()": "HLOOKUP requires at least 3 arguments", "=HLOOKUP()": "HLOOKUP requires at least 3 arguments",
"=HLOOKUP(D2,D1,1,FALSE)": "HLOOKUP requires second argument of table array", "=HLOOKUP(D2,D1,1,FALSE)": "HLOOKUP requires second argument of table array",
@ -2751,15 +2751,15 @@ func TestCalcCellValue(t *testing.T) {
// ROW // ROW
"=ROW(1,2)": "ROW requires at most 1 argument", "=ROW(1,2)": "ROW requires at most 1 argument",
"=ROW(\"\")": "invalid reference", "=ROW(\"\")": "invalid reference",
"=ROW(Sheet1)": "invalid column name \"Sheet1\"", "=ROW(Sheet1)": newInvalidColumnNameError("Sheet1").Error(),
"=ROW(Sheet1!A1!B1)": "invalid column name \"Sheet1\"", "=ROW(Sheet1!A1!B1)": newInvalidColumnNameError("Sheet1").Error(),
// ROWS // ROWS
"=ROWS()": "ROWS requires 1 argument", "=ROWS()": "ROWS requires 1 argument",
"=ROWS(1)": "invalid reference", "=ROWS(1)": "invalid reference",
"=ROWS(\"\")": "invalid reference", "=ROWS(\"\")": "invalid reference",
"=ROWS(Sheet1)": "invalid column name \"Sheet1\"", "=ROWS(Sheet1)": newInvalidColumnNameError("Sheet1").Error(),
"=ROWS(Sheet1!A1!B1)": "invalid column name \"Sheet1\"", "=ROWS(Sheet1!A1!B1)": newInvalidColumnNameError("Sheet1").Error(),
"=ROWS(Sheet1!Sheet1)": "invalid column name \"Sheet1\"", "=ROWS(Sheet1!Sheet1)": newInvalidColumnNameError("Sheet1").Error(),
// Web Functions // Web Functions
// ENCODEURL // ENCODEURL
"=ENCODEURL()": "ENCODEURL requires 1 argument", "=ENCODEURL()": "ENCODEURL requires 1 argument",

@ -108,11 +108,11 @@ func TestCheckCellInArea(t *testing.T) {
} }
ok, err := f.checkCellInArea("A1", "A:B") ok, err := f.checkCellInArea("A1", "A:B")
assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.False(t, ok) assert.False(t, ok)
ok, err = f.checkCellInArea("AA0", "Z0:AB1") ok, err = f.checkCellInArea("AA0", "Z0:AB1")
assert.EqualError(t, err, `cannot convert cell "AA0" to coordinates: invalid cell name "AA0"`) assert.EqualError(t, err, newCellNameToCoordinatesError("AA0", newInvalidCellNameError("AA0")).Error())
assert.False(t, ok) assert.False(t, ok)
} }
@ -146,13 +146,13 @@ func TestSetCellFloat(t *testing.T) {
assert.Equal(t, "123.42", val, "A1 should be 123.42") assert.Equal(t, "123.42", val, "A1 should be 123.42")
}) })
f := NewFile() f := NewFile()
assert.EqualError(t, f.SetCellFloat(sheet, "A", 123.42, -1, 64), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.SetCellFloat(sheet, "A", 123.42, -1, 64), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
} }
func TestSetCellValue(t *testing.T) { func TestSetCellValue(t *testing.T) {
f := NewFile() f := NewFile()
assert.EqualError(t, f.SetCellValue("Sheet1", "A", time.Now().UTC()), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.SetCellValue("Sheet1", "A", time.Now().UTC()), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.EqualError(t, f.SetCellValue("Sheet1", "A", time.Duration(1e13)), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.SetCellValue("Sheet1", "A", time.Duration(1e13)), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
} }
func TestSetCellValues(t *testing.T) { func TestSetCellValues(t *testing.T) {
@ -175,7 +175,7 @@ func TestSetCellValues(t *testing.T) {
func TestSetCellBool(t *testing.T) { func TestSetCellBool(t *testing.T) {
f := NewFile() f := NewFile()
assert.EqualError(t, f.SetCellBool("Sheet1", "A", true), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.SetCellBool("Sheet1", "A", true), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
} }
func TestSetCellTime(t *testing.T) { func TestSetCellTime(t *testing.T) {
@ -336,7 +336,7 @@ func TestGetCellType(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, CellTypeString, cellType) assert.Equal(t, CellTypeString, cellType)
_, err = f.GetCellType("Sheet1", "A") _, err = f.GetCellType("Sheet1", "A")
assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
} }
func TestGetCellFormula(t *testing.T) { func TestGetCellFormula(t *testing.T) {
@ -420,7 +420,7 @@ func TestSetCellFormula(t *testing.T) {
assert.NoError(t, f.SetCellFormula("Sheet1", "C19", "SUM(Sheet2!D2,Sheet2!D9)")) assert.NoError(t, f.SetCellFormula("Sheet1", "C19", "SUM(Sheet2!D2,Sheet2!D9)"))
// Test set cell formula with illegal rows number. // Test set cell formula with illegal rows number.
assert.EqualError(t, f.SetCellFormula("Sheet1", "C", "SUM(Sheet2!D2,Sheet2!D9)"), `cannot convert cell "C" to coordinates: invalid cell name "C"`) assert.EqualError(t, f.SetCellFormula("Sheet1", "C", "SUM(Sheet2!D2,Sheet2!D9)"), newCellNameToCoordinatesError("C", newInvalidCellNameError("C")).Error())
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetCellFormula1.xlsx"))) assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetCellFormula1.xlsx")))
assert.NoError(t, f.Close()) assert.NoError(t, f.Close())
@ -523,7 +523,7 @@ func TestGetCellRichText(t *testing.T) {
assert.EqualError(t, err, "sheet SheetN is not exist") assert.EqualError(t, err, "sheet SheetN is not exist")
// Test set cell rich text with illegal cell coordinates // Test set cell rich text with illegal cell coordinates
_, err = f.GetCellRichText("Sheet1", "A") _, err = f.GetCellRichText("Sheet1", "A")
assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
} }
func TestSetCellRichText(t *testing.T) { func TestSetCellRichText(t *testing.T) {
f := NewFile() f := NewFile()
@ -603,7 +603,7 @@ func TestSetCellRichText(t *testing.T) {
// Test set cell rich text on not exists worksheet // Test set cell rich text on not exists worksheet
assert.EqualError(t, f.SetCellRichText("SheetN", "A1", richTextRun), "sheet SheetN is not exist") assert.EqualError(t, f.SetCellRichText("SheetN", "A1", richTextRun), "sheet SheetN is not exist")
// Test set cell rich text with illegal cell coordinates // Test set cell rich text with illegal cell coordinates
assert.EqualError(t, f.SetCellRichText("Sheet1", "A", richTextRun), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.SetCellRichText("Sheet1", "A", richTextRun), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
richTextRun = []RichTextRun{{Text: strings.Repeat("s", TotalCellChars+1)}} richTextRun = []RichTextRun{{Text: strings.Repeat("s", TotalCellChars+1)}}
// Test set cell rich text with characters over the maximum limit // Test set cell rich text with characters over the maximum limit
assert.EqualError(t, f.SetCellRichText("Sheet1", "A1", richTextRun), ErrCellCharsLength.Error()) assert.EqualError(t, f.SetCellRichText("Sheet1", "A1", richTextRun), ErrCellCharsLength.Error())

@ -94,7 +94,7 @@ func TestChartSize(t *testing.T) {
func TestAddDrawingChart(t *testing.T) { func TestAddDrawingChart(t *testing.T) {
f := NewFile() f := NewFile()
assert.EqualError(t, f.addDrawingChart("SheetN", "", "", 0, 0, 0, nil), `cannot convert cell "" to coordinates: invalid cell name ""`) assert.EqualError(t, f.addDrawingChart("SheetN", "", "", 0, 0, 0, nil), newCellNameToCoordinatesError("", newInvalidCellNameError("")).Error())
} }
func TestAddChart(t *testing.T) { func TestAddChart(t *testing.T) {
@ -199,7 +199,7 @@ func TestAddChart(t *testing.T) {
} }
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddChart.xlsx"))) assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddChart.xlsx")))
// Test with illegal cell coordinates // Test with illegal cell coordinates
assert.EqualError(t, f.AddChart("Sheet2", "A", `{"type":"col","series":[{"name":"Sheet1!$A$30","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$30:$D$30"},{"name":"Sheet1!$A$31","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$31:$D$31"},{"name":"Sheet1!$A$32","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$32:$D$32"},{"name":"Sheet1!$A$33","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$33:$D$33"},{"name":"Sheet1!$A$34","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$34:$D$34"},{"name":"Sheet1!$A$35","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$35:$D$35"},{"name":"Sheet1!$A$36","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$36:$D$36"},{"name":"Sheet1!$A$37","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$37:$D$37"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"2D Column Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.AddChart("Sheet2", "A", `{"type":"col","series":[{"name":"Sheet1!$A$30","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$30:$D$30"},{"name":"Sheet1!$A$31","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$31:$D$31"},{"name":"Sheet1!$A$32","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$32:$D$32"},{"name":"Sheet1!$A$33","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$33:$D$33"},{"name":"Sheet1!$A$34","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$34:$D$34"},{"name":"Sheet1!$A$35","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$35:$D$35"},{"name":"Sheet1!$A$36","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$36:$D$36"},{"name":"Sheet1!$A$37","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$37:$D$37"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"2D Column Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
// Test with unsupported chart type // Test with unsupported chart type
assert.EqualError(t, f.AddChart("Sheet2", "BD32", `{"type":"unknown","series":[{"name":"Sheet1!$A$30","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$30:$D$30"},{"name":"Sheet1!$A$31","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$31:$D$31"},{"name":"Sheet1!$A$32","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$32:$D$32"},{"name":"Sheet1!$A$33","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$33:$D$33"},{"name":"Sheet1!$A$34","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$34:$D$34"},{"name":"Sheet1!$A$35","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$35:$D$35"},{"name":"Sheet1!$A$36","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$36:$D$36"},{"name":"Sheet1!$A$37","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$37:$D$37"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"Bubble 3D Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`), "unsupported chart type unknown") assert.EqualError(t, f.AddChart("Sheet2", "BD32", `{"type":"unknown","series":[{"name":"Sheet1!$A$30","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$30:$D$30"},{"name":"Sheet1!$A$31","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$31:$D$31"},{"name":"Sheet1!$A$32","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$32:$D$32"},{"name":"Sheet1!$A$33","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$33:$D$33"},{"name":"Sheet1!$A$34","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$34:$D$34"},{"name":"Sheet1!$A$35","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$35:$D$35"},{"name":"Sheet1!$A$36","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$36:$D$36"},{"name":"Sheet1!$A$37","categories":"Sheet1!$B$29:$D$29","values":"Sheet1!$B$37:$D$37"}],"format":{"x_scale":1.0,"y_scale":1.0,"x_offset":15,"y_offset":10,"print_obj":true,"lock_aspect_ratio":false,"locked":false},"legend":{"position":"left","show_legend_key":false},"title":{"name":"Bubble 3D Chart"},"plotarea":{"show_bubble_size":true,"show_cat_name":false,"show_leader_lines":false,"show_percent":true,"show_series_name":true,"show_val":true},"show_blanks_as":"zero"}`), "unsupported chart type unknown")
// Test add combo chart with invalid format set // Test add combo chart with invalid format set
@ -252,7 +252,7 @@ func TestDeleteChart(t *testing.T) {
// Test delete chart on not exists worksheet. // Test delete chart on not exists worksheet.
assert.EqualError(t, f.DeleteChart("SheetN", "A1"), "sheet SheetN is not exist") assert.EqualError(t, f.DeleteChart("SheetN", "A1"), "sheet SheetN is not exist")
// Test delete chart with invalid coordinates. // Test delete chart with invalid coordinates.
assert.EqualError(t, f.DeleteChart("Sheet1", ""), `cannot convert cell "" to coordinates: invalid cell name ""`) assert.EqualError(t, f.DeleteChart("Sheet1", ""), newCellNameToCoordinatesError("", newInvalidCellNameError("")).Error())
// Test delete chart on no chart worksheet. // Test delete chart on no chart worksheet.
assert.NoError(t, NewFile().DeleteChart("Sheet1", "A1")) assert.NoError(t, NewFile().DeleteChart("Sheet1", "A1"))
assert.NoError(t, f.Close()) assert.NoError(t, f.Close())

@ -120,7 +120,7 @@ func TestGetColsError(t *testing.T) {
f.Pkg.Store("xl/worksheets/sheet1.xml", []byte(`<worksheet><sheetData><row r="2"><c r="A" t="str"><v>B</v></c></row></sheetData></worksheet>`)) f.Pkg.Store("xl/worksheets/sheet1.xml", []byte(`<worksheet><sheetData><row r="2"><c r="A" t="str"><v>B</v></c></row></sheetData></worksheet>`))
_, err = f.GetCols("Sheet1") _, err = f.GetCols("Sheet1")
assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
f = NewFile() f = NewFile()
cols, err := f.Cols("Sheet1") cols, err := f.Cols("Sheet1")
@ -130,7 +130,7 @@ func TestGetColsError(t *testing.T) {
cols.curCol = 1 cols.curCol = 1
cols.sheetXML = []byte(`<worksheet><sheetData><row r="1"><c r="A" t="str"><v>A</v></c></row></sheetData></worksheet>`) cols.sheetXML = []byte(`<worksheet><sheetData><row r="1"><c r="A" t="str"><v>A</v></c></row></sheetData></worksheet>`)
_, err = cols.Rows() _, err = cols.Rows()
assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
} }
func TestColsRows(t *testing.T) { func TestColsRows(t *testing.T) {
@ -208,12 +208,12 @@ func TestColumnVisibility(t *testing.T) {
// Test get column visible with illegal cell coordinates. // Test get column visible with illegal cell coordinates.
_, err = f.GetColVisible("Sheet1", "*") _, err = f.GetColVisible("Sheet1", "*")
assert.EqualError(t, err, `invalid column name "*"`) assert.EqualError(t, err, newInvalidColumnNameError("*").Error())
assert.EqualError(t, f.SetColVisible("Sheet1", "*", false), `invalid column name "*"`) assert.EqualError(t, f.SetColVisible("Sheet1", "*", false), newInvalidColumnNameError("*").Error())
f.NewSheet("Sheet3") f.NewSheet("Sheet3")
assert.NoError(t, f.SetColVisible("Sheet3", "E", false)) assert.NoError(t, f.SetColVisible("Sheet3", "E", false))
assert.EqualError(t, f.SetColVisible("Sheet1", "A:-1", true), "invalid column name \"-1\"") assert.EqualError(t, f.SetColVisible("Sheet1", "A:-1", true), newInvalidColumnNameError("-1").Error())
assert.EqualError(t, f.SetColVisible("SheetN", "E", false), "sheet SheetN is not exist") assert.EqualError(t, f.SetColVisible("SheetN", "E", false), "sheet SheetN is not exist")
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestColumnVisibility.xlsx"))) assert.NoError(t, f.SaveAs(filepath.Join("test", "TestColumnVisibility.xlsx")))
}) })
@ -258,20 +258,20 @@ func TestOutlineLevel(t *testing.T) {
assert.EqualError(t, err, "sheet SheetN is not exist") assert.EqualError(t, err, "sheet SheetN is not exist")
// Test set and get column outline level with illegal cell coordinates. // Test set and get column outline level with illegal cell coordinates.
assert.EqualError(t, f.SetColOutlineLevel("Sheet1", "*", 1), `invalid column name "*"`) assert.EqualError(t, f.SetColOutlineLevel("Sheet1", "*", 1), newInvalidColumnNameError("*").Error())
_, err = f.GetColOutlineLevel("Sheet1", "*") _, err = f.GetColOutlineLevel("Sheet1", "*")
assert.EqualError(t, err, `invalid column name "*"`) assert.EqualError(t, err, newInvalidColumnNameError("*").Error())
// Test set column outline level on not exists worksheet. // Test set column outline level on not exists worksheet.
assert.EqualError(t, f.SetColOutlineLevel("SheetN", "E", 2), "sheet SheetN is not exist") assert.EqualError(t, f.SetColOutlineLevel("SheetN", "E", 2), "sheet SheetN is not exist")
assert.EqualError(t, f.SetRowOutlineLevel("Sheet1", 0, 1), "invalid row number 0") assert.EqualError(t, f.SetRowOutlineLevel("Sheet1", 0, 1), newInvalidRowNumberError(0).Error())
level, err = f.GetRowOutlineLevel("Sheet1", 2) level, err = f.GetRowOutlineLevel("Sheet1", 2)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, uint8(7), level) assert.Equal(t, uint8(7), level)
_, err = f.GetRowOutlineLevel("Sheet1", 0) _, err = f.GetRowOutlineLevel("Sheet1", 0)
assert.EqualError(t, err, `invalid row number 0`) assert.EqualError(t, err, newInvalidRowNumberError(0).Error())
level, err = f.GetRowOutlineLevel("Sheet1", 10) level, err = f.GetRowOutlineLevel("Sheet1", 10)
assert.NoError(t, err) assert.NoError(t, err)
@ -293,8 +293,8 @@ func TestSetColStyle(t *testing.T) {
// Test set column style on not exists worksheet. // Test set column style on not exists worksheet.
assert.EqualError(t, f.SetColStyle("SheetN", "E", style), "sheet SheetN is not exist") assert.EqualError(t, f.SetColStyle("SheetN", "E", style), "sheet SheetN is not exist")
// Test set column style with illegal cell coordinates. // Test set column style with illegal cell coordinates.
assert.EqualError(t, f.SetColStyle("Sheet1", "*", style), `invalid column name "*"`) assert.EqualError(t, f.SetColStyle("Sheet1", "*", style), newInvalidColumnNameError("*").Error())
assert.EqualError(t, f.SetColStyle("Sheet1", "A:*", style), `invalid column name "*"`) assert.EqualError(t, f.SetColStyle("Sheet1", "A:*", style), newInvalidColumnNameError("*").Error())
assert.NoError(t, f.SetColStyle("Sheet1", "B", style)) assert.NoError(t, f.SetColStyle("Sheet1", "B", style))
// Test set column style with already exists column with style. // Test set column style with already exists column with style.
@ -317,9 +317,9 @@ func TestColWidth(t *testing.T) {
// Test set and get column width with illegal cell coordinates. // Test set and get column width with illegal cell coordinates.
width, err = f.GetColWidth("Sheet1", "*") width, err = f.GetColWidth("Sheet1", "*")
assert.Equal(t, defaultColWidth, width) assert.Equal(t, defaultColWidth, width)
assert.EqualError(t, err, `invalid column name "*"`) assert.EqualError(t, err, newInvalidColumnNameError("*").Error())
assert.EqualError(t, f.SetColWidth("Sheet1", "*", "B", 1), `invalid column name "*"`) assert.EqualError(t, f.SetColWidth("Sheet1", "*", "B", 1), newInvalidColumnNameError("*").Error())
assert.EqualError(t, f.SetColWidth("Sheet1", "A", "*", 1), `invalid column name "*"`) assert.EqualError(t, f.SetColWidth("Sheet1", "A", "*", 1), newInvalidColumnNameError("*").Error())
// Test set column width on not exists worksheet. // Test set column width on not exists worksheet.
assert.EqualError(t, f.SetColWidth("SheetN", "B", "A", 12), "sheet SheetN is not exist") assert.EqualError(t, f.SetColWidth("SheetN", "B", "A", 12), "sheet SheetN is not exist")
@ -345,7 +345,7 @@ func TestInsertCol(t *testing.T) {
assert.NoError(t, f.InsertCol(sheet1, "A")) assert.NoError(t, f.InsertCol(sheet1, "A"))
// Test insert column with illegal cell coordinates. // Test insert column with illegal cell coordinates.
assert.EqualError(t, f.InsertCol("Sheet1", "*"), `invalid column name "*"`) assert.EqualError(t, f.InsertCol("Sheet1", "*"), newInvalidColumnNameError("*").Error())
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestInsertCol.xlsx"))) assert.NoError(t, f.SaveAs(filepath.Join("test", "TestInsertCol.xlsx")))
} }
@ -366,7 +366,7 @@ func TestRemoveCol(t *testing.T) {
assert.NoError(t, f.RemoveCol(sheet1, "A")) assert.NoError(t, f.RemoveCol(sheet1, "A"))
// Test remove column with illegal cell coordinates. // Test remove column with illegal cell coordinates.
assert.EqualError(t, f.RemoveCol("Sheet1", "*"), `invalid column name "*"`) assert.EqualError(t, f.RemoveCol("Sheet1", "*"), newInvalidColumnNameError("*").Error())
// Test remove column on not exists worksheet. // Test remove column on not exists worksheet.
assert.EqualError(t, f.RemoveCol("SheetN", "B"), "sheet SheetN is not exist") assert.EqualError(t, f.RemoveCol("SheetN", "B"), "sheet SheetN is not exist")

@ -32,7 +32,7 @@ func TestAddComments(t *testing.T) {
// Test add comment on not exists worksheet. // Test add comment on not exists worksheet.
assert.EqualError(t, f.AddComment("SheetN", "B7", `{"author":"Excelize: ","text":"This is a comment."}`), "sheet SheetN is not exist") assert.EqualError(t, f.AddComment("SheetN", "B7", `{"author":"Excelize: ","text":"This is a comment."}`), "sheet SheetN is not exist")
// Test add comment on with illegal cell coordinates // Test add comment on with illegal cell coordinates
assert.EqualError(t, f.AddComment("Sheet1", "A", `{"author":"Excelize: ","text":"This is a comment."}`), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.AddComment("Sheet1", "A", `{"author":"Excelize: ","text":"This is a comment."}`), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
if assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddComments.xlsx"))) { if assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddComments.xlsx"))) {
assert.Len(t, f.GetComments(), 2) assert.Len(t, f.GetComments(), 2)
} }

@ -21,16 +21,16 @@ import (
func TestEncrypt(t *testing.T) { func TestEncrypt(t *testing.T) {
f, err := OpenFile(filepath.Join("test", "encryptSHA1.xlsx"), Options{Password: "password"}) f, err := OpenFile(filepath.Join("test", "encryptSHA1.xlsx"), Options{Password: "password"})
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualError(t, f.SaveAs(filepath.Join("test", "BadEncrypt.xlsx"), Options{Password: "password"}), "not support encryption currently") assert.EqualError(t, f.SaveAs(filepath.Join("test", "BadEncrypt.xlsx"), Options{Password: "password"}), ErrEncrypt.Error())
assert.NoError(t, f.Close()) assert.NoError(t, f.Close())
} }
func TestEncryptionMechanism(t *testing.T) { func TestEncryptionMechanism(t *testing.T) {
mechanism, err := encryptionMechanism([]byte{3, 0, 3, 0}) mechanism, err := encryptionMechanism([]byte{3, 0, 3, 0})
assert.Equal(t, mechanism, "extensible") assert.Equal(t, mechanism, "extensible")
assert.EqualError(t, err, "unsupport encryption mechanism") assert.EqualError(t, err, ErrUnsupportEncryptMechanism.Error())
_, err = encryptionMechanism([]byte{}) _, err = encryptionMechanism([]byte{})
assert.EqualError(t, err, "unknown encryption mechanism") assert.EqualError(t, err, ErrUnknownEncryptMechanism.Error())
} }
func TestHashing(t *testing.T) { func TestHashing(t *testing.T) {

@ -164,13 +164,13 @@ func TestDeleteDataValidation(t *testing.T) {
dvRange.Sqref = "A" dvRange.Sqref = "A"
assert.NoError(t, f.AddDataValidation("Sheet1", dvRange)) assert.NoError(t, f.AddDataValidation("Sheet1", dvRange))
assert.EqualError(t, f.DeleteDataValidation("Sheet1", "A1"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.DeleteDataValidation("Sheet1", "A1"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.EqualError(t, f.DeleteDataValidation("Sheet1", "A1:A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.DeleteDataValidation("Sheet1", "A1:A"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
ws, ok := f.Sheet.Load("xl/worksheets/sheet1.xml") ws, ok := f.Sheet.Load("xl/worksheets/sheet1.xml")
assert.True(t, ok) assert.True(t, ok)
ws.(*xlsxWorksheet).DataValidations.DataValidation[0].Sqref = "A1:A" ws.(*xlsxWorksheet).DataValidations.DataValidation[0].Sqref = "A1:A"
assert.EqualError(t, f.DeleteDataValidation("Sheet1", "A1:B2"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.DeleteDataValidation("Sheet1", "A1:B2"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
// Test delete data validation on no exists worksheet. // Test delete data validation on no exists worksheet.
assert.EqualError(t, f.DeleteDataValidation("SheetN", "A1:B2"), "sheet SheetN is not exist") assert.EqualError(t, f.DeleteDataValidation("SheetN", "A1:B2"), "sheet SheetN is not exist")

@ -99,5 +99,5 @@ func TestExcelDateToTime(t *testing.T) {
} }
// Check error case // Check error case
_, err := ExcelDateToTime(-1, false) _, err := ExcelDateToTime(-1, false)
assert.EqualError(t, err, "invalid date value -1.000000, negative values are not supported") assert.EqualError(t, err, newInvalidExcelDateError(-1).Error())
} }

@ -56,6 +56,12 @@ func newFieldLengthError(name string) error {
return fmt.Errorf("field %s must be less or equal than 255 characters", name) return fmt.Errorf("field %s must be less or equal than 255 characters", name)
} }
// newCellNameToCoordinatesError defined the error message on converts
// alphanumeric cell name to coordinates.
func newCellNameToCoordinatesError(cell string, err error) error {
return fmt.Errorf("cannot convert cell %q to coordinates: %v", cell, err)
}
var ( var (
// ErrStreamSetColWidth defined the error message on set column width in // ErrStreamSetColWidth defined the error message on set column width in
// stream writing mode. // stream writing mode.
@ -139,4 +145,24 @@ var (
// ErrOptionsUnzipSizeLimit defined the error message for receiving // ErrOptionsUnzipSizeLimit defined the error message for receiving
// invalid UnzipSizeLimit and WorksheetUnzipMemLimit. // invalid UnzipSizeLimit and WorksheetUnzipMemLimit.
ErrOptionsUnzipSizeLimit = errors.New("the value of UnzipSizeLimit should be greater than or equal to WorksheetUnzipMemLimit") ErrOptionsUnzipSizeLimit = errors.New("the value of UnzipSizeLimit should be greater than or equal to WorksheetUnzipMemLimit")
// ErrSave defined the error message for saving file.
ErrSave = errors.New("no path defined for file, consider File.WriteTo or File.Write")
// ErrAttrValBool defined the error message on marshal and unmarshal
// boolean type XML attribute.
ErrAttrValBool = errors.New("unexpected child of attrValBool")
// ErrSparklineType defined the error message on receive the invalid
// sparkline Type parameters.
ErrSparklineType = errors.New("parameter 'Type' must be 'line', 'column' or 'win_loss'")
// ErrSparklineLocation defined the error message on missing Location
// parameters
ErrSparklineLocation = errors.New("parameter 'Location' is required")
// ErrSparklineRange defined the error message on missing sparkline Range
// parameters
ErrSparklineRange = errors.New("parameter 'Range' is required")
// ErrSparkline defined the error message on receive the invalid sparkline
// parameters.
ErrSparkline = errors.New("must have the same number of 'Location' and 'Range' parameters")
// ErrSparklineStyle defined the error message on receive the invalid
// sparkline Style parameters.
ErrSparklineStyle = errors.New("parameter 'Style' must betweent 0-35")
) )

@ -45,12 +45,12 @@ func TestOpenFile(t *testing.T) {
// Test set cell value with illegal row number. // Test set cell value with illegal row number.
assert.EqualError(t, f.SetCellDefault("Sheet2", "A", strconv.FormatFloat(float64(-100.1588), 'f', -1, 64)), assert.EqualError(t, f.SetCellDefault("Sheet2", "A", strconv.FormatFloat(float64(-100.1588), 'f', -1, 64)),
`cannot convert cell "A" to coordinates: invalid cell name "A"`) newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.NoError(t, f.SetCellInt("Sheet2", "A1", 100)) assert.NoError(t, f.SetCellInt("Sheet2", "A1", 100))
// Test set cell integer value with illegal row number. // Test set cell integer value with illegal row number.
assert.EqualError(t, f.SetCellInt("Sheet2", "A", 100), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.SetCellInt("Sheet2", "A", 100), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.NoError(t, f.SetCellStr("Sheet2", "C11", "Knowns")) assert.NoError(t, f.SetCellStr("Sheet2", "C11", "Knowns"))
// Test max characters in a cell. // Test max characters in a cell.
@ -63,7 +63,7 @@ func TestOpenFile(t *testing.T) {
assert.EqualError(t, f.SetCellStr("Sheet10", "b230", "10"), "sheet Sheet10 is not exist") assert.EqualError(t, f.SetCellStr("Sheet10", "b230", "10"), "sheet Sheet10 is not exist")
// Test set cell string value with illegal row number. // Test set cell string value with illegal row number.
assert.EqualError(t, f.SetCellStr("Sheet1", "A", "10"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.SetCellStr("Sheet1", "A", "10"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
f.SetActiveSheet(2) f.SetActiveSheet(2)
// Test get cell formula with given rows number. // Test get cell formula with given rows number.
@ -77,7 +77,7 @@ func TestOpenFile(t *testing.T) {
// Test get cell formula with illegal rows number. // Test get cell formula with illegal rows number.
_, err = f.GetCellFormula("Sheet1", "B") _, err = f.GetCellFormula("Sheet1", "B")
assert.EqualError(t, err, `cannot convert cell "B" to coordinates: invalid cell name "B"`) assert.EqualError(t, err, newCellNameToCoordinatesError("B", newInvalidCellNameError("B")).Error())
// Test get shared cell formula // Test get shared cell formula
_, err = f.GetCellFormula("Sheet2", "H11") _, err = f.GetCellFormula("Sheet2", "H11")
assert.NoError(t, err) assert.NoError(t, err)
@ -87,9 +87,9 @@ func TestOpenFile(t *testing.T) {
// Test read cell value with given illegal rows number. // Test read cell value with given illegal rows number.
_, err = f.GetCellValue("Sheet2", "a-1") _, err = f.GetCellValue("Sheet2", "a-1")
assert.EqualError(t, err, `cannot convert cell "A-1" to coordinates: invalid cell name "A-1"`) assert.EqualError(t, err, newCellNameToCoordinatesError("A-1", newInvalidCellNameError("A-1")).Error())
_, err = f.GetCellValue("Sheet2", "A") _, err = f.GetCellValue("Sheet2", "A")
assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
// Test read cell value with given lowercase column number. // Test read cell value with given lowercase column number.
_, err = f.GetCellValue("Sheet2", "a5") _, err = f.GetCellValue("Sheet2", "a5")
@ -324,7 +324,7 @@ func TestNewFile(t *testing.T) {
func TestAddDrawingVML(t *testing.T) { func TestAddDrawingVML(t *testing.T) {
// Test addDrawingVML with illegal cell coordinates. // Test addDrawingVML with illegal cell coordinates.
f := NewFile() f := NewFile()
assert.EqualError(t, f.addDrawingVML(0, "", "*", 0, 0), `cannot convert cell "*" to coordinates: invalid cell name "*"`) assert.EqualError(t, f.addDrawingVML(0, "", "*", 0, 0), newCellNameToCoordinatesError("*", newInvalidCellNameError("*")).Error())
} }
func TestSetCellHyperLink(t *testing.T) { func TestSetCellHyperLink(t *testing.T) {
@ -368,7 +368,7 @@ func TestSetCellHyperLink(t *testing.T) {
assert.True(t, ok) assert.True(t, ok)
ws.(*xlsxWorksheet).MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A:A"}}} ws.(*xlsxWorksheet).MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A:A"}}}
err = f.SetCellHyperLink("Sheet1", "A1", "https://github.com/xuri/excelize", "External") err = f.SetCellHyperLink("Sheet1", "A1", "https://github.com/xuri/excelize", "External")
assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
} }
func TestGetCellHyperLink(t *testing.T) { func TestGetCellHyperLink(t *testing.T) {
@ -408,7 +408,7 @@ func TestGetCellHyperLink(t *testing.T) {
assert.True(t, ok) assert.True(t, ok)
ws.(*xlsxWorksheet).MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A:A"}}} ws.(*xlsxWorksheet).MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A:A"}}}
link, target, err = f.GetCellHyperLink("Sheet1", "A1") link, target, err = f.GetCellHyperLink("Sheet1", "A1")
assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.Equal(t, link, false) assert.Equal(t, link, false)
assert.Equal(t, target, "") assert.Equal(t, target, "")
} }
@ -570,13 +570,13 @@ func TestSetCellStyleAlignment(t *testing.T) {
assert.NoError(t, f.SetCellStyle("Sheet1", "A22", "A22", style)) assert.NoError(t, f.SetCellStyle("Sheet1", "A22", "A22", style))
// Test set cell style with given illegal rows number. // Test set cell style with given illegal rows number.
assert.EqualError(t, f.SetCellStyle("Sheet1", "A", "A22", style), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.SetCellStyle("Sheet1", "A", "A22", style), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.EqualError(t, f.SetCellStyle("Sheet1", "A22", "A", style), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.SetCellStyle("Sheet1", "A22", "A", style), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
// Test get cell style with given illegal rows number. // Test get cell style with given illegal rows number.
index, err := f.GetCellStyle("Sheet1", "A") index, err := f.GetCellStyle("Sheet1", "A")
assert.Equal(t, 0, index) assert.Equal(t, 0, index)
assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetCellStyleAlignment.xlsx"))) assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetCellStyleAlignment.xlsx")))
} }
@ -1109,7 +1109,7 @@ func TestSetSheetRow(t *testing.T) {
assert.NoError(t, f.SetSheetRow("Sheet1", "B27", &[]interface{}{"cell", nil, int32(42), float64(42), time.Now().UTC()})) assert.NoError(t, f.SetSheetRow("Sheet1", "B27", &[]interface{}{"cell", nil, int32(42), float64(42), time.Now().UTC()}))
assert.EqualError(t, f.SetSheetRow("Sheet1", "", &[]interface{}{"cell", nil, 2}), assert.EqualError(t, f.SetSheetRow("Sheet1", "", &[]interface{}{"cell", nil, 2}),
`cannot convert cell "" to coordinates: invalid cell name ""`) newCellNameToCoordinatesError("", newInvalidCellNameError("")).Error())
assert.EqualError(t, f.SetSheetRow("Sheet1", "B27", []interface{}{}), ErrParameterInvalid.Error()) assert.EqualError(t, f.SetSheetRow("Sheet1", "B27", []interface{}{}), ErrParameterInvalid.Error())
assert.EqualError(t, f.SetSheetRow("Sheet1", "B27", &f), ErrParameterInvalid.Error()) assert.EqualError(t, f.SetSheetRow("Sheet1", "B27", &f), ErrParameterInvalid.Error())
@ -1181,7 +1181,7 @@ func TestSetDefaultTimeStyle(t *testing.T) {
assert.EqualError(t, f.setDefaultTimeStyle("SheetN", "", 0), "sheet SheetN is not exist") assert.EqualError(t, f.setDefaultTimeStyle("SheetN", "", 0), "sheet SheetN is not exist")
// Test set default time style on invalid cell // Test set default time style on invalid cell
assert.EqualError(t, f.setDefaultTimeStyle("Sheet1", "", 42), "cannot convert cell \"\" to coordinates: invalid cell name \"\"") assert.EqualError(t, f.setDefaultTimeStyle("Sheet1", "", 42), newCellNameToCoordinatesError("", newInvalidCellNameError("")).Error())
} }
func TestAddVBAProject(t *testing.T) { func TestAddVBAProject(t *testing.T) {

@ -14,7 +14,6 @@ package excelize
import ( import (
"archive/zip" "archive/zip"
"bytes" "bytes"
"fmt"
"io" "io"
"os" "os"
"path/filepath" "path/filepath"
@ -58,7 +57,7 @@ func NewFile() *File {
// Save provides a function to override the spreadsheet with origin path. // Save provides a function to override the spreadsheet with origin path.
func (f *File) Save() error { func (f *File) Save() error {
if f.Path == "" { if f.Path == "" {
return fmt.Errorf("no path defined for file, consider File.WriteTo or File.Write") return ErrSave
} }
return f.SaveAs(f.Path) return f.SaveAs(f.Path)
} }

@ -16,7 +16,6 @@ import (
"bytes" "bytes"
"container/list" "container/list"
"encoding/xml" "encoding/xml"
"errors"
"fmt" "fmt"
"io" "io"
"io/ioutil" "io/ioutil"
@ -240,11 +239,9 @@ func ColumnNumberToName(num int) (string, error) {
// excelize.CellNameToCoordinates("Z3") // returns 26, 3, nil // excelize.CellNameToCoordinates("Z3") // returns 26, 3, nil
// //
func CellNameToCoordinates(cell string) (int, int, error) { func CellNameToCoordinates(cell string) (int, int, error) {
const msg = "cannot convert cell %q to coordinates: %v"
colname, row, err := SplitCellName(cell) colname, row, err := SplitCellName(cell)
if err != nil { if err != nil {
return -1, -1, fmt.Errorf(msg, cell, err) return -1, -1, newCellNameToCoordinatesError(cell, err)
} }
if row > TotalRows { if row > TotalRows {
return -1, -1, ErrMaxRows return -1, -1, ErrMaxRows
@ -447,7 +444,7 @@ func (avb *attrValBool) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
found := false found := false
switch t.(type) { switch t.(type) {
case xml.StartElement: case xml.StartElement:
return errors.New("unexpected child of attrValBool") return ErrAttrValBool
case xml.EndElement: case xml.EndElement:
found = true found = true
} }

@ -184,7 +184,7 @@ func TestCellNameToCoordinates_Error(t *testing.T) {
} }
} }
_, _, err := CellNameToCoordinates("A1048577") _, _, err := CellNameToCoordinates("A1048577")
assert.EqualError(t, err, "row number exceeds maximum limit") assert.EqualError(t, err, ErrMaxRows.Error())
} }
func TestCoordinatesToCellName_OK(t *testing.T) { func TestCoordinatesToCellName_OK(t *testing.T) {

@ -12,7 +12,7 @@ func TestMergeCell(t *testing.T) {
if !assert.NoError(t, err) { if !assert.NoError(t, err) {
t.FailNow() t.FailNow()
} }
assert.EqualError(t, f.MergeCell("Sheet1", "A", "B"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.MergeCell("Sheet1", "A", "B"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.NoError(t, f.MergeCell("Sheet1", "D9", "D9")) assert.NoError(t, f.MergeCell("Sheet1", "D9", "D9"))
assert.NoError(t, f.MergeCell("Sheet1", "D9", "E9")) assert.NoError(t, f.MergeCell("Sheet1", "D9", "E9"))
assert.NoError(t, f.MergeCell("Sheet1", "H14", "G13")) assert.NoError(t, f.MergeCell("Sheet1", "H14", "G13"))
@ -156,7 +156,7 @@ func TestUnmergeCell(t *testing.T) {
mergeCellNum := len(sheet.MergeCells.Cells) mergeCellNum := len(sheet.MergeCells.Cells)
assert.EqualError(t, f.UnmergeCell("Sheet1", "A", "A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.UnmergeCell("Sheet1", "A", "A"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
// unmerge the mergecell that contains A1 // unmerge the mergecell that contains A1
assert.NoError(t, f.UnmergeCell(sheet1, "A1", "A1")) assert.NoError(t, f.UnmergeCell(sheet1, "A1", "A1"))
@ -190,7 +190,7 @@ func TestUnmergeCell(t *testing.T) {
ws, ok = f.Sheet.Load("xl/worksheets/sheet1.xml") ws, ok = f.Sheet.Load("xl/worksheets/sheet1.xml")
assert.True(t, ok) assert.True(t, ok)
ws.(*xlsxWorksheet).MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A:A"}}} ws.(*xlsxWorksheet).MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A:A"}}}
assert.EqualError(t, f.UnmergeCell("Sheet1", "A2", "B3"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.UnmergeCell("Sheet1", "A2", "B3"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
} }
func TestFlatMergedCells(t *testing.T) { func TestFlatMergedCells(t *testing.T) {

@ -60,7 +60,7 @@ func TestAddPicture(t *testing.T) {
// Test add picture to worksheet from bytes. // Test add picture to worksheet from bytes.
assert.NoError(t, f.AddPictureFromBytes("Sheet1", "Q1", "", "Excel Logo", ".png", file)) assert.NoError(t, f.AddPictureFromBytes("Sheet1", "Q1", "", "Excel Logo", ".png", file))
// Test add picture to worksheet from bytes with illegal cell coordinates. // Test add picture to worksheet from bytes with illegal cell coordinates.
assert.EqualError(t, f.AddPictureFromBytes("Sheet1", "A", "", "Excel Logo", ".png", file), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.AddPictureFromBytes("Sheet1", "A", "", "Excel Logo", ".png", file), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.NoError(t, f.AddPicture("Sheet1", "Q8", filepath.Join("test", "images", "excel.gif"), "")) assert.NoError(t, f.AddPicture("Sheet1", "Q8", filepath.Join("test", "images", "excel.gif"), ""))
assert.NoError(t, f.AddPicture("Sheet1", "Q15", filepath.Join("test", "images", "excel.jpg"), "")) assert.NoError(t, f.AddPicture("Sheet1", "Q15", filepath.Join("test", "images", "excel.jpg"), ""))
@ -110,7 +110,7 @@ func TestGetPicture(t *testing.T) {
// Try to get picture from a worksheet with illegal cell coordinates. // Try to get picture from a worksheet with illegal cell coordinates.
_, _, err = f.GetPicture("Sheet1", "A") _, _, err = f.GetPicture("Sheet1", "A")
assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
// Try to get picture from a worksheet that doesn't contain any images. // Try to get picture from a worksheet that doesn't contain any images.
file, raw, err = f.GetPicture("Sheet3", "I9") file, raw, err = f.GetPicture("Sheet3", "I9")
@ -165,7 +165,7 @@ func TestGetPicture(t *testing.T) {
func TestAddDrawingPicture(t *testing.T) { func TestAddDrawingPicture(t *testing.T) {
// testing addDrawingPicture with illegal cell coordinates. // testing addDrawingPicture with illegal cell coordinates.
f := NewFile() f := NewFile()
assert.EqualError(t, f.addDrawingPicture("sheet1", "", "A", "", 0, 0, 0, 0, nil), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.addDrawingPicture("sheet1", "", "A", "", 0, 0, 0, 0, nil), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
} }
func TestAddPictureFromBytes(t *testing.T) { func TestAddPictureFromBytes(t *testing.T) {
@ -195,7 +195,7 @@ func TestDeletePicture(t *testing.T) {
// Test delete picture on not exists worksheet. // Test delete picture on not exists worksheet.
assert.EqualError(t, f.DeletePicture("SheetN", "A1"), "sheet SheetN is not exist") assert.EqualError(t, f.DeletePicture("SheetN", "A1"), "sheet SheetN is not exist")
// Test delete picture with invalid coordinates. // Test delete picture with invalid coordinates.
assert.EqualError(t, f.DeletePicture("Sheet1", ""), `cannot convert cell "" to coordinates: invalid cell name ""`) assert.EqualError(t, f.DeletePicture("Sheet1", ""), newCellNameToCoordinatesError("", newInvalidCellNameError("")).Error())
assert.NoError(t, f.Close()) assert.NoError(t, f.Close())
// Test delete picture on no chart worksheet. // Test delete picture on no chart worksheet.
assert.NoError(t, NewFile().DeletePicture("Sheet1", "A1")) assert.NoError(t, NewFile().DeletePicture("Sheet1", "A1"))
@ -208,9 +208,9 @@ func TestDrawingResize(t *testing.T) {
assert.EqualError(t, err, "sheet SheetN is not exist") assert.EqualError(t, err, "sheet SheetN is not exist")
// Test calculate drawing resize with invalid coordinates. // Test calculate drawing resize with invalid coordinates.
_, _, _, _, err = f.drawingResize("Sheet1", "", 1, 1, nil) _, _, _, _, err = f.drawingResize("Sheet1", "", 1, 1, nil)
assert.EqualError(t, err, `cannot convert cell "" to coordinates: invalid cell name ""`) assert.EqualError(t, err, newCellNameToCoordinatesError("", newInvalidCellNameError("")).Error())
ws, ok := f.Sheet.Load("xl/worksheets/sheet1.xml") ws, ok := f.Sheet.Load("xl/worksheets/sheet1.xml")
assert.True(t, ok) assert.True(t, ok)
ws.(*xlsxWorksheet).MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A:A"}}} ws.(*xlsxWorksheet).MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A:A"}}}
assert.EqualError(t, f.AddPicture("Sheet1", "A1", filepath.Join("test", "images", "excel.jpg"), `{"autofit": true}`), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.AddPicture("Sheet1", "A1", filepath.Join("test", "images", "excel.jpg"), `{"autofit": true}`), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
} }

@ -158,7 +158,7 @@ func TestAddPivotTable(t *testing.T) {
})) }))
// Test empty pivot table options // Test empty pivot table options
assert.EqualError(t, f.AddPivotTable(nil), "parameter is required") assert.EqualError(t, f.AddPivotTable(nil), ErrParameterRequired.Error())
// Test invalid data range // Test invalid data range
assert.EqualError(t, f.AddPivotTable(&PivotTableOption{ assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
DataRange: "Sheet1!$A$1:$A$1", DataRange: "Sheet1!$A$1:$A$1",
@ -227,7 +227,7 @@ func TestAddPivotTable(t *testing.T) {
// Test adjust range with invalid range // Test adjust range with invalid range
_, _, err := f.adjustRange("") _, _, err := f.adjustRange("")
assert.EqualError(t, err, "parameter is required") assert.EqualError(t, err, ErrParameterRequired.Error())
// Test adjust range with incorrect range // Test adjust range with incorrect range
_, _, err = f.adjustRange("sheet1!") _, _, err = f.adjustRange("sheet1!")
assert.EqualError(t, err, "parameter is invalid") assert.EqualError(t, err, "parameter is invalid")

@ -111,10 +111,10 @@ func TestRowHeight(t *testing.T) {
f := NewFile() f := NewFile()
sheet1 := f.GetSheetName(0) sheet1 := f.GetSheetName(0)
assert.EqualError(t, f.SetRowHeight(sheet1, 0, defaultRowHeightPixels+1.0), "invalid row number 0") assert.EqualError(t, f.SetRowHeight(sheet1, 0, defaultRowHeightPixels+1.0), newInvalidRowNumberError(0).Error())
_, err := f.GetRowHeight("Sheet1", 0) _, err := f.GetRowHeight("Sheet1", 0)
assert.EqualError(t, err, "invalid row number 0") assert.EqualError(t, err, newInvalidRowNumberError(0).Error())
assert.NoError(t, f.SetRowHeight(sheet1, 1, 111.0)) assert.NoError(t, f.SetRowHeight(sheet1, 1, 111.0))
height, err := f.GetRowHeight(sheet1, 1) height, err := f.GetRowHeight(sheet1, 1)
@ -190,7 +190,7 @@ func TestColumns(t *testing.T) {
rows.curRow = 3 rows.curRow = 3
rows.decoder = f.xmlNewDecoder(bytes.NewReader([]byte(`<worksheet><sheetData><row r="1"><c r="A" t="s"><v>1</v></c></row></sheetData></worksheet>`))) rows.decoder = f.xmlNewDecoder(bytes.NewReader([]byte(`<worksheet><sheetData><row r="1"><c r="A" t="s"><v>1</v></c></row></sheetData></worksheet>`)))
_, err = rows.Columns() _, err = rows.Columns()
assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
// Test token is nil // Test token is nil
rows.decoder = f.xmlNewDecoder(bytes.NewReader(nil)) rows.decoder = f.xmlNewDecoder(bytes.NewReader(nil))
@ -220,12 +220,12 @@ func TestRowVisibility(t *testing.T) {
visiable, err = f.GetRowVisible("Sheet3", 25) visiable, err = f.GetRowVisible("Sheet3", 25)
assert.Equal(t, false, visiable) assert.Equal(t, false, visiable)
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualError(t, f.SetRowVisible("Sheet3", 0, true), "invalid row number 0") assert.EqualError(t, f.SetRowVisible("Sheet3", 0, true), newInvalidRowNumberError(0).Error())
assert.EqualError(t, f.SetRowVisible("SheetN", 2, false), "sheet SheetN is not exist") assert.EqualError(t, f.SetRowVisible("SheetN", 2, false), "sheet SheetN is not exist")
visible, err := f.GetRowVisible("Sheet3", 0) visible, err := f.GetRowVisible("Sheet3", 0)
assert.Equal(t, false, visible) assert.Equal(t, false, visible)
assert.EqualError(t, err, "invalid row number 0") assert.EqualError(t, err, newInvalidRowNumberError(0).Error())
_, err = f.GetRowVisible("SheetN", 1) _, err = f.GetRowVisible("SheetN", 1)
assert.EqualError(t, err, "sheet SheetN is not exist") assert.EqualError(t, err, "sheet SheetN is not exist")
@ -245,9 +245,9 @@ func TestRemoveRow(t *testing.T) {
assert.NoError(t, f.SetCellHyperLink(sheet1, "A5", "https://github.com/xuri/excelize", "External")) assert.NoError(t, f.SetCellHyperLink(sheet1, "A5", "https://github.com/xuri/excelize", "External"))
assert.EqualError(t, f.RemoveRow(sheet1, -1), "invalid row number -1") assert.EqualError(t, f.RemoveRow(sheet1, -1), newInvalidRowNumberError(-1).Error())
assert.EqualError(t, f.RemoveRow(sheet1, 0), "invalid row number 0") assert.EqualError(t, f.RemoveRow(sheet1, 0), newInvalidRowNumberError(0).Error())
assert.NoError(t, f.RemoveRow(sheet1, 4)) assert.NoError(t, f.RemoveRow(sheet1, 4))
if !assert.Len(t, r.SheetData.Row, rowCount-1) { if !assert.Len(t, r.SheetData.Row, rowCount-1) {
@ -306,9 +306,9 @@ func TestInsertRow(t *testing.T) {
assert.NoError(t, f.SetCellHyperLink(sheet1, "A5", "https://github.com/xuri/excelize", "External")) assert.NoError(t, f.SetCellHyperLink(sheet1, "A5", "https://github.com/xuri/excelize", "External"))
assert.EqualError(t, f.InsertRow(sheet1, -1), "invalid row number -1") assert.EqualError(t, f.InsertRow(sheet1, -1), newInvalidRowNumberError(-1).Error())
assert.EqualError(t, f.InsertRow(sheet1, 0), "invalid row number 0") assert.EqualError(t, f.InsertRow(sheet1, 0), newInvalidRowNumberError(0).Error())
assert.NoError(t, f.InsertRow(sheet1, 1)) assert.NoError(t, f.InsertRow(sheet1, 1))
if !assert.Len(t, r.SheetData.Row, rowCount+1) { if !assert.Len(t, r.SheetData.Row, rowCount+1) {
@ -484,7 +484,7 @@ func TestDuplicateRowZeroWithNoRows(t *testing.T) {
t.Run("ZeroWithNoRows", func(t *testing.T) { t.Run("ZeroWithNoRows", func(t *testing.T) {
f := NewFile() f := NewFile()
assert.EqualError(t, f.DuplicateRow(sheet, 0), "invalid row number 0") assert.EqualError(t, f.DuplicateRow(sheet, 0), newInvalidRowNumberError(0).Error())
if !assert.NoError(t, f.SaveAs(fmt.Sprintf(outFile, "ZeroWithNoRows"))) { if !assert.NoError(t, f.SaveAs(fmt.Sprintf(outFile, "ZeroWithNoRows"))) {
t.FailNow() t.FailNow()
@ -800,7 +800,7 @@ func TestDuplicateRowInvalidRowNum(t *testing.T) {
assert.NoError(t, f.SetCellStr(sheet, col, val)) assert.NoError(t, f.SetCellStr(sheet, col, val))
} }
assert.EqualError(t, f.DuplicateRow(sheet, row), fmt.Sprintf("invalid row number %d", row)) assert.EqualError(t, f.DuplicateRow(sheet, row), newInvalidRowNumberError(row).Error())
for col, val := range cells { for col, val := range cells {
v, err := f.GetCellValue(sheet, col) v, err := f.GetCellValue(sheet, col)
@ -822,7 +822,7 @@ func TestDuplicateRowInvalidRowNum(t *testing.T) {
assert.NoError(t, f.SetCellStr(sheet, col, val)) assert.NoError(t, f.SetCellStr(sheet, col, val))
} }
assert.EqualError(t, f.DuplicateRowTo(sheet, row1, row2), fmt.Sprintf("invalid row number %d", row1)) assert.EqualError(t, f.DuplicateRowTo(sheet, row1, row2), newInvalidRowNumberError(row1).Error())
for col, val := range cells { for col, val := range cells {
v, err := f.GetCellValue(sheet, col) v, err := f.GetCellValue(sheet, col)
@ -897,7 +897,7 @@ func TestCheckRow(t *testing.T) {
f.Pkg.Store("xl/worksheets/sheet1.xml", []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?><worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" ><sheetData><row r="2"><c><v>1</v></c><c r="-"><v>2</v></c><c><v>3</v></c><c><v>4</v></c><c r="M2"><v>5</v></c></row></sheetData></worksheet>`)) f.Pkg.Store("xl/worksheets/sheet1.xml", []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?><worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" ><sheetData><row r="2"><c><v>1</v></c><c r="-"><v>2</v></c><c><v>3</v></c><c><v>4</v></c><c r="M2"><v>5</v></c></row></sheetData></worksheet>`))
f.Sheet.Delete("xl/worksheets/sheet1.xml") f.Sheet.Delete("xl/worksheets/sheet1.xml")
delete(f.checked, "xl/worksheets/sheet1.xml") delete(f.checked, "xl/worksheets/sheet1.xml")
assert.EqualError(t, f.SetCellValue("Sheet1", "A1", false), `cannot convert cell "-" to coordinates: invalid cell name "-"`) assert.EqualError(t, f.SetCellValue("Sheet1", "A1", false), newCellNameToCoordinatesError("-", newInvalidCellNameError("-")).Error())
} }
func TestSetRowStyle(t *testing.T) { func TestSetRowStyle(t *testing.T) {

@ -56,7 +56,7 @@ func TestAddShape(t *testing.T) {
"color": "2980B9" "color": "2980B9"
} }
}] }]
}`), `cannot convert cell "A" to coordinates: invalid cell name "A"`) }`), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddShape1.xlsx"))) assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddShape1.xlsx")))
// Test add first shape for given sheet. // Test add first shape for given sheet.

@ -207,7 +207,7 @@ func TestSearchSheet(t *testing.T) {
f.Pkg.Store("xl/worksheets/sheet1.xml", []byte(`<worksheet><sheetData><row r="2"><c r="A" t="str"><v>A</v></c></row></sheetData></worksheet>`)) f.Pkg.Store("xl/worksheets/sheet1.xml", []byte(`<worksheet><sheetData><row r="2"><c r="A" t="str"><v>A</v></c></row></sheetData></worksheet>`))
result, err = f.SearchSheet("Sheet1", "A") result, err = f.SearchSheet("Sheet1", "A")
assert.EqualError(t, err, "cannot convert cell \"A\" to coordinates: invalid cell name \"A\"") assert.EqualError(t, err, newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.Equal(t, []string(nil), result) assert.Equal(t, []string(nil), result)
f.Pkg.Store("xl/worksheets/sheet1.xml", []byte(`<worksheet><sheetData><row r="0"><c r="A1" t="str"><v>A</v></c></row></sheetData></worksheet>`)) f.Pkg.Store("xl/worksheets/sheet1.xml", []byte(`<worksheet><sheetData><row r="0"><c r="A1" t="str"><v>A</v></c></row></sheetData></worksheet>`))
@ -236,7 +236,7 @@ func TestSetHeaderFooter(t *testing.T) {
// Test set header and footer with illegal setting. // Test set header and footer with illegal setting.
assert.EqualError(t, f.SetHeaderFooter("Sheet1", &FormatHeaderFooter{ assert.EqualError(t, f.SetHeaderFooter("Sheet1", &FormatHeaderFooter{
OddHeader: strings.Repeat("c", MaxFieldLength+1), OddHeader: strings.Repeat("c", MaxFieldLength+1),
}), "field OddHeader must be less or equal than 255 characters") }), newFieldLengthError("OddHeader").Error())
assert.NoError(t, f.SetHeaderFooter("Sheet1", nil)) assert.NoError(t, f.SetHeaderFooter("Sheet1", nil))
text := strings.Repeat("一", MaxFieldLength) text := strings.Repeat("一", MaxFieldLength)
@ -276,10 +276,10 @@ func TestDefinedName(t *testing.T) {
Name: "Amount", Name: "Amount",
RefersTo: "Sheet1!$A$2:$D$5", RefersTo: "Sheet1!$A$2:$D$5",
Comment: "defined name comment", Comment: "defined name comment",
}), "the same name already exists on the scope") }), ErrDefinedNameduplicate.Error())
assert.EqualError(t, f.DeleteDefinedName(&DefinedName{ assert.EqualError(t, f.DeleteDefinedName(&DefinedName{
Name: "No Exist Defined Name", Name: "No Exist Defined Name",
}), "no defined name on the scope") }), ErrDefinedNameScope.Error())
assert.Exactly(t, "Sheet1!$A$2:$D$5", f.GetDefinedName()[1].RefersTo) assert.Exactly(t, "Sheet1!$A$2:$D$5", f.GetDefinedName()[1].RefersTo)
assert.NoError(t, f.DeleteDefinedName(&DefinedName{ assert.NoError(t, f.DeleteDefinedName(&DefinedName{
Name: "Amount", Name: "Amount",
@ -316,7 +316,7 @@ func TestInsertPageBreak(t *testing.T) {
assert.NoError(t, f.InsertPageBreak("Sheet1", "B2")) assert.NoError(t, f.InsertPageBreak("Sheet1", "B2"))
assert.NoError(t, f.InsertPageBreak("Sheet1", "C3")) assert.NoError(t, f.InsertPageBreak("Sheet1", "C3"))
assert.NoError(t, f.InsertPageBreak("Sheet1", "C3")) assert.NoError(t, f.InsertPageBreak("Sheet1", "C3"))
assert.EqualError(t, f.InsertPageBreak("Sheet1", "A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.InsertPageBreak("Sheet1", "A"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.EqualError(t, f.InsertPageBreak("SheetN", "C3"), "sheet SheetN is not exist") assert.EqualError(t, f.InsertPageBreak("SheetN", "C3"), "sheet SheetN is not exist")
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestInsertPageBreak.xlsx"))) assert.NoError(t, f.SaveAs(filepath.Join("test", "TestInsertPageBreak.xlsx")))
} }
@ -342,7 +342,7 @@ func TestRemovePageBreak(t *testing.T) {
assert.NoError(t, f.InsertPageBreak("Sheet2", "C2")) assert.NoError(t, f.InsertPageBreak("Sheet2", "C2"))
assert.NoError(t, f.RemovePageBreak("Sheet2", "B2")) assert.NoError(t, f.RemovePageBreak("Sheet2", "B2"))
assert.EqualError(t, f.RemovePageBreak("Sheet1", "A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.RemovePageBreak("Sheet1", "A"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.EqualError(t, f.RemovePageBreak("SheetN", "C3"), "sheet SheetN is not exist") assert.EqualError(t, f.RemovePageBreak("SheetN", "C3"), "sheet SheetN is not exist")
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestRemovePageBreak.xlsx"))) assert.NoError(t, f.SaveAs(filepath.Join("test", "TestRemovePageBreak.xlsx")))
} }

@ -13,7 +13,6 @@ package excelize
import ( import (
"encoding/xml" "encoding/xml"
"errors"
"io" "io"
"strings" "strings"
) )
@ -410,7 +409,7 @@ func (f *File) AddSparkline(sheet string, opt *SparklineOption) (err error) {
sparkTypes = map[string]string{"line": "line", "column": "column", "win_loss": "stacked"} sparkTypes = map[string]string{"line": "line", "column": "column", "win_loss": "stacked"}
if opt.Type != "" { if opt.Type != "" {
if specifiedSparkTypes, ok = sparkTypes[opt.Type]; !ok { if specifiedSparkTypes, ok = sparkTypes[opt.Type]; !ok {
err = errors.New("parameter 'Type' must be 'line', 'column' or 'win_loss'") err = ErrSparklineType
return return
} }
sparkType = specifiedSparkTypes sparkType = specifiedSparkTypes
@ -470,17 +469,17 @@ func (f *File) parseFormatAddSparklineSet(sheet string, opt *SparklineOption) (*
return ws, ErrParameterRequired return ws, ErrParameterRequired
} }
if len(opt.Location) < 1 { if len(opt.Location) < 1 {
return ws, errors.New("parameter 'Location' is required") return ws, ErrSparklineLocation
} }
if len(opt.Range) < 1 { if len(opt.Range) < 1 {
return ws, errors.New("parameter 'Range' is required") return ws, ErrSparklineRange
} }
// The ranges and locations must match.\ // The ranges and locations must match.\
if len(opt.Location) != len(opt.Range) { if len(opt.Location) != len(opt.Range) {
return ws, errors.New(`must have the same number of 'Location' and 'Range' parameters`) return ws, ErrSparkline
} }
if opt.Style < 0 || opt.Style > 35 { if opt.Style < 0 || opt.Style > 35 {
return ws, errors.New("parameter 'Style' must betweent 0-35") return ws, ErrSparklineStyle
} }
if ws.ExtLst == nil { if ws.ExtLst == nil {
ws.ExtLst = &xlsxExtLst{} ws.ExtLst = &xlsxExtLst{}

@ -220,38 +220,38 @@ func TestAddSparkline(t *testing.T) {
Range: []string{"Sheet2!A3:E3"}, Range: []string{"Sheet2!A3:E3"},
}), "sheet SheetN is not exist") }), "sheet SheetN is not exist")
assert.EqualError(t, f.AddSparkline("Sheet1", nil), "parameter is required") assert.EqualError(t, f.AddSparkline("Sheet1", nil), ErrParameterRequired.Error())
assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{ assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{
Range: []string{"Sheet2!A3:E3"}, Range: []string{"Sheet2!A3:E3"},
}), `parameter 'Location' is required`) }), ErrSparklineLocation.Error())
assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{ assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{
Location: []string{"F3"}, Location: []string{"F3"},
}), `parameter 'Range' is required`) }), ErrSparklineRange.Error())
assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{ assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{
Location: []string{"F2", "F3"}, Location: []string{"F2", "F3"},
Range: []string{"Sheet2!A3:E3"}, Range: []string{"Sheet2!A3:E3"},
}), `must have the same number of 'Location' and 'Range' parameters`) }), ErrSparkline.Error())
assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{ assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{
Location: []string{"F3"}, Location: []string{"F3"},
Range: []string{"Sheet2!A3:E3"}, Range: []string{"Sheet2!A3:E3"},
Type: "unknown_type", Type: "unknown_type",
}), `parameter 'Type' must be 'line', 'column' or 'win_loss'`) }), ErrSparklineType.Error())
assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{ assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{
Location: []string{"F3"}, Location: []string{"F3"},
Range: []string{"Sheet2!A3:E3"}, Range: []string{"Sheet2!A3:E3"},
Style: -1, Style: -1,
}), `parameter 'Style' must betweent 0-35`) }), ErrSparklineStyle.Error())
assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{ assert.EqualError(t, f.AddSparkline("Sheet1", &SparklineOption{
Location: []string{"F3"}, Location: []string{"F3"},
Range: []string{"Sheet2!A3:E3"}, Range: []string{"Sheet2!A3:E3"},
Style: -1, Style: -1,
}), `parameter 'Style' must betweent 0-35`) }), ErrSparklineStyle.Error())
ws, ok := f.Sheet.Load("xl/worksheets/sheet1.xml") ws, ok := f.Sheet.Load("xl/worksheets/sheet1.xml")
assert.True(t, ok) assert.True(t, ok)

@ -174,8 +174,8 @@ func TestStreamTable(t *testing.T) {
// Test add table with illegal formatset. // Test add table with illegal formatset.
assert.EqualError(t, streamWriter.AddTable("B26", "A21", `{x}`), "invalid character 'x' looking for beginning of object key string") assert.EqualError(t, streamWriter.AddTable("B26", "A21", `{x}`), "invalid character 'x' looking for beginning of object key string")
// Test add table with illegal cell coordinates. // Test add table with illegal cell coordinates.
assert.EqualError(t, streamWriter.AddTable("A", "B1", `{}`), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, streamWriter.AddTable("A", "B1", `{}`), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.EqualError(t, streamWriter.AddTable("A1", "B", `{}`), `cannot convert cell "B" to coordinates: invalid cell name "B"`) assert.EqualError(t, streamWriter.AddTable("A1", "B", `{}`), newCellNameToCoordinatesError("B", newInvalidCellNameError("B")).Error())
} }
func TestStreamMergeCells(t *testing.T) { func TestStreamMergeCells(t *testing.T) {
@ -184,7 +184,7 @@ func TestStreamMergeCells(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.NoError(t, streamWriter.MergeCell("A1", "D1")) assert.NoError(t, streamWriter.MergeCell("A1", "D1"))
// Test merge cells with illegal cell coordinates. // Test merge cells with illegal cell coordinates.
assert.EqualError(t, streamWriter.MergeCell("A", "D1"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, streamWriter.MergeCell("A", "D1"), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.NoError(t, streamWriter.Flush()) assert.NoError(t, streamWriter.Flush())
// Save spreadsheet by the given path. // Save spreadsheet by the given path.
assert.NoError(t, file.SaveAs(filepath.Join("test", "TestStreamMergeCells.xlsx"))) assert.NoError(t, file.SaveAs(filepath.Join("test", "TestStreamMergeCells.xlsx")))
@ -204,7 +204,7 @@ func TestSetRow(t *testing.T) {
file := NewFile() file := NewFile()
streamWriter, err := file.NewStreamWriter("Sheet1") streamWriter, err := file.NewStreamWriter("Sheet1")
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualError(t, streamWriter.SetRow("A", []interface{}{}), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, streamWriter.SetRow("A", []interface{}{}), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
} }
func TestSetCellValFunc(t *testing.T) { func TestSetCellValFunc(t *testing.T) {

@ -34,8 +34,8 @@ func TestAddTable(t *testing.T) {
// Test add table with illegal formatset. // Test add table with illegal formatset.
assert.EqualError(t, f.AddTable("Sheet1", "B26", "A21", `{x}`), "invalid character 'x' looking for beginning of object key string") assert.EqualError(t, f.AddTable("Sheet1", "B26", "A21", `{x}`), "invalid character 'x' looking for beginning of object key string")
// Test add table with illegal cell coordinates. // Test add table with illegal cell coordinates.
assert.EqualError(t, f.AddTable("Sheet1", "A", "B1", `{}`), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.AddTable("Sheet1", "A", "B1", `{}`), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.EqualError(t, f.AddTable("Sheet1", "A1", "B", `{}`), `cannot convert cell "B" to coordinates: invalid cell name "B"`) assert.EqualError(t, f.AddTable("Sheet1", "A1", "B", `{}`), newCellNameToCoordinatesError("B", newInvalidCellNameError("B")).Error())
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddTable.xlsx"))) assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddTable.xlsx")))
@ -73,8 +73,8 @@ func TestAutoFilter(t *testing.T) {
} }
// testing AutoFilter with illegal cell coordinates. // testing AutoFilter with illegal cell coordinates.
assert.EqualError(t, f.AutoFilter("Sheet1", "A", "B1", ""), `cannot convert cell "A" to coordinates: invalid cell name "A"`) assert.EqualError(t, f.AutoFilter("Sheet1", "A", "B1", ""), newCellNameToCoordinatesError("A", newInvalidCellNameError("A")).Error())
assert.EqualError(t, f.AutoFilter("Sheet1", "A1", "B", ""), `cannot convert cell "B" to coordinates: invalid cell name "B"`) assert.EqualError(t, f.AutoFilter("Sheet1", "A1", "B", ""), newCellNameToCoordinatesError("B", newInvalidCellNameError("B")).Error())
} }
func TestAutoFilterError(t *testing.T) { func TestAutoFilterError(t *testing.T) {
@ -109,7 +109,7 @@ func TestAutoFilterError(t *testing.T) {
assert.EqualError(t, f.autoFilter("Sheet1", "A1", 1, 1, &formatAutoFilter{ assert.EqualError(t, f.autoFilter("Sheet1", "A1", 1, 1, &formatAutoFilter{
Column: "-", Column: "-",
Expression: "-", Expression: "-",
}), `invalid column name "-"`) }), newInvalidColumnNameError("-").Error())
assert.EqualError(t, f.autoFilter("Sheet1", "A1", 1, 100, &formatAutoFilter{ assert.EqualError(t, f.autoFilter("Sheet1", "A1", 1, 100, &formatAutoFilter{
Column: "A", Column: "A",
Expression: "-", Expression: "-",

Loading…
Cancel
Save