summaryrefslogtreecommitdiff
path: root/cell.go
diff options
context:
space:
mode:
Diffstat (limited to 'cell.go')
-rw-r--r--cell.go42
1 files changed, 42 insertions, 0 deletions
diff --git a/cell.go b/cell.go
index 808c413..281ab45 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 {