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());
相关推荐
咖啡八杯1 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育2 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵2 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔3 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影4 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao121315 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔5 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
CRMEB系统商城6 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience7 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
weixin_408099677 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能