Ad XLSX exporting capabilities
This commit is contained in:
@@ -1 +1,51 @@
|
||||
package encoder
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
"github.com/360EntSecGroup-Skylar/excelize"
|
||||
)
|
||||
|
||||
type (
|
||||
excelizeEncoder struct {
|
||||
row int
|
||||
f *excelize.File
|
||||
w io.Writer
|
||||
ff []field
|
||||
}
|
||||
)
|
||||
|
||||
func NewExcelizeEncoder(w io.Writer, header bool, ff ...field) *excelizeEncoder {
|
||||
enc := &excelizeEncoder{
|
||||
f: excelize.NewFile(),
|
||||
w: w,
|
||||
ff: ff,
|
||||
}
|
||||
|
||||
if header {
|
||||
enc.writeHeader()
|
||||
}
|
||||
|
||||
return enc
|
||||
}
|
||||
|
||||
func (enc *excelizeEncoder) Flush() {
|
||||
_ = enc.f.Write(enc.w)
|
||||
}
|
||||
|
||||
// Returns current row + column to alphanumeric cell name
|
||||
func (enc excelizeEncoder) pos(col int) string {
|
||||
cn, _ := excelize.CoordinatesToCellName(col, enc.row)
|
||||
return cn
|
||||
}
|
||||
|
||||
func (enc excelizeEncoder) sheet() string {
|
||||
return "Sheet1"
|
||||
}
|
||||
|
||||
func (enc *excelizeEncoder) writeHeader() {
|
||||
enc.row++
|
||||
for p := range enc.ff {
|
||||
_ = enc.f.SetCellStr(enc.sheet(), enc.pos(p+1), enc.ff[p].name)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,3 +126,40 @@ func (enc structuredEncoder) Record(r *types.Record) error {
|
||||
|
||||
return enc.w.Encode(out)
|
||||
}
|
||||
|
||||
func (enc *excelizeEncoder) Record(r *types.Record) error {
|
||||
enc.row++
|
||||
|
||||
for p, f := range enc.ff {
|
||||
p++
|
||||
switch f.name {
|
||||
case "recordID", "ID":
|
||||
_ = enc.f.SetCellStr(enc.sheet(), enc.pos(p), fmtUint64(r.ID))
|
||||
case "moduleID":
|
||||
_ = enc.f.SetCellStr(enc.sheet(), enc.pos(p), fmtUint64(r.ModuleID))
|
||||
case "namespaceID":
|
||||
_ = enc.f.SetCellStr(enc.sheet(), enc.pos(p), fmtUint64(r.NamespaceID))
|
||||
case "ownedBy":
|
||||
_ = enc.f.SetCellStr(enc.sheet(), enc.pos(p), fmtUint64(r.OwnedBy))
|
||||
case "createdBy":
|
||||
_ = enc.f.SetCellStr(enc.sheet(), enc.pos(p), fmtUint64(r.CreatedBy))
|
||||
case "createdAt":
|
||||
_ = enc.f.SetCellStr(enc.sheet(), enc.pos(p), fmtTime(&r.CreatedAt))
|
||||
case "updatedBy":
|
||||
_ = enc.f.SetCellStr(enc.sheet(), enc.pos(p), fmtUint64(r.UpdatedBy))
|
||||
case "updatedAt":
|
||||
_ = enc.f.SetCellStr(enc.sheet(), enc.pos(p), fmtTime(r.UpdatedAt))
|
||||
case "deletedBy":
|
||||
_ = enc.f.SetCellStr(enc.sheet(), enc.pos(p), fmtUint64(r.DeletedBy))
|
||||
case "deletedAt":
|
||||
_ = enc.f.SetCellStr(enc.sheet(), enc.pos(p), fmtTime(r.DeletedAt))
|
||||
default:
|
||||
vv := r.Values.FilterByName(f.name)
|
||||
if len(vv) > 0 {
|
||||
_ = enc.f.SetCellStr(enc.sheet(), enc.pos(p), vv[0].Value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user