|
@@ -0,0 +1,169 @@
|
|
|
|
|
+package xorm
|
|
|
|
|
+
|
|
|
|
|
+import (
|
|
|
|
|
+ "os"
|
|
|
|
|
+
|
|
|
|
|
+ tablib "github.com/agrison/go-tablib"
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+type Databook struct {
|
|
|
|
|
+ XDatabook *tablib.Databook
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func NewDatabook() *Databook {
|
|
|
|
|
+ db := &Databook{XDatabook: tablib.NewDatabook()}
|
|
|
|
|
+ return db
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func NewDatabookWithData(sheetName map[string]string, data interface{}, headers ...map[string][]string) (*Databook, error) {
|
|
|
|
|
+ s := len(sheetName)
|
|
|
|
|
+
|
|
|
|
|
+ switch data.(type) {
|
|
|
|
|
+ case map[string]*tablib.Dataset:
|
|
|
|
|
+ dataModel1 := data.(map[string]*tablib.Dataset)
|
|
|
|
|
+ d1 := len(dataModel1)
|
|
|
|
|
+ if s != d1 {
|
|
|
|
|
+ return nil, ErrParamsType
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ databook := tablib.NewDatabook()
|
|
|
|
|
+ for k, _ := range dataModel1 {
|
|
|
|
|
+ if _, ok := sheetName[k]; !ok {
|
|
|
|
|
+ return nil, ErrParamsType
|
|
|
|
|
+ }
|
|
|
|
|
+ databook.AddSheet(sheetName[k], dataModel1[k])
|
|
|
|
|
+ }
|
|
|
|
|
+ db := &Databook{XDatabook: databook}
|
|
|
|
|
+ return db, nil
|
|
|
|
|
+ case map[string][]map[string]interface{}:
|
|
|
|
|
+ dataModel2 := data.(map[string][]map[string]interface{})
|
|
|
|
|
+ d2 := len(dataModel2)
|
|
|
|
|
+
|
|
|
|
|
+ if len(headers) != 1 {
|
|
|
|
|
+ return nil, ErrParamsType
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ h := len(headers[0])
|
|
|
|
|
+
|
|
|
|
|
+ if s != h || s != d2 {
|
|
|
|
|
+ return nil, ErrParamsType
|
|
|
|
|
+ }
|
|
|
|
|
+ databook := tablib.NewDatabook()
|
|
|
|
|
+ for k, _ := range dataModel2 {
|
|
|
|
|
+ if _, ok := sheetName[k]; !ok {
|
|
|
|
|
+ return nil, ErrParamsType
|
|
|
|
|
+ }
|
|
|
|
|
+ if _, ok := headers[0][k]; !ok {
|
|
|
|
|
+ return nil, ErrParamsType
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ dataset, err := NewDatasetWithData(headers[0][k], dataModel2[k])
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return nil, err
|
|
|
|
|
+ }
|
|
|
|
|
+ databook.AddSheet(sheetName[k], dataset)
|
|
|
|
|
+ }
|
|
|
|
|
+ db := &Databook{XDatabook: databook}
|
|
|
|
|
+ return db, nil
|
|
|
|
|
+
|
|
|
|
|
+ default:
|
|
|
|
|
+ return nil, ErrParamsType
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (databook *Databook) AddSheet(title string, data interface{}, headers ...[]string) error {
|
|
|
|
|
+
|
|
|
|
|
+ switch data.(type) {
|
|
|
|
|
+ case *tablib.Dataset:
|
|
|
|
|
+ dataset := data.(*tablib.Dataset)
|
|
|
|
|
+ databook.XDatabook.AddSheet(title, dataset)
|
|
|
|
|
+ return nil
|
|
|
|
|
+ case []map[string]interface{}:
|
|
|
|
|
+ dataSlice := data.([]map[string]interface{})
|
|
|
|
|
+ if len(headers) != 1 {
|
|
|
|
|
+ return ErrParamsType
|
|
|
|
|
+ }
|
|
|
|
|
+ dataset, err := NewDatasetWithData(headers[0], dataSlice)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ databook.XDatabook.AddSheet(title, dataset)
|
|
|
|
|
+ return nil
|
|
|
|
|
+ default:
|
|
|
|
|
+ return ErrParamsType
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (databook *Databook) HTML() *tablib.Exportable {
|
|
|
|
|
+ return databook.XDatabook.HTML()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (databook *Databook) SaveAsHTML(filename string, perm os.FileMode) error {
|
|
|
|
|
+ html := databook.XDatabook.HTML()
|
|
|
|
|
+ return html.WriteFile(filename, perm)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (databook *Databook) JSON() (*tablib.Exportable, error) {
|
|
|
|
|
+ return databook.XDatabook.JSON()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (databook *Databook) SaveAsJSON(filename string, perm os.FileMode) error {
|
|
|
|
|
+ json, err := databook.XDatabook.JSON()
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ return json.WriteFile(filename, perm)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (databook *Databook) XLSX() (*tablib.Exportable, error) {
|
|
|
|
|
+ return databook.XDatabook.XLSX()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (databook *Databook) SaveAsXLSX(filename string, perm os.FileMode) error {
|
|
|
|
|
+ xlsx, err := databook.XDatabook.XLSX()
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ return xlsx.WriteFile(filename, perm)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (databook *Databook) XML() (*tablib.Exportable, error) {
|
|
|
|
|
+ return databook.XDatabook.XML()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (databook *Databook) SaveAsXML(filename string, perm os.FileMode) error {
|
|
|
|
|
+ xml, err := databook.XDatabook.XML()
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ return xml.WriteFile(filename, perm)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (databook *Databook) YAML() (*tablib.Exportable, error) {
|
|
|
|
|
+ return databook.XDatabook.YAML()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (databook *Databook) SaveAsYAML(filename string, perm os.FileMode) error {
|
|
|
|
|
+ yaml, err := databook.XDatabook.YAML()
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ return yaml.WriteFile(filename, perm)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (databook *Databook) Sheet(title string) tablib.Sheet {
|
|
|
|
|
+ return databook.XDatabook.Sheet(title)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (databook *Databook) Sheets() map[string]tablib.Sheet {
|
|
|
|
|
+ return databook.XDatabook.Sheets()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (databook *Databook) Size() int {
|
|
|
|
|
+ return databook.XDatabook.Size()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (databook *Databook) Wipe() {
|
|
|
|
|
+ databook.XDatabook.Wipe()
|
|
|
|
|
+}
|