Java.Utils:Excel转Json

Don't say much, just go to the code.

java 复制代码
package org.bood.common.utils;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Excel转Json
 *
 * @author bood
 * @since 2024/10/30
 */
public class ExcelToJsonConverter {

    public static void main(String[] args) {
        String excelFilePath = "/Users/bood/Downloads/*.xlsx";
        try {
            List<Map<String, Object>> jsonData = convertExcelToJson(excelFilePath);
            ObjectMapper objectMapper = new ObjectMapper();
            String jsonString = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonData);
            System.out.println(jsonString);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 将Excel文件转换为JSON格式的数据
     * 此方法读取Excel文件的内容,并将其转换为一个包含多个键值对的列表
     * 每个键值对代表Excel中的一个单元格,键是列标题,值是单元格的值
     *
     * @param filePath Excel文件的路径
     * @return 包含多个键值对的列表,每个键值对代表Excel中的一个单元格
     * @author bood
     * @since 2024/12/02
     */
    public static List<Map<String, Object>> convertExcelToJson(String filePath) throws IOException {
        List<Map<String, Object>> jsonData = new ArrayList<>();
        try (FileInputStream fis = new FileInputStream((filePath));
             Workbook workbook = new XSSFWorkbook(fis)) {
            // 获取第一个工作表
            Sheet sheet = workbook.getSheetAt(0);
            Row headerRow = sheet.getRow(0);
            List<String> headers = new ArrayList<>();
            // 获取列标题(KEY)
            for (Cell cell : headerRow) {
                headers.add(cell.toString());
            }
            // 读取数据行
            for (int i = 1; i <= sheet.getLastRowNum(); i++) {
                Row row = sheet.getRow(i);
                if (row == null) continue;
                Map<String, Object> jsonRow = new HashMap<>();
                for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
                    Cell cell = row.getCell(j);
                    jsonRow.put(headers.get(j), getCellValue(cell));
                }
                jsonData.add(jsonRow);
            }
        }
        return jsonData;
    }

    private static Object getCellValue(Cell cell) {
        switch (cell.getCellTypeEnum()) {
            case STRING:
                return cell.getStringCellValue();
            case BOOLEAN:
                return cell.getBooleanCellValue();
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    return cell.getDateCellValue();
                } else {
                    return Double.valueOf(cell.getNumericCellValue()).longValue();
                }
            case FORMULA:
                return cell.getCellFormula();
            case BLANK:
                return null;
            default:
                return null;
        }
    }

}
相关推荐
独泪了无痕18 小时前
探索Pinyin4j-Java中的拼音转换利器
java·后端
道尔柯南19 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
kingx320 小时前
Bugku 3122 谷歌小恐龙题解:纯离线逆向 Vault 的 AES-GCM 加密资源(附 Python 解密器)
java·逆向·ctf·bugku·aes-gcm
DevOpenClub1 天前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考
露天赏雪1 天前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
天天被压力1 天前
【A股分钟级高频数据完全手册 #06】北交所分钟级数据接口:京市股票Pro版最新分时
java·人工智能·python
天天被压力1 天前
【A股分钟级高频数据完全手册 #05】指数历史分钟数据接口:Pro版沪深指数分时回放
java·人工智能·python
captain3761 天前
▲统一功能——DispatcherServlet源码分析
java·spring·java-ee·log4j·maven
金銀銅鐵1 天前
JDK 21 中 List.of 的实现细节:从 List12 到 ListN
java·后端·ai编程
yeccheng1 天前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试