EasyExcel导出横向动态表头

需求:导出如下所示excel文档,红框内为动态表头

mysql表内数据格式如下图所示,由于某些特殊原因不能横向展示,仅能纵向展示,所以一个vin对应的数据可能有很多此时导出的时候上图所示的样式更便于人员观看。

依赖项

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel-core</artifactId>
    <version>3.2.1</version>
    <scope>compile</scope>
</dependency>

实现层

    @Override
    public void exportAviCarParseList(HttpServletResponse response, AviCarParse aviCarParse) {
        // 定义表头
        List<List<String>> headList = new ArrayList<>();
        // 前三个固定表头
        headList.add(new ArrayList<String>() {{
            add("信息标识码");
        }});
        headList.add(new ArrayList<String>() {{
            add("信息标识值");
        }});
        headList.add(new ArrayList<String>() {{
            add("过点时间");
        }});
        // 表头集合
        List<String> strings = aviCarParseMapper.selectParamCode();
        // 循环插入横向表头
        for (String string : strings) {
            headList.add(new ArrayList<String>() {{
                add(string);
            }});
        }

        List<List<Object>> dataList = Lists.newArrayList();
        // 后台数据 此时数据过来时已经解析成为横向表格样式(后附图)
        List<LinkedHashMap<String, Object>> tmpList = aviCarParseMapper.selectAviCarParseList(aviCarParse, strings);
        // 将数据插入list
        tmpList.forEach(tmp -> {
            List<Object> data = Lists.newArrayList();
            for (Object key : tmp.keySet()) {
                data.add(tmp.get(key.toString()));
            }
            dataList.add(data);
        });
        try {
            //设置类型,扩展名为.xls
            response.setContentType("application/vnd.ms-excel");
            EasyExcel.write(response.getOutputStream()).head(headList).sheet("尾标解析记录").doWrite(dataList);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

sql转成横向表格数据,List<Map>接收 

注:此方式好像是有个bug,表头与数据需要对应 所以我用linkdhashmap接收数据 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyExcel是一个方便、易用、高效的Java Excel操作库,广泛应用于各种Java应用程序中。在EasyExcel中,导出动态表头是常见的操作需求,因为有时候表头的列数和列名是不确定的,需要在运行时动态生成。下面将介绍如何使用EasyExcel导出动态表头。 首先需要定义Excel的列头信息,可以通过继承AbstractWriteHandler接口,重写afterSheetCreate方法,在该方法中动态生成列头信息。代码示例如下: ``` public class DynamicHeadExcelHandler implements AbstractWriteHandler { private List<List<String>> headTitles = new ArrayList<>(); @Override public void afterSheetCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, RowWriteHandler rowWriteHandler) { List<String> headTitle1 = new ArrayList<>(); headTitle1.add("姓名"); headTitle1.add("年龄"); headTitles.add(headTitle1); List<String> headTitle2 = new ArrayList<>(); headTitle2.add("性别"); headTitle2.add("地址"); headTitles.add(headTitle2); writeHead(writeSheetHolder, writeTableHolder); } private void writeHead(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder) { int maxColumnSize = getMaxColumnSize(headTitles); Sheet sheet = writeSheetHolder.getSheet(); sheet.createRow(0); for (int i = 0; i < maxColumnSize; i++) { Cell cell = sheet.getRow(0).createCell(i); cell.setCellValue(getCellValue(i)); cell.setCellStyle(getHeadStyle(writeSheetHolder, writeTableHolder)); } CellRangeAddress range = new CellRangeAddress(0, 0, 0, maxColumnSize - 1); sheet.addMergedRegion(range); } private int getMaxColumnSize(List<List<String>> headTitles) { int max = 0; for (List<String> titles : headTitles) { int size = titles.size(); if (size > max) { max = size; } } return max; } private String getCellValue(int index) { StringBuilder builder = new StringBuilder(); for (List<String> titles : headTitles) { if (titles.size() > index) { builder.append(titles.get(index)).append(" "); } } return builder.toString(); } private CellStyle getHeadStyle(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder) { CellStyle cellStyle = writeSheetHolder.getSheet().getWorkbook().createCellStyle(); Font font = writeSheetHolder.getSheet().getWorkbook().createFont(); font.setBold(true); font.setFontHeightInPoints((short) 14); cellStyle.setFont(font); cellStyle.setAlignment(HorizontalAlignment.CENTER); return cellStyle; } } ``` 在上述代码中,我们定义了两行表头信息,每一行都是一个List<String>类型的数据。在afterSheetCreate方法中,我们通过遍历headTitles来动态生成列头信息。然后在writeHead方法中,我们生成了一个合并单元格的行并将列头信息填入其中。 接下来,我们在程序中使用该ExcelHandler,可以通过以下代码实现: ``` ExcelWriter excelWriter = EasyExcel.write(outputStream).registerWriteHandler(new DynamicHeadExcelHandler()).build(); excelWriter.write(data, EasyExcel.writerSheet().build()); excelWriter.finish(); ``` 在上述代码中,我们创建了一个ExcelWriter对象,并将DynamicHeadExcelHandler注册为WriteHandler。然后我们调用write方法将数据写入Excel中。 综上所述,EasyExcel提供了方便的API来实现动态表头导出,通过继承AbstractWriteHandler接口来实现表头生成。以上就是使用EasyExcel导出动态表头的方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值