SpringBoot整合easyExcel实现CSV格式文件的导入导出

 更新时间:2024年02月25日 14:15:07   作者:夏林夕  
这篇文章主要为大家详细介绍了SpringBoot整合easyExcel实现CSV格式文件的导入导出,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以参考下

一:pom依赖

 <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.2</version>
        </dependency>
        <!-- java.lang.NoClassDefFoundError: org/apache/commons/compress/utils/Lists -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-compress</artifactId>
            <version>1.21</version>
        </dependency>
 
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>ooxml-schemas</artifactId>
            <version>1.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.1</version>
        </dependency>
 
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.26</version>
            <scope>test</scope>
        </dependency>
 
 
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-csv</artifactId>
            <version>1.9.0</version>
        </dependency>
 
        <dependency>
            <groupId>com.opencsv</groupId>
            <artifactId>opencsv</artifactId>
            <version>5.6</version> <!-- 使用最新版本 -->
        </dependency>
 
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.73</version>
        </dependency>

二:检查CSV内容格式的工具类

checkCscUtils.java

package com.example.juc.test.Controller;
 
/**
 * @Author 
 * @Date Created in  2023/12/5 17:32
 * @DESCRIPTION:  判断csv 文件内容是否正确
 * @Version V1.0
 */
 
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.springframework.web.multipart.MultipartFile;
 
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
 
public class checkCscUtils {
    public static boolean isCsvFormatValid(MultipartFile file) {
        try (InputStream inputStream = file.getInputStream();
             BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
             CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT.
                     withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim())) {
            // 获取标题
            List<String> headers = parser.getHeaderNames();
            int numberOfColumns = headers.size();
 
            for (CSVRecord record : parser) {
                // 检查列数是否一致
                if (record.size() != numberOfColumns) {
                    return false;
                }
                // 这里可以添加更多的检查,例如检查数据类型等
            }
        } catch (IOException e) {
            e.printStackTrace();
            // 如果发生异常,认为格式不正确
            return false;
        }
        // 所有检查都通过,则认为格式正确
        return true;
    }
}

三:Web端进行测试

 
 
/**
 * @Author 
 * @Date Created in  2023/11/2 10:59
 * @DESCRIPTION: 读取csv格式的文件数据
 * @Version V1.0
 */
 
@RestController
@RequestMapping("/api/csv")
public class CsvController {
 
    /**
     * 读取传入的csv  文本的内容可以存入数据库
     *
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public ResponseEntity<?> uploadCsv(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return ResponseEntity.badRequest().body("文件不能为空");
        }
        //判断csv文件类型是不是csv文件
        String contentType = file.getContentType();
        String originalFilename = file.getOriginalFilename();
        boolean isCsv = ("text/csv".equals(contentType))
                || (originalFilename != null && originalFilename.endsWith(".csv"));
        if (!isCsv) {
            return ResponseEntity.badRequest().body("文件必须是CSV格式");
        }
        //判断csv文件格式内容是否有误?
        boolean csvFormatValid = checkCscUtils.isCsvFormatValid(file);
        if (csvFormatValid) {
            List<User> userList = new CopyOnWriteArrayList<>();
            try {
                EasyExcel.read(file.getInputStream(), User.class,
                                new PageReadListener<User>(userList::addAll))
                        .excelType(ExcelTypeEnum.CSV)
                        .sheet()
                        .doRead();
            } catch (IOException e) {
                e.printStackTrace();
                return ResponseEntity.status(500).body("文件读取出错");
            }
 
            // 处理userList...
 
            return ResponseEntity.ok(userList);
        }
        return ResponseEntity.status(500).body("文件格式出错");
    }
 
    /**
     * 使用 easyExcel  导出一个csv 格式,但是版本可能与poi 版本冲突
     *
     * @param response
     * @return
     * @throws IOException
     */
    @GetMapping("/exportCsv")
    public ResponseEntity<?> exportCsv(HttpServletResponse response) throws IOException {
        // 设置响应头
        response.setContentType("application/csv");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode("export_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))
                + ".csv");
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
 
        List<Student> userList = getStudents();
 
        // 使用EasyExcel导出CSV文件response.getOutputStream()
        try {
            EasyExcel.write(response.getOutputStream(), Student.class)
                    .excelType(ExcelTypeEnum.CSV)
                    .sheet("我的学生")
                    .doWrite(userList);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return ResponseEntity.status(200).body("文件导出成功");
    }
 
 
 
 
 
 
    private static List<Student> getStudents() {
        // 创建数据列表
        List<Student> userList = new CopyOnWriteArrayList<>();
        // 添加数据(示例)
        userList.add(new Student("1", "John Doe", "25"));
        userList.add(new Student("2", "Jane Smith", "30"));
        userList.add(new Student("3", "Mike Johnson", "35"));
        return userList;
    }
}

四:拓展使用

使用hutool工具类来进行导出功能

