Импорт и экспорт настолько гладкие, вы используете EasyPoi?

задняя часть
Импорт и экспорт настолько гладкие, вы используете EasyPoi?

POI: технология, используемая для обработки файлов Excel, Word и т. д. EasyPoi: позволяет людям, которые не были знакомы с POI, легко писать функции импорта и экспорта Excel. Проще говоря, с EasyPoi импорт и экспорт файлов стал таким простым!

Адрес официального сайта:easypoi.mydoc.io/

1. SpringBoot интегрирует EasyPoi

импортировать зависимости

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

<!--easy-poi-->
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-base</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-web</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-annotation</artifactId>
    <version>4.0.0</version>
</dependency>

2. Связанные примечания

2.1 @ExcelTarget

Воздействует на класс сущностей, указывая, что это класс сущностей, который можно импортировать и экспортировать с помощью операций EasyPoi.

Общие свойства:

  • значение: Уникальный идентификатор, который нельзя повторять. Но его можно опустить, например, "пользователь"

Инструкции:

@ExcelTarget("user")
public class User implements Serializable {
}

2.2 @Excel

Воздействует на свойство в классе сущностей, чтобы указать, что это столбец в Excel.

Общие свойства:

  • name: имя столбца в таблице Excel, например name="name"
  • orderNum: порядок столбцов в таблице Excel, например orderNum="1"
  • тип: тип экспорта, 1 текст, 2 изображения, 3 функции, 10 чисел, по умолчанию текст
  • ширина: ширина столбца
  • высота: высота столбца
  • savePath: место сохранения изображения
  • exportformat: формат времени для экспорта в Excel, например, exportformat="гггг-ММ-дд ЧЧ:мм:сс"
  • importFormat: формат времени, импортированный Excel.
  • формат: установите формат времени для импорта и экспорта одновременно
  • isStatistics: этот столбец агрегирован? По умолчанию ложь
  • needMerge: объединять ли ячейки по вертикали, значение по умолчанию — false
  • replace: заменить значение, например replace = {"female_0", "male_1"}, что означает, что если значение равно 1, экспортировать «мужской», если значение равно 0, экспортировать «женский».

Инструкции:

@ExcelTarget("user")
public class User implements Serializable {

  @Excel(name = "姓名", width = 30, orderNum = "1")
  private String name;

  @Excel(name = "年龄", width = 10, orderNum = "2",isSta    tistics = true)
  private Integer age;

  @Excel(name = "性别", width = 10, orderNum = "3", repl    ace = {"女_0", "男_1"})
  private Integer sex;

  @Excel(name = "生日", width = 30, orderNum = "4", form    at = "yyyy-MM-dd HH:mm:ss")
  private Date birthday;

  @Excel(name = "头像信息", type = 2, width = 20,height = 30,savePath = "D:\\WorkSpace\\easy-poi\\src\\main\\resources")
  private String head;
}

2.3 @ExcelEntity

Воздействует на класс в классе сущностей, указывая, что это класс в экспортируемом классе.

Общие свойства:

  • имя: Уникальный идентификатор, не может быть повторен.

Инструкции:

@ExcelTarget("user")
public class User implements Serializable {

    @ExcelEntity(name = "address")
    private Address address;
}
@ExcelTarget("address")
public class Address implements Serializable {

    @Excel(name = "省", width = 30, orderNum = "6")
    private String province;

    @Excel(name = "市", width = 30, orderNum = "7")
    private String city;

    @Excel(name = "县", width = 30, orderNum = "8")
    private String county;
}

2.4 @ExcelCollection

Указывает, что это набор, отношение "один ко многим"

Общие свойства:

  • name: имя коллекции, уникальный идентификатор
  • orderNum: порядок, в котором расположены столбцы в таблице Excel.

Инструкции:

@ExcelTarget("user")
public class User implements Serializable {

  @ExcelCollection(name = "购买的水果", orderNum = "9")
  private List<Fruit> fruits;
  
}
@ExcelTarget("fruit")
public class Fruit implements Serializable {

    @Excel(name = "水果名")
    private String name;

