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, иначе будет сообщено об ошибке!