动态数量列导出Excel文件

POM文件添加

 		<!--hutool工具包-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.9</version>
        </dependency>
        <!--导出excel所需包-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>

主文件内容

需要注意的是,当动态导出的数据长度不一致时,如row1考试日期只有一个,row2有三个,就需要将最多的Map存在第一个,否非就会按照row1的数据结构来建立Excel表的列。可以根据考试次数从大到小将Map进行排列,已完成数据的完整性。

public class toExcel {
    public static void main(String[] args) {
        Map<String, Object> row1 = new LinkedHashMap<>();
        row1.put("姓名", "张三");
        row1.put("年龄", 23);
        row1.put("成绩", 88.32);
        row1.put("是否合格", true);
        row1.put("第1次考试日期", "2022-10-5");
        row1.put("考试次数", 1);

        Map<String, Object> row2 = new LinkedHashMap<>();
        row2.put("姓名", "李四");
        row2.put("年龄", 33);
        row2.put("成绩", 59.50);
        row2.put("是否合格", false);
        row2.put("第1次考试日期", "2022-10-7");
        row2.put("第2次考试日期", "2022-10-8");
        row2.put("第3次考试日期", "2022-10-9");
        row2.put("考试次数", 3);

        Map<String, Object> row3 = new LinkedHashMap<>();
        row3.put("姓名", "王五");
        row3.put("年龄", 28);
        row3.put("成绩", 63.50);
        row3.put("是否合格", false);
        row3.put("第1次考试日期", "2022-10-4");
        row3.put("第2次考试日期", "2022-10-6");
        row3.put("考试次数", 2);

        //将Map保存起来
        List<Map> mapList = new ArrayList<>();
        mapList.add(row1);
        mapList.add(row2);
        mapList.add(row3);

        //打印列表
        System.out.println("mapList::"+JSONUtil.toJsonStr(mapList));

        //将LIst中的MAP根据指定列的值从大到小排列
        mapList.sort((map1, map2) -> {
            Integer value1 = (Integer) map1.get("考试次数");
            Integer value2 = (Integer) map2.get("考试次数");
            return value2.compareTo(value1);
        });
        System.out.println("排序后的list:" + mapList);

        //赋值给ARRAYLIST
        ArrayList<Map> rows = CollUtil.newArrayList(mapList);
        //通过工具类创建writer(为本地路径)
        ExcelWriter writer = ExcelUtil.getWriter("C:\\Intel\\writeMapTest10.xlsx");
        //合并单元格后的标题行,使用默认标题样式
        writer.merge(rows.get(0).size() - 1, "一班成绩单");
        //一次性写出内容,使用默认样式,强制输出标题
        writer.write(rows, true);
        //为固定行赋值宽度
        for (int i = 0; i < 4; i++) {
            writer.setColumnWidth(i, 20);
        }
        //为动态行赋宽度
        for (int i = 4; i < rows.get(0).size() - 1; i++) {
            writer.setColumnWidth(i, 30);
        }
        //最后一行提示信息的宽度
        writer.setColumnWidth(rows.get(0).size() - 1, 20);
        //有数值的行设定高度(+2分别为标题行,和列名行)
        for (int i = 0; i < rows.size() + 2; i++) {
            writer.setRowHeight(i, 18);
        }
        //记得关闭writer,以释放内存
        writer.close();
    }
}

导出效果如图:

导出图

你可能感兴趣的:(Java,各种好玩的小项目,excel,java,开发语言)