1. Введение
инструмент импорта excel
Структура кода всего проекта выглядит следующим образом
\---excelExport # 导出工具包
| AsyncExportExcel.java #多线程导出
| ExcelImport.java # 导出工具类
|
+---data
| BaseParam.java # 基础导出参数类
|
+---dataConversion
| DataExportConversion.java # 属性导出转换接口
|
+---defaultDataHandle # 默认的数据处理
| AbstractDataHandler.java
| BooleanDataHandler.java
| DataHandlerFactory.java
| DateDataHandler.java
| StringDataHandler.java
|
\---style # 默认的样式
AbstractCellStyle.java
DefaultDataCellStyle.java
DefaultTitleCellStyle.java
com
\---utils
+---demo # 案例相关
| | ExcelImportApplication.java # springboot启动类
| |
| +---bean
| | DemoBean.java # 测试bean
| |
| +---controller
| | ExcelImportController.java # 测试从web导入excel和从文件导入excel
| |
| \---importParam
| | DemoImportParam.java # 导入参数
| |
| \---dataConversion
| HobbyConversion.java # 爱好属性导入转换类
|
\---excelImport # 导入工具包
| ExcelImport.java # 导入工具类
|
+---data
| CellParam.java # 导入列参数类
|
\---dataConversion
| DataImportConversion.java # 属性导入转换接口
|
\---impl
DateConversion.java # 日期属性导入转换接口
MapConversion.java # 键值对属性导入转换接口
Проще говоря, импорт excel можно разделить на несколько шагов.
- загрузить эксель файл
- Преобразование excel в данные, преобразование необходимых данных
2 использовать
2.1 Класс инструментов ExcelImport
Сначала создайте экземпляр класса инструмента ExcelImport, здесь я предоставляю конструктор
public ExcelImport(Class<T> clazz, List<CellParam> cellParams)
параметр | имея в виду |
---|---|
clazz | Объект класса (объект класса, который необходимо преобразовать в Bean) |
cellParams | Список CellParam (поля и классы преобразования данных, соответствующие каждому столбцу) |
После создания экземпляра класса инструмента ExcelImport необходимо вызвать метод importExcel, который определяется следующим образом.
public List<T> importExcel(InputStream is)
Просто передайте InputStream.
2.2 Импорт класса параметров столбца CellParam
Код класса CellParam выглядит следующим образом
public class CellParam {
private String fieldName;
private DataImportConversion conversion;
//Set Get Constructor
}
2.2.1 Свойства
Вы можете видеть, что класс CellParam имеет два свойства.
private String fieldName;
private DataImportConversion conversion;
параметр | имея в виду |
---|---|
fieldName | Столбец соответствует атрибуту бина |
conversion | класс преобразования данных |
2.3 Интерфейс преобразования данных DataImportConversion
public interface DataImportConversion<T> {
T transferData(Object data);
}
Я предоставляю здесь два преобразования данных по умолчанию, одно — это пара ключ-значение, другое — дата.
2.3.1 Преобразование данных пар "ключ-значение"
Класс преобразования данных пары "ключ-значение" предназначен для преобразования некоторых общих данных.
Например: мужчина и женщина, существуют ли разные числа, соответствующие каким-то разным именам (нормальный --> 0, ненормальный --> 1, другой --> 2)
Пользователь может определить тип возвращаемого значения через универсальный тип входящей карты.
public class MapConversion<K,V> implements DataImportConversion<V> {
private Map<K,V> map ;
private V defaultReturnValue;
public MapConversion(Map<K, V> map) {
this(map,null);
}
public MapConversion(Map<K, V> map,V defaultReturnValue) {
this.map = map;
this.defaultReturnValue = defaultReturnValue;
}
@Override
public V transferData(Object data) {
if (map == null) return null;
//如果data为null且map的null对应的值不为null,则直接返回map中null对应的值
if (data == null && map.get(null) != null){
return map.get(null);
}
//循环查找对应的key
for (Map.Entry<K,V> entry:map.entrySet()){
if (entry.getKey() != null && entry.getKey().equals(data)){
return entry.getValue();
}
}
//如果map里面找不到对应的数据,则返回defaultReturnValue
return defaultReturnValue;
}
}
2.3.2 Преобразование данных даты
Предоставляет функцию преобразования даты, которая преобразуется входящим форматом преобразования даты.
public class DateConversion implements DataImportConversion<Date> {
private SimpleDateFormat format;
public DateConversion(String pattern) {
this.format = new SimpleDateFormat(pattern);
}
@Override
public Date transferData(Object data) {
try {
return format.parse(data.toString());
} catch (Exception e){
e.printStackTrace();
}
return null;
}
}
3 случая
3.1 Сценарий
Исходные данные следующие
Имя | Пол | Дата рождения | Хобби |
---|---|---|---|
пыльное сердце | Женский | 2018-08-08 14:59:11 | танцевальный нож |
Цяньюэ | мужчина | 2018-08-08 14:59:11 | петь и танцевать |
Список, который необходимо преобразовать в компоненты управления данными, как показано ниже.
DemoBean{name='尘心', sex=0, birthday=Wed Aug 08 14:13:45 CST 2018, hobbies=[舞刀, 弄枪]}
DemoBean{name='千月', sex=1, birthday=Wed Aug 08 14:13:45 CST 2018, hobbies=[唱歌, 跳舞]}
Класс сущности выглядит следующим образом
public class DemoBean {
//姓名
private String name;
//性别,0->女,1->男
private Integer sex;
//出生日期
private Date birthday;
//爱好
private List<String> hobbies;
//Set Get
}
3.2 Преобразование данных
Видно, что необходимо преобразовать три атрибута, а именно пол, дату и хобби. Преобразования данных для пола и даты могут использовать преобразования данных по умолчанию. Хобби необходимо преобразовать строки в соответствии с,
Разделить и преобразовать в список данных, ниже приведено преобразование данных хобби,
public class HobbyConversion implements DataImportConversion<List<String>> {
@Override
public List<String> transferData(Object data) {
if (data == null) return null;
//根据,分割字符串
String hobbyStr = data.toString();
String[] hobbyArray = hobbyStr.split(",");
//转换成list
List<String> hobbies = Arrays.asList(hobbyArray);
return hobbies;
}
}
3.3 Класс параметров импорта
После того, как класс преобразования данных написан, начните писать класс параметров импорта, код выглядит следующим образом.
public class DemoImportParam {
public static List<CellParam> getCellParams(){
Map<String,Integer> sexMap = new HashMap<>();
sexMap.put("女",0);
sexMap.put("男",1);
List<CellParam> cellParams = new ArrayList<>();
cellParams.add(new CellParam("name"));
cellParams.add(new CellParam("sex", new MapConversion(sexMap)));
cellParams.add(new CellParam("birthday", new DateConversion("yyyy-MM-dd HH:mm:ss")));
cellParams.add(new CellParam("hobbies", new HobbyConversion()));
return cellParams;
}
}
В классе DemoImportParam вы можете увидеть статический метод getCellParams, который возвращает список. Внутри метода сначала определяется объект mao для хранения числа, соответствующего строке пола, а затем определение списка.
Вы можете видеть, что всего 4 параметра столбца.
- Имя заголовка первого столбца — имя, а имя соответствующего атрибута — имя
- Имя заголовка второго столбца — пол, имя соответствующего атрибута — пол, а объект преобразования данных — MapConversion.
- Имя заголовка третьего столбца — это дата рождения, имя соответствующего атрибута — день рождения, а преобразование даты
- Название заголовка четвертого столбца — хобби, имя соответствующего атрибута — хобби, а объект преобразования данных — HobbyConversion.
3.4 Экспорт
Затем есть два метода экспорта данных: один — получить доступ к всплывающему URL-адресу для загрузки файла Excel, а другой — экспортировать Excel в файл.
3.4.1 Импорт Excel из Интернета
@ResponseBody
@PostMapping("/import")
public List<DemoBean> importByWeb(MultipartFile file) throws Exception {
ExcelImport excelImport = new ExcelImport(DemoBean.class, DemoImportParam.getCellParams());
List<DemoBean> list = excelImport.importExcel(file.getInputStream());
return list;
}
3.4.2 Импорт Excel из файла
@Test
public void importByFile() throws Exception {
File file = new File("F:\\导出demo.xlsx");
FileInputStream inputStream = new FileInputStream(file);
//导入转换
ExcelImport excelImport = new ExcelImport(DemoBean.class, DemoImportParam.getCellParams());
List<DemoBean> list = excelImport.importExcel(inputStream);
//输出
for (DemoBean bean:list){
System.out.println(bean);
}
}
Расположение проекта:GitHub.com/rainbowbig/U…, можно глянуть при необходимости