From 5ca7231ed408ac264f509ff52b5d28ff4fbda757 Mon Sep 17 00:00:00 2001 From: xuri Date: Fri, 3 Jan 2020 23:57:25 +0800 Subject: optimize code and comments: use println errors instead of panic --- cell_test.go | 2 +- cellmerged.go | 197 ----------------------------------------------------- cellmerged_test.go | 169 --------------------------------------------- excelize_test.go | 2 +- file_test.go | 7 +- merge.go | 197 +++++++++++++++++++++++++++++++++++++++++++++++++++++ merge_test.go | 169 +++++++++++++++++++++++++++++++++++++++++++++ rows.go | 13 ++-- rows_test.go | 1 + sheet.go | 4 +- sheet_test.go | 12 ++-- sheetpr_test.go | 8 +-- sheetview_test.go | 24 +++---- sparkline_test.go | 4 +- 14 files changed, 407 insertions(+), 402 deletions(-) delete mode 100644 cellmerged.go delete mode 100644 cellmerged_test.go create mode 100644 merge.go create mode 100644 merge_test.go diff --git a/cell_test.go b/cell_test.go index 1efbc5a..60f8751 100644 --- a/cell_test.go +++ b/cell_test.go @@ -110,7 +110,7 @@ func ExampleFile_SetCellFloat() { f := NewFile() var x = 3.14159265 if err := f.SetCellFloat("Sheet1", "A1", x, 2, 64); err != nil { - fmt.Println(err) + println(err.Error()) } val, _ := f.GetCellValue("Sheet1", "A1") fmt.Println(val) diff --git a/cellmerged.go b/cellmerged.go deleted file mode 100644 index b952a1e..0000000 --- a/cellmerged.go +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright 2016 - 2020 The excelize Authors. All rights reserved. Use of -// this source code is governed by a BSD-style license that can be found in -// the LICENSE file. -// -// Package excelize providing a set of functions that allow you to write to -// and read from XLSX files. Support reads and writes XLSX file generated by -// Microsoft Excelâ„¢ 2007 and later. Support save file without losing original -// charts of XLSX. This library needs Go version 1.10 or later. - -package excelize - -import ( - "fmt" - "strings" -) - -// MergeCell provides a function to merge cells by given coordinate area and -// sheet name. For example create a merged cell of D3:E9 on Sheet1: -// -// err := f.MergeCell("Sheet1", "D3", "E9") -// -// If you create a merged cell that overlaps with another existing merged cell, -// those merged cells that already exist will be removed. -// -// B1(x1,y1) D1(x2,y1) -// +--------------------------------+ -// | | -// | | -// A4(x3,y3) | C4(x4,y3) | -// +-----------------------------+ | -// | | | | -// | | | | -// | |B5(x1,y2) | D5(x2,y2)| -// | +--------------------------------+ -// | | -// | | -// |A8(x3,y4) C8(x4,y4)| -// +-----------------------------+ -// -func (f *File) MergeCell(sheet, hcell, vcell string) error { - rect1, err := f.areaRefToCoordinates(hcell + ":" + vcell) - if err != nil { - return err - } - // Correct the coordinate area, such correct C1:B3 to B1:C3. - _ = sortCoordinates(rect1) - - hcell, _ = CoordinatesToCellName(rect1[0], rect1[1]) - vcell, _ = CoordinatesToCellName(rect1[2], rect1[3]) - - xlsx, err := f.workSheetReader(sheet) - if err != nil { - return err - } - ref := hcell + ":" + vcell - if xlsx.MergeCells != nil { - for i := 0; i < len(xlsx.MergeCells.Cells); i++ { - cellData := xlsx.MergeCells.Cells[i] - if cellData == nil { - continue - } - cc := strings.Split(cellData.Ref, ":") - if len(cc) != 2 { - return fmt.Errorf("invalid area %q", cellData.Ref) - } - - rect2, err := f.areaRefToCoordinates(cellData.Ref) - if err != nil { - return err - } - - // Delete the merged cells of the overlapping area. - if isOverlap(rect1, rect2) { - xlsx.MergeCells.Cells = append(xlsx.MergeCells.Cells[:i], xlsx.MergeCells.Cells[i+1:]...) - i-- - - if rect1[0] > rect2[0] { - rect1[0], rect2[0] = rect2[0], rect1[0] - } - - if rect1[2] < rect2[2] { - rect1[2], rect2[2] = rect2[2], rect1[2] - } - - if rect1[1] > rect2[1] { - rect1[1], rect2[1] = rect2[1], rect1[1] - } - - if rect1[3] < rect2[3] { - rect1[3], rect2[3] = rect2[3], rect1[3] - } - hcell, _ = CoordinatesToCellName(rect1[0], rect1[1]) - vcell, _ = CoordinatesToCellName(rect1[2], rect1[3]) - ref = hcell + ":" + vcell - } - } - xlsx.MergeCells.Cells = append(xlsx.MergeCells.Cells, &xlsxMergeCell{Ref: ref}) - } else { - xlsx.MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: ref}}} - } - return err -} - -// UnmergeCell provides a function to unmerge a given coordinate area. -// For example unmerge area D3:E9 on Sheet1: -// -// err := f.UnmergeCell("Sheet1", "D3", "E9") -// -// Attention: overlapped areas will also be unmerged. -func (f *File) UnmergeCell(sheet string, hcell, vcell string) error { - xlsx, err := f.workSheetReader(sheet) - if err != nil { - return err - } - rect1, err := f.areaRefToCoordinates(hcell + ":" + vcell) - if err != nil { - return err - } - - // Correct the coordinate area, such correct C1:B3 to B1:C3. - _ = sortCoordinates(rect1) - - // return nil since no MergeCells in the sheet - if xlsx.MergeCells == nil { - return nil - } - - i := 0 - for _, cellData := range xlsx.MergeCells.Cells { - if cellData == nil { - continue - } - cc := strings.Split(cellData.Ref, ":") - if len(cc) != 2 { - return fmt.Errorf("invalid area %q", cellData.Ref) - } - - rect2, err := f.areaRefToCoordinates(cellData.Ref) - if err != nil { - return err - } - - if isOverlap(rect1, rect2) { - continue - } - xlsx.MergeCells.Cells[i] = cellData - i++ - } - xlsx.MergeCells.Cells = xlsx.MergeCells.Cells[:i] - return nil -} - -// GetMergeCells provides a function to get all merged cells from a worksheet -// currently. -func (f *File) GetMergeCells(sheet string) ([]MergeCell, error) { - var mergeCells []MergeCell - xlsx, err := f.workSheetReader(sheet) - if err != nil { - return mergeCells, err - } - if xlsx.MergeCells != nil { - mergeCells = make([]MergeCell, 0, len(xlsx.MergeCells.Cells)) - - for i := range xlsx.MergeCells.Cells { - ref := xlsx.MergeCells.Cells[i].Ref - axis := strings.Split(ref, ":")[0] - val, _ := f.GetCellValue(sheet, axis) - mergeCells = append(mergeCells, []string{ref, val}) - } - } - - return mergeCells, err -} - -// MergeCell define a merged cell data. -// It consists of the following structure. -// example: []string{"D4:E10", "cell value"} -type MergeCell []string - -// GetCellValue returns merged cell value. -func (m *MergeCell) GetCellValue() string { - return (*m)[1] -} - -// GetStartAxis returns the merge start axis. -// example: "C2" -func (m *MergeCell) GetStartAxis() string { - axis := strings.Split((*m)[0], ":") - return axis[0] -} - -// GetEndAxis returns the merge end axis. -// example: "D4" -func (m *MergeCell) GetEndAxis() string { - axis := strings.Split((*m)[0], ":") - return axis[1] -} diff --git a/cellmerged_test.go b/cellmerged_test.go deleted file mode 100644 index e880d05..0000000 --- a/cellmerged_test.go +++ /dev/null @@ -1,169 +0,0 @@ -package excelize - -import ( - "path/filepath" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestMergeCell(t *testing.T) { - f, err := OpenFile(filepath.Join("test", "Book1.xlsx")) - if !assert.NoError(t, err) { - t.FailNow() - } - assert.EqualError(t, f.MergeCell("Sheet1", "A", "B"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) - assert.NoError(t, f.MergeCell("Sheet1", "D9", "D9")) - assert.NoError(t, f.MergeCell("Sheet1", "D9", "E9")) - assert.NoError(t, f.MergeCell("Sheet1", "H14", "G13")) - assert.NoError(t, f.MergeCell("Sheet1", "C9", "D8")) - assert.NoError(t, f.MergeCell("Sheet1", "F11", "G13")) - assert.NoError(t, f.MergeCell("Sheet1", "H7", "B15")) - assert.NoError(t, f.MergeCell("Sheet1", "D11", "F13")) - assert.NoError(t, f.MergeCell("Sheet1", "G10", "K12")) - assert.NoError(t, f.SetCellValue("Sheet1", "G11", "set value in merged cell")) - assert.NoError(t, f.SetCellInt("Sheet1", "H11", 100)) - assert.NoError(t, f.SetCellValue("Sheet1", "I11", float64(0.5))) - assert.NoError(t, f.SetCellHyperLink("Sheet1", "J11", "https://github.com/360EntSecGroup-Skylar/excelize", "External")) - assert.NoError(t, f.SetCellFormula("Sheet1", "G12", "SUM(Sheet1!B19,Sheet1!C19)")) - value, err := f.GetCellValue("Sheet1", "H11") - assert.Equal(t, "0.5", value) - assert.NoError(t, err) - value, err = f.GetCellValue("Sheet2", "A6") // Merged cell ref is single coordinate. - assert.Equal(t, "", value) - assert.NoError(t, err) - value, err = f.GetCellFormula("Sheet1", "G12") - assert.Equal(t, "SUM(Sheet1!B19,Sheet1!C19)", value) - assert.NoError(t, err) - - f.NewSheet("Sheet3") - assert.NoError(t, f.MergeCell("Sheet3", "D11", "F13")) - assert.NoError(t, f.MergeCell("Sheet3", "G10", "K12")) - - assert.NoError(t, f.MergeCell("Sheet3", "B1", "D5")) // B1:D5 - assert.NoError(t, f.MergeCell("Sheet3", "E1", "F5")) // E1:F5 - - assert.NoError(t, f.MergeCell("Sheet3", "H2", "I5")) - assert.NoError(t, f.MergeCell("Sheet3", "I4", "J6")) // H2:J6 - - assert.NoError(t, f.MergeCell("Sheet3", "M2", "N5")) - assert.NoError(t, f.MergeCell("Sheet3", "L4", "M6")) // L2:N6 - - assert.NoError(t, f.MergeCell("Sheet3", "P4", "Q7")) - assert.NoError(t, f.MergeCell("Sheet3", "O2", "P5")) // O2:Q7 - - assert.NoError(t, f.MergeCell("Sheet3", "A9", "B12")) - assert.NoError(t, f.MergeCell("Sheet3", "B7", "C9")) // A7:C12 - - assert.NoError(t, f.MergeCell("Sheet3", "E9", "F10")) - assert.NoError(t, f.MergeCell("Sheet3", "D8", "G12")) - - assert.NoError(t, f.MergeCell("Sheet3", "I8", "I12")) - assert.NoError(t, f.MergeCell("Sheet3", "I10", "K10")) - - assert.NoError(t, f.MergeCell("Sheet3", "M8", "Q13")) - assert.NoError(t, f.MergeCell("Sheet3", "N10", "O11")) - - // Test get merged cells on not exists worksheet. - assert.EqualError(t, f.MergeCell("SheetN", "N10", "O11"), "sheet SheetN is not exist") - - assert.NoError(t, f.SaveAs(filepath.Join("test", "TestMergeCell.xlsx"))) - - f = NewFile() - assert.NoError(t, f.MergeCell("Sheet1", "A2", "B3")) - f.Sheet["xl/worksheets/sheet1.xml"].MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{nil, nil}} - assert.NoError(t, f.MergeCell("Sheet1", "A2", "B3")) - - f.Sheet["xl/worksheets/sheet1.xml"].MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A1"}}} - assert.EqualError(t, f.MergeCell("Sheet1", "A2", "B3"), `invalid area "A1"`) - - f.Sheet["xl/worksheets/sheet1.xml"].MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A:A"}}} - assert.EqualError(t, f.MergeCell("Sheet1", "A2", "B3"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) -} - -func TestGetMergeCells(t *testing.T) { - wants := []struct { - value string - start string - end string - }{{ - value: "A1", - start: "A1", - end: "B1", - }, { - value: "A2", - start: "A2", - end: "A3", - }, { - value: "A4", - start: "A4", - end: "B5", - }, { - value: "A7", - start: "A7", - end: "C10", - }} - - f, err := OpenFile(filepath.Join("test", "MergeCell.xlsx")) - if !assert.NoError(t, err) { - t.FailNow() - } - sheet1 := f.GetSheetName(1) - - mergeCells, err := f.GetMergeCells(sheet1) - if !assert.Len(t, mergeCells, len(wants)) { - t.FailNow() - } - assert.NoError(t, err) - - for i, m := range mergeCells { - assert.Equal(t, wants[i].value, m.GetCellValue()) - assert.Equal(t, wants[i].start, m.GetStartAxis()) - assert.Equal(t, wants[i].end, m.GetEndAxis()) - } - - // Test get merged cells on not exists worksheet. - _, err = f.GetMergeCells("SheetN") - assert.EqualError(t, err, "sheet SheetN is not exist") -} - -func TestUnmergeCell(t *testing.T) { - f, err := OpenFile(filepath.Join("test", "MergeCell.xlsx")) - if !assert.NoError(t, err) { - t.FailNow() - } - sheet1 := f.GetSheetName(1) - - xlsx, err := f.workSheetReader(sheet1) - assert.NoError(t, err) - - mergeCellNum := len(xlsx.MergeCells.Cells) - - assert.EqualError(t, f.UnmergeCell("Sheet1", "A", "A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) - - // unmerge the mergecell that contains A1 - assert.NoError(t, f.UnmergeCell(sheet1, "A1", "A1")) - if len(xlsx.MergeCells.Cells) != mergeCellNum-1 { - t.FailNow() - } - - assert.NoError(t, f.SaveAs(filepath.Join("test", "TestUnmergeCell.xlsx"))) - - f = NewFile() - assert.NoError(t, f.MergeCell("Sheet1", "A2", "B3")) - // Test unmerged area on not exists worksheet. - assert.EqualError(t, f.UnmergeCell("SheetN", "A1", "A1"), "sheet SheetN is not exist") - - f.Sheet["xl/worksheets/sheet1.xml"].MergeCells = nil - assert.NoError(t, f.UnmergeCell("Sheet1", "H7", "B15")) - - f.Sheet["xl/worksheets/sheet1.xml"].MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{nil, nil}} - assert.NoError(t, f.UnmergeCell("Sheet1", "H15", "B7")) - - f.Sheet["xl/worksheets/sheet1.xml"].MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A1"}}} - assert.EqualError(t, f.UnmergeCell("Sheet1", "A2", "B3"), `invalid area "A1"`) - - f.Sheet["xl/worksheets/sheet1.xml"].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"`) - -} diff --git a/excelize_test.go b/excelize_test.go index ea82828..c7f5cad 100644 --- a/excelize_test.go +++ b/excelize_test.go @@ -1259,7 +1259,7 @@ func fillCells(f *File, sheet string, colCount, rowCount int) { for row := 1; row <= rowCount; row++ { cell, _ := CoordinatesToCellName(col, row) if err := f.SetCellStr(sheet, cell, cell); err != nil { - panic(err) + println(err.Error()) } } } diff --git a/file_test.go b/file_test.go index 97ff720..8c5050c 100644 --- a/file_test.go +++ b/file_test.go @@ -12,18 +12,17 @@ func BenchmarkWrite(b *testing.B) { for col := 1; col <= 20; col++ { val, err := CoordinatesToCellName(col, row) if err != nil { - panic(err) + b.Error(err) } if err := f.SetCellDefault("Sheet1", val, s); err != nil { - panic(err) + b.Error(err) } } } // Save xlsx file by the given path. err := f.SaveAs("./test.xlsx") if err != nil { - panic(err) + b.Error(err) } } - } diff --git a/merge.go b/merge.go new file mode 100644 index 0000000..b952a1e --- /dev/null +++ b/merge.go @@ -0,0 +1,197 @@ +// Copyright 2016 - 2020 The excelize Authors. All rights reserved. Use of +// this source code is governed by a BSD-style license that can be found in +// the LICENSE file. +// +// Package excelize providing a set of functions that allow you to write to +// and read from XLSX files. Support reads and writes XLSX file generated by +// Microsoft Excelâ„¢ 2007 and later. Support save file without losing original +// charts of XLSX. This library needs Go version 1.10 or later. + +package excelize + +import ( + "fmt" + "strings" +) + +// MergeCell provides a function to merge cells by given coordinate area and +// sheet name. For example create a merged cell of D3:E9 on Sheet1: +// +// err := f.MergeCell("Sheet1", "D3", "E9") +// +// If you create a merged cell that overlaps with another existing merged cell, +// those merged cells that already exist will be removed. +// +// B1(x1,y1) D1(x2,y1) +// +--------------------------------+ +// | | +// | | +// A4(x3,y3) | C4(x4,y3) | +// +-----------------------------+ | +// | | | | +// | | | | +// | |B5(x1,y2) | D5(x2,y2)| +// | +--------------------------------+ +// | | +// | | +// |A8(x3,y4) C8(x4,y4)| +// +-----------------------------+ +// +func (f *File) MergeCell(sheet, hcell, vcell string) error { + rect1, err := f.areaRefToCoordinates(hcell + ":" + vcell) + if err != nil { + return err + } + // Correct the coordinate area, such correct C1:B3 to B1:C3. + _ = sortCoordinates(rect1) + + hcell, _ = CoordinatesToCellName(rect1[0], rect1[1]) + vcell, _ = CoordinatesToCellName(rect1[2], rect1[3]) + + xlsx, err := f.workSheetReader(sheet) + if err != nil { + return err + } + ref := hcell + ":" + vcell + if xlsx.MergeCells != nil { + for i := 0; i < len(xlsx.MergeCells.Cells); i++ { + cellData := xlsx.MergeCells.Cells[i] + if cellData == nil { + continue + } + cc := strings.Split(cellData.Ref, ":") + if len(cc) != 2 { + return fmt.Errorf("invalid area %q", cellData.Ref) + } + + rect2, err := f.areaRefToCoordinates(cellData.Ref) + if err != nil { + return err + } + + // Delete the merged cells of the overlapping area. + if isOverlap(rect1, rect2) { + xlsx.MergeCells.Cells = append(xlsx.MergeCells.Cells[:i], xlsx.MergeCells.Cells[i+1:]...) + i-- + + if rect1[0] > rect2[0] { + rect1[0], rect2[0] = rect2[0], rect1[0] + } + + if rect1[2] < rect2[2] { + rect1[2], rect2[2] = rect2[2], rect1[2] + } + + if rect1[1] > rect2[1] { + rect1[1], rect2[1] = rect2[1], rect1[1] + } + + if rect1[3] < rect2[3] { + rect1[3], rect2[3] = rect2[3], rect1[3] + } + hcell, _ = CoordinatesToCellName(rect1[0], rect1[1]) + vcell, _ = CoordinatesToCellName(rect1[2], rect1[3]) + ref = hcell + ":" + vcell + } + } + xlsx.MergeCells.Cells = append(xlsx.MergeCells.Cells, &xlsxMergeCell{Ref: ref}) + } else { + xlsx.MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: ref}}} + } + return err +} + +// UnmergeCell provides a function to unmerge a given coordinate area. +// For example unmerge area D3:E9 on Sheet1: +// +// err := f.UnmergeCell("Sheet1", "D3", "E9") +// +// Attention: overlapped areas will also be unmerged. +func (f *File) UnmergeCell(sheet string, hcell, vcell string) error { + xlsx, err := f.workSheetReader(sheet) + if err != nil { + return err + } + rect1, err := f.areaRefToCoordinates(hcell + ":" + vcell) + if err != nil { + return err + } + + // Correct the coordinate area, such correct C1:B3 to B1:C3. + _ = sortCoordinates(rect1) + + // return nil since no MergeCells in the sheet + if xlsx.MergeCells == nil { + return nil + } + + i := 0 + for _, cellData := range xlsx.MergeCells.Cells { + if cellData == nil { + continue + } + cc := strings.Split(cellData.Ref, ":") + if len(cc) != 2 { + return fmt.Errorf("invalid area %q", cellData.Ref) + } + + rect2, err := f.areaRefToCoordinates(cellData.Ref) + if err != nil { + return err + } + + if isOverlap(rect1, rect2) { + continue + } + xlsx.MergeCells.Cells[i] = cellData + i++ + } + xlsx.MergeCells.Cells = xlsx.MergeCells.Cells[:i] + return nil +} + +// GetMergeCells provides a function to get all merged cells from a worksheet +// currently. +func (f *File) GetMergeCells(sheet string) ([]MergeCell, error) { + var mergeCells []MergeCell + xlsx, err := f.workSheetReader(sheet) + if err != nil { + return mergeCells, err + } + if xlsx.MergeCells != nil { + mergeCells = make([]MergeCell, 0, len(xlsx.MergeCells.Cells)) + + for i := range xlsx.MergeCells.Cells { + ref := xlsx.MergeCells.Cells[i].Ref + axis := strings.Split(ref, ":")[0] + val, _ := f.GetCellValue(sheet, axis) + mergeCells = append(mergeCells, []string{ref, val}) + } + } + + return mergeCells, err +} + +// MergeCell define a merged cell data. +// It consists of the following structure. +// example: []string{"D4:E10", "cell value"} +type MergeCell []string + +// GetCellValue returns merged cell value. +func (m *MergeCell) GetCellValue() string { + return (*m)[1] +} + +// GetStartAxis returns the merge start axis. +// example: "C2" +func (m *MergeCell) GetStartAxis() string { + axis := strings.Split((*m)[0], ":") + return axis[0] +} + +// GetEndAxis returns the merge end axis. +// example: "D4" +func (m *MergeCell) GetEndAxis() string { + axis := strings.Split((*m)[0], ":") + return axis[1] +} diff --git a/merge_test.go b/merge_test.go new file mode 100644 index 0000000..e880d05 --- /dev/null +++ b/merge_test.go @@ -0,0 +1,169 @@ +package excelize + +import ( + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestMergeCell(t *testing.T) { + f, err := OpenFile(filepath.Join("test", "Book1.xlsx")) + if !assert.NoError(t, err) { + t.FailNow() + } + assert.EqualError(t, f.MergeCell("Sheet1", "A", "B"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + assert.NoError(t, f.MergeCell("Sheet1", "D9", "D9")) + assert.NoError(t, f.MergeCell("Sheet1", "D9", "E9")) + assert.NoError(t, f.MergeCell("Sheet1", "H14", "G13")) + assert.NoError(t, f.MergeCell("Sheet1", "C9", "D8")) + assert.NoError(t, f.MergeCell("Sheet1", "F11", "G13")) + assert.NoError(t, f.MergeCell("Sheet1", "H7", "B15")) + assert.NoError(t, f.MergeCell("Sheet1", "D11", "F13")) + assert.NoError(t, f.MergeCell("Sheet1", "G10", "K12")) + assert.NoError(t, f.SetCellValue("Sheet1", "G11", "set value in merged cell")) + assert.NoError(t, f.SetCellInt("Sheet1", "H11", 100)) + assert.NoError(t, f.SetCellValue("Sheet1", "I11", float64(0.5))) + assert.NoError(t, f.SetCellHyperLink("Sheet1", "J11", "https://github.com/360EntSecGroup-Skylar/excelize", "External")) + assert.NoError(t, f.SetCellFormula("Sheet1", "G12", "SUM(Sheet1!B19,Sheet1!C19)")) + value, err := f.GetCellValue("Sheet1", "H11") + assert.Equal(t, "0.5", value) + assert.NoError(t, err) + value, err = f.GetCellValue("Sheet2", "A6") // Merged cell ref is single coordinate. + assert.Equal(t, "", value) + assert.NoError(t, err) + value, err = f.GetCellFormula("Sheet1", "G12") + assert.Equal(t, "SUM(Sheet1!B19,Sheet1!C19)", value) + assert.NoError(t, err) + + f.NewSheet("Sheet3") + assert.NoError(t, f.MergeCell("Sheet3", "D11", "F13")) + assert.NoError(t, f.MergeCell("Sheet3", "G10", "K12")) + + assert.NoError(t, f.MergeCell("Sheet3", "B1", "D5")) // B1:D5 + assert.NoError(t, f.MergeCell("Sheet3", "E1", "F5")) // E1:F5 + + assert.NoError(t, f.MergeCell("Sheet3", "H2", "I5")) + assert.NoError(t, f.MergeCell("Sheet3", "I4", "J6")) // H2:J6 + + assert.NoError(t, f.MergeCell("Sheet3", "M2", "N5")) + assert.NoError(t, f.MergeCell("Sheet3", "L4", "M6")) // L2:N6 + + assert.NoError(t, f.MergeCell("Sheet3", "P4", "Q7")) + assert.NoError(t, f.MergeCell("Sheet3", "O2", "P5")) // O2:Q7 + + assert.NoError(t, f.MergeCell("Sheet3", "A9", "B12")) + assert.NoError(t, f.MergeCell("Sheet3", "B7", "C9")) // A7:C12 + + assert.NoError(t, f.MergeCell("Sheet3", "E9", "F10")) + assert.NoError(t, f.MergeCell("Sheet3", "D8", "G12")) + + assert.NoError(t, f.MergeCell("Sheet3", "I8", "I12")) + assert.NoError(t, f.MergeCell("Sheet3", "I10", "K10")) + + assert.NoError(t, f.MergeCell("Sheet3", "M8", "Q13")) + assert.NoError(t, f.MergeCell("Sheet3", "N10", "O11")) + + // Test get merged cells on not exists worksheet. + assert.EqualError(t, f.MergeCell("SheetN", "N10", "O11"), "sheet SheetN is not exist") + + assert.NoError(t, f.SaveAs(filepath.Join("test", "TestMergeCell.xlsx"))) + + f = NewFile() + assert.NoError(t, f.MergeCell("Sheet1", "A2", "B3")) + f.Sheet["xl/worksheets/sheet1.xml"].MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{nil, nil}} + assert.NoError(t, f.MergeCell("Sheet1", "A2", "B3")) + + f.Sheet["xl/worksheets/sheet1.xml"].MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A1"}}} + assert.EqualError(t, f.MergeCell("Sheet1", "A2", "B3"), `invalid area "A1"`) + + f.Sheet["xl/worksheets/sheet1.xml"].MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A:A"}}} + assert.EqualError(t, f.MergeCell("Sheet1", "A2", "B3"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) +} + +func TestGetMergeCells(t *testing.T) { + wants := []struct { + value string + start string + end string + }{{ + value: "A1", + start: "A1", + end: "B1", + }, { + value: "A2", + start: "A2", + end: "A3", + }, { + value: "A4", + start: "A4", + end: "B5", + }, { + value: "A7", + start: "A7", + end: "C10", + }} + + f, err := OpenFile(filepath.Join("test", "MergeCell.xlsx")) + if !assert.NoError(t, err) { + t.FailNow() + } + sheet1 := f.GetSheetName(1) + + mergeCells, err := f.GetMergeCells(sheet1) + if !assert.Len(t, mergeCells, len(wants)) { + t.FailNow() + } + assert.NoError(t, err) + + for i, m := range mergeCells { + assert.Equal(t, wants[i].value, m.GetCellValue()) + assert.Equal(t, wants[i].start, m.GetStartAxis()) + assert.Equal(t, wants[i].end, m.GetEndAxis()) + } + + // Test get merged cells on not exists worksheet. + _, err = f.GetMergeCells("SheetN") + assert.EqualError(t, err, "sheet SheetN is not exist") +} + +func TestUnmergeCell(t *testing.T) { + f, err := OpenFile(filepath.Join("test", "MergeCell.xlsx")) + if !assert.NoError(t, err) { + t.FailNow() + } + sheet1 := f.GetSheetName(1) + + xlsx, err := f.workSheetReader(sheet1) + assert.NoError(t, err) + + mergeCellNum := len(xlsx.MergeCells.Cells) + + assert.EqualError(t, f.UnmergeCell("Sheet1", "A", "A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`) + + // unmerge the mergecell that contains A1 + assert.NoError(t, f.UnmergeCell(sheet1, "A1", "A1")) + if len(xlsx.MergeCells.Cells) != mergeCellNum-1 { + t.FailNow() + } + + assert.NoError(t, f.SaveAs(filepath.Join("test", "TestUnmergeCell.xlsx"))) + + f = NewFile() + assert.NoError(t, f.MergeCell("Sheet1", "A2", "B3")) + // Test unmerged area on not exists worksheet. + assert.EqualError(t, f.UnmergeCell("SheetN", "A1", "A1"), "sheet SheetN is not exist") + + f.Sheet["xl/worksheets/sheet1.xml"].MergeCells = nil + assert.NoError(t, f.UnmergeCell("Sheet1", "H7", "B15")) + + f.Sheet["xl/worksheets/sheet1.xml"].MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{nil, nil}} + assert.NoError(t, f.UnmergeCell("Sheet1", "H15", "B7")) + + f.Sheet["xl/worksheets/sheet1.xml"].MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A1"}}} + assert.EqualError(t, f.UnmergeCell("Sheet1", "A2", "B3"), `invalid area "A1"`) + + f.Sheet["xl/worksheets/sheet1.xml"].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"`) + +} diff --git a/rows.go b/rows.go index d24b1a6..40972ae 100644 --- a/rows.go +++ b/rows.go @@ -63,7 +63,6 @@ type Rows struct { err error curRow, totalRow, stashRow int sheet string - stashColumn []string rows []xlsxRow f *File decoder *xml.Decoder @@ -111,7 +110,6 @@ func (rows *Rows) Columns() ([]string, error) { } if row > rows.curRow { rows.stashRow = row - 1 - rows.stashColumn = columns return columns, err } } @@ -153,12 +151,19 @@ func (err ErrSheetNotExist) Error() string { // Rows return a rows iterator. For example: // // rows, err := f.Rows("Sheet1") +// if err != nil { +// println(err.Error()) +// return +// } // for rows.Next() { // row, err := rows.Columns() +// if err != nil { +// println(err.Error()) +// } // for _, colCell := range row { -// fmt.Print(colCell, "\t") +// print(colCell, "\t") // } -// fmt.Println() +// println() // } // func (f *File) Rows(sheet string) (*Rows, error) { diff --git a/rows_test.go b/rows_test.go index 1127bb1..9377d5e 100644 --- a/rows_test.go +++ b/rows_test.go @@ -143,6 +143,7 @@ func TestColumns(t *testing.T) { rows.decoder = f.xmlNewDecoder(bytes.NewReader([]byte(`1`))) rows.curRow = 1 _, err = rows.Columns() + assert.NoError(t, err) rows.decoder = f.xmlNewDecoder(bytes.NewReader([]byte(`1B`))) rows.stashRow, rows.curRow = 0, 1 diff --git a/sheet.go b/sheet.go index 2654b8f..19b90c6 100644 --- a/sheet.go +++ b/sheet.go @@ -339,12 +339,12 @@ func (f *File) GetSheetIndex(name string) int { // GetSheetMap provides a function to get worksheet name and index map of XLSX. // For example: // -// f, err := excelize.OpenFile("./Book1.xlsx") +// f, err := excelize.OpenFile("Book1.xlsx") // if err != nil { // return // } // for index, name := range f.GetSheetMap() { -// fmt.Println(index, name) +// println(index, name) // } // func (f *File) GetSheetMap() map[int]string { diff --git a/sheet_test.go b/sheet_test.go index 7a58248..a03066a 100644 --- a/sheet_test.go +++ b/sheet_test.go @@ -19,7 +19,7 @@ func ExampleFile_SetPageLayout() { "Sheet1", excelize.PageLayoutOrientation(excelize.OrientationLandscape), ); err != nil { - panic(err) + println(err.Error()) } if err := f.SetPageLayout( "Sheet1", @@ -27,7 +27,7 @@ func ExampleFile_SetPageLayout() { excelize.FitToHeight(2), excelize.FitToWidth(2), ); err != nil { - panic(err) + println(err.Error()) } // Output: } @@ -41,17 +41,17 @@ func ExampleFile_GetPageLayout() { fitToWidth excelize.FitToWidth ) if err := f.GetPageLayout("Sheet1", &orientation); err != nil { - panic(err) + println(err.Error()) } if err := f.GetPageLayout("Sheet1", &paperSize); err != nil { - panic(err) + println(err.Error()) } if err := f.GetPageLayout("Sheet1", &fitToHeight); err != nil { - panic(err) + println(err.Error()) } if err := f.GetPageLayout("Sheet1", &fitToWidth); err != nil { - panic(err) + println(err.Error()) } fmt.Println("Defaults:") fmt.Printf("- orientation: %q\n", orientation) diff --git a/sheetpr_test.go b/sheetpr_test.go index d1ae2f1..6a35a6e 100644 --- a/sheetpr_test.go +++ b/sheetpr_test.go @@ -40,7 +40,7 @@ func ExampleFile_SetSheetPrOptions() { excelize.AutoPageBreaks(true), excelize.OutlineSummaryBelow(false), ); err != nil { - panic(err) + println(err.Error()) } // Output: } @@ -66,7 +66,7 @@ func ExampleFile_GetSheetPrOptions() { &autoPageBreaks, &outlineSummaryBelow, ); err != nil { - panic(err) + println(err.Error()) } fmt.Println("Defaults:") fmt.Printf("- codeName: %q\n", codeName) @@ -189,7 +189,7 @@ func ExampleFile_SetPageMargins() { excelize.PageMarginRight(1.0), excelize.PageMarginTop(1.0), ); err != nil { - panic(err) + println(err.Error()) } // Output: } @@ -215,7 +215,7 @@ func ExampleFile_GetPageMargins() { &marginRight, &marginTop, ); err != nil { - panic(err) + println(err.Error()) } fmt.Println("Defaults:") fmt.Println("- marginBottom:", marginBottom) diff --git a/sheetview_test.go b/sheetview_test.go index e45b8ce..8412002 100644 --- a/sheetview_test.go +++ b/sheetview_test.go @@ -47,7 +47,7 @@ func ExampleFile_SetSheetViewOptions() { excelize.ZoomScale(80), excelize.TopLeftCell("C3"), ); err != nil { - panic(err) + println(err.Error()) } var zoomScale excelize.ZoomScale @@ -55,22 +55,22 @@ func ExampleFile_SetSheetViewOptions() { fmt.Println("- zoomScale: 80") if err := f.SetSheetViewOptions(sheet, 0, excelize.ZoomScale(500)); err != nil { - panic(err) + println(err.Error()) } if err := f.GetSheetViewOptions(sheet, 0, &zoomScale); err != nil { - panic(err) + println(err.Error()) } fmt.Println("Used out of range value:") fmt.Println("- zoomScale:", zoomScale) if err := f.SetSheetViewOptions(sheet, 0, excelize.ZoomScale(123)); err != nil { - panic(err) + println(err.Error()) } if err := f.GetSheetViewOptions(sheet, 0, &zoomScale); err != nil { - panic(err) + println(err.Error()) } fmt.Println("Used correct value:") @@ -111,7 +111,7 @@ func ExampleFile_GetSheetViewOptions() { &zoomScale, &topLeftCell, ); err != nil { - panic(err) + println(err.Error()) } fmt.Println("Default:") @@ -125,27 +125,27 @@ func ExampleFile_GetSheetViewOptions() { fmt.Println("- topLeftCell:", `"`+topLeftCell+`"`) if err := f.SetSheetViewOptions(sheet, 0, excelize.TopLeftCell("B2")); err != nil { - panic(err) + println(err.Error()) } if err := f.GetSheetViewOptions(sheet, 0, &topLeftCell); err != nil { - panic(err) + println(err.Error()) } if err := f.SetSheetViewOptions(sheet, 0, excelize.ShowGridLines(false)); err != nil { - panic(err) + println(err.Error()) } if err := f.GetSheetViewOptions(sheet, 0, &showGridLines); err != nil { - panic(err) + println(err.Error()) } if err := f.SetSheetViewOptions(sheet, 0, excelize.ShowZeros(false)); err != nil { - panic(err) + println(err.Error()) } if err := f.GetSheetViewOptions(sheet, 0, &showZeros); err != nil { - panic(err) + println(err.Error()) } fmt.Println("After change:") diff --git a/sparkline_test.go b/sparkline_test.go index dca32e9..45bf386 100644 --- a/sparkline_test.go +++ b/sparkline_test.go @@ -298,12 +298,12 @@ func prepareSparklineDataset() *File { f.NewSheet("Sheet3") for row, data := range sheet2 { if err := f.SetSheetRow("Sheet2", fmt.Sprintf("A%d", row+1), &data); err != nil { - panic(err) + println(err.Error()) } } for row, data := range sheet3 { if err := f.SetSheetRow("Sheet3", fmt.Sprintf("A%d", row+1), &data); err != nil { - panic(err) + println(err.Error()) } } return f -- cgit v1.2.1