java读取excel文件返回JSON

java读取excel文件返回JSON

bash 复制代码
/**
     * 读取文件,返回JSON格式
     *
     * @param titleRowNum   表头行 1--表示第一行是表头,2--表示第一行和第二行都是表头
     * @param excelFile
     * @param typeReference
     * @param <T>
     * @return
     */
    public static <T> List<T> readExcelJSON(int titleRowNum, File excelFile, TypeReference<T> typeReference) {
        cn.hutool.poi.excel.ExcelReader excelReader = ExcelUtil.getReader(excelFile);
        int sheetCount = excelReader.getSheetCount();

        List<T> resultList = new ArrayList<>();

        for (int sheetNum = 0; sheetNum < sheetCount; sheetNum++) {
            excelReader.setSheet(sheetNum);
            // 构建表头结构
            List<List<Object>> titleRowsList = excelReader.read(0, titleRowNum - 1);
            List<List<String>> titleColumnList = new ArrayList<>(titleRowsList.get(0).size());
            // 将表头第一行初始化到表头list
            titleRowsList.get(0).forEach(titleRowColumnValue -> {
                List<String> titleColumnValueList = new ArrayList<>();
                titleColumnValueList.add(titleRowColumnValue.toString());
                titleColumnList.add(titleColumnValueList);
            });
            // 拼接表头其他行
            for (int titleRowIndex = 1; titleRowIndex < titleRowsList.size(); titleRowIndex++) {
                List<Object> titleRowList = titleRowsList.get(titleRowIndex);
                for (int rowIndex = 0; rowIndex < titleRowList.size(); rowIndex++) {
                    if (!titleRowList.get(rowIndex).toString()
                            .equals(titleColumnList.get(rowIndex).get(titleColumnList.get(rowIndex).size() - 1))) {
                        titleColumnList.get(rowIndex).add(titleRowList.get(rowIndex).toString());
                    }
                }
            }
            // 初始化json解析模板
            JSONObject jsonDataTemplate = new JSONObject();
            titleColumnList.forEach(columnList -> {
                if (columnList.size() > 1) {
                    for (int columnIndex = 0; columnIndex < columnList.size() - 1; columnIndex++) {
                        jsonDataTemplate.put(columnList.get(columnIndex), new JSONObject());
                    }
                }
            });

            // 读取数据
            List<List<Object>> valueRowsList = excelReader.read(titleRowNum);
            valueRowsList.forEach(valueRowList -> {
                JSONObject rowValueJson = JSONObject.parseObject(jsonDataTemplate.toJSONString());
                for (int valueRowIndex = 0; valueRowIndex < valueRowList.size(); valueRowIndex++) {
                    List<String> columnTitleList = titleColumnList.get(valueRowIndex);
                    if (columnTitleList.size() > 1) {
                        JSONObject tmeJson = rowValueJson;
                        for (int columnTitleIndex = 0; columnTitleIndex < columnTitleList.size(); columnTitleIndex++) {
                            if (columnTitleIndex != columnTitleList.size() - 1) {
                                tmeJson = rowValueJson.getJSONObject(columnTitleList.get(columnTitleIndex));
                            } else {
                                tmeJson.put(columnTitleList.get(columnTitleIndex), valueRowList.get(valueRowIndex));
                            }
                        }
                    } else {
                        rowValueJson.put(columnTitleList.get(0), valueRowList.get(valueRowIndex));
                    }
                }
                resultList.add(JSON.parseObject(rowValueJson.toJSONString(), typeReference));
            });

        }
        return resultList;
    }
相关推荐
Seven9740 分钟前
BIO详解:解锁阻塞IO的使用方式
java
oak隔壁找我11 小时前
JVM常用调优参数
java·后端
蝎子莱莱爱打怪15 小时前
OpenClaw 从零配置指南:接入飞书 + 常用命令 + 原理图解
java·后端·ai编程
狼爷16 小时前
Go 没有 override?别硬套继承!用接口+嵌入,写更清爽的“覆盖”逻辑
java·go
小兔崽子去哪了19 小时前
Java 自动化部署
java·后端
ma_king19 小时前
入门 java 和 数据库
java·数据库·后端
后端AI实验室19 小时前
我用Cursor开发了3个月,整理出这套提效4倍的工作流
java·ai
码路飞1 天前
GPT-5.3 Instant 终于学会好好说话了,顺手对比了下同天发布的 Gemini 3.1 Flash-Lite
java·javascript
SimonKing1 天前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员
Seven971 天前
剑指offer-80、⼆叉树中和为某⼀值的路径(二)
java