From d862973c8d9fa6b7064f04df154f663c2034f076 Mon Sep 17 00:00:00 2001 From: lj-wsdj <1134294381@qq.com> Date: Wed, 22 May 2024 15:32:09 +0800 Subject: [PATCH] add new --- README.md | 5 +- export/xlsx.go | 16 ++++-- export5_test.go | 126 ++++++++++++++++++++++++++++++++++++++++++++++++ test5.xlsx | Bin 0 -> 6782 bytes 4 files changed, 141 insertions(+), 6 deletions(-) create mode 100644 export5_test.go create mode 100755 test5.xlsx diff --git a/README.md b/README.md index 9d3b883..aacbf41 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ excel的导出导入(目前仅完成导出) ## 导出功能 如果要使用导出,则传入的数据必须为指针,类型可以是struct或者元素为struct的slice。 -通过tag来确认需要导出的字段,内容为`export:”x:1,y:1”`,注意下x,y分别表是该字段在excel表格中的起始位置x为col,y为row,且tag中的x在数据中需要顺序列出。 +通过tag来确认需要导出的字段,内容为`export:”x:1,y:1”`,注意下x,y分别表是该字段在excel表格中的起始位置x为col,y为row,且tag中的x,y在数据中需要顺序列出,优先y,其次x。 +当导出的excel表格列数不确定时,tag使用`export:"loop:true"`,这样会将所有字段导出到excel表格中。 -详情请看测试文件 \ No newline at end of file +详情请看测试文件 diff --git a/export/xlsx.go b/export/xlsx.go index 134693e..bc72551 100644 --- a/export/xlsx.go +++ b/export/xlsx.go @@ -116,12 +116,20 @@ func (e *Exporter) writeCell(sheet string, field reflect.Value, tag string) { y, _ := strconv.Atoi(tagMap["y"]) colSpan, _ := strconv.Atoi(tagMap["colspan"]) rowSpan, _ := strconv.Atoi(tagMap["rowspan"]) + loop := tagMap["loop"] var location Location if e.preLocation != nil { - if x > e.preLocation.RightX { - y = e.preLocation.TopY - } else if x <= e.preLocation.RightX { - y = e.preLocation.BottomY + 1 + if loop != "" { + y = e.preLocation.BottomY + if x <= e.preLocation.RightX { + x = e.preLocation.RightX + 1 + } + } else { + if x > e.preLocation.RightX { + y = e.preLocation.TopY + } else if x <= e.preLocation.RightX { + y = e.preLocation.BottomY + 1 + } } } location = Location{ diff --git a/export5_test.go b/export5_test.go new file mode 100644 index 0000000..a67f890 --- /dev/null +++ b/export5_test.go @@ -0,0 +1,126 @@ +package xlsx + +import ( + "testing" + "time" + + "git.botann.com/lijun/xlsx/export" +) + +type CategoryReport struct { + ProjectID int `json:"project_id"` + ProjectName string `json:"project_name" export:"x:1,y:3"` + ProjectUnit string `json:"project_unit" export:"x:2,y:3"` + Developer string `json:"developer" export:"x:3,y:3"` + Location string `json:"location" export:"x:4,y:3"` + ProductionTime time.Time `json:"production_time" export:"x:5,y:3"` + CompanyInvest int64 `json:"company_invest" export:"x:6,y:3"` + Business []BusinessIndex `json:"business"` +} + +type BusinessIndex struct { + ProjectID int `json:"project_id"` + IndexId int `json:"index_id"` + Year int `json:"year"` + Name string `json:"name"` + Amount int64 `json:"amount" export:"x:7,y:3,loop:true"` + Unit string `json:"unit"` +} + +type BusinessIndexTotal struct { + IndexId int `json:"index_id"` + Name string `json:"name"` + Amount int64 `json:"amount" export:"x:7,y:2,loop:true"` +} + +type CategoryStatistics struct { + Info Info `json:"info"` + List []CategoryReport `json:"list"` +} +type Info struct { + Total []BusinessIndexTotal `json:"total"` + Title []BusinessIndex `json:"title"` +} + +func TestMain(t *testing.T) { + title := []export.Title{ + { + Name: "项目名称", + Location: export.Location{X: 1, Y: 1}, + }, + { + Name: "项目单位", + Location: export.Location{X: 2, Y: 1}, + }, + { + Name: "开发商", + Location: export.Location{X: 3, Y: 1}, + }, + { + Name: "位置", + Location: export.Location{X: 4, Y: 1}, + }, + { + Name: "生产时间", + Location: export.Location{X: 5, Y: 1}, + }, + { + Name: "公司投资", + Location: export.Location{X: 6, Y: 1}, + }, + { + Name: "生产规模", + Location: export.Location{X: 7, Y: 1}, + }, + { + Name: "权益规模", + Location: export.Location{X: 8, Y: 1}, + }, + { + Name: "总产量", + Location: export.Location{X: 9, Y: 1}, + }, + { + Name: "合计", + Location: export.Location{X: 1, Y: 2}, + Colspan: 6, + }, + } + total := []BusinessIndexTotal{ + {IndexId: 1, Name: "生产规模", Amount: 100}, {IndexId: 2, Name: "权益规模", Amount: 200}, {IndexId: 3, Name: "总产量", Amount: 300}, + } + report := []CategoryReport{ + CategoryReport{ + ProjectID: 1, ProjectName: "项目1", ProjectUnit: "单位1", Developer: "开发商1", Location: "位置1", ProductionTime: time.Now(), CompanyInvest: 1000, + Business: []BusinessIndex{ + {IndexId: 1, Name: "生产规模", Amount: 10, Unit: "吨"}, {IndexId: 2, Name: "权益规模", Amount: 20, Unit: "吨"}, {IndexId: 3, Name: "总产量", Amount: 30, Unit: "吨"}, + }, + }, + CategoryReport{ + ProjectID: 2, ProjectName: "项目2", ProjectUnit: "单位2", Developer: "开发商2", Location: "位置2", ProductionTime: time.Now(), CompanyInvest: 2000, + Business: []BusinessIndex{ + {IndexId: 1, Name: "生产规模", Amount: 20, Unit: "吨"}, {IndexId: 2, Name: "权益规模", Amount: 40, Unit: "吨"}, {IndexId: 3, Name: "总产量", Amount: 60, Unit: "吨"}, + }, + }, + CategoryReport{ + ProjectID: 3, ProjectName: "项目3", ProjectUnit: "单位3", Developer: "开发商3", Location: "位置3", ProductionTime: time.Now(), CompanyInvest: 3000, + Business: []BusinessIndex{ + {IndexId: 1, Name: "生产规模", Amount: 30, Unit: "吨"}, {IndexId: 2, Name: "权益规模", Amount: 60, Unit: "吨"}, {IndexId: 3, Name: "总产量", Amount: 90, Unit: "吨"}, + }, + }, + } + info := Info{ + Total: total, + } + data := CategoryStatistics{ + List: report, + Info: info, + } + exporter := export.DefaultExporter() + exporter.Titles = title + exporter.Data = &data + exporter.File = "test5.xlsx" + exporter.Path = "./" + exporter.Export(0) + +} diff --git a/test5.xlsx b/test5.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..183c3f4bb018ef7617084a2b107a349945d2819e GIT binary patch literal 6782 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