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

2024-06-04 4261阅读

目录

一:pom依赖

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

三:Web端进行测试

四:拓展使用


一:pom依赖

 
            org.apache.poi
            poi
            4.1.2
        
        
            org.apache.poi
            poi-ooxml
            4.1.2
        
        
            org.apache.poi
            poi-ooxml-schemas
            4.1.2
        
        
        
            org.apache.commons
            commons-compress
            1.21
        
        
            org.apache.poi
            ooxml-schemas
            1.4
        
        
        
            com.alibaba
            easyexcel
            3.1.1
        
        
        
            org.slf4j
            slf4j-log4j12
            1.7.26
            test
        
        
            org.apache.commons
            commons-csv
            1.9.0
        
        
            com.opencsv
            opencsv
            5.6 
        
        
        
            com.alibaba
            fastjson
            1.2.73
        

二:检查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 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 userList = new CopyOnWriteArrayList();
            try {
                EasyExcel.read(file.getInputStream(), User.class,
                                new PageReadListener(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 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 getStudents() {
        // 创建数据列表
        List 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 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("文件导出成功");
    }

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]