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

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

pom依赖:

<!-- csv文件解析依赖 -->

<dependency>

    <groupId>com.opencsv</groupId>

    <artifactId>opencsv</artifactId>

    <version>4.3.2</version>

</dependency>

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

public class CsvUtil {

    /**

    * 日志对象

    */

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

    /**

    * 解析csv文件并转成bean

    * @param file csv文件

    * @param clazz 类

    * @param <T> 泛型

    * @return 泛型bean集合

    */

    public <T> List<T> getCsvData(MultipartFile file, Class<T> 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<T> strategy = new HeaderColumnNameMappingStrategy<>();

        strategy.setType(clazz);

        CsvToBean<T> csvToBean = new CsvToBeanBuilder<T>(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<String, String> batchInsert(MultipartFile file) {

    CsvUtil csvUtil = new CsvUtil();

    // 将csv文件内容转成bean

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

    ……

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容