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) {