Java中EasyPoi多sheet导出功能实现

EasyPoi 多sheet导出

序言:之前一直想开始写博客,都没有时间行动起来,今天终于开始了我的第一篇博客…

最近接到一个导出excel功能的需求,该功能主要难点是

  • 多sheet页
  • 导出合并单元格(跨行、跨列)
  • 多表头合并

我开始的想法是如果采用poi来实现这个功能,业务逻辑可能会有点复杂,于是我使用了easyPoi——一个so easy的工具,它的特点就是非常方便,用jQuery的一句来说就是:write Less,Do More。

话不多说,接下来分享一下我的代码(我使用的是SSH框架搭建环境)

一、引入maven jar包

<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-base</artifactId>
    <version>3.2.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-web</artifactId>
    <version>3.2.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-annotation</artifactId>
    <version>3.2.0</version>
</dependency>

二、编写导出的实体类(使用注解形式)

1、DeptUtil 类

@ExcelTarget("deptUtil")
public class DeptUtil {

  @Excel(name = "部门编号", width = 30 , needMerge = true)
  private Integer id;

  @Excel(name = "部门名称", width = 30 , needMerge = true)
  private String deptName;

  @ExcelCollection(name = "员工信息")
  private List<EmpUtil> emps;

	....省略getter、setter方法

2、EmpUtil类

@ExcelTarget("empUtil")
public class EmpUtil{

  @Excel(name = "序号", width = 30, isColumnHidden = true)
  private Integer id;

  @Excel(name = "员工姓名", width = 30, groupName = "基本信息")
  private String empName;

  @Excel(name = "年龄", width = 30, type = 10, groupName = "基本信息")
  private Integer age;

  @Excel(name = "入职时间", width = 30, groupName = "工作信息", format = "yyyy/MM/dd HH:mm")
  private Date hiredate;

  @Excel(name = "薪酬", width = 30, type = 10, groupName = "工作信息")
  private BigDecimal salary;

