java解析excel文件,返回json

我这里用的是springboot项目,配合Maven使用的。首先需要引入依赖:

XML 复制代码
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>

接下来写一个ExcelUtils工具类,用于读取和解析单元格内的数据

java 复制代码
    
public class ExcelUtils {

    // sheet页下标
    private static final int SHEET_INDEX = 0;

    // 开始读取的行
    private static final int STARTER_EAD_LINE = 4;

    // 去除最后读取的行
    private static final int TAIL_LINE = 2;

上面的三个参数值根据自己要解析的excel定。

    private static final String[] PARAM_ARR = new String[] {"", ""};

数组内容自己定....


    public static void main(String[] args) {
        //读取excel数据
        ExcelUtils excelUtil = new ExcelUtils();
        List<Map<String, String>> result = excelUtil.readExcelToObj("文件路径");

        JSONArray jsonArray = new JSONArray();
        for (Map<String, String> map : result) {
            JSONObject jsonObject = new JSONObject();
            for (Map.Entry<String, String> entry : map.entrySet()) {
                jsonObject.put(entry.getKey(), entry.getValue());
            }
            jsonArray.add(jsonObject);
        }
        System.out.println(jsonArray.toJSONString());

    }


    private List<Map<String, String>> readExcelToObj(String path) {

        Workbook wb = null;
        List<Map<String, String>> result = null;
        try {
            wb = WorkbookFactory.create(new File(path));
            result = readExcel(wb, SHEET_INDEX, STARTER_EAD_LINE, TAIL_LINE);
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }


        public String getCellValue(Cell cell) {

        if (cell == null) {
            return "";
        }

        if (cell.getCellType() == CellType.STRING) {

            return cell.getStringCellValue();

        } else if (cell.getCellType() == CellType.BOOLEAN) {

            return String.valueOf(cell.getBooleanCellValue());

        } else if (cell.getCellType() == CellType.FORMULA) {

            return String.valueOf((int) cell.getNumericCellValue());

        } else if (cell.getCellType() == CellType.NUMERIC) {

            return String.valueOf((int) cell.getNumericCellValue());

        }
        return "";
    }



     private boolean isMergedRegion(Sheet sheet, int row, int column) {
        int sheetMergeCount = sheet.getNumMergedRegions();
        for (int i = 0; i < sheetMergeCount; i++) {
            CellRangeAddress range = sheet.getMergedRegion(i);
            int firstColumn = range.getFirstColumn();
            int lastColumn = range.getLastColumn();
            int firstRow = range.getFirstRow();
            int lastRow = range.getLastRow();
            if (row >= firstRow && row <= lastRow) {
                if (column >= firstColumn && column <= lastColumn) {
                    return true;
                }
            }
        }
        return false;
    }



    public String getMergedRegionValue(Sheet sheet, int row, int column) {
        int sheetMergeCount = sheet.getNumMergedRegions();

        for (int i = 0; i < sheetMergeCount; i++) {
            CellRangeAddress ca = sheet.getMergedRegion(i);
            int firstColumn = ca.getFirstColumn();
            int lastColumn = ca.getLastColumn();
            int firstRow = ca.getFirstRow();
            int lastRow = ca.getLastRow();

            if (row >= firstRow && row <= lastRow) {

                if (column >= firstColumn && column <= lastColumn) {
                    Row fRow = sheet.getRow(firstRow);
                    Cell fCell = fRow.getCell(firstColumn);
                    return getCellValue(fCell);
                }
            }
        }

        return null;
    }


    private List<Map<String, String>> readExcel(Workbook wb, int sheetIndex, int startReadLine, int tailLine) {
        Sheet sheet = wb.getSheetAt(sheetIndex);
        Row row = null;
        List<Map<String, String>> result = new ArrayList<Map<String, String>>();
        for (int i = startReadLine; i < sheet.getLastRowNum() - tailLine + 1; i++) {

            row = sheet.getRow(i);
            Map<String, String> map = new HashMap<String, String>();

            // 开始循环填充数据
            for (Cell c : row) {
                String returnStr = "";

                boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());
                //判断是否具有合并单元格
                if (isMerge) {
                    String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
                    returnStr = rs;
                } else {
                    //设置单元格类型
                    c.setCellType(CellType.STRING);
                    returnStr = c.getRichStringCellValue().getString();
                }

                int columnIndex = c.getColumnIndex();
                if (columnIndex < PARAM_ARR.length) {
                    map.put(PARAM_ARR[columnIndex], returnStr);
                }

            }
            result.add(map);
        }
        return result;
    }

}

执行main方法,填写正确的路径即可获取数据。

正常情况下后端接受的类型并非File类型,而是MultipartFile类型,因此需要转化

XML 复制代码
String originalFilename = file.getOriginalFilenam;
String fileType = "";   // 文件类型

File tempFile = null;
try {
    tempFile = File.createTempFile(originalFilename, fileType);
    file.transferTo(tempFile);
} catch (IOException e) {
    log.error("文件转换失败!", e);
}

List<Map<String, String>> maps = excelUtils.readExcelToObjByUpload(tempFile);

格式转换完后执行即可获得List<Map<String, String>>数据。

遍历数据,获得json返回

java 复制代码
JSONArray jsonArray = new JSONArray();

for (Map<String, String> map : maps) {
    boolean putFlag = true;
    JSONObject jsonObject = new JSONObject();
    for (Map.Entry<String, String> entry : map.entrySet()) {
        // 此行有一处数据为空则不加入,自己根据业务逻辑加判断
        if (StringUtils.isNull(entry.getValue())) {
            putFlag = false;
            break;
        }
        jsonObject.put(entry.getKey(), entry.getValue());
    }
    if (putFlag) {
        jsonArray.add(jsonObject);
    }
}

log.info("excel解析完数据为:{}", jsonArray.toJSONString());
相关推荐
okseekw7 分钟前
Java泛型从入门到实战:原理、用法与案例深度解析
java·后端
雨中飘荡的记忆8 分钟前
Spring WebFlux详解
java·后端·spring
若水不如远方9 分钟前
告别 RestHighLevelClient:Elasticsearch Java 新客户端实战与源码浅析
java·elasticsearch
萝卜青今天也要开心12 分钟前
2025年下半年系统架构设计师考后分享
java·数据库·redis·笔记·学习·系统架构
Unstoppable2213 分钟前
八股训练营第 39 天 | Bean 的作用域?Bean 的生命周期?Spring 循环依赖是怎么解决的?Spring 中用到了那些设计模式?
java·spring·设计模式
程序员根根13 分钟前
JavaSE 进阶:多线程核心知识点(线程创建 vs 线程安全 + 线程池优化 + 实战案例
java
阿伟*rui14 分钟前
互联网大厂Java面试:音视频场景技术攻防与系统设计深度解析
java·redis·websocket·面试·音视频·高并发·后端架构
Java天梯之路14 分钟前
Spring AOP:面向切面编程的优雅解耦之道
java·spring·面试
qq_3482318517 分钟前
Spring AI核心知识点
java·人工智能·spring
关于不上作者榜就原神启动那件事20 分钟前
【java后端开发问题合集】
java·开发语言