From e37e060d6f97274c1e967cea40609623493bce25 Mon Sep 17 00:00:00 2001 From: xuri Date: Fri, 31 Dec 2021 00:00:01 +0800 Subject: [PATCH] This closes #1107, stream writer will create a time number format for time type cells Unit test coverage improved --- cell.go | 6 ++---- stream.go | 11 ++++++++--- stream_test.go | 43 +++++++++++++++++++++++-------------------- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/cell.go b/cell.go index 983b260..146d0a2 100644 --- a/cell.go +++ b/cell.go @@ -228,8 +228,7 @@ func setCellTime(value time.Time) (t string, b string, isNum bool, err error) { var excelTime float64 _, offset := value.In(value.Location()).Zone() value = value.Add(time.Duration(offset) * time.Second) - excelTime, err = timeToExcelTime(value) - if err != nil { + if excelTime, err = timeToExcelTime(value); err != nil { return } isNum = excelTime > 0 @@ -419,8 +418,7 @@ func setCellStr(value string) (t string, v string, ns xml.Attr) { } } } - t = "str" - v = bstrMarshal(value) + t, v = "str", bstrMarshal(value) return } diff --git a/stream.go b/stream.go index 4bd721e..8df308d 100644 --- a/stream.go +++ b/stream.go @@ -341,7 +341,7 @@ func (sw *StreamWriter) SetRow(axis string, values []interface{}, opts ...RowOpt val = v.Value setCellFormula(&c, v.Formula) } - if err = setCellValFunc(&c, val); err != nil { + if err = sw.setCellValFunc(&c, val); err != nil { _, _ = sw.rawData.WriteString(``) return err } @@ -424,7 +424,7 @@ func setCellFormula(c *xlsxC, formula string) { } // setCellValFunc provides a function to set value of a cell. -func setCellValFunc(c *xlsxC, val interface{}) (err error) { +func (sw *StreamWriter) setCellValFunc(c *xlsxC, val interface{}) (err error) { switch val := val.(type) { case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: err = setCellIntFunc(c, val) @@ -439,7 +439,12 @@ func setCellValFunc(c *xlsxC, val interface{}) (err error) { case time.Duration: c.T, c.V = setCellDuration(val) case time.Time: - c.T, c.V, _, err = setCellTime(val) + var isNum bool + c.T, c.V, isNum, err = setCellTime(val) + if isNum && c.S == 0 { + style, _ := sw.File.NewStyle(&Style{NumFmt: 22}) + c.S = style + } case bool: c.T, c.V = setCellBool(val) case nil: diff --git a/stream_test.go b/stream_test.go index 833a00a..dd1be8a 100644 --- a/stream_test.go +++ b/stream_test.go @@ -58,7 +58,7 @@ func TestStreamWriter(t *testing.T) { assert.NoError(t, streamWriter.SetRow("A4", []interface{}{Cell{StyleID: styleID}, Cell{Formula: "SUM(A10,B10)"}}), RowOpts{Height: 45, StyleID: styleID}) assert.NoError(t, streamWriter.SetRow("A5", []interface{}{&Cell{StyleID: styleID, Value: "cell"}, &Cell{Formula: "SUM(A10,B10)"}})) assert.NoError(t, streamWriter.SetRow("A6", []interface{}{time.Now()})) - assert.NoError(t, streamWriter.SetRow("A7", nil, RowOpts{Hidden: true})) + assert.NoError(t, streamWriter.SetRow("A7", nil, RowOpts{Height: 20, Hidden: true, StyleID: styleID})) assert.EqualError(t, streamWriter.SetRow("A7", nil, RowOpts{Height: MaxRowHeight + 1}), ErrMaxRowHeight.Error()) for rowID := 10; rowID <= 51200; rowID++ { @@ -208,24 +208,27 @@ func TestSetRow(t *testing.T) { } func TestSetCellValFunc(t *testing.T) { + f := NewFile() + sw, err := f.NewStreamWriter("Sheet1") + assert.NoError(t, err) c := &xlsxC{} - assert.NoError(t, setCellValFunc(c, 128)) - assert.NoError(t, setCellValFunc(c, int8(-128))) - assert.NoError(t, setCellValFunc(c, int16(-32768))) - assert.NoError(t, setCellValFunc(c, int32(-2147483648))) - assert.NoError(t, setCellValFunc(c, int64(-9223372036854775808))) - assert.NoError(t, setCellValFunc(c, uint(128))) - assert.NoError(t, setCellValFunc(c, uint8(255))) - assert.NoError(t, setCellValFunc(c, uint16(65535))) - assert.NoError(t, setCellValFunc(c, uint32(4294967295))) - assert.NoError(t, setCellValFunc(c, uint64(18446744073709551615))) - assert.NoError(t, setCellValFunc(c, float32(100.1588))) - assert.NoError(t, setCellValFunc(c, float64(100.1588))) - assert.NoError(t, setCellValFunc(c, " Hello")) - assert.NoError(t, setCellValFunc(c, []byte(" Hello"))) - assert.NoError(t, setCellValFunc(c, time.Now().UTC())) - assert.NoError(t, setCellValFunc(c, time.Duration(1e13))) - assert.NoError(t, setCellValFunc(c, true)) - assert.NoError(t, setCellValFunc(c, nil)) - assert.NoError(t, setCellValFunc(c, complex64(5+10i))) + assert.NoError(t, sw.setCellValFunc(c, 128)) + assert.NoError(t, sw.setCellValFunc(c, int8(-128))) + assert.NoError(t, sw.setCellValFunc(c, int16(-32768))) + assert.NoError(t, sw.setCellValFunc(c, int32(-2147483648))) + assert.NoError(t, sw.setCellValFunc(c, int64(-9223372036854775808))) + assert.NoError(t, sw.setCellValFunc(c, uint(128))) + assert.NoError(t, sw.setCellValFunc(c, uint8(255))) + assert.NoError(t, sw.setCellValFunc(c, uint16(65535))) + assert.NoError(t, sw.setCellValFunc(c, uint32(4294967295))) + assert.NoError(t, sw.setCellValFunc(c, uint64(18446744073709551615))) + assert.NoError(t, sw.setCellValFunc(c, float32(100.1588))) + assert.NoError(t, sw.setCellValFunc(c, float64(100.1588))) + assert.NoError(t, sw.setCellValFunc(c, " Hello")) + assert.NoError(t, sw.setCellValFunc(c, []byte(" Hello"))) + assert.NoError(t, sw.setCellValFunc(c, time.Now().UTC())) + assert.NoError(t, sw.setCellValFunc(c, time.Duration(1e13))) + assert.NoError(t, sw.setCellValFunc(c, true)) + assert.NoError(t, sw.setCellValFunc(c, nil)) + assert.NoError(t, sw.setCellValFunc(c, complex64(5+10i))) }