Некоторое время назад я нашел проект Ali EasyExcel на github. Я подумал, что он довольно хорош, поэтому я написал простой метод для его инкапсуляции, чтобы для завершения импорта или экспорта Excel можно было использовать только одну функцию. Я только что обновил и исправил некоторые ошибки некоторое время назад, поэтому я поделюсь своим пакетом, пожалуйста, дайте мне больше советов.
Прикрепите исходный код:GitHub.com/Хоуи Юань/О…
EasyExcel
Адрес github EasyExcel:GitHub.com/Alibaba/EAS…Официальное введение EasyExcel:
Видно, что самой большой особенностью EasyExcel является то, что он использует меньше памяти.Конечно, его функции теперь относительно просты, и он может сталкиваться с менее сложными сценами, но базовое чтение и запись могут быть полностью удовлетворены.
1. Зависимость
Первый - добавить зависимости проекта, текущая версия 1.1.2-beta4
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>1.1.2-beta4</version>
</dependency>
2. Требуемые классы
1. ExcelUtil
Класс инструментов, вы можете напрямую вызвать метод этого класса инструментов для чтения или записи Excel.
2. ExcelListener
Класс слушателя может настроить полученные данные в соответствии с вашими потребностями и вашей собственной ситуацией.Здесь я просто добавляю данные в список.
public class ExcelListener extends AnalysisEventListener {
//自定义用于暂时存储data。
//可以通过实例获取该值
private List<Object> datas = new ArrayList<>();
/**
* 通过 AnalysisContext 对象还可以获取当前 sheet,当前行等数据
*/
@Override
public void invoke(Object object, AnalysisContext context) {
//数据存储到list,供批量处理,或后续自己业务逻辑处理。
datas.add(object);
//根据自己业务做处理
doSomething(object);
}
private void doSomething(Object object) {
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
/*
datas.clear();
解析结束销毁不用的资源
*/
}
public List<Object> getDatas() {
return datas;
}
public void setDatas(List<Object> datas) {
this.datas = datas;
}
}
3. ExcelWriterFactroy
Excel для экспорта нескольких листов, записи нескольких листов путем многократного вызова метода записи
4. ExcelException
Поймать соответствующее исключение
3. Читайте Excel
При чтении Excel просто позвонитеExcelUtil.readExcel()
метод
@RequestMapping(value = "readExcel", method = RequestMethod.POST)
public Object readExcel(MultipartFile excel) {
return ExcelUtil.readExcel(excel, new ImportInfo());
}
Где excel — файловый объект типа MultipartFile, а new ImportInfo() — объект сущности, отображаемый Excel, который необходимо наследоватьBaseRowModelтакие классы как:
public class ImportInfo extends BaseRowModel {
@ExcelProperty(index = 0)
private String name;
@ExcelProperty(index = 1)
private String age;
@ExcelProperty(index = 2)
private String email;
/*
作为 excel 的模型映射,需要 setter 方法
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
В качестве класса сущностей сопоставления столбец, сопоставленный переменной-членом, может быть помечен аннотацией @ExcelProperty и переменной индекса, и метод установки обязателен.
4. Экспорт в Excel
1. Экспортируемый Excel имеет только один лист
просто позвониExcelUtil.writeExcelWithSheets()
метод:
@RequestMapping(value = "writeExcel", method = RequestMethod.GET)
public void writeExcel(HttpServletResponse response) throws IOException {
List<ExportInfo> list = getList();
String fileName = "一个 Excel 文件";
String sheetName = "第一个 sheet";
ExcelUtil.writeExcel(response, list, fileName, sheetName, new ExportInfo());
}
fileName и sheetName — это имя файла и имя листа файла экспорта соответственно, new ExportInfo() — это объект сопоставления экспортированных данных, а list — это экспортированные данные.
Для класса сущностей сопоставления вы можете настроить заголовок с помощью аннотации @ExcelProperty по мере необходимости.Конечно, вам также необходимо наследовать класс BaseRowModel, например:
public class ExportInfo extends BaseRowModel {
@ExcelProperty(value = "姓名" ,index = 0)
private String name;
@ExcelProperty(value = "年龄",index = 1)
private String age;
@ExcelProperty(value = "邮箱",index = 2)
private String email;
@ExcelProperty(value = "地址",index = 3)
private String address;
}
значение — имя столбца, индекс — порядковый номер столбца
Если нужно немного усложнить, можно добиться эффекта следующего рисунка:
Соответствующий класс сущности записывается следующим образом:
public class MultiLineHeadExcelModel extends BaseRowModel {
@ExcelProperty(value = {"表头1","表头1","表头31"},index = 0)
private String p1;
@ExcelProperty(value = {"表头1","表头1","表头32"},index = 1)
private String p2;
@ExcelProperty(value = {"表头3","表头3","表头3"},index = 2)
private int p3;
@ExcelProperty(value = {"表头4","表头4","表头4"},index = 3)
private long p4;
@ExcelProperty(value = {"表头5","表头51","表头52"},index = 4)
private String p5;
@ExcelProperty(value = {"表头6","表头61","表头611"},index = 5)
private String p6;
@ExcelProperty(value = {"表头6","表头61","表头612"},index = 6)
private String p7;
@ExcelProperty(value = {"表头6","表头62","表头621"},index = 7)
private String p8;
@ExcelProperty(value = {"表头6","表头62","表头622"},index = 8)
private String p9;
}
2. Экспортированный Excel имеет несколько листов
перечислитьExcelUtil.writeExcelWithSheets()
Обработайте первый лист, затем вызовитеwrite()
Метод обрабатывает последующие листы по очереди и, наконец, используетfinish()
метод заканчивается
public void writeExcelWithSheets(HttpServletResponse response) throws IOException {
List<ExportInfo> list = getList();
String fileName = "一个 Excel 文件";
String sheetName1 = "第一个 sheet";
String sheetName2 = "第二个 sheet";
String sheetName3 = "第三个 sheet";
ExcelUtil.writeExcelWithSheets(response, list, fileName, sheetName1, new ExportInfo())
.write(list, sheetName2, new ExportInfo())
.write(list, sheetName3, new ExportInfo())
.finish();
}
Параметрами метода записи являются данные списка текущего листа, имя текущего листа и соответствующий класс сопоставления.