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;
    }
相关推荐
代码什么用8 小时前
Spring基础使用
java·后端·spring
Su米苏8 小时前
Spring AI 中MCP 与普通 @Tool的区别
java·人工智能·spring
码云数智-园园8 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
老板一杯拿铁8 小时前
Java 异常体系详解:从字节码原理到最佳实践
java
蜗牛互联网9 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端
禾小西9 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨9 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言
小卡车5559 小时前
java反射、自定义注解的应用(自定义分页)
java
BLUcoding10 小时前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom
yuniko-n10 小时前
【JUC】Lock 和 synchronzied 锁
java