    @Excel(name = "价格/元")
    private Double price;

    @Excel(name = "数量")
    private Integer count;
    
}

2.5 @ExcelIgnore

Воздействовать на атрибут, пропустить этот столбец при экспорте

Инструкции:

@ExcelIgnore 
@Excel(name = "荣誉", width = 60, orderNum = "5")
private List<String> honors;

3. Экспорт в Excel

3.1 Экспорт основных свойств

Определите класс пользователя:

/**
 * @Description 导入导出实体类
 * @Author 一颗雷布斯
 * @Date 2021/5/24 15:38
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ExcelTarget("user")
public class User implements Serializable {

    @Excel(name = "姓名", width = 30, orderNum = "1" )
    private String name;

    @Excel(name = "年龄", width = 10, orderNum = "2")
    private Integer age;

    @Excel(name = "性别", width = 10, orderNum = "3", replace = {"女_0", "男_1"})
    private Integer sex;

    @Excel(name = "生日", width = 30, orderNum = "4", format = "yyyy-MM-dd HH:mm:ss")
    private Date birthday;
}

Методы испытаний:

@Test
void exportBasic() throws IOException {
    //新建测试数据
    List<User> userList = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        User user = new User();
        user.setName("周芷若" + i);
        user.setAge(18 + i);
        user.setBirthday(new Date());
        user.setSex(new Random().nextInt(2));
        userList.add(user);
    }
    /*---------------------下面是使用EasyPoi导出的核心方法----------------------------*/
    // ExportParams() 两个参数,一个是title 表格标题, 一个是sheetName
    Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户表","sheet1"),User.class,userList);
    //导出文件到指定位置
    FileOutputStream outputStream = new FileOutputStream("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\用户表.xls");
    workbook.write(outputStream);
    outputStream.close();
    workbook.close();
}

Результаты:

3.2 Экспорт изображений

Определить класс пользователя (включая аватар пользователя):

/**
 * @Description 导入导出实体类
 * @Author 一颗雷布斯
 * @Date 2021/5/24 15:38
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ExcelTarget("user")
public class User implements Serializable {

    @Excel(name = "姓名", width = 30, orderNum = "1" )
    private String name;

    @Excel(name = "年龄", width = 10, orderNum = "2")
    private Integer age;

    @Excel(name = "性别", width = 10, orderNum = "3", replace = {"女_0", "男_1"})
    private Integer sex;

    @Excel(name = "生日", width = 30, orderNum = "4", format = "yyyy-MM-dd HH:mm:ss")
    private Date birthday;
    
    //切记图片的 type = 2
    @Excel(name = "头像信息", type = 2, width = 20,height = 30)
    private String head;
}

Методы испытаний:

@Test
void exportBasic() throws IOException {
    //新建测试数据
    List<User> userList = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        User user = new User();
        user.setName("周芷若" + i);
        user.setAge(18 + i);
        user.setBirthday(new Date());
        user.setSex(new Random().nextInt(2));
        //指定图像所在的位置
        user.setHead("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\static\\image\\head.jpeg");
        userList.add(user);
    }
    /*---------------------下面是使用EasyPoi导出的核心方法----------------------------*/
    // ExportParams() 两个参数,一个是title 表格标题, 一个是sheetName
    Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户表","sheet1"),User.class,userList);
    //导出文件到指定位置
    FileOutputStream outputStream = new FileOutputStream("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\用户表.xls");
    workbook.write(outputStream);
    outputStream.close();
    workbook.close();
}

Результаты:

3.3 Экспорт объектов в объекты

Определите класс пользователя (содержащий объект адреса пользователя):

/**
 * @Description 导入导出实体类
 * @Author 一颗雷布斯
 * @Date 2021/5/24 15:38
 */

@Data
@AllArgsConstructor
@NoArgsConstructor
@ExcelTarget("user")
public class User implements Serializable {

    @Excel(name = "姓名", width = 30, orderNum = "1")
    private String name;

    @Excel(name = "年龄", width = 10, orderNum = "2")
    private Integer age;

    @Excel(name = "性别", width = 10, orderNum = "3", replace = {"女_0", "男_1"})
    private Integer sex;