    /**
     * 使用 hutool 工具类生成一个csv格式的文档
     *
     * @param response
     * @return
     * @throws IOException
     */
    @GetMapping("/exportCsvHutool")
    public ResponseEntity<?> exportCsvHutool(HttpServletResponse response) throws IOException {
        List<Student> userList = getStudents();
        // 业务处理完成把数据写到流中 响应到页面上
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" +
                new String("exportCsvFileTest.csv".getBytes(StandardCharsets.UTF_8), "ISO8859-1"));
        response.setContentType(String.valueOf(StandardCharsets.UTF_8));
        CsvWriter csvWriter = CsvUtil.getWriter(response.getWriter());
        csvWriter.writeBeans(userList);
        csvWriter.close();
 
        return ResponseEntity.status(200).body("文件导出成功");
    }

以上就是SpringBoot整合easyExcel实现CSV格式文件的导入导出的详细内容,更多关于SpringBoot easyExcel CSV导入导出的资料请关注脚本之家其它相关文章!

相关文章

  • JRebel2023.3 插件使用及安装步骤详解

    JRebel2023.3 插件使用及安装步骤详解

    JRebel是一款JVM插件,它使得Java代码修改后不用重启系统,立即生效,IDEA上原生是不支持热部署的,一般更新了 Java 文件后要手动重启 Tomcat 服务器,才能生效,浪费时间浪费生命,目前对于idea热部署最好的解决方案就是安装JRebel插件,本文分步骤介绍的非常详细,一起看看吧
    2023-08-08
  • SSM Mapper文件查询出返回数据查不到个别字段的问题

    SSM Mapper文件查询出返回数据查不到个别字段的问题

    这篇文章主要介绍了SSM Mapper文件查询出返回数据查不到个别字段的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 详解使用Spring MVC统一异常处理实战

    详解使用Spring MVC统一异常处理实战

    本篇文章主要介绍了详解使用Spring MVC统一异常处理实战,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Java9 Stream Collectors新增功能(小结)

    Java9 Stream Collectors新增功能(小结)

    这篇文章主要介绍了Java9 Stream Collectors新增功能(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Java和JVM的重载识别,重写方法是怎样进行的

    Java和JVM的重载识别,重写方法是怎样进行的

    这篇文章主要介绍了Java和JVM的重载识别,重写方法是怎样进行的,违章围绕了Java和JVM的重载识别,重写方法展开相关资料,需要的小伙伴可以参考一下,希望对你的工作或学习有所帮助
    2022-01-01
  • java8 forEach结合Lambda表达式遍历 List操作

    java8 forEach结合Lambda表达式遍历 List操作

    这篇文章主要介绍了java8 forEach结合Lambda表达式遍历 List操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 一文让你彻底明白Java中的值传递和引用传递

    一文让你彻底明白Java中的值传递和引用传递

    这篇文章主要给大家介绍了关于Java中值传递和引用传递的相关资料,值传递是指在调用函数时将实际参数复制一份传递到函数中,引用传递是指在调用函数时将实际参数的引用直接传递到函数中,需要的朋友可以参考下
    2023-10-10
  • Java数组模拟优先级队列数据结构的实例

    Java数组模拟优先级队列数据结构的实例

    这篇文章主要介绍了Java数组模拟优先级队列数据结构的实例,优先级队列中的元素会被设置优先权,本文的例子借助了Java中的TreeSet和TreeMap,需要的朋友可以参考下
    2016-04-04
  • jstorm源码解析之bolt异常处理方法

    jstorm源码解析之bolt异常处理方法

    下面小编就为大家带来一篇jstorm源码解析之bolt异常处理方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • JAVA 根据Url把多文件打包成ZIP下载实例

    JAVA 根据Url把多文件打包成ZIP下载实例

    这篇文章主要介绍了JAVA 根据Url把多文件打包成ZIP下载的相关资料,需要的朋友可以参考下
    2017-08-08

最新评论