該版本完全兼容最新版 excelize 庫 (v2.7+),實現了只有表頭的 Excel 模板,并在指定列添加了下拉框功能。生成的 Excel 文件在打開時,指定列的單元格會顯示下拉選擇箭頭。
代碼如下:
package mainimport ("fmt""log""github.com/xuri/excelize/v2"
)// Excel模板配置
type ExcelTemplateConfig struct {SheetName string // 工作表名稱Headers []HeaderConfig // 表頭配置DropdownCols []DropdownCol // 下拉框列配置
}type HeaderConfig struct {Title string // 列標題Column string // 列標識(如A, B, C)
}type DropdownCol struct {Column string // 需要下拉框的列標識(如B, C)Options []string // 下拉選項列表StartRow int // 下拉框起始行(從1開始)EndRow int // 下拉框結束行
}func CreateExcelTemplate(config ExcelTemplateConfig) error {f := excelize.NewFile()defer f.Close()// 設置工作表名稱sheet := config.SheetNameif sheet == "" {sheet = "Sheet1"}// 創建新工作表index, err := f.NewSheet(sheet)if err != nil {return fmt.Errorf("創建工作表失敗: %w", err)}f.SetActiveSheet(index)// 寫入表頭for _, header := range config.Headers {cell := fmt.Sprintf("%s1", header.Column)if err := f.SetCellValue(sheet, cell, header.Title); err != nil {return fmt.Errorf("寫入表頭失敗: %w", err)}// 設置表頭樣式(可選)style, _ := f.NewStyle(&excelize.Style{Font: &excelize.Font{Bold: true, Color: "FFFFFF"},Fill: excelize.Fill{Type: "pattern", Color: []string{"4F81BD"}, Pattern: 1},Alignment: &excelize.Alignment{Horizontal: "center"},})f.SetCellStyle(sheet, cell, cell, style)}// 設置列寬(可選)for _, header := range config.Headers {colWidth := 15.0 // 默認列寬if len(header.Title) > 15 {colWidth = float64(len(header.Title)) + 2}if err := f.SetColWidth(sheet, header.Column, header.Column, colWidth); err != nil {log.Printf("設置列寬失敗: %v", err)}}// 添加下拉框for _, dropdown := range config.DropdownCols {if dropdown.EndRow < dropdown.StartRow {// 默認設置1000行下拉框dropdown.EndRow = dropdown.StartRow + 999}// 構建范圍字符串 (如 "B2:B1000")dvRange := fmt.Sprintf("%s%d:%s%d",dropdown.Column,dropdown.StartRow,dropdown.Column,dropdown.EndRow,)// 創建數據驗證對象dv := excelize.NewDataValidation(true) // 允許空值dv.SetSqref(dvRange) // 設置應用范圍// 設置下拉列表選項if err := dv.SetDropList(dropdown.Options); err != nil {return fmt.Errorf("設置下拉選項失敗: %w", err)}// 添加數據驗證到工作表if err := f.AddDataValidation(sheet, dv); err != nil {return fmt.Errorf("添加下拉框失敗: %w", err)}// 添加注釋提示(使用新版API)commentCell := fmt.Sprintf("%s1", dropdown.Column)if err := f.AddComment(sheet, excelize.Comment{Cell: commentCell,Author: "系統提示",Paragraph: []excelize.RichTextRun{{Text: "請從下拉列表中選擇:\n"},{Text: joinOptions(dropdown.Options)},},}); err != nil {log.Printf("添加注釋失敗: %v", err)}}// 保存文件if err := f.SaveAs("template.xlsx"); err != nil {return fmt.Errorf("保存文件失敗: %w", err)}return nil
}// 將選項列表轉換為逗號分隔的字符串(用于注釋)
func joinOptions(options []string) string {result := ""for i, opt := range options {if i > 0 {result += ", "}result += opt}return result
}func main() {// 配置Excel模板config := ExcelTemplateConfig{SheetName: "Sheet1",Headers: []HeaderConfig{{Title: "產品ID", Column: "A"},{Title: "產品名稱", Column: "B"},{Title: "產品狀態", Column: "C"},{Title: "產品類別", Column: "D"},},DropdownCols: []DropdownCol{{Column: "C", // 狀態列Options: []string{"在售", "下架", "預售", "停產", "測試"},StartRow: 2, // 從第2行開始EndRow: 1000, // 到第1000行},{Column: "D", // 類別列Options: []string{"電子產品", "家居用品", "服裝", "食品", "圖書", "ceshi"},StartRow: 2,EndRow: 1000,},},}// 生成Excel模板文件if err := CreateExcelTemplate(config); err != nil {log.Fatalf("生成模板失敗: %v", err)}fmt.Println("Excel模板已成功生成: template.xlsx")fmt.Println("包含以下下拉框列:")for i, dropdown := range config.DropdownCols {fmt.Printf("%d. 列 %s: %v\n", i+1, dropdown.Column, dropdown.Options)}
}
功能說明:
純表頭模板:
只生成表頭行(第1行)
沒有數據行
下拉框功能:
在指定列添加數據驗證下拉框
下拉框從第2行開始到指定結束行
支持多個下拉框列
增強功能:
表頭美化:加粗、居中、藍底白字
列寬自適應:根據標題長度自動調整列寬
提示注釋:在列標題添加下拉選項提示
空值允許:允許單元格為空
使用說明:
安裝依賴:
bash
go get github.com/xuri/excelize/v2
運行程序:
bash
go run main.go
輸出文件:
生成?
template.xlsx
?文件打開后可以看到表頭和下拉框設置
自定義選項:
修改下拉選項:
go
Options: []string{"選項1", "選項2", "選項3"},
調整下拉范圍:
go
StartRow: 2, // 從第2行開始 EndRow: 500, // 到第500行
添加更多下拉列:
go
DropdownCols: []DropdownCol{{Column: "E", Options: []string{"是", "否"}, StartRow: 2, EndRow: 1000},// 添加更多列... },
該版本完全兼容最新版 excelize 庫 (v2.7+),實現了只有表頭的 Excel 模板,并在指定列添加了下拉框功能。生成的 Excel 文件在打開時,指定列的單元格會顯示下拉選擇箭頭。
擴展:
自定義列寬:
定義config:
// 配置Excel模板config := ExcelTemplateConfig{SheetName: "Sheet1",Headers: []HeaderConfig{{Title: "產品ID", Column: "A", Width: 20}, // 增加了列寬的配置{Title: "產品名稱", Column: "B", Width: 40}, // 增加了列寬的配置{Title: "產品狀態", Column: "C"},{Title: "產品類別", Column: "D"},},DropdownCols: []DropdownCol{{Column: "C", // 狀態列Options: []string{"在售", "下架", "預售", "停產", "測試"},StartRow: 2, // 從第2行開始EndRow: 100000, // 到第100000行},{Column: "D", // 類別列Options: []string{"電子產品", "家居用品", "服裝", "食品", "圖書", "ceshi"},StartRow: 2,EndRow: 100000,},},}
設置列寬:
// 設置列寬(可選)for _, header := range config.Headers {colWidth := 15.0 // 默認列寬if header.Width > 15 {colWidth = float64(header.Width)}if err := f.SetColWidth(sheet, header.Column, header.Column, colWidth); err != nil {log.Printf("設置列寬失敗: %v", err)}}
修改這兩處,即可按照用戶設置的列寬來確定模板的列寬了。