    @Excel(name = "生日", width = 30, orderNum = "4", format = "yyyy-MM-dd HH:mm:ss")
    private Date birthday;

    @ExcelEntity(name = "address")
    private Address address;
}

Класс адреса:

/**
 * @Description 地址
 * @Author 一颗雷布斯
 * @Date 2021/5/24 16:32
 */
@Data
@AllArgsConstructor
@ExcelTarget("address")
public class Address implements Serializable {

    @Excel(name = "省", width = 30, orderNum = "5")
    private String province;

    @Excel(name = "市", width = 30, orderNum = "6")
    private String city;

    @Excel(name = "县", width = 30, orderNum = "7")
    private String county;

}

Методы испытаний:

@Test
void exportUserTest() throws IOException {
    List<User> userList = new ArrayList<>();
    for (int i = 0; i < 5; i++) {
        User user = new User();
        user.setName("周芷若" + i);
        user.setAge(18 + i);
        user.setBirthday(new Date());
        user.setSex(new Random().nextInt(2));
        //设置地址
        user.setAddress(new Address("湖南","长沙","宁乡"));
        userList.add(user);
    }
    Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户表","sheet1"),User.class,userList);
    //导出文件到指定位置
    FileOutputStream outputStream = new FileOutputStream("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\用户表.xls");
    workbook.write(outputStream);
    outputStream.close();
    workbook.close();
}

Результаты:

3.4 Экспорт коллекции списков в объект

Определите класс пользователя (включая информацию о чести пользователя):

/**
 * @Description 导入导出实体类
 * @Author 一颗雷布斯
 * @Date 2021/5/24 15:38
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ExcelTarget("user")
public class User implements Serializable {

    @Excel(name = "姓名", width = 30, orderNum = "1")
    private String name;

    @Excel(name = "年龄", width = 10, orderNum = "2")
    private Integer age;

    @Excel(name = "性别", width = 10, orderNum = "3", replace = {"女_0", "男_1"})
    private Integer sex;

    @Excel(name = "生日", width = 30, orderNum = "4", format = "yyyy-MM-dd HH:mm:ss")
    private Date birthday;

    @Excel(name = "荣誉", width = 60, orderNum = "5")
    private List<String> honors;
}

Методы испытаний:

@Test
void exportUserTest() throws IOException {
    List<User> userList = new ArrayList<>();
    String honorList="吃饭比赛一等奖、国际睡觉大赛二等奖";
    List<String> honors = Arrays.asList(honorList.split("、"));
    for (int i = 0; i < 5; i++) {
        User user = new User();
        user.setName("周芷若" + i);
        user.setAge(18 + i);
        user.setBirthday(new Date());
        user.setSex(0);
        //设置用户所得荣誉
        user.setHonors(honors);
        userList.add(user);
    }
    Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户表","sheet1"),User.class,userList);
    //导出文件到指定位置
    FileOutputStream outputStream = new FileOutputStream("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\用户表.xls");
    workbook.write(outputStream);
    outputStream.close();
    workbook.close();
}

Результаты:

3.5 Экспорт отношения «один ко многим»

Определите класс пользователя (включая информацию о фруктах, купленных пользователем, здесь пользователь покупает несколько фруктов):

@Data
@AllArgsConstructor
@NoArgsConstructor
@ExcelTarget("user")
public class User implements Serializable {

    @Excel(name = "姓名", width = 30, orderNum = "1",needMerge = true)
    private String name;

    @Excel(name = "年龄", width = 10, orderNum = "2",needMerge = true)
    private Integer age;

    @Excel(name = "性别", width = 10, orderNum = "3", replace = {"女_0", "男_1"},needMerge = true)
    private Integer sex;

    @Excel(name = "生日", width = 30, orderNum = "4", format = "yyyy-MM-dd HH:mm:ss",needMerge = true)
    private Date birthday;

    @ExcelCollection(name = "购买的水果", orderNum = "5")
    private List<Fruit> fruits;
}

Фрукты:

/**
 * @Description 水果实体类
 * @Author 一颗雷布斯
 * @Date 2021/5/24 16:43
 */
