summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxuri <xuri.me@gmail.com>2021-11-14 00:17:31 +0800
committerxuri <xuri.me@gmail.com>2021-11-14 00:17:31 +0800
commit57275db22e3a7f9dce51556f7579b704b8033dcb (patch)
treededa912d160c898d18e3f24be22a283636d2c9db
parentadecf447e15244207af5dfb7177447d278db7526 (diff)
This closes #1057, merge column styles to reduce spreadsheet size
-rw-r--r--col_test.go4
-rw-r--r--lib.go6
-rw-r--r--sheet.go35
3 files changed, 40 insertions, 5 deletions
diff --git a/col_test.go b/col_test.go
index 08f0eca..80fc676 100644
--- a/col_test.go
+++ b/col_test.go
@@ -243,9 +243,9 @@ func TestOutlineLevel(t *testing.T) {
assert.Equal(t, uint8(4), level)
assert.NoError(t, err)
- level, err = f.GetColOutlineLevel("Shee2", "A")
+ level, err = f.GetColOutlineLevel("SheetN", "A")
assert.Equal(t, uint8(0), level)
- assert.EqualError(t, err, "sheet Shee2 is not exist")
+ assert.EqualError(t, err, "sheet SheetN is not exist")
assert.NoError(t, f.SetColWidth("Sheet2", "A", "D", 13))
assert.EqualError(t, f.SetColWidth("Sheet2", "A", "D", MaxColumnWidth+1), ErrColumnWidth.Error())
diff --git a/lib.go b/lib.go
index 0710a7a..535161a 100644
--- a/lib.go
+++ b/lib.go
@@ -413,8 +413,8 @@ func defaultTrue(b *bool) bool {
return *b
}
-// MarshalXMLMarshalXML convert the boolean data type to literal values 0 or 1
-// on serialization.
+// MarshalXML convert the boolean data type to literal values 0 or 1 on
+// serialization.
func (avb attrValBool) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
attr := xml.Attr{
Name: xml.Name{
@@ -437,7 +437,7 @@ func (avb attrValBool) MarshalXML(e *xml.Encoder, start xml.StartElement) error
}
// UnmarshalXML convert the literal values true, false, 1, 0 of the XML
-// attribute to boolean data type on de-serialization.
+// attribute to boolean data type on deserialization.
func (avb *attrValBool) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
for {
t, err := d.Token()
diff --git a/sheet.go b/sheet.go
index dc93513..43e277a 100644
--- a/sheet.go
+++ b/sheet.go
@@ -24,6 +24,7 @@ import (
"path/filepath"
"reflect"
"regexp"
+ "sort"
"strconv"
"strings"
"unicode/utf8"
@@ -149,6 +150,37 @@ func (f *File) workBookWriter() {
}
}
+// mergeExpandedCols merge expanded columns.
+func (f *File) mergeExpandedCols(ws *xlsxWorksheet) {
+ sort.Slice(ws.Cols.Col, func(i, j int) bool {
+ return ws.Cols.Col[i].Min < ws.Cols.Col[j].Min
+ })
+ columns := []xlsxCol{}
+ for i, n := 0, len(ws.Cols.Col); i < n; {
+ left := i
+ for i++; i < n && reflect.DeepEqual(
+ xlsxCol{
+ BestFit: ws.Cols.Col[i-1].BestFit,
+ Collapsed: ws.Cols.Col[i-1].Collapsed,
+ CustomWidth: ws.Cols.Col[i-1].CustomWidth,
+ Hidden: ws.Cols.Col[i-1].Hidden,
+ Max: ws.Cols.Col[i-1].Max + 1,
+ Min: ws.Cols.Col[i-1].Min + 1,
+ OutlineLevel: ws.Cols.Col[i-1].OutlineLevel,
+ Phonetic: ws.Cols.Col[i-1].Phonetic,
+ Style: ws.Cols.Col[i-1].Style,
+ Width: ws.Cols.Col[i-1].Width,
+ }, ws.Cols.Col[i]); i++ {
+ }
+ column := deepcopy.Copy(ws.Cols.Col[left]).(xlsxCol)
+ if left < i-1 {
+ column.Max = ws.Cols.Col[i-1].Min
+ }
+ columns = append(columns, column)
+ }
+ ws.Cols.Col = columns
+}
+
// workSheetWriter provides a function to save xl/worksheets/sheet%d.xml after
// serialize structure.
func (f *File) workSheetWriter() {
@@ -161,6 +193,9 @@ func (f *File) workSheetWriter() {
if sheet.MergeCells != nil && len(sheet.MergeCells.Cells) > 0 {
_ = f.mergeOverlapCells(sheet)
}
+ if sheet.Cols != nil && len(sheet.Cols.Col) > 0 {
+ f.mergeExpandedCols(sheet)
+ }
for k, v := range sheet.SheetData.Row {
sheet.SheetData.Row[k].C = trimCell(v.C)
}