Простое, удобное и лёгкое решение для импорта и экспорта больших объёмов файлов Excel.
<dependency>
<groupId>com.wuwenze</groupId>
<artifactId>ExcelKit</artifactId>
<version>2.0.72</version>
</dependency>
В настоящее время поддерживаются два способа настройки: аннотация или XML.
@Excel("用户信息")
public class User {
@ExcelField(value = "编号", width = 30)
private Integer userId;
@ExcelField(//
value = "用户名",//
required = true,//
validator = UsernameValidator.class,//
comment = "请填写用户名,最大长度为12,且不能重复"
)
private String username;
@ExcelField(value = "密码", required = true, maxLength = 32)
private String password;
@ExcelField(value = "邮箱", validator = UserEmailValidator.class)
private String email;
@ExcelField(//
value = "性别",//
readConverterExp = "未知=0,男=1,女=2",//
writeConverterExp = "0=未知,1=男,2=女",//
options = SexOptions.class//
)
private Integer sex;
@ExcelField(//
value = "用户组",//
name = "userGroup.name",//
options = UserGroupNameOptions.class
)
private UserGroup userGroup;
@ExcelField(value = "创建时间", dateFormat = "yyyy/MM/dd HH:mm:ss")
private Date createAt;
@ExcelField(//
value = "自定义字段",//
maxLength = 80,//
comment = "可以乱填,但是长度不能超过80,导入时最终会转换为数字",//
writeConverter = CustomizeFieldWriteConverter.class,// 写文件时,将数字转字符串
readConverter = CustomizeFieldReadConverter.class// 读文件时,将字符串转数字
)
private Integer customizeField;
// Getter and Setter ..
}
Конфигурация в формате XML, необходимо поместить файл XML в
classpath:excel-mapping/{entityClassName}.xml
public class User2 {
private Integer userId;
private String username;
private String password;
private String email;
private Integer sex;
private UserGroup userGroup;
private Date createAt;
private Integer customizeField;
// Getter and Setter ..
}
classpath:excel-mapping/com.wuwenze.entity.User2.xml
<?xml version="1.0" encoding="UTF-8"?>
<excel-mapping name="用户信息">
<property name="userId" column="编号" width="30"/>
<property
name="username"
column="用户名"
required="true"
validator="com.wuwenze.validator.UsernameValidator"
comment="请填写用户名,最大长度为12,且不能重复"
/>
<property name="password" column="密码" required="true" maxLength="32"/>
<property name="email" column="邮箱" validator="com.wuwenze.validator.UserEmailValidator"/>
<property
name="sex"
column="性别"
readConverterExp="未知=0,男=1,女=2"
writeConverterExp="0=未知,1=男,2=女"
options="com.wuwenze.options.SexOptions"
/>
<property name="userGroup.name" column="用户组" options="com.wuwenze.options.UserGroupNameOptions"/>
<property name="createAt" column="创建时间" dateFormat="yyyy/MM/dd HH:mm:ss"/>
<property
name="customizeField"
column="自定义字段"
maxLength="80"
comment="可以乱填,但是长度不能超过80,导入时最终会转换为数字"
writeConverter="com.wuwenze.converter.CustomizeFieldWriteConverter"
readConverter="com.wuwenze.converter.CustomizeFieldReadConverter"
/>
</excel-mapping>
Эти два метода можно использовать по выбору, ExcelKit будет предпочитать загрузку файла конфигурации в формате XML
.
Реализуя
com.wuwenze.poi.config.Options
, можно настроить источник данных для выпадающего списка при импорте.
public class UserGroupNameOptions implements Options {
@Override
public String[] get() {
return new String[]{"管理组", "普通会员组", "游客"};
}
}
Реализуя
com.wuwenze.poi.validator.Validator
, можно настраивать правила проверки при импорте ячеек.
public class UsernameValidator implements Validator {
final List<String> ERROR_USERNAME_LIST = Lists.newArrayList(
"admin", "root", "master", "administrator", "sb"
);
@Override
public String valid(Object o) {
String username = (String) o;
if (username.length() > 12) {
return "用户名不能超过12个字符。";
}
if (ERROR_USERNAME_LIST.contains(username)) {
return "用户名非法,不允许使用。";
}
return null;
}
}
Реализуя
com.wuwenze.poi.convert.WriteConverter
иcom.wuwenze.poi.convert.ReadConverter
, можно создавать преобразователи для чтения и записи значений ячеек.
public class CustomizeFieldWriteConverter implements WriteConverter {
/**
* При записи файла преобразует значения (в данном примере числовые значения объединяются в строку определённого формата).
*/
@Override
public **Конвертация строк и чисел в Excel с помощью библиотеки ExcelKit**
String convert(Object o) throws ExcelKitWriteConverterException { return (o + "_convertedValue"); }
public class CustomizeFieldReadConverter implements ReadConverter {
/**
int convertedValue = 0;
for (char c : value.toCharArray()) {
convertedValue += Integer.valueOf(c);
}
return convertedValue;
} }
**Создание шаблона для импорта данных из Excel**
> Использование ExcelKit API для создания шаблона импорта, который будет содержать комментарии и выпадающие списки.
``` java
// Генерация шаблона импорта (с 3 примерами данных)
@RequestMapping(value = "/downTemplate", method = RequestMethod.GET)
public void downTemplate(HttpServletResponse response) {
List<User> userList = DbUtil.getUserList(3);
ExcelKit.$Export(User.class, response).downXlsx(userList, true);
}
Импорт данных из файла Excel
Импорт данных выполняется построчно, что позволяет избежать проблем с нехваткой памяти и не беспокоиться о размере файла Excel.
@RequestMapping(value = "/importUser", method = RequestMethod.POST)
public ResponseEntity<?> importUser(@RequestParam MultipartFile file)
throws IOException {
long beginMillis = System.currentTimeMillis();
List<User> successList = Lists.newArrayList();
List<Map<String, Object>> errorList = Lists.newArrayList();
ExcelKit.$Import(User.class)
.readXlsx(file.getInputStream(), new ExcelReadHandler<User>() {
@Override
public void onSuccess(int sheetIndex, int rowIndex, User entity) {
successList.add(entity); // Успешное чтение одной строки, добавление в очередь импорта.
}
@Override
public void onError(int sheetIndex, int rowIndex,
List<ExcelErrorField> errorFields) {
// Ошибка при чтении данных, сохранение всех ошибок для текущей строки.
errorList.add(MapUtil.newHashMap(//
"sheetIndex", sheetIndex,//
"rowIndex", rowIndex,//
"errorFields", errorFields//
));
}
});
// TODO: Выполнить операцию вставки данных из списка successList.
return ResponseEntity.ok(MapUtil.newHashMap(
"data", successList,
"haveError", !CollectionUtil.isEmpty(errorList),
"error", errorList,
"timeConsuming", (System.currentTimeMillis() - beginMillis) / 1000L
));
}
Экспорт данных в Excel
Экспорт данных осуществляется с использованием Apache POI SXSSF API, что значительно улучшает производительность экспорта.
@RequestMapping(value = "/downXlsx", method = RequestMethod.GET)
public void downXlsx(HttpServletResponse response) {
long beginMillis = System.currentTimeMillis();
List<User> userList = DbUtil.getUserList(100000);// Создание 100 000 тестовых записей
ExcelKit.$Export(User.class, response).downXlsx(userList, false);
log.info("#ExcelKit.$Export success, size={},timeConsuming={}s",//
userList.size(), (System.currentTimeMillis() - beginMillis) / 1000L);
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )