使用easypoi操作excel

easypoi官方文档

http://doc.wupaas.com/docs/easypoi/easypoi-1c0u6ksp2r091

 

注解介绍

easypoi起因就是Excel的导入导出,最初的模板是实体和Excel的对应,model–row,filed–col 这样利用注解我们可以和容易做到excel到导入导出 经过一段时间发展,现在注解有5个类分别是

  • @Excel 作用到filed上面,是对Excel一列的一个描述

  • @ExcelCollection 表示一个集合,主要针对一对多的导出,比如一个老师对应多个科目,科目就可以用集合表示

  • @ExcelEntity 表示一个继续深入导出的实体,但他没有太多的实际意义,只是告诉系统这个对象里面同样有导出的字段

  • @ExcelIgnore 和名字一样表示这个字段被忽略跳过这个导导出

  • @ExcelTarget 这个是作用于最外层的对象,描述这个对象的id,以便支持一个对象可以针对不同导出做出不同处理

 

环境

windows10、jdk8、maven3.6、idea2020.3、easypoi4.3.0

 

题目

使用easypoi实现完成如下功能:

一、基本的导入导出功能

二、到图片的导入导出功能

三、复杂实体(一对一、一对多)的导入导出功能

四、使用模板导出功能

 

完整代码

下载代码

 

操作过程

新建maven工程:打开idea,File->New->Project->选择Maven->Next->填写工程相关信息->Finish

pom.xml添加依赖

   <dependencies>
       <!-- easypoi的依赖 包括:base、web、annotation -->
       <dependency>
           <groupId>cn.afterturn</groupId>
           <artifactId>easypoi-base</artifactId>
           <version>4.3.0</version>
       </dependency>
       <dependency>
           <groupId>cn.afterturn</groupId>
           <artifactId>easypoi-web</artifactId>
           <version>4.3.0</version>
       </dependency>
       <dependency>
           <groupId>cn.afterturn</groupId>
           <artifactId>easypoi-annotation</artifactId>
           <version>4.3.0</version>
       </dependency>
       
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.13.2</version>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
           <version>1.18.4</version>
       </dependency>
   </dependencies>

 

一、基本的导入导出功能

新建User实体类:

在src/main/java目录下创建实体类

@Data
@ExcelTarget("user")
public class User implements Serializable {
    @Excel(name="编号")
    private String id;
    @Excel(name="姓名")
    private String name;
    @Excel(name="年龄")
    private Integer age;
    @Excel(name="性别", replace = {"男_1", "女_2"}, suffix = "生")
    private Integer sex;
    @Excel(name="生日", width = 35.0, format = "yyyy-MM-dd")
    private Date bir;
}

说明:

1.在实体类上添加@ExcelTarget表示这个实体类是用来处理excel的;

2.如果实体类的属性与excel的字段(列名称)有对应关系,需要在字段上添加@Excel注解;

3.@Excel注解的属性比较丰富,可参考官方文档。通过@Excel的name属性来映射excel字段名与Java实体类属性名,例如:excel的字段名为"编号",在java实体的属性名为"id";用replace属性实现值替换,例如在excel中是“男”,在java实体中则为1;通过suffix添加后缀,适应更丰富的使用场景;通过format指定日期格式。

 

测试类:

在src/test/java目录下创建测试类

测试基本导出excel功能

public class UserTest {

    // 模拟查询所有记录
    public List<User> getUsers(){
       List<User> users = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            User user = new User();
            user.setId(String.valueOf(i));
            user.setName("小陈"+i);
            user.setAge(10+i);
            user.setSex(i%2+1);
            user.setBir(new Date());
            users.add(user);
        }
        return users;
    }

    // 导出excel
    @Test
    public void testExport() throws IOException {
        // 获取数据
        List<User> users = getUsers();
        // 将输出导出到excel
        // 参数1:ExportParams  参数2:数据的类型  参数3:导出的数据集合
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户信息列表", "用户信息"), User.class, users);
        // 将数据写到输出流
        FileOutputStream os = new FileOutputStream("用户.xls");
        workbook.write(os);
        // 关闭资源
        os.close();
        workbook.close();

    }

}

