From c4fa0fad1e34fe15cfc4928babb44036efdd8a98 Mon Sep 17 00:00:00 2001 From: lj-wsdj <1134294381@qq.com> Date: Fri, 14 Jun 2024 11:12:59 +0800 Subject: [PATCH] =?UTF-8?q?=E9=92=88=E5=AF=B9=E7=AE=80=E5=8D=95=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E8=BF=9B=E8=A1=8C=E7=AE=80=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- export/cell.go | 1 + export/title.go | 32 ++++++++++++++++++-------------- export/xlsx.go | 22 +++++++++++++++------- export1_test.go | 2 +- export6_test.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ test.xlsx | Bin 6562 -> 0 bytes test1.xlsx | Bin 0 -> 6640 bytes test6.xlsx | Bin 0 -> 6449 bytes 8 files changed, 79 insertions(+), 22 deletions(-) create mode 100644 export6_test.go delete mode 100755 test.xlsx create mode 100755 test1.xlsx create mode 100755 test6.xlsx diff --git a/export/cell.go b/export/cell.go index a85d494..99968f0 100644 --- a/export/cell.go +++ b/export/cell.go @@ -40,6 +40,7 @@ func (e *Exporter) SetCell(sheet string, cell Cell) { BottomY: bottomy, IsMerge: start_col != end_col, } + // 记录当前单元格位置 e.preLocation = &CellLocation if cell.Style != nil { style, _ := e.xlsx.NewStyle(cell.Style) diff --git a/export/title.go b/export/title.go index 0eac5d2..41bdc07 100644 --- a/export/title.go +++ b/export/title.go @@ -23,20 +23,24 @@ func (e *Exporter) SetGlobalTitleStyle(style *excelize.Style) { e.GlobalTitleStyle = style } -func (e *Exporter) SetTitle(sheet string) { - for _, title := range e.Titles { - start_col, end_col := e.CaculateCell(title.Location, title.Rowspan, title.Colspan) - e.xlsx.MergeCell(sheet, start_col, end_col) - e.xlsx.SetCellValue(sheet, start_col, title.Name) - start_col_number, _, _ := excelize.SplitCellName(start_col) - e.xlsx.SetColWidth(sheet, start_col_number, start_col_number, 20) - if title.Style != nil { - style, _ := e.xlsx.NewStyle(title.Style) - e.xlsx.SetCellStyle(sheet, start_col, end_col, style) - } else if e.GlobalTitleStyle != nil { - style, _ := e.xlsx.NewStyle(e.GlobalTitleStyle) - e.xlsx.SetCellStyle(sheet, start_col, end_col, style) +func (e *Exporter) WriteTitle(sheet string, title Title) { + start_col, end_col := e.CaculateCell(title.Location, title.Rowspan, title.Colspan) + e.xlsx.MergeCell(sheet, start_col, end_col) + e.xlsx.SetCellValue(sheet, start_col, title.Name) + start_col_number, _, _ := excelize.SplitCellName(start_col) + e.xlsx.SetColWidth(sheet, start_col_number, start_col_number, 20) + if title.Style != nil { + style, _ := e.xlsx.NewStyle(title.Style) + e.xlsx.SetCellStyle(sheet, start_col, end_col, style) + } else if e.GlobalTitleStyle != nil { + style, _ := e.xlsx.NewStyle(e.GlobalTitleStyle) + e.xlsx.SetCellStyle(sheet, start_col, end_col, style) - } + } +} + +func (e *Exporter) SetTitle(sheet string) { + for _, title := range e.Titles { + e.WriteTitle(sheet, title) } } diff --git a/export/xlsx.go b/export/xlsx.go index fa29b9c..4fd0730 100644 --- a/export/xlsx.go +++ b/export/xlsx.go @@ -54,11 +54,10 @@ func (e *Exporter) Export(sheetIndex int) error { if err != nil { return err } - if len(e.Titles) == 0 { - return fmt.Errorf("excel title is null") - } sheet := e.Sheets[sheetIndex] - e.SetTitle(sheet) + if len(e.Titles) > 0 { + e.SetTitle(sheet) + } v := reflect.ValueOf(e.Data) if v.Kind() != reflect.Pointer { return fmt.Errorf("data must be pointer") @@ -117,8 +116,19 @@ func (e *Exporter) writeCell(sheet string, field reflect.Value, tag string) { colSpan, _ := strconv.Atoi(tagMap["colspan"]) rowSpan, _ := strconv.Atoi(tagMap["rowspan"]) loop := tagMap["loop"] + title := tagMap["title"] + if title != "" { + t := Title{ + Name: title, + Location: Location{X: x, Y: 1}, + Colspan: colSpan, + Rowspan: rowSpan, + } + e.WriteTitle(sheet, t) + } var location Location if e.preLocation != nil { + // loop不为空,则表示该结构体需要循环输出,x坐标需要重新计算(即x坐标需要在上一个结构体的右边,主要用于导出字段数量不确定,用sliece类型的结构体存储) if loop != "" { y = e.preLocation.BottomY if x <= e.preLocation.RightX { @@ -127,7 +137,7 @@ func (e *Exporter) writeCell(sheet string, field reflect.Value, tag string) { } else { if x > e.preLocation.RightX { y = e.preLocation.TopY - } else if x <= e.preLocation.RightX { + } else if x <= e.preLocation.RightX { // 如果x坐标小于等于上一个单元格的x坐标,则表示需要换行,此时y坐标需要在上一个单元格的下面 y = e.preLocation.BottomY + 1 } } @@ -153,10 +163,8 @@ func value(field reflect.Value) (val 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 } } diff --git a/export1_test.go b/export1_test.go index d0cf0fc..b82f9da 100644 --- a/export1_test.go +++ b/export1_test.go @@ -147,7 +147,7 @@ func TestMain(t *testing.T) { exporter := export.DefaultExporter() exporter.Data = &data exporter.Titles = title - exporter.File = "test.xlsx" + exporter.File = "test1.xlsx" exporter.Path = "./" exporter.Export(0) } diff --git a/export6_test.go b/export6_test.go new file mode 100644 index 0000000..861ea3d --- /dev/null +++ b/export6_test.go @@ -0,0 +1,44 @@ +package xlsx + +import ( + "fmt" + "testing" + + "git.botann.com/lijun/xlsx/export" +) + +type Data struct { + Name string `export:"true,x:1,y:1,title:项目名称"` + TotalInvest int64 `export:"true,x:2,y:1,title:总投资(万元)"` + Unit string `export:"true,x:3,y:1,title:单位"` + Remark string `export:"true,x:4,y:1,title:备注"` +} + +func TestMain(t *testing.T) { + data := []Data{ + { + Name: "项目1", + TotalInvest: 100, + Unit: "单位1", + Remark: "备注1", + }, + { + Name: "项目2", + TotalInvest: 200, + Unit: "单位2", + Remark: "备注2", + }, + { + Name: "项目3", + TotalInvest: 300, + Unit: "单位3", + Remark: "备注3", + }, + } + exporter := export.DefaultExporter() + exporter.Data = &data + exporter.File = "test6.xlsx" + exporter.Path = "./" + err := exporter.Export(0) + fmt.Println(err) +} diff --git a/test.xlsx b/test.xlsx deleted file mode 100755 index 7a2bab3b82b7d43d1f5bc3bc6fc6b054a34c88c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6562 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 S0)v8ri@bu6c{ZTD`S*WlghI~% literal 0 HcmV?d00001 diff --git a/test6.xlsx b/test6.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..43d945ea106c711dc085a4d2b6d6042171b47d28 GIT binary patch literal 6449 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 kpow2rfk6WE^b6