summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md11
-rw-r--r--cell.go30
-rw-r--r--chart.go53
-rw-r--r--excelize.go27
-rw-r--r--picture.go29
-rw-r--r--rows.go52
-rw-r--r--sheet.go40
-rw-r--r--styles.go70
8 files changed, 161 insertions, 151 deletions
diff --git a/README.md b/README.md
index 58c275f..abb842b 100644
--- a/README.md
+++ b/README.md
@@ -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)
}
}
```
diff --git a/cell.go b/cell.go
index af98cf0..c47b1f1 100644
--- a/cell.go
+++ b/cell.go
@@ -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
+ }
+ }
}
}
}
diff --git a/chart.go b/chart.go
index 48bd8f1..f36c83a 100644
--- a/chart.go
+++ b/chart.go
@@ -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)
+ }
}
}
}
diff --git a/picture.go b/picture.go
index bc35b47..729bb4a 100644
--- a/picture.go
+++ b/picture.go
@@ -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
}
diff --git a/rows.go b/rows.go
index 39c6246..9bbbec2 100644
--- a/rows.go
+++ b/rows.go
@@ -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
+ }
}
}
}
diff --git a/sheet.go b/sheet.go
index e8d381f..e86522a 100644
--- a/sheet.go
+++ b/sheet.go
@@ -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:]...)
}
}
diff --git a/styles.go b/styles.go
index c20bd82..df7f336 100644
--- a/styles.go
+++ b/styles.go
@@ -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))
+ }
+ }
}
}