
本文讲解如何使用 go 语言(配合 tealeg/xlsx 库)从 excel 表格中按列索引提取多个单元格的值,并将其组合成一个结构化的 json 对象,而非为每个单元格生成独立的 json。
本文讲解如何使用 go 语言(配合 tealeg/xlsx 库)从 excel 表格中按列索引提取多个单元格的值,并将其组合成一个结构化的 json 对象,而非为每个单元格生成独立的 json。
在处理 Excel 数据导出为 JSON 的场景中,常见误区是将每个匹配单元格单独构造成 map 并立即序列化——这会导致每行输出多个孤立的 JSON 对象(如 {"d_name":"A1","name":"A1"} 和 {"d_name":"B1","name":"B1"}),而实际需求往往是将同一行中不同列的数据关联组合为一个逻辑对象,例如将第 4 列(索引 3)作为 d_name、第 6 列(索引 5)作为 name,合并为 {"d_name":"张三","name":"李四"}。
关键在于:不要在循环内逐个 marshal,而应在行级作用域中预先收集所需字段,再统一构建并编码最终结构体。
以下是修正后的完整实现:
package main
import (
"fmt"
"github.com/tealeg/xlsx"
"encoding/json"
)
func main() {
excelFileName := "/Users/isaacmelton/Desktop/Test_Data.xlsx"
xlFile, err := xlsx.OpenFile(excelFileName)
if err != nil {
fmt.Printf("Error opening file: %v\n", err)
return
}
for _, sheet := range xlFile.Sheets {
for _, row := range sheet.Rows {
// 定义一个 map 存储本行需合并的字段
rowData := make(map[string]string)
for x, cell := range row.Cells {
switch x {
case 3: // 第4列(0-based),对应 d_name
rowData["d_name"] = cell.String()
case 5: // 第6列(0-based),对应 name
rowData["name"] = cell.String()
}
}
// 只有当两个字段均存在时才输出(可选校验)
if rowData["d_name"] != "" && rowData["name"] != "" {
jsonBytes, err := json.Marshal(rowData)
if err != nil {
fmt.Printf("JSON marshal error: %v\n", err)
continue
}
fmt.Println(string(jsonBytes))
}
}
}
}✅ 输出示例(符合预期):
{"d_name":"cell1","name":"cell2"}
{"d_name":"valueA","name":"valueB"}⚠️ 注意事项:
- 列索引 x == 3 和 x == 5 是基于 0 起始的,务必确认 Excel 中目标列的实际位置;
- 建议添加空值检查(如 cell != nil)和错误处理(json.Marshal 可能返回 error),避免 panic 或静默失败;
- 若需支持多行合并为数组(如 [{"d_name":...}, {"d_name":...}]),可在外层声明 var allRows []map[string]string,并在每行处理后 allRows = append(allRows, rowData),最后统一 json.Marshal(allRows);
- tealeg/xlsx 库已归档,生产环境推荐升级至更活跃的替代库(如 xlsx 或 excelize),后者对现代 Excel 格式和并发支持更佳。
通过合理控制数据收集粒度(以行为单位)与 JSON 序列化时机,即可精准实现“跨单元格结构化组装”,这是 Excel-to-JSON 集成中的核心实践模式。


















