【Java后端】解析csv文件并转成bean对象

为了批量导入数据,采用了csv文件存储数据,后端写csv解析工具对数据进行读取和解析并导入数据库。

pom依赖:

    com.opencsv

    opencsv

    4.3.2

1、解析csv文件工具类(通用)

public class CsvUtil {

    /**

    * 日志对象

    */

    private static final Logger LOGGER = LoggerFactory.getLogger(CsvUtil.class);

    /**

    * 解析csv文件并转成bean

    * @param file csv文件

    * @param clazz 类

    * @param 泛型

    * @return 泛型bean集合

    */

    public List getCsvData(MultipartFile file, Class clazz) {

        InputStreamReader in;

        try {

            in = new InputStreamReader(file.getInputStream(), "gbk");

        } catch (Exception e) {

            LOGGER.error(Constant.LOG_FOMAT_TYPE_TWO,

                    ErrorCode.FILE_LOAD_ERROR.getErrorCode(),

                    ErrorCode.FILE_LOAD_ERROR.getMessage(),

                    e.getMessage());

            throw BaseException.of(ErrorCode.FILE_LOAD_ERROR.of());

        }

        HeaderColumnNameMappingStrategy strategy = new HeaderColumnNameMappingStrategy<>();

        strategy.setType(clazz);

        CsvToBean csvToBean = new CsvToBeanBuilder(in)

                .withSeparator(',')

                .withQuoteChar('\'')

                .withMappingStrategy(strategy).build();

        return csvToBean.parse();

    }

}

3、csv文件对应的bean对象DataAndTypeCsv.java

public class DataAndTypeCsv {

    /**

    * 字典代码

    */

    @CsvBindByName(column = "code")

    private String code;

    /**

    * 简写

    */

    @CsvBindByName(column = "short_name")

    private String shortName;

    /**

    * 名称

    */

    @CsvBindByName(column = "name", required = true)  //是否可以为null 否

    private String name;

    /**

    * 拼音或英文描述

    */

    @CsvBindByName(column = "remark")

    private String remark;

    /**

    * 父类型id

    */

    @CsvBindByName(column = "parent_id")

    private Integer parentId;

    /**

    * 类型名称

    */

    @CsvBindByName(column = "type_name", required = true)  //是否可以为null 否

    private String typeName;

    /**

    * 类型id

    */

    @CsvBindByName(column = "type_id", required = true)  //是否可以为null 否

    private Integer typeId;


……

get、set方法

……

bean对象通过注解@CsvBindByName(column = “”, required = true) 映射csv文件的列名,并检查列数据是否为空,若是csv文件中该列存在值为空的情况会报错。

4、应用

controller层定义restful接口:

@Transactional(rollbackFor = BaseException.class)

@PostMapping

public Map batchInsert(MultipartFile file) {

    CsvUtil csvUtil = new CsvUtil();

    // 将csv文件内容转成bean

    List csvData = csvUtil.getCsvData(file, DataAndTypeCsv.class);

    ……

}

你可能感兴趣的:(【Java后端】解析csv文件并转成bean对象)