EasyExcel导出横向动态表头

文章讲述了在MySQL数据纵向展示的情况下,如何利用EasyExcel库导出带有动态表头的Excel文件。首先,定义了固定的表头,然后根据查询结果动态添加额外的表头。数据以List<Map>的形式处理,用LinkedHashMap保持键值对应关系,以解决表头与数据匹配的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:导出如下所示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接收数据 

将Excel文件写入字节数组可以使用Java IO中的ByteArrayOutputStream类。可以按照以下步骤实现: 1. 创建一个ByteArrayOutputStream对象,用于保存Excel文件的字节数据。 ``` ByteArrayOutputStream baos = new ByteArrayOutputStream(); ``` 2. 将Excel文件写入ByteArrayOutputStream对象。 ``` ExcelWriter writer = ... // ExcelWriter对象 List<List<String>> data = ... // Excel数据 Sheet sheet = new Sheet(1, 0); sheet.setSheetName("Sheet1"); Table table = new Table(1); writer.write0(data, sheet, table); writer.finish(); byte[] bytes = baos.toByteArray(); ``` 3. 将ByteArrayOutputStream对象中的字节数据转换成字节数组。 ``` byte[] bytes = baos.toByteArray(); ``` 4. 关闭ByteArrayOutputStream对象。 ``` baos.close(); ``` 完整的代码示例: ```java import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.Sheet; import com.alibaba.excel.metadata.Table; import com.alibaba.excel.support.ExcelTypeEnum; public class ExcelWriterToByteArrayExample { public static void main(String[] args) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ExcelWriter writer = new ExcelWriter(baos, ExcelTypeEnum.XLSX); List<List<String>> data = new ArrayList<>(); data.add(Arrays.asList("Hello", "World")); Sheet sheet = new Sheet(1, 0); sheet.setSheetName("Sheet1"); Table table = new Table(1); writer.write0(data, sheet, table); writer.finish(); byte[] bytes = baos.toByteArray(); baos.close(); } } ``` 运行以上代码,就会将Excel文件写入字节数组中。如果导出的Excel文件不可用,可能是ExcelWriter对象没有正确配置或者写入的Excel数据有问题,需要检查ExcelWriter对象的配置和写入的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值