@Data
@AllArgsConstructor
@ExcelTarget("fruit")
public class Fruit implements Serializable {

    @Excel(name = "水果名")
    private String name;

    @Excel(name = "价格/元")
    private Double price;

    @Excel(name = "数量")
    private Integer count;
}

Методы испытаний:

@Test
void exportUserTest() throws IOException {
    List<User> userList = new ArrayList<>();
    for (int i = 0; i < 5; i++) {
        User user = new User();
        user.setName("周芷若" + i);
        user.setAge(18 + i);
        user.setBirthday(new Date());
        user.setSex(0);
        //设置用户购买的水果信息
        user.setFruits(Arrays.asList(new Fruit("苹果",23.5,11),new Fruit("香蕉",4.98,21)));
        userList.add(user);
    }
    Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户表","sheet1"),User.class,userList);
    //导出文件到指定位置
    FileOutputStream outputStream = new FileOutputStream("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\用户表.xls");
    workbook.write(outputStream);
    outputStream.close();
    workbook.close();
}

Результаты:

4. Импорт Excel

4.1 Импорт основных свойств

Подготовка файлов:

Определите класс пользователя:

@Data
@AllArgsConstructor
@NoArgsConstructor
@ExcelTarget("user")
public class User implements Serializable {

    @Excel(name = "姓名", width = 30, orderNum = "1")
    private String name;

    @Excel(name = "年龄", width = 10, orderNum = "2")
    private Integer age;

    @Excel(name = "性别", width = 10, orderNum = "3", replace = {"女_0", "男_1"})
    private Integer sex;

    @Excel(name = "生日", width = 30, orderNum = "4", format = "yyyy-MM-dd HH:mm:ss")
    private Date birthday;
}

Методы испытаний:

@Test
void importUserTest() {
    ImportParams importParams = new ImportParams();
    //表格标题行数,默认0
    importParams.setTitleRows(1);
    //表头行数,默认1
    importParams.setHeadRows(1);
    //导出数据 参数1:当如excel文件  参数2:导入对象的类型 参数3:导入参数配置
    List<User> userList = ExcelImportUtil.importExcel(new File("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\用户表.xls"), User.class,importParams);
   if(!CollectionUtils.isEmpty(userList))
    userList.forEach(user->{
        System.out.println(user);
    });
}

Результаты:

4.2 Импорт изображений

Подготовка файлов:

Определите класс пользователя (включая аватар пользователя, savePath указывает место сохранения аватара пользователя):

@Data
@AllArgsConstructor
@NoArgsConstructor
@ExcelTarget("user")
public class User implements Serializable {

    @Excel(name = "姓名", width = 30, orderNum = "1")
    private String name;

    @Excel(name = "年龄", width = 10, orderNum = "2")
    private Integer age;

    @Excel(name = "性别", width = 10, orderNum = "3", replace = {"女_0", "男_1"})
    private Integer sex;

    @Excel(name = "生日", width = 30, orderNum = "4", format = "yyyy-MM-dd HH:mm:ss")
    private Date birthday;

    @Excel(name = "头像信息", type = 2, width = 20,height = 30,savePath = "D:\\WorkSpace\\easy-poi\\src\\main\\resources\\head")
    private String head;
}

Методы испытаний:

@Test
void importUserTest() {
    ImportParams importParams = new ImportParams();
    //表格标题行数,默认0
    importParams.setTitleRows(1);
    //表头行数,默认1
    importParams.setHeadRows(1);
    //导出数据 参数1:当如excel文件  参数2:导入对象的类型 参数3:导入参数配置
    List<User> userList = ExcelImportUtil.importExcel(new File("D:\\WorkSpace\\easy-poi\\src\\main\\resources\\用户表.xls"), User.class,importParams);
   if(!CollectionUtils.isEmpty(userList))
    userList.forEach(user->{
        System.out.println(user);
    });
}

Результаты:Место сохранения аватара:

5. Меры предосторожности

При экспорте файла Excel не забудьте сначала отключить исходный экспортированный файл Excel, иначе будет сообщено об ошибке!