summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCooper de Nicola <cdenicol@stanford.edu>2022-08-24 18:34:29 -0700
committerGitHub <noreply@github.com>2022-08-25 09:34:29 +0800
commit0e9378fec2ab4ba60ed284db4383df86555076d1 (patch)
tree39e3f2eac3a4c135c52f25d740fdb9b20bd60f13
parentcb8bca0e92cbec30db10c2a2863ef81fd98a6138 (diff)
This closes #1247, add new function `SetSheetCol` for set worksheet column values (#1320)
Signed-off-by: cdenicola <cooper.denicola@instabase.com> Co-authored-by: cdenicola <cooper.denicola@instabase.com>
-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) {