easypoi使用模板实现多级表头、多个sheet导出,动态导出列、表头

easypoi使用模板实多级表头、多个sheet导出,动态导出列、表头

build.gradle
在这里插入图片描述
如果使用maven
在这里插入图片描述

一、多级表头和sheet

在这里插入图片描述
fe的写法 fe标志 冒号 list数据 单个元素数据(默认t,可以不写) 第一个元素
{{$fe: maplist t t.id }}
像比较复杂的表头,建议使用模板实现比较方便。

二、模板导出
Map<Integer, List<Map<String, Object>>> resultMap = new TreeMap<>();
        List<Map<String, Object>> resultList = new ArrayList<>();
        List<String> sheetList = new ArrayList<>();
        int sheetIndex = 0;
        for (int i = 0; i < 3; i++) {
            sheetIndex++;
            Map<String, Object> map = new TreeMap<String, Object>();
            map.put("data", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            List<Map<String, String>> listMap = new ArrayList<Map<String, String>>();
            int id = 0;
            for (int i2 = 0; i2 < 5; i2++) {
                id++;
                Map<String, String> lm = new TreeMap<String, String>();
                lm.put("id", id + "");
                lm.put("item1", "商品" + sheetIndex + "-1");
                lm.put("item2", "商品" + sheetIndex + "-2");
                lm.put("item3", "商品" + sheetIndex + "-3");
                lm.put("item4", "商品" + sheetIndex + "-4");
                lm.put("item5", "商品" + sheetIndex + "-5");
                listMap.add(lm);
            }
            map.put("maplist", listMap);
            resultList.add(map);
            sheetList.add("Container " + sheetIndex);
        }
        //这里有个坑需要注意下
        List<Map<String, Object>> reverseResultList = new ArrayList<>();
        for (int i = resultList.size() - 1; i >= 0; i--) {
            reverseResultList.add(resultList.get(i));
        }
        resultMap.put(0, reverseResultList);
        TemplateExportParams params = new TemplateExportParams("D:/test/test.xls", true);
        Workbook workbook = ExcelExportUtil.exportExcelClone(resultMap, params);
        int i = 0;
        for (String s : sheetList) {
            workbook.setSheetName(i, s);
            i++;
        }
        FileOutputStream fos = new FileOutputStream("D:/test/test_map.xls");
        workbook.write(fos);
        fos.close();
        workbook.close();
这里有个坑需要注意下

List<Map<String, Object>> reverseResultList = new ArrayList<>();
for (int i = resultList.size() - 1; i >= 0; i–) {
reverseResultList.add(resultList.get(i));
}
之所以需要写这一步,是因为
ExcelExportUtil.exportExcelClone(resultMap, params);
里面源码回会把我上面按顺序的数据倒序输出
在这里插入图片描述
所以上面我只能先把自己的数据倒序,才能保证数据的顺序是自己想要的输出结果

三、效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
暂时就这些了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Easypoi导出动态多级复杂表头可以通过编写自定义的导出类来实现,以下是一个示例代码: ```java public class CustomExportUtil { /** * 导出Excel * * @param title 标题 * @param headers 表头 * @param dataList 数据表 * @param dateFormat 日期格式 * @param response HttpServletResponse对象 * @throws IOException */ public static void exportExcel(String title, List<ExcelHeader> headers, List<Map<String, Object>> dataList, String dateFormat, HttpServletResponse response) throws IOException { // 创建Excel对象 Workbook workbook = new SXSSFWorkbook(1000); // 创建Sheet对象 Sheet sheet = workbook.createSheet(title); // 设置默认sheet.setDefaultColumnWidth(15); // 创建第一行,设置表头 Row headerRow = sheet.createRow(0); int colIndex = 0; for (ExcelHeader header : headers) { Cell cell = headerRow.createCell(colIndex++); cell.setCellValue(header.getTitle()); // 设置合并单元格 if (header.getColSpan() > 1 || header.getRowSpan() > 1) { CellRangeAddress rangeAddress = new CellRangeAddress(0, header.getRowSpan() - 1, colIndex - 1, colIndex + header.getColSpan() - 2); sheet.addMergedRegion(rangeAddress); } } // 填充数据 int rowIndex = 1; for (Map<String, Object> data : dataList) { Row row = sheet.createRow(rowIndex++); colIndex = 0; for (ExcelHeader header : headers) { // 获取数据 Object value = data.get(header.getFieldName()); // 格式化日期 if (value instanceof Date) { value = new SimpleDateFormat(dateFormat).format(value); } Cell cell = row.createCell(colIndex++); cell.setCellValue(String.valueOf(value)); } } // 设置响应头 response.setContentType("application/octet-stream;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + new String((title + ".xlsx").getBytes("utf-8"), "iso8859-1")); // 输出Excel文件 OutputStream outputStream = response.getOutputStream(); workbook.write(outputStream); outputStream.flush(); outputStream.close(); } } ``` 其中,ExcelHeader类表示表头信息,包括标题、字段名、合并数、行合并数等信息: ```java public class ExcelHeader { /** * 标题 */ private String title; /** * 字段名 */ private String fieldName; /** * 合并数 */ private int colSpan; /** * 行合并数 */ private int rowSpan; public ExcelHeader(String title, String fieldName, int colSpan, int rowSpan) { this.title = title; this.fieldName = fieldName; this.colSpan = colSpan; this.rowSpan = rowSpan; } // getter/setter方法省略 } ``` 使用示例: ```java List<ExcelHeader> headers = new ArrayList<>(); headers.add(new ExcelHeader("姓名", "name", 1, 1)); headers.add(new ExcelHeader("年龄", "age", 1, 1)); headers.add(new ExcelHeader("联系方式", null, 2, 1)); headers.add(new ExcelHeader("电话", "phone", 1, 1)); headers.add(new ExcelHeader("邮箱", "email", 1, 1)); headers.add(new ExcelHeader("地址", "address", 1, 1)); headers.add(new ExcelHeader("省份", "province", 1, 1)); headers.add(new ExcelHeader("城市", "city", 1, 1)); headers.add(new ExcelHeader("区县", "county", 1, 1)); List<Map<String, Object>> dataList = new ArrayList<>(); Map<String, Object> data1 = new HashMap<>(); data1.put("name", "张三"); data1.put("age", 20); data1.put("phone", "123456789"); data1.put("email", "zhangsan@example.com"); data1.put("address", "北京市朝阳区"); data1.put("province", "北京市"); data1.put("city", "北京市"); data1.put("county", "朝阳区"); dataList.add(data1); CustomExportUtil.exportExcel("学生信息表", headers, dataList, "yyyy-MM-dd HH:mm:ss", response); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值