summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cell.go24
-rw-r--r--excelize_test.go17
2 files changed, 38 insertions, 3 deletions
diff --git a/cell.go b/cell.go
index 214f5c6..dd6b169 100644
--- a/cell.go
+++ b/cell.go
@@ -1052,20 +1052,38 @@ func (f *File) SetCellRichText(sheet, cell string, runs []RichTextRun) error {
//
// err := f.SetSheetRow("Sheet1", "B6", &[]interface{}{"1", nil, 2})
func (f *File) SetSheetRow(sheet, axis string, slice interface{}) error {
+ return f.setSheetCells(sheet, axis, slice, rows)
+}
+
+// SetSheetCol writes an array to column by given worksheet name, starting
+// coordinate and a pointer to array type 'slice'. For example, writes an
+// array to column B start with the cell B6 on Sheet1:
+//
+// err := f.SetSheetCol("Sheet1", "B6", &[]interface{}{"1", nil, 2})
+func (f *File) SetSheetCol(sheet, axis string, slice interface{}) error {
+ return f.setSheetCells(sheet, axis, slice, columns)
+}
+
+// setSheetCells provides a function to set worksheet cells value.
+func (f *File) setSheetCells(sheet, axis string, slice interface{}, dir adjustDirection) error {
col, row, err := CellNameToCoordinates(axis)
if err != nil {
return err
}
-
// Make sure 'slice' is a Ptr to Slice
v := reflect.ValueOf(slice)
if v.Kind() != reflect.Ptr || v.Elem().Kind() != reflect.Slice {
return ErrParameterInvalid
}
v = v.Elem()
-
for i := 0; i < v.Len(); i++ {
- cell, err := CoordinatesToCellName(col+i, row)
+ var cell string
+ var err error
+ if dir == rows {
+ cell, err = CoordinatesToCellName(col+i, row)
+ } else {
+ cell, err = CoordinatesToCellName(col, row+i)
+ }
// Error should never happen here. But keep checking to early detect regressions
// if it will be introduced in the future.
if err != nil {
diff --git a/excelize_test.go b/excelize_test.go
index f1b9903..5db658a 100644
--- a/excelize_test.go
+++ b/excelize_test.go
@@ -1123,6 +1123,23 @@ func TestSharedStrings(t *testing.T) {
assert.NoError(t, f.Close())
}
+func TestSetSheetCol(t *testing.T) {
+ f, err := OpenFile(filepath.Join("test", "Book1.xlsx"))
+ if !assert.NoError(t, err) {
+ t.FailNow()
+ }
+
+ assert.NoError(t, f.SetSheetCol("Sheet1", "B27", &[]interface{}{"cell", nil, int32(42), float64(42), time.Now().UTC()}))
+
+ assert.EqualError(t, f.SetSheetCol("Sheet1", "", &[]interface{}{"cell", nil, 2}),
+ newCellNameToCoordinatesError("", newInvalidCellNameError("")).Error())
+
+ assert.EqualError(t, f.SetSheetCol("Sheet1", "B27", []interface{}{}), ErrParameterInvalid.Error())
+ assert.EqualError(t, f.SetSheetCol("Sheet1", "B27", &f), ErrParameterInvalid.Error())
+ assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetSheetCol.xlsx")))
+ assert.NoError(t, f.Close())
+}
+
func TestSetSheetRow(t *testing.T) {
f, err := OpenFile(filepath.Join("test", "Book1.xlsx"))
if !assert.NoError(t, err) {