From b52dfc1b1de12fb38aa371b89629d816cbc2a9b6 Mon Sep 17 00:00:00 2001 From: lj-wsdj <1134294381@qq.com> Date: Wed, 15 May 2024 17:09:50 +0800 Subject: [PATCH] fix bug time struct --- export/xlsx.go | 79 ++++++++++++++++++++++++++++++++++++------------- export_test.go | 53 ++++++++++++++++++++++++++++++--- test.xlsx | Bin 6534 -> 6621 bytes 3 files changed, 108 insertions(+), 24 deletions(-) diff --git a/export/xlsx.go b/export/xlsx.go index a15ecf1..a73adae 100644 --- a/export/xlsx.go +++ b/export/xlsx.go @@ -76,9 +76,16 @@ func (e *Exporter) Export(sheetIndex int) error { func (e *Exporter) dealElement(sheet string, data reflect.Value, index int) error { for i := 0; i < data.NumField(); i++ { field := data.Field(i) + t := data.Type().Field(i) + tag, ok := t.Tag.Lookup("export") switch field.Kind() { case reflect.Struct: - e.dealElement(sheet, field, index) + // 如果是结构体类型,但是没有export标签,则进行递归,否则直接处理(例如time.Time类型是结构体,但是可能需要导出) + if !ok { + e.dealElement(sheet, field, index) + } else { + e.writeCell(sheet, field, tag, index) + } // 该逻辑有待验证 case reflect.Slice: for j := 0; j < field.Len(); j++ { @@ -88,32 +95,64 @@ func (e *Exporter) dealElement(sheet string, data reflect.Value, index int) erro } } default: - t := data.Type().Field(i) - tag, ok := t.Tag.Lookup("export") if ok { - tagMap := dealTag(tag) - x, _ := strconv.Atoi(tagMap["x"]) - y, _ := strconv.Atoi(tagMap["y"]) - colSpan, _ := strconv.Atoi(tagMap["colspan"]) - rowSpan, _ := strconv.Atoi(tagMap["rowspan"]) - location := Location{ - X: x, - Y: y + index, - } - cell := Cell{ - Location: location, - Rowspan: rowSpan, - Colspan: colSpan, - Value: field, - } - e.SetCell(sheet, cell) + e.writeCell(sheet, field, tag, index) } - } + } } return e.Save() } +func (e *Exporter) writeCell(sheet string, field reflect.Value, tag string, index int) { + tagMap := dealTag(tag) + x, _ := strconv.Atoi(tagMap["x"]) + y, _ := strconv.Atoi(tagMap["y"]) + colSpan, _ := strconv.Atoi(tagMap["colspan"]) + rowSpan, _ := strconv.Atoi(tagMap["rowspan"]) + location := Location{ + X: x, + Y: y + index, + } + value := value(field) + cell := Cell{ + Location: location, + Rowspan: rowSpan, + Colspan: colSpan, + Value: value, + } + e.SetCell(sheet, cell) +} + +func value(field reflect.Value) (val string) { + mthV := field.MethodByName("String") + if !mthV.IsValid() && field.CanAddr() { + mthV = field.Addr().MethodByName("String") + } + if mthV.IsValid() && mthV.Kind() == reflect.Func && mthV.Type().NumIn() == 0 { + callV := mthV.Call(nil) + + if len(callV) > 0 { + val = fmt.Sprintf("%s", callV[0].String()) + + return + } + } + if field.CanUint() { + val = fmt.Sprintf("%d", field.Uint()) + + } else if field.CanInt() { + val = fmt.Sprintf("%d", field.Int()) + + } else if field.CanFloat() { + val = fmt.Sprintf("%f", field.Float()) + + } else { + val = fmt.Sprintf("%s", field.String()) + } + return +} + func dealTag(tag string) map[string]string { tag_list := strings.Split(tag, ",") tag_map := make(map[string]string) diff --git a/export_test.go b/export_test.go index 5aa2cd5..57edb79 100644 --- a/export_test.go +++ b/export_test.go @@ -1,14 +1,55 @@ package xlsx import ( + "encoding/json" + "fmt" + "math" "testing" + "time" "git.botann.com/lijun/xlsx/export" ) type Fen int +func (t *Fen) Value() float64 { + return float64(*t) * 0.01 +} + +func (t *Fen) String() string { + return fmt.Sprintf("%.2f", t.Value()) +} + +func (t Fen) MarshalJSON() ([]byte, error) { + return json.Marshal(t.String()) +} + +func (t *Fen) UnmarshalJSON(data []byte) error { + y := float64(0) + err := json.Unmarshal(data, &y) + if err != nil { + return err + } + *t = Fen(math.Round(y * 100)) + return nil +} + +type Date time.Time + +func (t *Date) Value() time.Time { + return time.Time(*t) +} + +func (t *Date) String() string { + return t.Value().Format("2006-01-02") +} + +func (t Date) MarshalJSON() ([]byte, error) { + return json.Marshal(t.String()) +} + type Data struct { + Date time.Time `export:"x:7,y:3"` Name string TotalInvest Fen `export:"true,x:2,y:3"` ProjectName string `export:"true,x:1,y:3"` @@ -75,9 +116,16 @@ func Test(t *testing.T) { Colspan: 1, Rowspan: 0, }, + { + Name: "日期", + Location: export.Location{X: 7, Y: 1}, + Colspan: 1, + Rowspan: 0, + }, } data := []Data{ { + Date: time.Now(), Name: "测试数据1", TotalInvest: 10000, ProjectName: "项目1", @@ -85,10 +133,6 @@ func Test(t *testing.T) { CityInvest: 2000, CompanyInvest: 6000, Partner: "公司1", - ExData: []ExData{ - {Col1: "test1", Col2: "test2"}, - {Col1: "测试1", Col2: "测试2"}, - }, ExData2: ExData2{ CenterInvest: 3000, CityInvest: 1500, @@ -96,6 +140,7 @@ func Test(t *testing.T) { }, }, { + Date: time.Now(), Name: "测试数据", TotalInvest: 8000, ProjectName: "项目2", diff --git a/test.xlsx b/test.xlsx index 3de3c61ef0044c68c0d1d9a96df09e76cd7f993d..72fae1c4636a477294cc2589344b2aea9ea8e2f7 100755 GIT binary patch delta 1011 zcmV0?Z-UkReR|A=eH!~KO zU07NQrIylmQA;UQx@pCYpcUUHiTV~rghG>a(e3ZR;eY;ieZT{7#3Jd3!huA?5HQgS z+rH>H@Ne^X*@AWVmo23N10D$Jz^+og8bY$wW!#fm*kfYAgMWWv#62aoFzO)Li=~enLN#94=EMB}N&(o|X<5_yU%<0K%a=FOq=qz53x#CA0u6?)TqOX)(aj~cJD6nd7O?^kb^?&+__EkHOcLxyvXpfS_Vbk_FjN>~3cM(Zk5{Gmu#^G&(KP_J5?ChxO^(S^%D{La7 z#0iNrW_;!RZPdRt5m}E$Q^)*#cVf3uzYC|qU3Kcz4}STI?f#%5;%=tyJN40&SE`Cb z!7q-8$bUF&JsuL5ICA{#sECZQ&ha{==QyPG2azrbS0}P1;ps$vCuX(cL5(e)o^+>j zNjy&k75p+q^rnd3@`r}zU966kXn$$hs1&~AD9Kne8?|%&u2&Q;IdC_}jOwI$Km%_v_iH z9@ewb=Hj+`daXXQdMome@?}!jay+db<_$f6FK_aOW|zfsT;z*lc~@^XA%xU%`-5%1 z-rya>1-sp}w!tO3f37>`^#*qw!@9wo&Tqp2ntcTT0RR6`O9u$!5Gr;S0RR9zv&{!e z4S&myqdX9W_y1EM@BcVllIbo1EiSfZcB8rNX{aQq0Y|oTdHfOS4uefJo}E+YtCLe@ z5b?{k@4Pcg)ruh@{%TD;9BR?D!#*KDfAIgG$V>WPd=c_Z9T2s5?YluGEtC{^_V z`%10E5r=Ev?S$+rtyV(rsX9umnp;!f(SKmQ-qOBm2lDO!@?Si}Zr9dWiu%;!px;d- zc9m|$pbqU(ku+}F9)~f$CvlgM%qM9~r(zo468viMqGo4LSFhi(!&+mL5G_wgym7`? zA>Ky)OOufGXf$=q&vz$&i~3c14eqK_r@x8IXKeQeoe+OBb>FFvrn1si8cT8UWPd`& zu=RMzeB!C`x2F>_j&)AgF+Ha-tv`r-N%$sFEQ!D*$~!Tuu?IE2blOf%REo2d!B2)bxoxqS~tWD(YhQy z7oQ)mJDRdbb0=#*xglEXEevsMrGGa>Yi?$U*21_UZmjrp_UQL0_gG-pDX$i%VSHJh z$*g>Tk0Bc$E;`j0NbW=KKnfq2??3`594=)5r2}CBFbBeY;I4^6$iu%QSqPZ};URDb zQiM=AkTQhQfv^ym1IZ)EBgaG$WDbN!z#T{tLE%8k2ucUSB49T1=d9A0P8VOo^mhON z0RR6`O9u#69xG-C0ssI!2eU;NQ2`0#5Gr;S0RR9zlb;w<4U`7}0C;RKb98xZWpk52 z85ENf85#i_lP(!R0@)Iia2X*RRvs&62Lb>9JO=;(7ytkO0000000000005(ttQji? J@D>07001)zqHzEK