	....省略getter、setter方法

3、核心代码

public String export(){

    Workbook workBook = null;
    try {
      List<DeptUtil> exportList = exportService.exportList();
      System.err.println(JSONArray.toJSONString(exportList));

      // 创建参数对象(用来设定excel得sheet得内容等信息)
      ExportParams deptExportParams = new ExportParams();
      // 设置sheet得名称
      deptExportParams.setSheetName("员工报表1");
      // 创建sheet1使用得map
      Map<String, Object> deptExportMap = new HashMap<>();
      // title的参数为ExportParams类型,目前仅仅在ExportParams中设置了sheetName
      deptExportMap.put("title", deptExportParams);
      // 模版导出对应得实体类型
      deptExportMap.put("entity", DeptUtil.class);
      // sheet中要填充得数据
      deptExportMap.put("data", exportList);

      ExportParams empExportParams = new ExportParams();
      empExportParams.setSheetName("员工报表2");
      // 创建sheet2使用得map
      Map<String, Object> empExportMap = new HashMap<>();
      empExportMap.put("title", empExportParams);
      empExportMap.put("entity", DeptUtil.class);
      empExportMap.put("data", exportList);

      // 将sheet1、sheet2、sheet3使用得map进行包装
      List<Map<String, Object>> sheetsList = new ArrayList<>();
      sheetsList.add(deptExportMap);
      sheetsList.add(empExportMap);
      // 执行方法
      workBook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF);
      fileName = URLEncoder.encode("员工报表导出", "UTF-8");
      ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
      workBook.write(outputStream);
      outputStream.flush();
      byte[] byteArray = outputStream.toByteArray();
      excelStream = new ByteArrayInputStream(byteArray,0,byteArray.length);
      outputStream.close();

    }catch (Exception e){
      e.printStackTrace();
    }finally {
      if(workBook != null) {
        try {
          workBook.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return "success";
  }

三、效果展示

有一个问题就是如果sheet填充的数据源是一样的,那么第二个sheet的内容就会为空

不过一般上要实现多sheet页展示,内容应该是不一样的,这里只是作为实现效果展示,就采用了同一个数据获取源。

以上就是所有内容了,如果想要学习更多可以查阅easyPoi的api(http://easypoi.mydoc.io/
另外附上我的项目源码:https://github.com/wzqonly/easyPoi_export

到此这篇关于Java中EasyPoi多sheet导出功能实现的文章就介绍到这了,更多相关Java EasyPoi多sheet导出内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java中Easypoi实现excel多sheet表导入导出功能

    Easypoi简化了开发中对文档的导入导出实现,并不像poi那样都要写大段工具类来搞定文档的读写. 第一步引入Easypoi依赖 <!-- 导出文件工具 EasyPoi实现Excel读写管理测试用例 --> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>4.

  • 实现ssr服务端渲染的方法步骤

    前言 前段时间寻思做个个人网站,然后就立马行动了.  个人网站如何实现选择什么技术方案,自己可以自由决定.  刚好之前有大致想过服务端渲染,加载速度快,还有seo挺适合个人网站的.  所以就自己造了个轮子用koa+react来实现ssr服务端渲染. 什么是ssr 最初听说有单页面的服务端渲染的时候,就理解为类似传统的服务端路由+模板渲染,只是需要用单页面应用的框架写.后面寻思这样好像有点傻,再一了解,原来只是在首次加载的时候,后端进行当前路径页面的组件渲染和数据请求,组装成html返回给前端,用

  • Java中EasyPoi多sheet导出功能实现

    EasyPoi 多sheet导出 序言:之前一直想开始写博客,都没有时间行动起来,今天终于开始了我的第一篇博客- 最近接到一个导出excel功能的需求,该功能主要难点是 多sheet页 导出合并单元格(跨行.跨列) 多表头合并 我开始的想法是如果采用poi来实现这个功能,业务逻辑可能会有点复杂,于是我使用了easyPoi--一个so easy的工具,它的特点就是非常方便,用jQuery的一句来说就是:write Less,Do More. 话不多说,接下来分享一下我的代码(我使用的是SSH框架搭

  • Java中EasyPoi导出复杂合并单元格的方法

    前言: 上星期做了一个Excel的单元格合并,用的是EasyPoi,我之前合并单元格都是原生的,第一次使用EasyPoi合并也不太熟悉,看着网上自己套用,使用后发现比原生的方便些,贡献一下,也给其他用到合并而且用的是EasyPoi的小伙伴节省下时间. 导出模板: 坐标: 版本号,自己来定,可以去官网查看:EasyPoi官网 <!-- easypoi 导入包 --> <dependency> <groupId>cn.afterturn</groupId> &l

  • Java中easypoi导入excel文件列名相同的处理方案

    Easypoi是什么 Easypoi 功能如同名字easy,主打的功能就是容易,让一个没接触过poi的人员,就可以方便的写出Excel导出.Excel模板导出.Excel导入.Word模板导出,通过简单的注解和模板语言(熟悉的表达式fe语法),完成以前复杂的写法 开源地址:https://gitee.com/lemur/easypoi 独特的功能 基于注解的导入导出,修改注解就可以修改Excel 支持常用的样式自定义 基于map可以灵活定义的表头字段 支持一堆多的导出,导入 支持模板的导出,一些

  • vue中后端做Excel导出功能返回数据流前端的处理操作

    项目中有一个导出功能的实现,用博客来记录一下.因为需求对导出表格的数据格式和样式有要求,所以这个导出功能放到后端来做,而且后端返回的是数据流,所以需要处理成想要的表格并导出来. 先看下效果图: 页面效果: 点击 导出Excel 调用导出接口成功了: 后台返回的数据流,一堆看不懂的乱码: 接下来要处理这堆乱码,因为用到的地方多,所以在util.js文件里封装了一个公共方法并抛出: 虽然vue里有封装好的请求接口的方法,但这里要单独用axios,所以先在util.js里引入axios import

  • SpringBoot+EasyPoi实现excel导出功能

    在实际项目开发中,对于Excel的导入导出还是很常见的需求,比如说将数据根据模板批量导入到数据库中,以及将数据库中的数据批量导出陈Excel的形式 现有需求: 根据检索条件查询列表并将结果导出到excel Easypoi文档:https://easypoi.mydoc.io/#text_186900 EasyPoi的主要特点 1.设计精巧,使用简单 2.接口丰富,扩展简单 3.默认值多,write less do more 4.spring mvc支持,web导出可以简单明了 实现过程 1.创建

  • Java中实现简单的Excel导出

    简单介绍一下Java中的Excel文件导出功能(基于HttpServletResponse实现下载) 首先,引入需要依赖的jar包: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency> <dependency> <gro

  • java中String.intern()方法功能介绍

    下文笔者讲述java中String.intern()方法的功能简介说明,如下所示: String.intern原理 String.intern():    此方法是一个Native方法      底层调用C++的 StringTable::intern方法实现 当通过语句str.intern()调用intern()方法后    JVM 就会在当前类的常量池中查找是否存在与str等值的String     若存在则直接返回常量池中相应Strnig的引用     若不存在,则会在常量池中创建一个等值

  • Java中Map的排序问题详解

    Map的种类 在Java中,Map的主要作用是存储键值对.由于是根据键得到值,所以不允许键重复.它主要有如下几个类别: HashMap: 最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的.HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致.如果需要同步,可以用Collections的sy

  • Java中SPI的一些理解

    前言 最近在面试的时候被问到SPI了,没回答上来,主要也是自己的原因,把自己给带沟里去了,因为讲到了类加载器的双亲委派模型,后面就被问到了有哪些是破坏了双亲委派模型的场景,然后我就说到了SPI,JNDI,以及JDK9的模块化都破坏了双亲委派. 然后就被问,那你说说对Java中的SPI的理解吧.然后我就一脸懵逼了,之前只是知道它会破坏双亲委派,也知道是个怎么回事,但是并没有深入了解,那么这次我就好好的来总结一下这个知识吧. 什么是SPI SPI全称Service Provider Interfac

随机推荐