运行testExport,导出的excel内容如下:

测试基本导入功能

在UserTest类添加如下代码:

    // 测试导入
    @Test
    public void testImport(){
        ImportParams params = new ImportParams();
        params.setTitleRows(1);//标题占1行
        params.setHeadRows(1);//表头占1行
//        params.setStartSheetIndex(2);//从第几个sheet开始
//        params.setSheetNum(3);//读取几个sheet
        params.setImportFields(new String[]{"编号","姓名"});//设置字段是否为合法的模板
        // 参数1:导入的excel文件(或者文件输入流)  参数2:导入对应的实体类型, 参数3:导入参数
        List<User> users = ExcelImportUtil.importExcel(
                new File("用户.xls"), User.class, params
        );
        users.forEach(System.out::println);
    }

运行testImport测试后,控制台输出如下:

 

带图片的导出excel

新建company实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@ExcelTarget("company")
public class CompanyEntity {
    @Excel(name="编号")
    private String id;
    @Excel(name="公司名称")
    private String name;
    //表示type =2 该字段类型为图片,imageType=1 (默认可以不填),表示从file读取,字段类型是个字符串类型
    //可以用相对路径也可以用绝对路径,绝对路径优先依次获取
    //savePath:导入文件保存路径,如果是图片可以填写,默认是upload/className/ IconEntity这个类对应的就是upload/Icon/
    @Excel(name="公司LOGO",type = 2 ,width = 40 , height = 50,imageType = 1, savePath = "imgInput")
    private String logo;
    @Excel(name="公司地址", width = 50)
    private String addr;
}

重点关注及理解logo属性上方@Excel注解的属性。

 

测试类

public class CompanyEntityTest {

    // 模拟查询所有记录
    public List<CompanyEntity> getCompanys(){
        List<CompanyEntity> companys = new ArrayList<>();
        companys.add(new CompanyEntity("1","谷歌","img/google.png","美国加利福尼亚州圣克拉拉县山景市"));
        companys.add(new CompanyEntity("2", "华为", "img/huawei.png","中国广东省深圳市龙岗区坂田华为总部办公楼"));
        companys.add(new CompanyEntity("3", "腾讯", "img/tencent.png", "中国广东深圳市南山区高新科技园北区腾讯大厦"));
        return companys;
    }
    // 导出excel
    @Test
    public void testExport() throws IOException {
        // 获取数据
        List<CompanyEntity> companys = getCompanys();
        // 将输出导出到excel
        // 参数1:ExportParams  参数2:数据的类型  参数3:导出的数据集合
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("公司信息列表", "公司"), CompanyEntity.class, companys);
        // 将数据写到输出流
        FileOutputStream os = new FileOutputStream("公司信息.xls");
        workbook.write(os);
        // 关闭资源
        os.close();
        workbook.close();

    }
}

准备测试图片,放到工程的img目录下

运行testExport测试,导出excel内容如下:

带图片的导入功能

在CompanyEntityTest 类中添加导入测试方法

    // 测试带图片的导入
    @Test
    public void testImgImport() throws Exception {
        ImportParams params = new ImportParams();
        params.setTitleRows(1);//标题占1行
        params.setHeadRows(1);//表头占1行

        List<CompanyEntity> companys = ExcelImportUtil.importExcel(
                new FileInputStream("公司信息.xls"), CompanyEntity.class, params
        );
        companys.forEach(System.out::println);
    }

运行测试,控制台输出如下内容:

将在imgInput目录下看到导入的图片

 

三、复杂实体(一对一、一对多)的导入导出功能

新建实体类

StudentEntity.java

@Data
@NoArgsConstructor
@AllArgsConstructor
@ExcelTarget("stu")
public class StudentEntity implements Serializable {
    /**
     * id
     */
    private String id;
    /**
     * 学生姓名
     */
    @Excel(name = "学生姓名", height = 20, width = 30, isImportField = "true_st")
    private String name;
    /**
     * 学生性别
     */
    @Excel(name = "学生性别", replace = { "男_1", "女_2" }, suffix = "生", isImportField = "true_st")
    private int  sex;

