From 770026e956508e1ff0d1563617d7a3c8f212fb22 Mon Sep 17 00:00:00 2001 From: Ri Xu Date: Mon, 12 Mar 2018 20:14:39 +0800 Subject: - 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 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'cell.go') 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 { -- cgit v1.2.1