summaryrefslogtreecommitdiff
path: root/col.go
diff options
context:
space:
mode:
Diffstat (limited to 'col.go')
-rw-r--r--col.go125
1 files changed, 87 insertions, 38 deletions
diff --git a/col.go b/col.go
index ff771f1..6f76800 100644
--- a/col.go
+++ b/col.go
@@ -13,6 +13,8 @@ import (
"errors"
"math"
"strings"
+
+ "github.com/mohae/deepcopy"
)
// Define the default cell size and EMU unit of measurement.
@@ -59,7 +61,7 @@ func (f *File) GetColVisible(sheet, col string) (bool, error) {
//
// err := f.SetColVisible("Sheet1", "D", false)
//
-// Hide the columns from D to F (included)
+// Hide the columns from D to F (included):
//
// err := f.SetColVisible("Sheet1", "D:F", false)
//
@@ -87,23 +89,31 @@ func (f *File) SetColVisible(sheet, columns string, visible bool) error {
return err
}
colData := xlsxCol{
- Min: min,
- Max: max,
- Width: 9, // default width
- Hidden: !visible,
+ Min: min,
+ Max: max,
+ Width: 9, // default width
+ Hidden: !visible,
CustomWidth: true,
}
- if xlsx.Cols != nil {
- xlsx.Cols.Col = append(xlsx.Cols.Col, colData)
- } else {
+ if xlsx.Cols == nil {
cols := xlsxCols{}
cols.Col = append(cols.Col, colData)
xlsx.Cols = &cols
- }
+ return nil
+ }
+ xlsx.Cols.Col = flatCols(colData, xlsx.Cols.Col, func(fc, c xlsxCol) xlsxCol {
+ fc.BestFit = c.BestFit
+ fc.Collapsed = c.Collapsed
+ fc.CustomWidth = c.CustomWidth
+ fc.OutlineLevel = c.OutlineLevel
+ fc.Phonetic = c.Phonetic
+ fc.Style = c.Style
+ fc.Width = c.Width
+ return fc
+ })
return nil
}
-
// GetColOutlineLevel provides a function to get outline level of a single
// column by given worksheet name and column name. For example, get outline
// level of column D in Sheet1:
@@ -162,16 +172,16 @@ func (f *File) SetColOutlineLevel(sheet, col string, level uint8) error {
xlsx.Cols = &cols
return err
}
- for v := range xlsx.Cols.Col {
- if xlsx.Cols.Col[v].Min <= colNum && colNum <= xlsx.Cols.Col[v].Max {
- colData = xlsx.Cols.Col[v]
- }
- }
- colData.Min = colNum
- colData.Max = colNum
- colData.OutlineLevel = level
- colData.CustomWidth = true
- xlsx.Cols.Col = append(xlsx.Cols.Col, colData)
+ xlsx.Cols.Col = flatCols(colData, xlsx.Cols.Col, func(fc, c xlsxCol) xlsxCol {
+ fc.BestFit = c.BestFit
+ fc.Collapsed = c.Collapsed
+ fc.CustomWidth = c.CustomWidth
+ fc.Hidden = c.Hidden
+ fc.Phonetic = c.Phonetic
+ fc.Style = c.Style
+ fc.Width = c.Width
+ return fc
+ })
return err
}
@@ -214,21 +224,21 @@ func (f *File) SetColStyle(sheet, columns string, styleID int) error {
if xlsx.Cols == nil {
xlsx.Cols = &xlsxCols{}
}
- var find bool
- for idx, col := range xlsx.Cols.Col {
- if col.Min == min && col.Max == max {
- xlsx.Cols.Col[idx].Style = styleID
- find = true
- }
- }
- if !find {
- xlsx.Cols.Col = append(xlsx.Cols.Col, xlsxCol{
- Min: min,
- Max: max,
- Width: 9,
- Style: styleID,
- })
- }
+ xlsx.Cols.Col = flatCols(xlsxCol{
+ Min: min,
+ Max: max,
+ Width: 9,
+ Style: styleID,
+ }, xlsx.Cols.Col, func(fc, c xlsxCol) xlsxCol {
+ fc.BestFit = c.BestFit
+ fc.Collapsed = c.Collapsed
+ fc.CustomWidth = c.CustomWidth
+ fc.Hidden = c.Hidden
+ fc.OutlineLevel = c.OutlineLevel
+ fc.Phonetic = c.Phonetic
+ fc.Width = c.Width
+ return fc
+ })
return nil
}
@@ -261,16 +271,55 @@ func (f *File) SetColWidth(sheet, startcol, endcol string, width float64) error
Width: width,
CustomWidth: true,
}
- if xlsx.Cols != nil {
- xlsx.Cols.Col = append(xlsx.Cols.Col, col)
- } else {
+ if xlsx.Cols == nil {
cols := xlsxCols{}
cols.Col = append(cols.Col, col)
xlsx.Cols = &cols
+ return err
}
+ xlsx.Cols.Col = flatCols(col, xlsx.Cols.Col, func(fc, c xlsxCol) xlsxCol {
+ fc.BestFit = c.BestFit
+ fc.Collapsed = c.Collapsed
+ fc.Hidden = c.Hidden
+ fc.OutlineLevel = c.OutlineLevel
+ fc.Phonetic = c.Phonetic
+ fc.Style = c.Style
+ return fc
+ })
return err
}
+// flatCols provides a method for the column's operation functions to flatten
+// and check the worksheet columns.
+func flatCols(col xlsxCol, cols []xlsxCol, replacer func(fc, c xlsxCol) xlsxCol) []xlsxCol {
+ fc := []xlsxCol{}
+ for i := col.Min; i <= col.Max; i++ {
+ c := deepcopy.Copy(col).(xlsxCol)
+ c.Min, c.Max = i, i
+ fc = append(fc, c)
+ }
+ inFlat := func(colID int, cols []xlsxCol) (int, bool) {
+ for idx, c := range cols {
+ if c.Max == colID && c.Min == colID {
+ return idx, true
+ }
+ }
+ return -1, false
+ }
+ for _, column := range cols {
+ for i := column.Min; i <= column.Max; i++ {
+ if idx, ok := inFlat(i, fc); ok {
+ fc[idx] = replacer(fc[idx], column)
+ continue
+ }
+ c := deepcopy.Copy(column).(xlsxCol)
+ c.Min, c.Max = i, i
+ fc = append(fc, c)
+ }
+ }
+ return fc
+}
+
// positionObjectPixels calculate the vertices that define the position of a
// graphical object within the worksheet in pixels.
//