    @Excel(name = "出生日期", databaseFormat = "yyyyMMddHHmmss", format = "yyyy-MM-dd", isImportField = "true_st", width = 20)
    private Date birthday;

    @Excel(name = "进校日期", databaseFormat = "yyyyMMddHHmmss", format = "yyyy-MM-dd")
    private Date registrationDate;

 }

TeacherEntity.java

@Data
@NoArgsConstructor
@AllArgsConstructor
@ExcelTarget("teacherEntity")
public class TeacherEntity implements java.io.Serializable {
    private String id;
    /**
     * name
     */
    @Excel(name = "主讲老师_major,代课老师_absent", orderNum = "1", needMerge = true,isImportField = "true_major,true_absent")
    private String name;
}

CourseEntity.java

@Data
@ExcelTarget("courseEntity")
public class CourseEntity implements Serializable {
    /** 主键 */
    private String id;
    /** 课程名称 */
    @Excel(name = "课程名称", orderNum = "1", needMerge = true,width = 25)
    private String name;
    /** 老师主键 */
    @ExcelEntity(id = "absent")
    private TeacherEntity mathTeacher;

    @ExcelCollection(name = "学生", orderNum = "4")
    private List<StudentEntity> students;
}

说明:

1.课程实体(CourseEntity)是一个复杂的实体,其属性包含了教师实体(TeacherEntity)和 学生实体(StudentEntity);

2.课程和教师的为一对一关系,使用@ExcelEntity注解;

3.课程和学生是一对多的关系,使用@ExcelCollection注解。

 

测试类

public class CourseEntityTest {
    // 模拟查询所有记录
    public List<CourseEntity> getCourses(){
        List<CourseEntity> courses = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            CourseEntity courseEntity = new CourseEntity();
            courseEntity.setId(String.valueOf(i));
            courseEntity.setName("专业课_"+i);
            TeacherEntity teacherEntity = new TeacherEntity("1"+i,"老师_"+i);
            courseEntity.setMathTeacher(teacherEntity);
            courseEntity.setStudents(new StudentEntityTest().getStus());
            courses.add(courseEntity);
        }
        return courses;
    }

    // 导出excel
    @Test
    public void testExport() throws IOException {
        // 获取数据
        List<CourseEntity> stus = getCourses();
        // 将输出导出到excel
        // 参数1:ExportParams  参数2:数据的类型  参数3:导出的数据集合
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("课程信息列表", "测试"), CourseEntity.class, stus);
        // 将数据写到输出流
        FileOutputStream os = new FileOutputStream("课程信息.xls");
        workbook.write(os);
        // 关闭资源
        os.close();
        workbook.close();

    }
    // 导入excel
    @Test
    public void testImport(){
        ImportParams params = new ImportParams();
        params.setTitleRows(1);//标题占1行
        params.setHeadRows(2);//表头占1行
        // 参数1:导入的excel文件(或者文件输入流)  参数2:导入对应的实体类型, 参数3:导入参数
        List<CourseEntity> courses = ExcelImportUtil.importExcel(
                new File("课程信息.xls"), CourseEntity.class, params
        );
        courses.forEach(System.out::println);
    }
}

运行testExport导出测试,导出的excel内容如下:

运行testImport导入测试,控制台输出如下内容:

CourseEntity(id=null, name=专业课_0, mathTeacher=TeacherEntity(id=null, name=老师_0), students=[StudentEntity(id=null, name=小张0, sex=1, birthday=Sat Mar 20 00:00:00 CST 2021, registrationDate=Sat Mar 20 00:00:00 CST 2021), StudentEntity(id=null, name=小张1, sex=2, birthday=Sat Mar 20 00:00:00 CST 2021, registrationDate=Sat Mar 20 00:00:00 CST 2021), StudentEntity(id=null, name=小张2, sex=1, birthday=Sat Mar 20 00:00:00 CST 2021, registrationDate=Sat Mar 20 00:00:00 CST 2021), StudentEntity(id=null, name=小张3, sex=2, birthday=Sat Mar 20 00:00:00 CST 2021, registrationDate=Sat Mar 20 00:00:00 CST 2021), StudentEntity(id=null, name=小张4, sex=1, birthday=Sat Mar 20 00:00:00 CST 2021, registrationDate=Sat Mar 20 00:00:00 CST 2021)])
CourseEntity(id=null, name=专业课_1, mathTeacher=TeacherEntity(id=null, name=老师_1), students=[StudentEntity(id=null, name=小张0, sex=1, birthday=Sat Mar 20 00:00:00 CST 2021, registrationDate=Sat Mar 20 00:00:00 CST 2021), StudentEntity(id=null, name=小张1, sex=2, birthday=Sat Mar 20 00:00:00 CST 2021, registrationDate=Sat Mar 20 00:00:00 CST 2021), StudentEntity(id=null, name=小张2, sex=1, birthday=Sat Mar 20 00:00:00 CST 2021, registrationDate=Sat Mar 20 00:00:00 CST 2021), StudentEntity(id=null, name=小张3, sex=2, birthday=Sat Mar 20 00:00:00 CST 2021, registrationDate=Sat Mar 20 00:00:00 CST 2021), StudentEntity(id=null, name=小张4, sex=1, birthday=Sat Mar 20 00:00:00 CST 2021, registrationDate=Sat Mar 20 00:00:00 CST 2021)])
CourseEntity(id=null, name=专业课_2, mathTeacher=TeacherEntity(id=null, name=老师_2), students=[StudentEntity(id=null, name=小张0, sex=1, birthday=Sat Mar 20 00:00:00 CST 2021, registrationDate=Sat Mar 20 00:00:00 CST 2021), StudentEntity(id=null, name=小张1, sex=2, birthday=Sat Mar 20 00:00:00 CST 2021, registrationDate=Sat Mar 20 00:00:00 CST 2021), StudentEntity(id=null, name=小张2, sex=1, birthday=Sat Mar 20 00:00:00 CST 2021, registrationDate=Sat Mar 20 00:00:00 CST 2021), StudentEntity(id=null, name=小张3, sex=2, birthday=Sat Mar 20 00:00:00 CST 2021, registrationDate=Sat Mar 20 00:00:00 CST 2021), StudentEntity(id=null, name=小张4, sex=1, birthday=Sat Mar 20 00:00:00 CST 2021, registrationDate=Sat Mar 20 00:00:00 CST 2021)])

 

四、使用模板导出功能

在导出具有复杂样式的excel时,使用模板导出是一个很好的选择。

在工程目录下新建模板文件如下:

template.xlsx

说明:

1.这里用{{}}来是指使用变量值来填充单元格的内容;

2.如果是要生产多行数据,需要用$fe: ;

3.需要注意的是模板中第6行左边的{{在A6, 右边的}}在J6, 也就是说{{和}}可以在不同的单元格中,每次遍历maplist,不同的属性值填充到不同的单元格中,完成多次遍历后,会生成多行数据。

 

新建测试类

public class TemplateTest {
    // 使用excel模板导出excel
    @Test
    public void fe_map() throws Exception {
        TemplateExportParams params = new TemplateExportParams(
                "template.xlsx");
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("date", "2014-12-25");
        map.put("money", 2000000.00);
        map.put("upperMoney", "贰佰万");
        map.put("company", "执笔潜行科技有限公司");
        map.put("bureau", "财政局");
        map.put("person", "JueYue");
        map.put("phone", "1879740****");
        List<Map<String, String>> listMap = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            Map<String, String> lm = new HashMap<>();
            lm.put("id", i + 1 + "");
            lm.put("zijin", i * 10000 + "");
            lm.put("bianma", "A001");
            lm.put("mingcheng", "设计");
            lm.put("xiangmumingcheng", "EasyPoi " + i + "期");
            lm.put("quancheng", "开源项目");
            lm.put("sqje", i * 10000 + "");
            lm.put("hdje", i * 10000 + "");

            listMap.add(lm);
        }
        map.put("maplist", listMap);

        // 导出excel
        Workbook workbook = ExcelExportUtil.exportExcel(params, map);
        File savefile = new File("D:/excel/");
        if (!savefile.exists()) {
            savefile.mkdirs();
        }
        FileOutputStream fos = new FileOutputStream("D:/excel/专项支出用款申请书_map.xlsx");
        workbook.write(fos);
        fos.close();
    }
}

