Explorar el Código

- Function `SetCellValue()` time.Duration support added, relate issue #176;
- go test updated

Ri Xu hace 8 años
padre
commit
52b1a8e896
Se han modificado 3 ficheros con 31 adiciones y 16 borrados
  1. 25 13
      cell.go
  2. 4 3
      excelize.go
  3. 2 0
      excelize_test.go

+ 25 - 13
cell.go

@@ -39,6 +39,7 @@ func (f *File) mergeCellsParser(xlsx *xlsxWorksheet, axis string) string {
 //    float64
 //    string
 //    []byte
+//    time.Duration
 //    time.Time
 //    nil
 //
@@ -46,6 +47,30 @@ func (f *File) mergeCellsParser(xlsx *xlsxWorksheet, axis string) string {
 // set numbers format by SetCellStyle() method.
 func (f *File) SetCellValue(sheet, axis string, value interface{}) {
 	switch t := value.(type) {
+	case float32:
+		f.SetCellDefault(sheet, axis, strconv.FormatFloat(float64(value.(float32)), 'f', -1, 32))
+	case float64:
+		f.SetCellDefault(sheet, axis, strconv.FormatFloat(float64(value.(float64)), 'f', -1, 64))
+	case string:
+		f.SetCellStr(sheet, axis, t)
+	case []byte:
+		f.SetCellStr(sheet, axis, string(t))
+	case time.Duration:
+		f.SetCellDefault(sheet, axis, strconv.FormatFloat(float64(value.(time.Duration).Seconds()/86400), 'f', -1, 32))
+		f.setDefaultTimeStyle(sheet, axis, 21)
+	case time.Time:
+		f.SetCellDefault(sheet, axis, strconv.FormatFloat(float64(timeToExcelTime(timeToUTCTime(value.(time.Time)))), 'f', -1, 64))
+		f.setDefaultTimeStyle(sheet, axis, 22)
+	case nil:
+		f.SetCellStr(sheet, axis, "")
+	default:
+		f.setCellIntValue(sheet, axis, value)
+	}
+}
+
+// setCellIntValue provides function to set int value of a cell.
+func (f *File) setCellIntValue(sheet, axis string, value interface{}) {
+	switch value.(type) {
 	case int:
 		f.SetCellInt(sheet, axis, value.(int))
 	case int8:
@@ -66,19 +91,6 @@ func (f *File) SetCellValue(sheet, axis string, value interface{}) {
 		f.SetCellInt(sheet, axis, int(value.(uint32)))
 	case uint64:
 		f.SetCellInt(sheet, axis, int(value.(uint64)))
-	case float32:
-		f.SetCellDefault(sheet, axis, strconv.FormatFloat(float64(value.(float32)), 'f', -1, 32))
-	case float64:
-		f.SetCellDefault(sheet, axis, strconv.FormatFloat(float64(value.(float64)), 'f', -1, 64))
-	case string:
-		f.SetCellStr(sheet, axis, t)
-	case []byte:
-		f.SetCellStr(sheet, axis, string(t))
-	case time.Time:
-		f.SetCellDefault(sheet, axis, strconv.FormatFloat(float64(timeToExcelTime(timeToUTCTime(value.(time.Time)))), 'f', -1, 64))
-		f.setDefaultTimeStyle(sheet, axis)
-	case nil:
-		f.SetCellStr(sheet, axis, "")
 	default:
 		f.SetCellStr(sheet, axis, fmt.Sprintf("%v", value))
 	}

+ 4 - 3
excelize.go

@@ -70,10 +70,11 @@ func OpenReader(r io.Reader) (*File, error) {
 }
 
 // setDefaultTimeStyle provides function to set default numbers format for
-// time.Time type cell value by given worksheet name and cell coordinates.
-func (f *File) setDefaultTimeStyle(sheet, axis string) {
+// time.Time type cell value by given worksheet name, cell coordinates and
+// number format code.
+func (f *File) setDefaultTimeStyle(sheet, axis string, format int) {
 	if f.GetCellStyle(sheet, axis) == 0 {
-		style, _ := f.NewStyle(`{"number_format": 22}`)
+		style, _ := f.NewStyle(`{"number_format": ` + strconv.Itoa(format) + `}`)
 		f.SetCellStyle(sheet, axis, axis, style)
 	}
 }

+ 2 - 0
excelize_test.go

@@ -83,6 +83,8 @@ func TestOpenFile(t *testing.T) {
 	xlsx.SetCellValue("Sheet2", "F16", true)
 	xlsx.SetCellValue("Sheet2", "G2", nil)
 	xlsx.SetCellValue("Sheet2", "G4", time.Now())
+	// 02:46:40
+	xlsx.SetCellValue("Sheet2", "G5", time.Duration(1e13))
 	// Test completion column.
 	xlsx.SetCellValue("Sheet2", "M2", nil)
 	// Test read cell value with given axis large than exists row.