diff options
-rw-r--r-- | README.md | 11 | ||||
-rw-r--r-- | cell.go | 30 | ||||
-rw-r--r-- | chart.go | 53 | ||||
-rw-r--r-- | excelize.go | 27 | ||||
-rw-r--r-- | picture.go | 29 | ||||
-rw-r--r-- | rows.go | 52 | ||||
-rw-r--r-- | sheet.go | 40 | ||||
-rw-r--r-- | styles.go | 70 |
8 files changed, 161 insertions, 151 deletions
@@ -30,7 +30,6 @@ package main import ( "fmt" - "os" "github.com/xuri/excelize" ) @@ -48,7 +47,6 @@ func main() { err := xlsx.SaveAs("./Workbook.xlsx") if err != nil { fmt.Println(err) - os.Exit(1) } } ``` @@ -62,7 +60,6 @@ package main import ( "fmt" - "os" "github.com/xuri/excelize" ) @@ -71,7 +68,7 @@ func main() { xlsx, err := excelize.OpenFile("./Workbook.xlsx") if err != nil { fmt.Println(err) - os.Exit(1) + return } // Get value from cell by given worksheet name and axis. cell := xlsx.GetCellValue("Sheet1", "B2") @@ -99,7 +96,6 @@ package main import ( "fmt" - "os" "github.com/xuri/excelize" ) @@ -119,7 +115,6 @@ func main() { err := xlsx.SaveAs("./Workbook.xlsx") if err != nil { fmt.Println(err) - os.Exit(1) } } ``` @@ -131,7 +126,6 @@ package main import ( "fmt" - "os" _ "image/gif" _ "image/jpeg" _ "image/png" @@ -143,7 +137,7 @@ func main() { xlsx, err := excelize.OpenFile("./Workbook.xlsx") if err != nil { fmt.Println(err) - os.Exit(1) + return } // Insert a picture. err = xlsx.AddPicture("Sheet1", "A2", "./image1.png", "") @@ -164,7 +158,6 @@ func main() { err = xlsx.Save() if err != nil { fmt.Println(err) - os.Exit(1) } } ``` @@ -92,15 +92,13 @@ func (f *File) GetCellValue(sheet, axis string) string { return "" } for _, v := range xlsx.SheetData.Row { - if v.R != row { - continue - } - for _, r := range v.C { - if axis != r.R { - continue + if v.R == row { + for _, r := range v.C { + if axis == r.R { + val, _ := r.getValueFrom(f, f.sharedStringsReader()) + return val + } } - val, _ := r.getValueFrom(f, f.sharedStringsReader()) - return val } } return "" @@ -164,15 +162,13 @@ func (f *File) GetCellFormula(sheet, axis string) string { return "" } for _, v := range xlsx.SheetData.Row { - if v.R != row { - continue - } - for _, f := range v.C { - if axis != f.R { - continue - } - if f.F != nil { - return f.F.Content + if v.R == row { + for _, f := range v.C { + if axis == f.R { + if f.F != nil { + return f.F.Content + } + } } } } @@ -21,11 +21,52 @@ const ( // This section defines the default value of chart properties. var ( - chartView3DRotX = map[string]int{Bar: 0, Bar3D: 15, Doughnut: 0, Line: 0, Pie: 0, Pie3D: 30, Radar: 0, Scatter: 0} - chartView3DRotY = map[string]int{Bar: 0, Bar3D: 20, Doughnut: 0, Line: 0, Pie: 0, Pie3D: 0, Radar: 0, Scatter: 0} - chartView3DDepthPercent = map[string]int{Bar: 100, Bar3D: 100, Doughnut: 100, Line: 100, Pie: 100, Pie3D: 100, Radar: 100, Scatter: 100} - chartView3DRAngAx = map[string]int{Bar: 0, Bar3D: 1, Doughnut: 0, Line: 0, Pie: 0, Pie3D: 0, Radar: 0, Scatter: 0} - chartLegendPosition = map[string]string{"bottom": "b", "left": "l", "right": "r", "top": "t", "top_right": "tr"} + chartView3DRotX = map[string]int{ + Bar: 0, + Bar3D: 15, + Doughnut: 0, + Line: 0, + Pie: 0, + Pie3D: 30, + Radar: 0, + Scatter: 0, + } + chartView3DRotY = map[string]int{ + Bar: 0, + Bar3D: 20, + Doughnut: 0, + Line: 0, + Pie: 0, + Pie3D: 0, + Radar: 0, + Scatter: 0, + } + chartView3DDepthPercent = map[string]int{ + Bar: 100, + Bar3D: 100, + Doughnut: 100, + Line: 100, + Pie: 100, + Pie3D: 100, + Radar: 100, + Scatter: 100, + } + chartView3DRAngAx = map[string]int{ + Bar: 0, + Bar3D: 1, + Doughnut: 0, + Line: 0, + Pie: 0, + Pie3D: 0, + Radar: 0, + Scatter: 0} + chartLegendPosition = map[string]string{ + "bottom": "b", + "left": "l", + "right": "r", + "top": "t", + "top_right": "tr", + } ) // parseFormatChartSet provides function to parse the format settings of the @@ -63,7 +104,6 @@ func parseFormatChartSet(formatSet string) *formatChart { // // import ( // "fmt" -// "os" // // "github.com/xuri/excelize" // ) @@ -83,7 +123,6 @@ func parseFormatChartSet(formatSet string) *formatChart { // err := xlsx.SaveAs("./Workbook.xlsx") // if err != nil { // fmt.Println(err) -// os.Exit(1) // } // } // diff --git a/excelize.go b/excelize.go index f06ecb0..e3b5dac 100644 --- a/excelize.go +++ b/excelize.go @@ -120,11 +120,11 @@ func checkSheet(xlsx *xlsxWorksheet) { _, ok := existsRows[i+1] if ok { sheetData.Row = append(sheetData.Row, xlsx.SheetData.Row[existsRows[i+1]]) - continue + } else { + sheetData.Row = append(sheetData.Row, xlsxRow{ + R: i + 1, + }) } - sheetData.Row = append(sheetData.Row, xlsxRow{ - R: i + 1, - }) } xlsx.SheetData = sheetData } @@ -223,16 +223,15 @@ func (f *File) adjustRowDimensions(xlsx *xlsxWorksheet, rowIndex, offset int) { return } for i, r := range xlsx.SheetData.Row { - if r.R < rowIndex { - continue - } - xlsx.SheetData.Row[i].R += offset - for k, v := range xlsx.SheetData.Row[i].C { - axis := v.R - col := string(strings.Map(letterOnlyMapF, axis)) - row, _ := strconv.Atoi(strings.Map(intOnlyMapF, axis)) - xAxis := row + offset - xlsx.SheetData.Row[i].C[k].R = col + strconv.Itoa(xAxis) + if r.R >= rowIndex { + xlsx.SheetData.Row[i].R += offset + for k, v := range xlsx.SheetData.Row[i].C { + axis := v.R + col := string(strings.Map(letterOnlyMapF, axis)) + row, _ := strconv.Atoi(strings.Map(intOnlyMapF, axis)) + xAxis := row + offset + xlsx.SheetData.Row[i].C[k].R = col + strconv.Itoa(xAxis) + } } } } @@ -38,7 +38,6 @@ func parseFormatPictureSet(formatSet string) *formatPicture { // // import ( // "fmt" -// "os" // _ "image/gif" // _ "image/jpeg" // _ "image/png" @@ -66,7 +65,6 @@ func parseFormatPictureSet(formatSet string) *formatPicture { // err = xlsx.SaveAs("./Workbook.xlsx") // if err != nil { // fmt.Println(err) -// os.Exit(1) // } // } // @@ -135,10 +133,9 @@ func (f *File) deleteSheetRelationships(sheet, rID string) { var sheetRels xlsxWorkbookRels xml.Unmarshal([]byte(f.readXML(rels)), &sheetRels) for k, v := range sheetRels.Relationships { - if v.ID != rID { - continue + if v.ID == rID { + sheetRels.Relationships = append(sheetRels.Relationships[:k], sheetRels.Relationships[k+1:]...) } - sheetRels.Relationships = append(sheetRels.Relationships[:k], sheetRels.Relationships[k+1:]...) } output, _ := xml.Marshal(sheetRels) f.saveFileList(rels, string(output)) @@ -415,17 +412,14 @@ func (f *File) GetPicture(sheet, cell string) (string, []byte) { for _, anchor := range decodeWsDr.TwoCellAnchor { decodeTwoCellAnchor := decodeTwoCellAnchor{} xml.Unmarshal([]byte("<decodeTwoCellAnchor>"+anchor.Content+"</decodeTwoCellAnchor>"), &decodeTwoCellAnchor) - if decodeTwoCellAnchor.From == nil || decodeTwoCellAnchor.Pic == nil { - continue - } - if decodeTwoCellAnchor.From.Col == col && decodeTwoCellAnchor.From.Row == row { - xlsxWorkbookRelation := f.getDrawingRelationships(drawingRelationships, decodeTwoCellAnchor.Pic.BlipFill.Blip.Embed) - _, ok := supportImageTypes[filepath.Ext(xlsxWorkbookRelation.Target)] - if !ok { - continue + 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) + _, ok := supportImageTypes[filepath.Ext(xlsxWorkbookRelation.Target)] + if ok { + return filepath.Base(xlsxWorkbookRelation.Target), []byte(f.XLSX[strings.Replace(xlsxWorkbookRelation.Target, "..", "xl", -1)]) + } } - - return filepath.Base(xlsxWorkbookRelation.Target), []byte(f.XLSX[strings.Replace(xlsxWorkbookRelation.Target, "..", "xl", -1)]) } } return "", []byte{} @@ -441,10 +435,9 @@ func (f *File) getDrawingRelationships(rels, rID string) *xlsxWorkbookRelation { var drawingRels xlsxWorkbookRels xml.Unmarshal([]byte(f.readXML(rels)), &drawingRels) for _, v := range drawingRels.Relationships { - if v.ID != rID { - continue + if v.ID == rID { + return &v } - return &v } return nil } @@ -219,12 +219,11 @@ func (f *File) RemoveRow(sheet string, row int) { xlsx := f.workSheetReader(sheet) row++ for i, r := range xlsx.SheetData.Row { - if r.R != row { - continue + if r.R == row { + xlsx.SheetData.Row = append(xlsx.SheetData.Row[:i], xlsx.SheetData.Row[i+1:]...) + f.adjustHelper(sheet, -1, row, -1) + return } - xlsx.SheetData.Row = append(xlsx.SheetData.Row[:i], xlsx.SheetData.Row[i+1:]...) - f.adjustHelper(sheet, -1, row, -1) - return } } @@ -269,28 +268,27 @@ func checkRow(xlsx *xlsxWorksheet) { buffer := bytes.Buffer{} for k, v := range xlsx.SheetData.Row { lenCol := len(v.C) - if lenCol < 1 { - continue - } - endR := string(strings.Map(letterOnlyMapF, v.C[lenCol-1].R)) - endRow, _ := strconv.Atoi(strings.Map(intOnlyMapF, v.C[lenCol-1].R)) - endCol := TitleToNumber(endR) + 1 - if lenCol < endCol { - oldRow := xlsx.SheetData.Row[k].C - xlsx.SheetData.Row[k].C = xlsx.SheetData.Row[k].C[:0] - tmp := []xlsxC{} - for i := 0; i <= endCol; i++ { - buffer.WriteString(ToAlphaString(i)) - buffer.WriteString(strconv.Itoa(endRow)) - tmp = append(tmp, xlsxC{ - R: buffer.String(), - }) - buffer.Reset() - } - xlsx.SheetData.Row[k].C = tmp - for _, y := range oldRow { - colAxis := TitleToNumber(string(strings.Map(letterOnlyMapF, y.R))) - xlsx.SheetData.Row[k].C[colAxis] = y + if lenCol > 0 { + endR := string(strings.Map(letterOnlyMapF, v.C[lenCol-1].R)) + endRow, _ := strconv.Atoi(strings.Map(intOnlyMapF, v.C[lenCol-1].R)) + endCol := TitleToNumber(endR) + 1 + if lenCol < endCol { + oldRow := xlsx.SheetData.Row[k].C + xlsx.SheetData.Row[k].C = xlsx.SheetData.Row[k].C[:0] + tmp := []xlsxC{} + for i := 0; i <= endCol; i++ { + buffer.WriteString(ToAlphaString(i)) + buffer.WriteString(strconv.Itoa(endRow)) + tmp = append(tmp, xlsxC{ + R: buffer.String(), + }) + buffer.Reset() + } + xlsx.SheetData.Row[k].C = tmp + for _, y := range oldRow { + colAxis := TitleToNumber(string(strings.Map(letterOnlyMapF, y.R))) + xlsx.SheetData.Row[k].C[colAxis] = y + } } } } @@ -92,10 +92,9 @@ func (f *File) worksheetWriter() { func trimCell(column []xlsxC) []xlsxC { col := []xlsxC{} for _, c := range column { - if c.S == 0 && c.V == "" && c.F == nil && c.T == "" { - continue + if c.S != 0 || c.V != "" || c.F != nil || c.T != "" { + col = append(col, c) } - col = append(col, c) } return col } @@ -374,19 +373,18 @@ func (f *File) SetSheetBackground(sheet, picture string) error { func (f *File) DeleteSheet(name string) { content := f.workbookReader() for k, v := range content.Sheets.Sheet { - if v.Name != trimSheetName(name) || len(content.Sheets.Sheet) < 2 { - continue + if v.Name == trimSheetName(name) && len(content.Sheets.Sheet) > 1 { + content.Sheets.Sheet = append(content.Sheets.Sheet[:k], content.Sheets.Sheet[k+1:]...) + sheet := "xl/worksheets/sheet" + strings.TrimPrefix(v.ID, "rId") + ".xml" + rels := "xl/worksheets/_rels/sheet" + strings.TrimPrefix(v.ID, "rId") + ".xml.rels" + target := f.deleteSheetFromWorkbookRels(v.ID) + f.deleteSheetFromContentTypes(target) + delete(f.sheetMap, name) + delete(f.XLSX, sheet) + delete(f.XLSX, rels) + delete(f.Sheet, sheet) + f.SheetCount-- } - content.Sheets.Sheet = append(content.Sheets.Sheet[:k], content.Sheets.Sheet[k+1:]...) - sheet := "xl/worksheets/sheet" + strings.TrimPrefix(v.ID, "rId") + ".xml" - rels := "xl/worksheets/_rels/sheet" + strings.TrimPrefix(v.ID, "rId") + ".xml.rels" - target := f.deleteSheetFromWorkbookRels(v.ID) - f.deleteSheetFromContentTypes(target) - delete(f.sheetMap, name) - delete(f.XLSX, sheet) - delete(f.XLSX, rels) - delete(f.Sheet, sheet) - f.SheetCount-- } } @@ -396,11 +394,10 @@ func (f *File) DeleteSheet(name string) { func (f *File) deleteSheetFromWorkbookRels(rID string) string { content := f.workbookRelsReader() for k, v := range content.Relationships { - if v.ID != rID { - continue + if v.ID == rID { + content.Relationships = append(content.Relationships[:k], content.Relationships[k+1:]...) + return v.Target } - content.Relationships = append(content.Relationships[:k], content.Relationships[k+1:]...) - return v.Target } return "" } @@ -410,10 +407,9 @@ func (f *File) deleteSheetFromWorkbookRels(rID string) string { func (f *File) deleteSheetFromContentTypes(target string) { content := f.contentTypesReader() for k, v := range content.Overrides { - if v.PartName != "/xl/"+target { - continue + if v.PartName == "/xl/"+target { + content.Overrides = append(content.Overrides[:k], content.Overrides[k+1:]...) } - content.Overrides = append(content.Overrides[:k], content.Overrides[k+1:]...) } } @@ -2163,32 +2163,31 @@ func setBorders(formatStyle *formatStyle) *xlsxBorder { var border xlsxBorder for _, v := range formatStyle.Border { - if v.Style > 13 || v.Style < 0 { - continue - } - var color xlsxColor - color.RGB = getPaletteColor(v.Color) - switch v.Type { - case "left": - border.Left.Style = styles[v.Style] - border.Left.Color = &color - case "right": - border.Right.Style = styles[v.Style] - border.Right.Color = &color - case "top": - border.Top.Style = styles[v.Style] - border.Top.Color = &color - case "bottom": - border.Bottom.Style = styles[v.Style] - border.Bottom.Color = &color - case "diagonalUp": - border.Diagonal.Style = styles[v.Style] - border.Diagonal.Color = &color - border.DiagonalUp = true - case "diagonalDown": - border.Diagonal.Style = styles[v.Style] - border.Diagonal.Color = &color - border.DiagonalDown = true + if 0 <= v.Style && v.Style < 14 { + var color xlsxColor + color.RGB = getPaletteColor(v.Color) + switch v.Type { + case "left": + border.Left.Style = styles[v.Style] + border.Left.Color = &color + case "right": + border.Right.Style = styles[v.Style] + border.Right.Color = &color + case "top": + border.Top.Style = styles[v.Style] + border.Top.Color = &color + case "bottom": + border.Bottom.Style = styles[v.Style] + border.Bottom.Color = &color + case "diagonalUp": + border.Diagonal.Style = styles[v.Style] + border.Diagonal.Color = &color + border.DiagonalUp = true + case "diagonalDown": + border.Diagonal.Style = styles[v.Style] + border.Diagonal.Color = &color + border.DiagonalDown = true + } } } return &border @@ -2555,18 +2554,15 @@ func (f *File) SetConditionalFormat(sheet, area, formatSet string) { var ok bool // "type" is a required parameter, check for valid validation types. vt, ok = validType[v.Type] - if !ok { - continue - } - // Check for valid criteria types. - ct, ok = criteriaType[v.Criteria] - if !ok && vt != "expression" { - continue - } - - drawfunc, ok := drawContFmtFunc[vt] if ok { - cfRule = append(cfRule, drawfunc(p, ct, v)) + // Check for valid criteria types. + ct, ok = criteriaType[v.Criteria] + if ok || vt == "expression" { + drawfunc, ok := drawContFmtFunc[vt] + if ok { + cfRule = append(cfRule, drawfunc(p, ct, v)) + } + } } } |