| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- package xlsx
- import "reflect"
- // Writes an array to row r. Accepts a pointer to array type 'e',
- // and writes the number of columns to write, 'cols'. If 'cols' is < 0,
- // the entire array will be written if possible. Returns -1 if the 'e'
- // doesn't point to an array, otherwise the number of columns written.
- func (r *Row) WriteSlice(e interface{}, cols int) int {
- if cols == 0 {
- return cols
- }
- // it's a slice, so open up its values
- v := reflect.ValueOf(e).Elem()
- if v.Kind() != reflect.Slice { // is 'e' even a slice?
- return -1
- }
- n := v.Len()
- if cols < n && cols > 0 {
- n = cols
- }
- var setCell func(reflect.Value)
- setCell = func(val reflect.Value) {
- switch val.Kind() { // underlying type of slice
- case reflect.String:
- cell := r.AddCell()
- cell.SetString(val.Interface().(string))
- case reflect.Int, reflect.Int8,
- reflect.Int16, reflect.Int32:
- cell := r.AddCell()
- cell.SetInt(val.Interface().(int))
- case reflect.Int64:
- cell := r.AddCell()
- cell.SetInt64(val.Interface().(int64))
- case reflect.Bool:
- cell := r.AddCell()
- cell.SetBool(val.Interface().(bool))
- case reflect.Float64, reflect.Float32:
- cell := r.AddCell()
- cell.SetFloat(val.Interface().(float64))
- case reflect.Interface:
- setCell(reflect.ValueOf(val.Interface()))
- }
- }
- var i int
- for i = 0; i < n; i++ {
- setCell(v.Index(i))
- }
- return i
- }
- // Writes a struct to row r. Accepts a pointer to struct type 'e',
- // and the number of columns to write, `cols`. If 'cols' is < 0,
- // the entire struct will be written if possible. Returns -1 if the 'e'
- // doesn't point to a struct, otherwise the number of columns written
- func (r *Row) WriteStruct(e interface{}, cols int) int {
- if cols == 0 {
- return cols
- }
- v := reflect.ValueOf(e).Elem()
- if v.Kind() != reflect.Struct {
- return -1 // bail if it's not a struct
- }
- n := v.NumField() // number of fields in struct
- if cols < n && cols > 0 {
- n = cols
- }
- var k int
- for i := 0; i < n; i, k = i+1, k+1 {
- f := v.Field(i).Kind()
- cell := r.AddCell()
- switch f {
- case reflect.Int, reflect.Int8,
- reflect.Int16, reflect.Int32:
- cell.SetInt(v.Field(i).Interface().(int))
- case reflect.Int64:
- cell.SetInt64(v.Field(i).Interface().(int64))
- case reflect.String:
- cell.SetString(v.Field(i).Interface().(string))
- case reflect.Float64, reflect.Float32:
- cell.SetFloat(v.Field(i).Interface().(float64))
- case reflect.Bool:
- cell.SetBool(v.Field(i).Interface().(bool))
- default:
- k-- // nothing set so reset to previous
- }
- }
- return k
- }
|