通过EasyExcel实现导入导出功能(包含偏复杂表头)

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目

 首先引入maven

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.6</version>
        </dependency>

一.导出(写)

1.创建导出对象

加@ExcelIgnore 注解后将不作为导出字段  @ExcelProperty("XX")导出的表头

@Data
public class OlderVo {
    @ExcelIgnore
    private String id;

    @ExcelProperty("地区")
    private String area;

    @ExcelProperty("总数")
    private String total;

    private String code;

}

 导出,如果不自定义表头就去掉.head(dead())

    public void exportOlder(HttpServletResponse response) throws IOException {
        List<OlderVo> list = XXXXService.exportXXX();
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("导出", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), OlderVo.class).sheet("模板").head(head()).doWrite(list);
    }



//自定义表头
    private static List<List<String>> head() {
        List<List<String>> list = new ArrayList<List<String>>();
        List<String> head0 = new ArrayList<String>();
        head0.add("地区");
        List<String> head1 = new ArrayList<String>();
        head1.add("总数");
        List<String> head2 = new ArrayList<String>();
        head2.add("60-69周岁");
        head2.add("数量");
        List<String> head3 = new ArrayList<String>();
        head3.add("60-69周岁");
        head3.add("占比");

        list.add(head0);
        list.add(head1);
        list.add(head2);
        list.add(head3);
  
        return list;
    }

 二.读操作(导入获取数据)

1.创建接收的实体

@Data
public class TemplateEntity {

    @ExcelProperty("标号")
    private Integer label;

    @ExcelProperty("字符串")
    private String str;

    @ExcelProperty("数字")
    private Integer num;
}

2.导出接口

    @PostMapping("/getinfo")
    public R importExcel(@RequestPart("file") MultipartFile file) throws IOException {
        R r = templateService.impExcel(file);
        return r;
    }

3.实现类方法

@Service
public class TemplateServiceImpl implements TemplateService {
    @Override
    public R impExcel(MultipartFile file) throws IOException {
        List<TemplateEntity> entities = getTemplateEntities(file);
        System.out.println(entities);
        return R.ok(entities);
    }
    private List<TemplateEntity> getTemplateEntities(MultipartFile file) throws IOException {
        TemplateListener templateListener = new TemplateListener();
        EasyExcel.read(file.getInputStream(),TemplateEntity.class,templateListener).sheet().doRead();
        return templateListener.getDate();
    }
}

4.监听器

public class TemplateListener extends AnalysisEventListener<TemplateEntity> {

    private List<TemplateEntity> list = new ArrayList<>();

    @Override
    public void invoke(TemplateEntity data, AnalysisContext analysisContext) {
        list.add(data);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }

    public List<TemplateEntity> getDate(){
        return list;
    }
}

参考:Springboot + Easyexcel读取写入数据,多头行数,多sheet,复杂表头简单实现_鸢尾の的博客-CSDN博客_easyexcel从第三行开始读取

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用EasyExcel实现多级表头导出EasyExcel是一个基于Java的简单易用的Excel操作工具,支持大数据量的导入导出操作。 下面是一个示例代码,演示了如何实现多级表头导出: ```java // 创建一个excel写对象 ExcelWriter writer = EasyExcel.write("output.xlsx").build(); // 定义表头数据 List<List<String>> head = new ArrayList<>(); // 第一行表头 List<String> headRow1 = new ArrayList<>(); headRow1.add("一级表头"); headRow1.add("一级表头"); headRow1.add("一级表头"); head.add(headRow1); // 第二行表头 List<String> headRow2 = new ArrayList<>(); headRow2.add("二级表头"); headRow2.add("二级表头"); headRow2.add("二级表头"); head.add(headRow2); // 第三行表头 List<String> headRow3 = new ArrayList<>(); headRow3.add("三级表头"); headRow3.add("三级表头"); headRow3.add("三级表头"); head.add(headRow3); // 写入表头数据 Sheet sheet = new Sheet(1, 0); sheet.setHead(head); writer.write1(null, sheet); // 写入内容数据(省略) // 关闭excel写对象 writer.finish(); ``` 在上面的示例代码中,我们创建了一个ExcelWriter对象,并指定了输出文件名为"output.xlsx"。然后,我们定义了一个包含多级表头表头数据,每一级的表头都是一个List<String>。我们将这些表头数据添加到head列表中,然后使用Sheet对象将head列表设置为excel的表头。最后,调用writer的write1方法写入表头数据。 你可以根据需要修改示例代码中的表头数据,然后使用EasyExcel提供的其他方法写入内容数据。完成后,调用writer的finish方法关闭excel写对象即可。 希望对你有帮助!如果还有其他问题,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值