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;
        }
    }

}
相关推荐
蔡俊锋7 分钟前
Javar如何用RabbitMQ订单超时处理
java·python·rabbitmq·ruby
天天摸鱼的java工程师24 分钟前
Snowflake 雪花算法优缺点(Java老司机实战总结)
java·后端·面试
Miraitowa_cheems1 小时前
LeetCode算法日记 - Day 11: 寻找峰值、山脉数组的峰顶索引
java·算法·leetcode
海梨花1 小时前
【从零开始学习Redis】项目实战-黑马点评D2
java·数据库·redis·后端·缓存
共享家95271 小时前
linux-高级IO(上)
java·linux·服务器
橘子郡1231 小时前
观察者模式和发布订阅模式对比,Java示例
java
指针满天飞1 小时前
Collections.synchronizedList是如何将List变为线程安全的
java·数据结构·list
Java技术小馆1 小时前
重构 Controller 的 7 个黄金法则
java·后端·面试
金銀銅鐵1 小时前
[Java] 以 IntStream 为例,浅析 Stream 的实现
java·后端
曳渔2 小时前
UDP/TCP套接字编程简单实战指南
java·开发语言·网络·网络协议·tcp/ip·udp