当前位置: 首页 > news >正文

golang实现读取excel文件并转换为JSON格式

需求

假如有如下表格:
在这里插入图片描述
我希望能够得到如下的JSON数组以供后续使用:

[
    {
        "create_date": "2025-02-25 06:31:11",
        "id": "26",
        "indicator_value": "0.25",
        "params": "1,4",
        "primary_id": "1",
        "project_id": "1",
        "second_id": "1",
        "status": "0",
        "update_date": "2025-02-25 06:31:11"
    },
    {
        "create_date": "2025-02-25 06:31:18",
        "id": "27",
        "indicator_value": "0.5",
        "params": "1,2",
        "primary_id": "1",
        "project_id": "2",
        "second_id": "1",
        "status": "0",
        "update_date": "2025-02-25 06:31:18"
    }
]

由于暂时没找到能实现该功能的第三方依赖,所以只能自己写个简单的方法实现此功能

实现

首先安装excelize依赖以便读取excel文件

go get github.com/xuri/excelize/v2

然后创建方法readExcelToJSON

import (
	"encoding/json"
	"strings"

	"github.com/xuri/excelize/v2"
)

// 读取Excel文件并转换为JSON
func readExcelToJSON(filePath, sheetName string) (string, error) {
	f, err := excelize.OpenFile(filePath)
	if err != nil {
		return "", err
	}

	rows, err := f.GetRows(sheetName)
	if err != nil {
		return "", err
	}

	// 提取标题行中每列的名称
	headers := make([]string, len(rows[0]))
	for j, col := range rows[0] {
		headers[j] = strings.TrimSpace(col)
	}

	var jsonDataSlice []string

	// 忽略标题行
	rows = rows[1:]

	// 遍历所有行
	for _, row := range rows {
		rowData := make(map[string]interface{})

		// 填充数据到map中,使用列名作为key
		for j, col := range row {
			header := headers[j]                // 当前列的列名
			cellValue := strings.TrimSpace(col) // 单元格的值

			// 不需要转换数据类型
			rowData[header] = cellValue
		}

		jsonData, err := json.Marshal(rowData)
		if err != nil {
			return "", err
		}

		jsonDataSlice = append(jsonDataSlice, string(jsonData))

	}
	// 将结果切片转换为标准格式JSON字符串
	jsonResult := "[" + strings.Join(jsonDataSlice, ",") + "]"
	return jsonResult, nil
}

如果需要转换数据类型,可以把rowData[header] = cellValue替换成下面的代码

			if num, err := strconv.Atoi(cellValue); err == nil {
				rowData[header] = num
			} else if floatNum, err := strconv.ParseFloat(cellValue, 64); err == nil {
				rowData[header] = floatNum
			} else if boolVal, err := strconv.ParseBool(cellValue); err == nil {
				rowData[header] = boolVal
			} else {
				rowData[header] = cellValue
			}

测试

import (
	"testing"
)

func TestReadExcelRows(t *testing.T) {

	rows, err := readExcelToJSON("C:\\Users\\ThinkPad\\Desktop\\tproject_input.xlsx", "Result 1")
	if err != nil {
		t.Errorf("error = %v", err)
		return
	}
	t.Logf("rows = %v", rows)
}

在这里插入图片描述

相关文章:

  • 51单片机编程学习笔记——74HC138译码器
  • 通用网盘客户端(基于webdav协议)
  • 《JavaScript解题秘籍:力扣队列与栈的高效解题策略》
  • 【Mac】2025-MacOS系统下常用的开发环境配置
  • 私有云基础架构
  • 全面了解机器学习:回归、分类、分割与检测任务
  • OpenCV:从入门到实战的全方位指南
  • DeepSeek助力学术写作:150个提示词解读
  • Goby 漏洞安全通告| Ollama /api/tags 未授权访问漏洞(CNVD-2025-04094)
  • HarmonyOS NEXT开发进阶(十一):应用层架构介绍
  • selenium用例执行过程采集操作形成测试报告上的回复
  • 基于 openEuler 22.09 的 OpenStack Yoga 部署
  • Java 大视界 -- Java 大数据中的联邦学习激励机制设计与实践(111)
  • Git 2.48.1 官方安装与配置全流程指南(Windows平台)
  • Attentive Eraser论文笔记
  • 神经机器翻译:联合学习对齐和翻译
  • ThreadLocal在多线程中传递上下文InheritableThreadLocal
  • IDEA 2025最新版2024.3.3软件安装、插件安装、语言设置
  • Redis实战篇《黑马点评》8 附近商铺
  • 网络编程 day01
  • 招商蛇口:一季度营收约204亿元,净利润约4.45亿元
  • 交通运输部:预计今年五一假期全社会跨区域人员流动量将再创新高
  • 书业观察|一本书的颜值革命:从毛边皮面到爆火的刷边书
  • 文化润疆|让新疆青少年成为“小小博物家”
  • 四川在浙江公开招募200名退休教师,赴川支教帮扶
  • 加拿大温哥华一车辆冲撞人群,造成多人伤亡