Skip to content

Commit

Permalink
optimze request SetHeaders;rename offic to office;excel A1-AZ expand …
Browse files Browse the repository at this point in the history
…A1-ZZ;excel add ExportZip
  • Loading branch information
dreamlu committed Oct 20, 2023
1 parent 85488f9 commit cc5e2a2
Show file tree
Hide file tree
Showing 8 changed files with 103 additions and 23 deletions.
6 changes: 5 additions & 1 deletion CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
better mock code implementation to replace faker
TMap[string,T] to TMap[K,V]
optimize src/file
skip verify ssl https
skip verify ssl https
optimze request SetHeaders
rename offic to office
excel A1-AZ expand A1-ZZ
excel add ExportZip
39 changes: 25 additions & 14 deletions offic/excel/excel.go → office/excel/excel.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (

type Excel[T comparable] struct {
*excelize.File
FileName string
Data any
Headers []string
HeaderMapper amap.AMap
Expand Down Expand Up @@ -40,41 +41,51 @@ func NewExcel[T comparable]() *Excel[T] {

func (f *Excel[T]) Export(data any) (err error) {

var (
ch = 'A'
pre = ""
)
ch, preCh, pre := f.sheetCellCharInit()
f.File = excelize.NewFile()

for _, header := range f.Headers {
err = f.SetCellValue(f.sheet, string(ch)+"1", header)
err = f.SetCellValue(f.sheet, pre+string(ch)+"1", header)
if err != nil {
return
}
ch++
pre = string(ch)
f.sheetCellCharChange(&ch, &preCh, &pre)
}

arr := reflect.ToSlice(data)
//_ = f.SetColWidth(St, "B", "I", 18)

for i, value := range arr {
num := strconv.Itoa(i + 2)
ch = 'A'
pre = ""
ch, preCh, pre = f.sheetCellCharInit()
for _, col := range f.Headers {
var v any
v = reflect.Field(value, f.HeaderMapper[col])
err = f.SetCellValue(f.sheet, pre+string(ch)+num, v)
if err != nil {
return
}
ch++
if ch > 'Z' {
ch = 'A'
pre = string(ch)
}

f.sheetCellCharChange(&ch, &preCh, &pre)
}
}
return
}

func (f *Excel[T]) sheetCellCharInit() (ch, preCh int32, pre string) {
return 'A', 'A', ""
}

func (f *Excel[T]) sheetCellCharChange(ch, preCh *int32, pre *string) {
*ch++
if *ch > 'Z' {
*ch = 'A'
if *pre != "" {
*preCh++
*pre = string(*preCh)
return
}
*pre = string(*preCh)
}
return
}
Expand Down
File renamed without changes.
18 changes: 12 additions & 6 deletions offic/excel/excel_sugar.go → office/excel/excel_sugar.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,6 @@ import (
"io"
)

func Export[T comparable](data any) (e *Excel[T], err error) {
e = NewExcel[T]()
err = e.Export(data)
return
}

// Import excel data
// support type: string, int, int64, uint, float64
// if you want to handle imported data, please implement Handle interface
Expand All @@ -20,3 +14,15 @@ func Import[T comparable](r io.Reader, opts ...excelize.Options) (datas []*T, er
err, datas = e.Import(r)
return
}

// Export excel data
func Export[T comparable](data any) (e *Excel[T], err error) {
e = NewExcel[T]()
err = e.Export(data)
return
}

// ExportZip export excel data to zip
func ExportZip[T comparable](dst io.Writer, excels []*Excel[T]) error {
return exportZip(dst, excels)
}
22 changes: 22 additions & 0 deletions offic/excel/excel_test.go → office/excel/excel_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,25 @@ func TestImport(t *testing.T) {
t.Log(user)
}
}

func TestExportZip(t *testing.T) {
var arr []*User
for i := 0; i < 10; i++ {
arr = append(arr, &User{
ID: i,
Name: "测试" + strconv.Itoa(i),
Date: time.CDateNow(),
})
}
e1, _ := Export[User](arr)
e1.FileName = "e1.xlsx"
e2, _ := Export[User](arr)
e2.FileName = "e2.xlsx"

// 1.bytes file stream
var bf = bytes.NewBuffer(nil)
t.Log(ExportZip[User](bf, []*Excel[User]{e1, e2}))

f, _ := os.Create("test.zip")
t.Log(ExportZip[User](f, []*Excel[User]{e1, e2}))
}
21 changes: 21 additions & 0 deletions office/excel/excel_zip.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package excel

import (
"github.com/dreamlu/gt/src/file/fs"
"io"
)

func exportZip[T comparable](dst io.Writer, excels []*Excel[T]) (err error) {

var fss []*fs.File
for _, excel := range excels {
ts := fs.NewFile()
_, err = excel.WriteTo(ts)
if err != nil {
return
}
ts.SetName(excel.FileName)
fss = append(fss, ts)
}
return fs.ZipFiles(dst, fss)
}
14 changes: 12 additions & 2 deletions src/ghttp/request.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,15 @@ func (m *Request) SetHeader(key, value string) *Request {
return m
}

func (m *Request) SetHeaders(header http.Header) *Request {
m.header = header
func (m *Request) SetHeaders(headers any) *Request {
switch headers.(type) {
case http.Header:
m.header = headers.(http.Header)
case cmap.CMap:
for k, v := range headers.(cmap.CMap) {
m.SetHeader(k, v[0])
}
}
return m
}

Expand All @@ -82,6 +89,9 @@ func (m *Request) SetBody(body io.Reader) *Request {
}

func (m *Request) SetJsonBody(v any) *Request {
if v == nil {
v = cmap.NewCMap()
}
bs, _ := json.Marshal(v)
m.body = bytes.NewReader(bs)
return m
Expand Down
6 changes: 6 additions & 0 deletions src/reflect/value.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ func Set(data any, field string, value any) {
TrueValueOf(data).FieldByName(field).Set(TrueValueOf(value))
}

// SetByIndex data field index value
// type and field must same
func SetByIndex(data any, index int, value any) {
TrueValueOf(data).Field(index).Set(TrueValueOf(value))
}

// Field reflect value via field name
// field must exist
func Field(data any, field string) any {
Expand Down

0 comments on commit cc5e2a2

Please sign in to comment.