инструмент импорта excel

задняя часть GitHub Excel

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 можно разделить на несколько шагов.

  1. загрузить эксель файл
  2. Преобразование 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…, можно глянуть при необходимости