运行测试类,结果如下:

 

完成!enjoy it!

 

### 回答1: 使用EasyPoi读取Excel可以按照以下步骤进行: 1. 添加EasyPoi的依赖。在Maven项目中,在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>4.2.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>4.2.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-poifiles</artifactId> <version>4.2.0</version> </dependency> ``` 2. 创建Java类,定义Excel中每行数据对应的实体类。可以使用EasyPoi提供的注解来指定Excel中每列数据对应的属性。 ```java import cn.afterturn.easypoi.excel.annotation.Excel; public class User { @Excel(name = "ID", orderNum = "0") private Integer id; @Excel(name = "姓名", orderNum = "1") private String name; @Excel(name = "年龄", orderNum = "2") private Integer age; // getter和setter方法省略 } ``` 3. 使用EasyPoi提供的工具类读取Excel文件。可以使用以下代码读取Excel文件并将数据转换为实体类列表。 ```java import cn.afterturn.easypoi.excel.ExcelImportUtil; import cn.afterturn.easypoi.excel.entity.ImportParams; public class ExcelReader { public static void main(String[] args) { ImportParams params = new ImportParams(); List<User> userList = ExcelImportUtil.importExcel( new File("user.xlsx"), User.class, params ); // TODO: 处理读取到的用户数据 } } ``` 其中,ImportParams可以指定读取Excel文件的一些参数,例如读取的sheet名称、是否读取表头等。ExcelImportUtil.importExcel方法返回值为List<User>类型,即读取到的所有用户信息。 ### 回答2: easypoi是一个基于Apache POI封装的Java类库,用于快速读取和写入Excel文件。它可以帮助我们轻松地读取Excel文件中的数据,并提供了一些便捷的方法和功能。 使用easypoi读取Excel文件非常简单。首先,我们需要导入easypoi相关的依赖库。然后,我们可以创建一个ExcelImportUtil对象,并指定要读取Excel文件路径。接下来,我们可以调用ExcelImportUtil的方法,例如readExcel方法,来读取Excel文件中的数据。 读取数据后,我们可以根据需要对数据进行处理或操作,例如打印到控制台、存储到数据库等。同时,easypoi还提供了灵活的配置选项,可以帮助我们处理复杂的Excel文件,如合并单元格、多表头等。 除了读取Excel文件,easypoi还可以方便地写入Excel文件。我们可以创建一个ExcelExportUtil对象,并使用该对象的方法,例如createWorkbook方法,创建一个新的Excel文件。然后,我们可以使用addSheet和addTable等方法,向Excel文件中添加表格和数据。最后,我们可以调用write方法,将数据写入Excel文件中。 总之,easypoi是一个功能强大而又简单易用的Java类库,可以帮助我们快速读取和写入Excel文件。无论是处理大量数据还是处理复杂的Excel格式,easypoi都可以满足我们的需求。 ### 回答3: easypoi是一款强大的Java工具库,专门用于简化对Excel文件的读写操作。它提供了丰富的API,可以方便地读取Excel文件中的数据。 使用easypoi读取Excel文件非常简单。首先,我们需要导入easypoi的相关依赖库,并在代码中引入所需的类。然后,通过创建一个ExcelImportUtil对象来进行Excel文件的读取操作。 接下来,我们可以调用ExcelImportUtil的相关方法来选择要读取Excel文件,并指定要读取的数据所在的Sheet等信息。easypoi会自动解析Excel文件,并将数据转化为Java对象。 我们可以通过遍历获取到的Java对象来访问Excel中的数据。使用easypoi读取Excel文件可以灵活地选择要读取的数据列,并且可以方便地处理数据类型转换等问题。 在读取Excel文件时,easypoi还提供了一些额外的功能。例如,我们可以指定要读取的起始行和结束行,还可以指定要跳过的表头行数。这些功能使得读取Excel文件更加灵活和高效。 总结而言,easypoi是一个功能强大、易于使用的Java工具库,可以方便地读取Excel文件。它的丰富的API和灵活的功能使得我们可以轻松地处理各种Excel文件,从而大大提高了工作效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值