|
@@ -1,6 +1,10 @@
|
|
|
package main
|
|
|
|
|
|
import (
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+ "github.com/xuri/excelize/v2"
|
|
|
+ "io/ioutil"
|
|
|
"log"
|
|
|
"testing"
|
|
|
)
|
|
@@ -12,3 +16,76 @@ func TestZpName(t *testing.T) {
|
|
|
res := ZpName(key, model, sys2)
|
|
|
log.Println(res)
|
|
|
}
|
|
|
+
|
|
|
+type Node struct {
|
|
|
+ Code string `json:"code"`
|
|
|
+ Name string `json:"name"`
|
|
|
+ Children []Node `json:"children"`
|
|
|
+}
|
|
|
+
|
|
|
+func TestA(t *testing.T) {
|
|
|
+ // 第一步:读取 JSON 文件
|
|
|
+ data, err := ioutil.ReadFile("./国民经济行业分类_2017.json")
|
|
|
+ if err != nil {
|
|
|
+ log.Fatalf("读取 JSON 文件失败: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ var root []Node
|
|
|
+ err = json.Unmarshal(data, &root)
|
|
|
+ if err != nil {
|
|
|
+ log.Fatalf("解析 JSON 失败: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 第二步:创建 Excel 文件
|
|
|
+ f := excelize.NewFile()
|
|
|
+ sheetName := "Sheet1"
|
|
|
+ f.NewSheet(sheetName)
|
|
|
+
|
|
|
+ // 写表头:每层用两列:code, name
|
|
|
+ f.SetCellValue(sheetName, "A1", "Level1 Code")
|
|
|
+ f.SetCellValue(sheetName, "B1", "Level1 Name")
|
|
|
+ f.SetCellValue(sheetName, "C1", "Level2 Code")
|
|
|
+ f.SetCellValue(sheetName, "D1", "Level2 Name")
|
|
|
+ f.SetCellValue(sheetName, "E1", "Level3 Code")
|
|
|
+ f.SetCellValue(sheetName, "F1", "Level3 Name")
|
|
|
+ f.SetCellValue(sheetName, "G1", "Level4 Code")
|
|
|
+ f.SetCellValue(sheetName, "H1", "Level4 Name")
|
|
|
+
|
|
|
+ // 第三步:递归写入
|
|
|
+ row := 2
|
|
|
+ for _, n := range root {
|
|
|
+ row = writeNode(f, sheetName, n, row, 0)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 第四步:保存 Excel 文件
|
|
|
+ if err := f.SaveAs("output.xlsx"); err != nil {
|
|
|
+ log.Fatalf("保存 Excel 失败: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Println("导出完成:output.xlsx")
|
|
|
+}
|
|
|
+
|
|
|
+func writeNode(f *excelize.File, sheet string, node Node, row int, level int) int {
|
|
|
+ // 每层用两列:level=0 用 A/B, level=1 用 C/D ...
|
|
|
+ // 列号从 1 开始:A=1, B=2, C=3...
|
|
|
+ colCodeNum := level*2 + 1 // 代码列
|
|
|
+ colNameNum := level*2 + 2 // 名称列
|
|
|
+
|
|
|
+ colCode, _ := excelize.ColumnNumberToName(colCodeNum)
|
|
|
+ colName, _ := excelize.ColumnNumberToName(colNameNum)
|
|
|
+
|
|
|
+ cellCode := fmt.Sprintf("%s%d", colCode, row)
|
|
|
+ cellName := fmt.Sprintf("%s%d", colName, row)
|
|
|
+
|
|
|
+ f.SetCellValue(sheet, cellCode, node.Code)
|
|
|
+ f.SetCellValue(sheet, cellName, node.Name)
|
|
|
+
|
|
|
+ if len(node.Children) > 0 {
|
|
|
+ for _, child := range node.Children {
|
|
|
+ row = writeNode(f, sheet, child, row, level+1)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ row++
|
|
|
+ }
|
|
|
+ return row
|
|
|
+}
|