POI实现前端传入的参数与实体类字段顺序不一致时导出百万数据

POI实现前端传入的参数与实体类字段顺序不一致时导出数据

/**
     * 导出百万数据
     *
     * @param sheetName
     * @param titleList
     * @param dataList  类型是List<Map<String, Object>>
     * @return
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     */
    public static SXSSFWorkbook getSXSSFWorkbook2(String sheetName, // 页名
                                                  List<Map<String, String>> titleList, // 表头列表
                                                  List<Map<String, Object>> dataList, //数据集合
                                                  Map<String, Map<String, String>> i18nMap) //国际化处理
            throws IllegalArgumentException {

        // 创建keyList和valueList分别用来存储titleList集合中map集合的key和value
        List<String> keyList = new ArrayList<>();
        List<String> valueList = new ArrayList<>();
        Map<Integer, String> tltleMap = new LinkedHashMap<>();

        Map<String, Map<String, Object>> dataMap = new LinkedHashMap<>();

        // 遍历titleList集合,获取其中map集合的key集合和value集合
        for (int i = 0; i < titleList.size(); i++) {
            // 获取表头集合中的map集合
            Map<String, String> map = new HashMap<>();
            map = titleList.get(i);
            // 通过map.keySet()方法
            // 通过得到key的值,然后获取value;
            for (String key : map.keySet()) {
                String value = map.get(key);
                keyList.add(key);
                tltleMap.put(i, value);
                valueList.add(value);
            }
        }

        // 遍历dataList集合,获取其中map集合
        for (int i = 0; i < dataList.size(); i++) {
            // 获取数据集合中的map集合
            dataMap.put(String.valueOf(i), dataList.get(i));
        }
        // 创建工作薄对象
        SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(1000);
        Sheet sheet = sxssfWorkbook.createSheet(sheetName);
        // 创建第一行,作为header表头
        Row row = sheet.createRow(0);
        // 循环创建header单元格并赋值

        for (int i = 0; i < valueList.size(); i++) {
            // 设置宽
            sheet.setColumnWidth(i, 1000 * 5);
            // 设置高
            row.setHeightInPoints(25);
            Cell cell = row.createCell(i);
            cell.setCellValue(valueList.get(i));
        }


        Map<Integer, String> headersFieldMap = new LinkedHashMap<>();
        for (int i = 0; i < keyList.size(); i++) {
            if (!keyList.get(i).equals(null)) {
                headersFieldMap.put(i, keyList.get(i));
            }
        }
        // 表格列标题一行对应的字段的集合
        //  Collection headersFieldCo = headersFieldMap.values();
        int dtoRow = 1;// 内容栏 导出数据dtoList的行序号
        for (int j = 0; j < dataList.size(); j++) {
            row = sheet.createRow(dtoRow);
            dtoRow++;
            int zdCell = 0;
            for (short i = 0; i < keyList.size(); i++) {// 遍历属性,比对
                String value = "";
                String ssd = keyList.get(i);
                if (!dataList.get(0).containsKey(keyList.get(i))) {
                    continue;
                }
                if (dataList.get(dtoRow - 2).get(ssd) != null && dataList.get(dtoRow - 2).get(ssd) != "") {
                    value = dataList.get(dtoRow - 2).get(ssd).toString();
                }

                try {
                    if (i18nMap != null && i18nMap.containsKey(keyList.get(i))) {
                        Object val = valueList.get(i);
                        String textVal = null;
                        if (val != null) {
                            textVal = val.toString();
                            //根据属性值获取响应的国际化处理
                            Map<String, String> ss = i18nMap.get(keyList.get(i));
                            //获取国际化值要是不为null,则赋值到单元格中
                            if (ss.get(val.toString()) != null) {
                                textVal = ss.get(val.toString());
                            }
                        } else {
                            // 字段内容值为null时,进行处理
                            textVal = "";
                            if (i18nMap.get(keyList.get(i)).containsKey("null")) {
                                textVal = i18nMap.get(keyList.get(i)).get("null");
                            }
                        }
                        row.createCell(zdCell).setCellValue(textVal);// 写进excel对象
                    } else {
                        row.createCell(zdCell).setCellValue(value);// 写进excel对象
                    }
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                }
                zdCell++;
            }
        }
        //FileOutputStream fos = new FileOutputStream("D:/demo.xlsx");
        //sxssfWorkbook.write(out);
        //fos.flush(); // 刷新缓冲区
        //fos.close(); // 释放资源
        return sxssfWorkbook;
    }


    // 大标题的样式
    public static CellStyle bigTitle(Workbook wb) {
        CellStyle style = wb.createCellStyle();
        //设置字体样式
        Font font = wb.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short) 16); //字体大小
        font.setBold(true);//字体加粗
        style.setFont(font);
        //设置边框样式
        style.setAlignment(HorizontalAlignment.CENTER); // 横向居中
        style.setVerticalAlignment(VerticalAlignment.CENTER); // 纵向居中
        style.setBorderTop(BorderStyle.THIN); // 上细线
        style.setBorderBottom(BorderStyle.THIN); // 下细线
        style.setBorderLeft(BorderStyle.THIN); // 左细线
        style.setBorderRight(BorderStyle.THIN); // 右细线
        style.setWrapText(true);//设置是否自动换行
        return style;
    }

    //小标题样式
    public static CellStyle title(Workbook wb) {
        CellStyle style = wb.createCellStyle();
        //设置字体样式
        Font font = wb.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short) 14); //字体大小
        font.setBold(true);//字体加粗
        style.setFont(font);
        //设置边框样式
        style.setAlignment(HorizontalAlignment.CENTER); // 横向居中
        style.setVerticalAlignment(VerticalAlignment.CENTER); // 纵向居中
        style.setBorderTop(BorderStyle.THIN); // 上细线
        style.setBorderBottom(BorderStyle.THIN); // 下细线
        style.setBorderLeft(BorderStyle.THIN); // 左细线
        style.setBorderRight(BorderStyle.THIN); // 右细线
        style.setWrapText(true);//设置是否自动换行
        return style;
    }

    //正文样式
    public static CellStyle text(Workbook wb) {
        CellStyle style = wb.createCellStyle();
        //设置字体样式
        Font font = wb.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short) 12); //字体大小
        style.setFont(font);
        //设置边框样式
        style.setAlignment(HorizontalAlignment.CENTER); // 横向居中
        style.setVerticalAlignment(VerticalAlignment.CENTER); // 纵向居中
        style.setBorderTop(BorderStyle.THIN); // 上细线
        style.setBorderBottom(BorderStyle.THIN); // 下细线
        style.setBorderLeft(BorderStyle.THIN); // 左细线
        style.setBorderRight(BorderStyle.THIN); // 右细线
        style.setWrapText(true);//设置是否自动换行
        return style;
    }

这里我是借鉴了另外一位博主写的博客
附上链接:https://www.cnblogs.com/pikachu-zhaof/p/9711662.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值