diff options
-rw-r--r-- | chart.go | 16 | ||||
-rw-r--r-- | comment.go | 18 | ||||
-rw-r--r-- | excelize.go | 2 | ||||
-rw-r--r-- | excelize_test.go | 28 | ||||
-rw-r--r-- | lib.go | 2 | ||||
-rw-r--r-- | picture.go | 29 | ||||
-rw-r--r-- | rows.go | 14 | ||||
-rw-r--r-- | shape.go | 14 | ||||
-rw-r--r-- | sheet.go | 29 | ||||
-rw-r--r-- | styles.go | 11 | ||||
-rw-r--r-- | table.go | 26 |
11 files changed, 117 insertions, 72 deletions
@@ -192,7 +192,7 @@ var ( // parseFormatChartSet provides function to parse the format settings of the // chart with default value. -func parseFormatChartSet(formatSet string) *formatChart { +func parseFormatChartSet(formatSet string) (*formatChart, error) { format := formatChart{ Dimension: formatChartDimension{ Width: 480, @@ -216,8 +216,8 @@ func parseFormatChartSet(formatSet string) *formatChart { }, ShowBlanksAs: "gap", } - json.Unmarshal([]byte(formatSet), &format) - return &format + err := json.Unmarshal([]byte(formatSet), &format) + return &format, err } // AddChart provides the method to add chart in a sheet by given chart format @@ -357,8 +357,11 @@ func parseFormatChartSet(formatSet string) *formatChart { // // Set chart size by dimension property. The dimension property is optional. The default width is 480, and height is 290. // -func (f *File) AddChart(sheet, cell, format string) { - formatSet := parseFormatChartSet(format) +func (f *File) AddChart(sheet, cell, format string) error { + formatSet, err := parseFormatChartSet(format) + if err != nil { + return err + } // Read sheet data. xlsx := f.workSheetReader(sheet) // Add first picture for given sheet, create xl/drawings/ and xl/drawings/_rels/ folder. @@ -371,6 +374,7 @@ func (f *File) AddChart(sheet, cell, format string) { f.addChart(formatSet) f.addContentTypePart(chartID, "chart") f.addContentTypePart(drawingID, "drawings") + return err } // countCharts provides function to get chart files count storage in the @@ -1082,7 +1086,7 @@ func (f *File) drawingParser(drawingXML string, content *xlsxWsDr) int { _, ok := f.XLSX[drawingXML] if ok { // Append Model decodeWsDr := decodeWsDr{} - xml.Unmarshal([]byte(f.readXML(drawingXML)), &decodeWsDr) + _ = xml.Unmarshal([]byte(f.readXML(drawingXML)), &decodeWsDr) content.R = decodeWsDr.R cNvPrID = len(decodeWsDr.OneCellAnchor) + len(decodeWsDr.TwoCellAnchor) + 1 for _, v := range decodeWsDr.OneCellAnchor { @@ -9,13 +9,13 @@ import ( // parseFormatCommentsSet provides function to parse the format settings of the // comment with default value. -func parseFormatCommentsSet(formatSet string) *formatComment { +func parseFormatCommentsSet(formatSet string) (*formatComment, error) { format := formatComment{ Author: "Author:", Text: " ", } - json.Unmarshal([]byte(formatSet), &format) - return &format + err := json.Unmarshal([]byte(formatSet), &format) + return &format, err } // AddComment provides the method to add comment in a sheet by given worksheet @@ -25,8 +25,11 @@ func parseFormatCommentsSet(formatSet string) *formatComment { // // xlsx.AddComment("Sheet1", "A30", `{"author":"Excelize: ","text":"This is a comment."}`) // -func (f *File) AddComment(sheet, cell, format string) { - formatSet := parseFormatCommentsSet(format) +func (f *File) AddComment(sheet, cell, format string) error { + formatSet, err := parseFormatCommentsSet(format) + if err != nil { + return err + } // Read sheet data. xlsx := f.workSheetReader(sheet) commentID := f.countComments() + 1 @@ -48,6 +51,7 @@ func (f *File) AddComment(sheet, cell, format string) { f.addComment(commentsXML, cell, formatSet) f.addDrawingVML(commentID, drawingVML, cell) f.addContentTypePart(commentID, "comments") + return err } // addDrawingVML provides function to create comment as @@ -127,7 +131,7 @@ func (f *File) addDrawingVML(commentID int, drawingVML, cell string) { c, ok := f.XLSX[drawingVML] if ok { d := decodeVmlDrawing{} - xml.Unmarshal([]byte(c), &d) + _ = xml.Unmarshal([]byte(c), &d) for _, v := range d.Shape { s := xlsxShape{ ID: "_x0000_s1025", @@ -197,7 +201,7 @@ func (f *File) addComment(commentsXML, cell string, formatSet *formatComment) { c, ok := f.XLSX[commentsXML] if ok { d := xlsxComments{} - xml.Unmarshal([]byte(c), &d) + _ = xml.Unmarshal([]byte(c), &d) comments.CommentList.Comment = append(comments.CommentList.Comment, d.CommentList.Comment...) } comments.CommentList.Comment = append(comments.CommentList.Comment, cmt) diff --git a/excelize.go b/excelize.go index f2e50c8..0972e96 100644 --- a/excelize.go +++ b/excelize.go @@ -88,7 +88,7 @@ func (f *File) workSheetReader(sheet string) *xlsxWorksheet { } if f.Sheet[name] == nil { var xlsx xlsxWorksheet - xml.Unmarshal(f.readXML(name), &xlsx) + _ = xml.Unmarshal(f.readXML(name), &xlsx) if f.checked == nil { f.checked = make(map[string]bool) } diff --git a/excelize_test.go b/excelize_test.go index bf6ff4c..4dbc709 100644 --- a/excelize_test.go +++ b/excelize_test.go @@ -211,9 +211,10 @@ func TestNewFile(t *testing.T) { if err != nil { t.Error(err) } + // Test add picture to worksheet with invalid formatset err = xlsx.AddPicture("Sheet1", "C2", "./test/images/excel.png", "") if err != nil { - t.Error(err) + t.Log(err) } err = xlsx.SaveAs("./test/Book3.xlsx") if err != nil { @@ -651,6 +652,7 @@ func TestSetDeleteSheet(t *testing.T) { t.Error(err) } xlsx.DeleteSheet("Sheet1") + xlsx.AddComment("Sheet1", "A1", "") xlsx.AddComment("Sheet1", "A1", `{"author":"Excelize: ","text":"This is a comment."}`) err = xlsx.SaveAs("./test/Book_delete_sheet.xlsx") if err != nil { @@ -765,9 +767,22 @@ func TestAddTable(t *testing.T) { if err != nil { t.Error(err) } - xlsx.AddTable("Sheet1", "B26", "A21", ``) - xlsx.AddTable("Sheet2", "A2", "B5", `{"table_name":"table","table_style":"TableStyleMedium2", "show_first_column":true,"show_last_column":true,"show_row_stripes":false,"show_column_stripes":true}`) - xlsx.AddTable("Sheet2", "F1", "F1", `{"table_style":"TableStyleMedium8"}`) + err = xlsx.AddTable("Sheet1", "B26", "A21", `{}`) + if err != nil { + t.Error(err) + } + err = xlsx.AddTable("Sheet2", "A2", "B5", ``) + if err != nil { + t.Log(err) + } + err = xlsx.AddTable("Sheet2", "A2", "B5", `{"table_name":"table","table_style":"TableStyleMedium2", "show_first_column":true,"show_last_column":true,"show_row_stripes":false,"show_column_stripes":true}`) + if err != nil { + t.Error(err) + } + err = xlsx.AddTable("Sheet2", "F1", "F1", `{"table_style":"TableStyleMedium8"}`) + if err != nil { + t.Error(err) + } err = xlsx.Save() if err != nil { t.Error(err) @@ -783,6 +798,7 @@ func TestAddShape(t *testing.T) { xlsx.AddShape("Sheet1", "B30", `{"type":"rect","paragraph":[{"text":"Rectangle"},{}]}`) xlsx.AddShape("Sheet1", "C30", `{"type":"rect","paragraph":[]}`) xlsx.AddShape("Sheet3", "H1", `{"type":"ellipseRibbon", "color":{"line":"#4286f4","fill":"#8eb9ff"}, "paragraph":[{"font":{"bold":true,"italic":true,"family":"Berlin Sans FB Demi","size":36,"color":"#777777","underline":"single"}}], "height": 90}`) + xlsx.AddShape("Sheet3", "H1", "") err = xlsx.Save() if err != nil { t.Error(err) @@ -846,6 +862,7 @@ func TestAddChart(t *testing.T) { for k, v := range values { xlsx.SetCellValue("Sheet1", k, v) } + xlsx.AddChart("Sheet1", "P1", "") xlsx.AddChart("Sheet1", "P1", `{"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"}],"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":"Fruit 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"}`) xlsx.AddChart("Sheet1", "X1", `{"type":"colStacked","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"}],"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":"Fruit 2D Stacked 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"}`) xlsx.AddChart("Sheet1", "P16", `{"type":"colPercentStacked","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"}],"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":"Fruit 100% Stacked 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"}`) @@ -937,6 +954,7 @@ func TestSetPane(t *testing.T) { xlsx.SetPanes("Panes 3", `{"freeze":false,"split":true,"x_split":3270,"y_split":1800,"top_left_cell":"N57","active_pane":"bottomLeft","panes":[{"sqref":"I36","active_cell":"I36"},{"sqref":"G33","active_cell":"G33","pane":"topRight"},{"sqref":"J60","active_cell":"J60","pane":"bottomLeft"},{"sqref":"O60","active_cell":"O60","pane":"bottomRight"}]}`) xlsx.NewSheet("Panes 4") xlsx.SetPanes("Panes 4", `{"freeze":true,"split":false,"x_split":0,"y_split":9,"top_left_cell":"A34","active_pane":"bottomLeft","panes":[{"sqref":"A11:XFD11","active_cell":"A11","pane":"bottomLeft"}]}`) + xlsx.SetPanes("Panes 4", "") err := xlsx.SaveAs("./test/Book_set_panes.xlsx") if err != nil { t.Error(err) @@ -1010,6 +1028,8 @@ func TestConditionalFormat(t *testing.T) { xlsx.SetConditionalFormat("Sheet1", "K1:K10", `[{"type":"data_bar", "criteria":"=", "min_type":"min","max_type":"max","bar_color":"#638EC6"}]`) // Use a formula to determine which cells to format. xlsx.SetConditionalFormat("Sheet1", "L1:L10", fmt.Sprintf(`[{"type":"formula", "criteria":"L2<3", "format":%d}]`, format1)) + // Test set invalid format set in conditional format + xlsx.SetConditionalFormat("Sheet1", "L1:L10", "") err = xlsx.SaveAs("./test/Book_conditional_format.xlsx") if err != nil { t.Log(err) @@ -50,7 +50,7 @@ func readFile(file *zip.File) []byte { log.Fatal(err) } buff := bytes.NewBuffer(nil) - io.Copy(buff, rc) + _, _ = io.Copy(buff, rc) rc.Close() return buff.Bytes() } @@ -16,7 +16,7 @@ import ( // parseFormatPictureSet provides function to parse the format settings of the // picture with default value. -func parseFormatPictureSet(formatSet string) *formatPicture { +func parseFormatPictureSet(formatSet string) (*formatPicture, error) { format := formatPicture{ FPrintsWithSheet: true, FLocksWithSheet: false, @@ -26,8 +26,8 @@ func parseFormatPictureSet(formatSet string) *formatPicture { XScale: 1.0, YScale: 1.0, } - json.Unmarshal([]byte(formatSet), &format) - return &format + err := json.Unmarshal([]byte(formatSet), &format) + return &format, err } // AddPicture provides the method to add picture in a sheet by given picture @@ -89,9 +89,12 @@ func (f *File) AddPicture(sheet, cell, picture, format string) error { return errors.New("Unsupported image extension") } readFile, _ := os.Open(picture) - image, _, err := image.DecodeConfig(readFile) + image, _, _ := image.DecodeConfig(readFile) _, file := filepath.Split(picture) - formatSet := parseFormatPictureSet(format) + formatSet, err := parseFormatPictureSet(format) + if err != nil { + return err + } // Read sheet data. xlsx := f.workSheetReader(sheet) // Add first picture for given sheet, create xl/drawings/ and xl/drawings/_rels/ folder. @@ -130,7 +133,7 @@ func (f *File) addSheetRelationships(sheet, relType, target, targetMode string) _, ok = f.XLSX[rels] if ok { ID.Reset() - xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels) + _ = xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels) rID = len(sheetRels.Relationships) + 1 ID.WriteString("rId") ID.WriteString(strconv.Itoa(rID)) @@ -156,7 +159,7 @@ func (f *File) deleteSheetRelationships(sheet, rID string) { } var rels = "xl/worksheets/_rels/" + strings.TrimPrefix(name, "xl/worksheets/") + ".rels" var sheetRels xlsxWorkbookRels - xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels) + _ = xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels) for k, v := range sheetRels.Relationships { if v.ID == rID { sheetRels.Relationships = append(sheetRels.Relationships[:k], sheetRels.Relationships[k+1:]...) @@ -273,7 +276,7 @@ func (f *File) addDrawingRelationships(index int, relType, target, targetMode st _, ok := f.XLSX[rels] if ok { ID.Reset() - xml.Unmarshal([]byte(f.readXML(rels)), &drawingRels) + _ = xml.Unmarshal([]byte(f.readXML(rels)), &drawingRels) rID = len(drawingRels.Relationships) + 1 ID.WriteString("rId") ID.WriteString(strconv.Itoa(rID)) @@ -394,7 +397,7 @@ func (f *File) getSheetRelationshipsTargetByID(sheet, rID string) string { } var rels = "xl/worksheets/_rels/" + strings.TrimPrefix(name, "xl/worksheets/") + ".rels" var sheetRels xlsxWorkbookRels - xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels) + _ = xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels) for _, v := range sheetRels.Relationships { if v.ID == rID { return v.Target @@ -431,10 +434,10 @@ func (f *File) GetPicture(sheet, cell string) (string, []byte) { _, ok := f.XLSX[drawingXML] if !ok { - return "", []byte{} + return "", nil } decodeWsDr := decodeWsDr{} - xml.Unmarshal([]byte(f.readXML(drawingXML)), &decodeWsDr) + _ = xml.Unmarshal([]byte(f.readXML(drawingXML)), &decodeWsDr) cell = strings.ToUpper(cell) fromCol := string(strings.Map(letterOnlyMapF, cell)) @@ -446,7 +449,7 @@ func (f *File) GetPicture(sheet, cell string) (string, []byte) { for _, anchor := range decodeWsDr.TwoCellAnchor { decodeTwoCellAnchor := decodeTwoCellAnchor{} - xml.Unmarshal([]byte("<decodeTwoCellAnchor>"+anchor.Content+"</decodeTwoCellAnchor>"), &decodeTwoCellAnchor) + _ = xml.Unmarshal([]byte("<decodeTwoCellAnchor>"+anchor.Content+"</decodeTwoCellAnchor>"), &decodeTwoCellAnchor) if decodeTwoCellAnchor.From != nil && decodeTwoCellAnchor.Pic != nil { if decodeTwoCellAnchor.From.Col == col && decodeTwoCellAnchor.From.Row == row { xlsxWorkbookRelation := f.getDrawingRelationships(drawingRelationships, decodeTwoCellAnchor.Pic.BlipFill.Blip.Embed) @@ -468,7 +471,7 @@ func (f *File) getDrawingRelationships(rels, rID string) *xlsxWorkbookRelation { return nil } var drawingRels xlsxWorkbookRels - xml.Unmarshal([]byte(f.readXML(rels)), &drawingRels) + _ = xml.Unmarshal([]byte(f.readXML(rels)), &drawingRels) for _, v := range drawingRels.Relationships { if v.ID == rID { return &v @@ -31,7 +31,7 @@ func (f *File) GetRows(sheet string) [][]string { output, _ := xml.Marshal(f.Sheet[name]) f.saveFileList(name, replaceWorkSheetsRelationshipsNameSpaceBytes(output)) } - decoder := xml.NewDecoder(bytes.NewReader(f.readXML(name))) + xml.NewDecoder(bytes.NewReader(f.readXML(name))) d := f.sharedStringsReader() var inElement string var r xlsxRow @@ -44,7 +44,7 @@ func (f *File) GetRows(sheet string) [][]string { } rows = append(rows, row) } - decoder = xml.NewDecoder(bytes.NewReader(f.readXML(name))) + decoder := xml.NewDecoder(bytes.NewReader(f.readXML(name))) for { token, _ := decoder.Token() if token == nil { @@ -55,7 +55,7 @@ func (f *File) GetRows(sheet string) [][]string { inElement = startElement.Name.Local if inElement == "row" { r = xlsxRow{} - decoder.DecodeElement(&r, &startElement) + _ = decoder.DecodeElement(&r, &startElement) cr := r.R - 1 for _, colCell := range r.C { c := TitleToNumber(strings.Map(letterOnlyMapF, colCell.R)) @@ -110,9 +110,9 @@ func (rows *Rows) Columns() []string { } startElement := rows.token.(xml.StartElement) r := xlsxRow{} - rows.decoder.DecodeElement(&r, &startElement) + _ = rows.decoder.DecodeElement(&r, &startElement) d := rows.f.sharedStringsReader() - row := make([]string, len(r.C), len(r.C)) + row := make([]string, len(r.C)) for _, colCell := range r.C { c := TitleToNumber(strings.Map(letterOnlyMapF, colCell.R)) val, _ := colCell.getValueFrom(rows.f, d) @@ -173,7 +173,7 @@ func (f *File) getTotalRowsCols(name string) (int, int) { inElement = startElement.Name.Local if inElement == "row" { r = xlsxRow{} - decoder.DecodeElement(&r, &startElement) + _ = decoder.DecodeElement(&r, &startElement) tr = r.R for _, colCell := range r.C { col := TitleToNumber(strings.Map(letterOnlyMapF, colCell.R)) @@ -240,7 +240,7 @@ func (f *File) sharedStringsReader() *xlsxSST { if len(ss) == 0 { ss = f.readXML("xl/SharedStrings.xml") } - xml.Unmarshal([]byte(ss), &sharedStrings) + _ = xml.Unmarshal([]byte(ss), &sharedStrings) f.SharedStrings = &sharedStrings } return f.SharedStrings @@ -9,7 +9,7 @@ import ( // parseFormatShapeSet provides function to parse the format settings of the // shape with default value. -func parseFormatShapeSet(formatSet string) *formatShape { +func parseFormatShapeSet(formatSet string) (*formatShape, error) { format := formatShape{ Width: 160, Height: 160, @@ -23,8 +23,8 @@ func parseFormatShapeSet(formatSet string) *formatShape { YScale: 1.0, }, } - json.Unmarshal([]byte(formatSet), &format) - return &format + err := json.Unmarshal([]byte(formatSet), &format) + return &format, err } // AddShape provides the method to add shape in a sheet by given worksheet @@ -245,8 +245,11 @@ func parseFormatShapeSet(formatSet string) *formatShape { // wavyHeavy // wavyDbl // -func (f *File) AddShape(sheet, cell, format string) { - formatSet := parseFormatShapeSet(format) +func (f *File) AddShape(sheet, cell, format string) error { + formatSet, err := parseFormatShapeSet(format) + if err != nil { + return err + } // Read sheet data. xlsx := f.workSheetReader(sheet) // Add first shape for given sheet, create xl/drawings/ and xl/drawings/_rels/ folder. @@ -266,6 +269,7 @@ func (f *File) AddShape(sheet, cell, format string) { } f.addDrawingShape(sheet, drawingXML, cell, formatSet) f.addContentTypePart(drawingID, "drawings") + return err } // addDrawingShape provides function to add preset geometry by given sheet, @@ -39,7 +39,7 @@ func (f *File) NewSheet(name string) int { func (f *File) contentTypesReader() *xlsxTypes { if f.ContentTypes == nil { var content xlsxTypes - xml.Unmarshal([]byte(f.readXML("[Content_Types].xml")), &content) + _ = xml.Unmarshal([]byte(f.readXML("[Content_Types].xml")), &content) f.ContentTypes = &content } return f.ContentTypes @@ -59,7 +59,7 @@ func (f *File) contentTypesWriter() { func (f *File) workbookReader() *xlsxWorkbook { if f.WorkBook == nil { var content xlsxWorkbook - xml.Unmarshal([]byte(f.readXML("xl/workbook.xml")), &content) + _ = xml.Unmarshal([]byte(f.readXML("xl/workbook.xml")), &content) f.WorkBook = &content } return f.WorkBook @@ -142,7 +142,7 @@ func (f *File) setWorkbook(name string, rid int) { func (f *File) workbookRelsReader() *xlsxWorkbookRels { if f.WorkBookRels == nil { var content xlsxWorkbookRels - xml.Unmarshal([]byte(f.readXML("xl/_rels/workbook.xml.rels")), &content) + _ = xml.Unmarshal([]byte(f.readXML("xl/_rels/workbook.xml.rels")), &content) f.WorkBookRels = &content } return f.WorkBookRels @@ -247,7 +247,7 @@ func (f *File) GetActiveSheetIndex() int { buffer.WriteString("xl/worksheets/sheet") buffer.WriteString(strings.TrimPrefix(v.ID, "rId")) buffer.WriteString(".xml") - xml.Unmarshal([]byte(f.readXML(buffer.String())), &xlsx) + _ = xml.Unmarshal([]byte(f.readXML(buffer.String())), &xlsx) for _, sheetView := range xlsx.SheetViews.SheetView { if sheetView.TabSelected { ID, _ := strconv.Atoi(strings.TrimPrefix(v.ID, "rId")) @@ -433,16 +433,18 @@ func (f *File) CopySheet(from, to int) error { if from < 1 || to < 1 || from == to || f.GetSheetName(from) == "" || f.GetSheetName(to) == "" { return errors.New("Invalid worksheet index") } - f.copySheet(from, to) - return nil + return f.copySheet(from, to) } // copySheet provides function to duplicate a worksheet by gave source and // target worksheet name. -func (f *File) copySheet(from, to int) { +func (f *File) copySheet(from, to int) error { sheet := f.workSheetReader("sheet" + strconv.Itoa(from)) worksheet := xlsxWorksheet{} - deepCopy(&worksheet, &sheet) + err := deepCopy(&worksheet, &sheet) + if err != nil { + return err + } path := "xl/worksheets/sheet" + strconv.Itoa(to) + ".xml" if len(worksheet.SheetViews.SheetView) > 0 { worksheet.SheetViews.SheetView[0].TabSelected = false @@ -457,6 +459,7 @@ func (f *File) copySheet(from, to int) { if ok { f.XLSX[toRels] = f.XLSX[fromRels] } + return err } // SetSheetVisible provides function to set worksheet visible by given worksheet @@ -502,10 +505,10 @@ func (f *File) SetSheetVisible(name string, visible bool) { } // parseFormatPanesSet provides function to parse the panes settings. -func parseFormatPanesSet(formatSet string) *formatPanes { +func parseFormatPanesSet(formatSet string) (*formatPanes, error) { format := formatPanes{} - json.Unmarshal([]byte(formatSet), &format) - return &format + err := json.Unmarshal([]byte(formatSet), &format) + return &format, err } // SetPanes provides function to create and remove freeze panes and split panes @@ -594,7 +597,7 @@ func parseFormatPanesSet(formatSet string) *formatPanes { // xlsx.SetPanes("Sheet1", `{"freeze":false,"split":false}`) // func (f *File) SetPanes(sheet, panes string) { - fs := parseFormatPanesSet(panes) + fs, _ := parseFormatPanesSet(panes) xlsx := f.workSheetReader(sheet) p := &xlsxPane{ ActivePane: fs.ActivePane, @@ -644,7 +647,7 @@ func (f *File) GetSheetVisible(name string) bool { // name. func trimSheetName(name string) string { r := []rune{} - for _, v := range []rune(name) { + for _, v := range name { switch v { case 58, 92, 47, 63, 42, 91, 93: // replace :\/?*[] continue @@ -988,7 +988,7 @@ func is12HourTime(format string) bool { func (f *File) stylesReader() *xlsxStyleSheet { if f.Styles == nil { var styleSheet xlsxStyleSheet - xml.Unmarshal([]byte(f.readXML("xl/styles.xml")), &styleSheet) + _ = xml.Unmarshal([]byte(f.readXML("xl/styles.xml")), &styleSheet) f.Styles = &styleSheet } return f.Styles @@ -2562,10 +2562,12 @@ func (f *File) SetCellStyle(sheet, hcell, vcell string, styleID int) { // // bar_color - Used for data_bar. Same as min_color, see above. // -func (f *File) SetConditionalFormat(sheet, area, formatSet string) { +func (f *File) SetConditionalFormat(sheet, area, formatSet string) error { var format []*formatConditional - json.Unmarshal([]byte(formatSet), &format) - + err := json.Unmarshal([]byte(formatSet), &format) + if err != nil { + return err + } drawContFmtFunc := map[string]func(p int, ct string, fmtCond *formatConditional) *xlsxCfRule{ "cellIs": drawCondFmtCellIs, "top10": drawCondFmtTop10, @@ -2601,6 +2603,7 @@ func (f *File) SetConditionalFormat(sheet, area, formatSet string) { SQRef: area, CfRule: cfRule, }) + return err } // drawCondFmtCellIs provides function to create conditional formatting rule for @@ -11,13 +11,13 @@ import ( // parseFormatTableSet provides function to parse the format settings of the // table with default value. -func parseFormatTableSet(formatSet string) *formatTable { +func parseFormatTableSet(formatSet string) (*formatTable, error) { format := formatTable{ TableStyle: "", ShowRowStripes: true, } - json.Unmarshal([]byte(formatSet), &format) - return &format + err := json.Unmarshal([]byte(formatSet), &format) + return &format, err } // AddTable provides the method to add table in a worksheet by given worksheet @@ -41,8 +41,11 @@ func parseFormatTableSet(formatSet string) *formatTable { // TableStyleMedium1 - TableStyleMedium28 // TableStyleDark1 - TableStyleDark11 // -func (f *File) AddTable(sheet, hcell, vcell, format string) { - formatSet := parseFormatTableSet(format) +func (f *File) AddTable(sheet, hcell, vcell, format string) error { + formatSet, err := parseFormatTableSet(format) + if err != nil { + return err + } hcell = strings.ToUpper(hcell) vcell = strings.ToUpper(vcell) // Coordinate conversion, convert C1:B3 to 2,0,1,2. @@ -69,6 +72,7 @@ func (f *File) AddTable(sheet, hcell, vcell, format string) { f.addSheetTable(sheet, rID) f.addTable(sheet, tableXML, hxAxis, hyAxis, vxAxis, vyAxis, tableID, formatSet) f.addContentTypePart(tableID, "table") + return err } // countTables provides function to get table files count storage in the folder @@ -155,10 +159,10 @@ func (f *File) addTable(sheet, tableXML string, hxAxis, hyAxis, vxAxis, vyAxis, // parseAutoFilterSet provides function to parse the settings of the auto // filter. -func parseAutoFilterSet(formatSet string) *formatAutoFilter { +func parseAutoFilterSet(formatSet string) (*formatAutoFilter, error) { format := formatAutoFilter{} - json.Unmarshal([]byte(formatSet), &format) - return &format + err := json.Unmarshal([]byte(formatSet), &format) + return &format, err } // AutoFilter provides the method to add auto filter in a worksheet by given @@ -232,7 +236,8 @@ func parseAutoFilterSet(formatSet string) *formatAutoFilter { // Price < 2000 // func (f *File) AutoFilter(sheet, hcell, vcell, format string) error { - formatSet := parseAutoFilterSet(format) + formatSet, _ := parseAutoFilterSet(format) + hcell = strings.ToUpper(hcell) vcell = strings.ToUpper(vcell) @@ -256,8 +261,7 @@ func (f *File) AutoFilter(sheet, hcell, vcell, format string) error { } ref := ToAlphaString(hxAxis) + strconv.Itoa(hyAxis+1) + ":" + ToAlphaString(vxAxis) + strconv.Itoa(vyAxis+1) refRange := vxAxis - hxAxis - err := f.autoFilter(sheet, ref, refRange, hxAxis, formatSet) - return err + return f.autoFilter(sheet, ref, refRange, hxAxis, formatSet) } // autoFilter provides function to extract the tokens from the filter |