Go 實現支持多層復雜表頭的 Excel 導出工具
目錄
- 項目介紹
- 依賴說明
- 核心結構設計
- 如何支持多層表頭
- 完整使用示例
- 總結與擴展
項目介紹
在實際業務系統中,Excel 文件導出是一項常見功能,尤其是報表類需求中常見的復雜多級表頭,常規表格組件往往無法滿足。
本文基于 Go 語言和 excelize 庫,封裝一個支持多層嵌套表頭結構的導出工具,兼顧靈活性與可維護性。
依賴說明
import ("fmt""io""github.com/xuri/excelize/v2"
)
安裝依賴:
go get github.com/xuri/excelize/v2
核心結構設計
我們封裝了一個 ExcelExporter
結構體,用于管理工作簿、表頭結構和數據行追加。
簡單表頭支持:
func (e *ExcelExporter) SetSimpleHeaders(headers []string)
func (e *ExcelExporter) AppendData(data []interface{})
復雜表頭支持:
我們定義了遞歸結構體 Header
:
type Header struct {Title stringKey stringChildren []Header
}
支持任意嵌套層級,例如:
Header{Title: "基礎信息",Key: "basic",Children: []Header{{Title: "身份信息",Key: "identity",Children: []Header{{Title: "姓名", Key: "name"}, {Title: "性別", Key: "gender"}, {Title: "年齡", Key: "age"},},},{Title: "聯系方式",Key: "contact",Children: []Header{{Title: "手機號", Key: "mobile"},{Title: "郵箱", Key: "email"},},},},
},
通過遞歸函數 generateHeaders
自動合并單元格并映射每個字段的列坐標。
如何支持多層表頭
關鍵點包括:
- 使用遞歸方法生成合并單元格
- 用
keyToColumn
映射字段名和坐標位置 - 自動計算最大深度,確保每行 header 對齊
- 根據字段長度自動設置列寬
- 對每個單元格設置統一樣式(邊框、居中等)
每一級 Header 都可能包含子 Header,當 Children 非空時,會合并主標題橫向區域,并將子標題寫入下一行。
完整使用示例
exporter := NewExcelExporter()
_ = exporter.CreateSheet("統計報表")headers := []Header{{Title: "基礎信息",Key: "basic",Children: []Header{{Title: "身份信息",Key: "identity",Children: []Header{{Title: "姓名", Key: "name"},{Title: "性別", Key: "gender"},},},{Title: "聯系方式",Key: "contact",Children: []Header{{Title: "手機號", Key: "mobile"},},},},},{Title: "是否有孩子", Key: "has_child"},
}_ = exporter.SetComplexHeaders(headers)_ = exporter.AppendRow(map[string]interface{}{"name": "張三","gender": "男","mobile": "13800000000","has_child": "是",
})_ = exporter.SaveToFile("output.xlsx")
總結與擴展
總結
本文實現了一個具備如下能力的 Excel 工具:
- ? 簡單和復雜表頭共存支持
- ? 任意層級嵌套的結構導出
- ? 表頭自動合并、樣式統一
- ? 數據字段位置自動映射
可拓展方向
- 支持設置日期、貨幣等格式
- 支持按條件著色或高亮
- 支持單元格注釋、批注
- 與后端服務結合,實現 API 下載
- 多 Sheet 支持、分頁導出等
項目地址建議發布至 GitHub 并附帶 Demo 示例,歡迎讀者按需定制化封裝,助力高效構建導出報表模塊。