123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- // Copyright 2015 The Xorm Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- 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{}, mustMatch bool, 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 && mustMatch {
- 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) && mustMatch {
- 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], mustMatch)
- 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{}, mustMatch bool, 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, mustMatch)
- 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()
- }
|