From 770026e956508e1ff0d1563617d7a3c8f212fb22 Mon Sep 17 00:00:00 2001 From: Ri Xu Date: Mon, 12 Mar 2018 20:14:39 +0800 Subject: [PATCH] - New function `SetSheetRow()` has been added for support write whole line at once, relate issue #96 and #194; - go test and godoc updated; - Note that this function performance has not been tested --- cell.go | 42 ++++++++++++++++++++++++++++++++++++++++++ excelize_test.go | 17 +++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/cell.go b/cell.go index 808c413a..281ab454 100644 --- a/cell.go +++ b/cell.go @@ -3,6 +3,7 @@ package excelize import ( "encoding/xml" "fmt" + "reflect" "strconv" "strings" "time" @@ -483,6 +484,47 @@ func (f *File) SetCellDefault(sheet, axis, value string) { xlsx.SheetData.Row[xAxis].C[yAxis].V = value } +// SetSheetRow writes an array to row by given worksheet name, starting +// coordinate and a pointer to array type 'slice'. For example, writes an +// array to row 6 start with the cell B6 on Sheet1: +// +// xlsx.SetSheetRow("Sheet1", "B6", &[]interface{}{"1", nil, 2}) +// +func (f *File) SetSheetRow(sheet, axis string, slice interface{}) { + xlsx := f.workSheetReader(sheet) + axis = f.mergeCellsParser(xlsx, axis) + col := string(strings.Map(letterOnlyMapF, axis)) + row, err := strconv.Atoi(strings.Map(intOnlyMapF, axis)) + if err != nil { + return + } + // Make sure 'slice' is a Ptr to Slice + v := reflect.ValueOf(slice) + if v.Kind() != reflect.Ptr { + return + } + v = v.Elem() + if v.Kind() != reflect.Slice { + return + } + + xAxis := row - 1 + yAxis := TitleToNumber(col) + + rows := xAxis + 1 + cell := yAxis + 1 + + completeRow(xlsx, rows, cell) + completeCol(xlsx, rows, cell) + + idx := 0 + for i := cell - 1; i < v.Len()+cell-1; i++ { + c := ToAlphaString(i) + strconv.Itoa(row) + f.SetCellValue(sheet, c, v.Index(idx).Interface()) + idx++ + } +} + // checkCellInArea provides function to determine if a given coordinate is // within an area. func checkCellInArea(cell, area string) bool { diff --git a/excelize_test.go b/excelize_test.go index 41a2d7f8..2b67c9e8 100644 --- a/excelize_test.go +++ b/excelize_test.go @@ -1043,3 +1043,20 @@ func TestSharedStrings(t *testing.T) { } xlsx.GetRows("Sheet1") } + +func TestSetSheetRow(t *testing.T) { + xlsx, err := OpenFile("./test/Book1.xlsx") + if err != nil { + t.Error(err) + return + } + xlsx.SetSheetRow("Sheet1", "B27", &[]interface{}{"cell", nil, int32(42), float64(42), time.Now()}) + xlsx.SetSheetRow("Sheet1", "", &[]interface{}{"cell", nil, 2}) + xlsx.SetSheetRow("Sheet1", "B27", []interface{}{}) + xlsx.SetSheetRow("Sheet1", "B27", &xlsx) + err = xlsx.Save() + if err != nil { + t.Error(err) + return + } +}