Skip to content

Commit

Permalink
- New function SetSheetRow() has been added for support write whole…
Browse files Browse the repository at this point in the history
… line at once, relate issue #96 and #194;

- go test and godoc updated;
- Note that this function performance has not been tested
  • Loading branch information
xuri committed Mar 12, 2018
1 parent ecc3adf commit 770026e
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 0 deletions.
42 changes: 42 additions & 0 deletions cell.go
Expand Up @@ -3,6 +3,7 @@ package excelize
import (
"encoding/xml"
"fmt"
"reflect"
"strconv"
"strings"
"time"
Expand Down Expand Up @@ -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 {
Expand Down
17 changes: 17 additions & 0 deletions excelize_test.go
Expand Up @@ -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
}
}

0 comments on commit 770026e

Please sign in to comment.