springboot 实现csv导入导出功能。

maven依赖

        <!--csv依赖 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-csv</artifactId>
            <version>1.7</version>
        </dependency>
        <!--上传工具依赖        -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
        </dependency>

导出工具类 CSVUtils

package com.ruoyi.common.core.utils.poi;

import com.ruoyi.common.core.utils.file.FileUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @ClassName CSVUtils * @Description TODO
 * @Author lgn
 * @Date 16:18 2022/9/13
 * @Version 1.0
 **/
public class CSVUtils {
    /**
     * CSV文件列分隔符
     */
    private static final String CSV_COLUMN_SEPARATOR = ",";

    /**
     * CSV文件列分隔符
     */
    private static final String CSV_RN = "\r\n";


    /**
     *
     * @param dataList 集合数据
     * @param colNames 表头部数据
     * @param mapKey 查找的对应数据
     * @param os 返回结果
     */
    public static void doExport(List<Map<String, Object>> dataList, String colNames, String mapKey, OutputStream os) throws IOException {
        try {
            StringBuffer buf = new StringBuffer();

            String[] colNamesArr = null;
            String[] mapKeyArr = null;

            colNamesArr = colNames.split(",");
            mapKeyArr = mapKey.split(",");

            // 完成数据csv文件的封装
            // 输出列头
            for (String aColNamesArr : colNamesArr) {
                buf.append(aColNamesArr).append(CSV_COLUMN_SEPARATOR);
            }
            buf.append(CSV_RN);

            if (null != dataList) { // 输出数据
                for (Map<String, Object> aDataList : dataList) {
                    for (String aMapKeyArr : mapKeyArr) {
                        buf.append(aDataList.get(aMapKeyArr)).append(CSV_COLUMN_SEPARATOR);
                    }
                    buf.append(CSV_RN);
                }
            }
            // 写出响应
            os.write(buf.toString().getBytes("GBK"));
            os.flush();
        } catch (Exception e) {
            throw e;
        } finally {
            if (os != null) {
                try {
                    os.close();
                }
                catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }

    /**
     * setHeader
     */
    public static void responseSetProperties(HttpServletRequest request, String fileName, HttpServletResponse response) throws UnsupportedEncodingException {
        // 设置文件后缀
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String fn = fileName + sdf.format(new Date()) + ".csv";
        // 读取字符编码
        String utf = "UTF-8";

        // 设置响应
        response.setContentType("application/ms-txt.numberformat:@");
        response.setCharacterEncoding(utf);
        response.setHeader("Pragma", "public");
        response.setHeader("Cache-Control", "max-age=30");
        //response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fn, utf));
        response.setHeader("Content-Disposition",
                "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, fn));//重新生成的新文件的名字
    }

}

导入工具类

package com.ruoyi.common.core.utils.poi;
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.net.URL;
import java.util.ArrayList;
import java.util.List;
/**
 * @ClassName CsvImportUtil * @Description TODO
 * @Author lgn
 * @Date 17:09 2022/9/13
 * @Version 1.0
 **/
public class CsvImportUtil {

    //上传文件的路径
    private final static URL PATH = Thread.currentThread().getContextClassLoader().getResource("");


    /**
     * @return File  一般文件类型
     * @Description 上传文件的文件类型
     * @Param multipartFile
     **/
    public static File uploadFile(MultipartFile multipartFile) {
        // 获 取上传 路径
        String path = PATH.getPath() + multipartFile.getOriginalFilename();
        try {
            // 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
            File file = new File(path);
            // 此抽象路径名表示的文件或目录是否存在
            if (!file.getParentFile().exists()) {
                // 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
                file.getParentFile().mkdirs();
            }
            // 转换为一般file 文件
            multipartFile.transferTo(file);

            return file;
        } catch (IOException e) {

            e.printStackTrace();
            return null;
        }

    }

    /**
     * @return List<List<String>>
     * @Description 读取CSV文件的内容(不含表头)
     * @Param filePath 文件存储路径,colNum 列数
     **/
    public static List<List<String>> readCSV(String filePath, int colNum) {
        BufferedReader bufferedReader = null;
        InputStreamReader inputStreamReader = null;
        FileInputStream fileInputStream = null;

        try {
            fileInputStream = new FileInputStream(filePath);
            inputStreamReader = new InputStreamReader(fileInputStream, "GBK");
            bufferedReader = new BufferedReader(inputStreamReader);

            CSVParser parser = CSVFormat.DEFAULT.parse(bufferedReader);


            //  表内容集合,外层 List为行的集合,内层 List为字段集合
            List<List<String>> values = new ArrayList<>();


            int rowIndex = 0;
            // 读取文件每行内容

            for (CSVRecord record : parser.getRecords()) {
                //  跳过表头
                if (rowIndex == 0) {
                    rowIndex++;
                    continue;
                }
                // 判断下角标是否越界
                if (colNum > record.size()) {
                    // 返回空集合
                    return values;
                }
                //  每行的内容
                List<String> value = new ArrayList<>();
                for (int i = 0; i < colNum; i++) {
                    value.add(record.get(i));
                }
                values.add(value);
                rowIndex++;
            }
            return values;
        } catch (IOException e) {
            e.printStackTrace();

        } finally {
            //关闭流
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (inputStreamReader != null) {
                try {
                    inputStreamReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}

Controller

/**
 * 导出资产管理列表"
 */
@ApiOperation(value = "导出资产管理列表", notes = "导出资产管理列表", httpMethod = "POST")
@Log(title = "导出资产管理列表", businessType = BusinessType.EXPORT)
@PostMapping("/exportAssetsManageList")
public void exportAssetsManageList(HttpServletResponse response, HttpServletRequest request, LgsAssetsManage lgsAssetsManage)
{
    List<Map<String,Object>> list = lgsAssetsManagementService.getAssetsManageMapList(lgsAssetsManage);
    if (list.size() == 0) {
        AjaxResult ajax = AjaxResult.error(503,"无数据导出");
    }

    String sTitle = "owner,systemName,systemNumber,instrumentNum,terminalNum,completionTime,operationDays,updatedBy,updatedTime";
    String fName = "AssetsManage_";
    String mapKey = "owner,systemName,systemNumber,instrumentNum,terminalNum,completionTime,operationDays,updatedBy,updatedTime";

    try (final OutputStream os = response.getOutputStream()) {
        CSVUtils.responseSetProperties(request,fName, response);
        CSVUtils.doExport(list, sTitle, mapKey, os);
    } catch (Exception e) {
    }
}

@ApiOperation(value = "导入资产管理", notes = "导入资产管理", httpMethod = "POST")
@Log(title = "导入资产管理", businessType = BusinessType.IMPORT)
@PostMapping(value ="csvImportAssetsManage", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public void csvImportAssetsManage(@RequestPart("file") MultipartFile file)
{
    // 使用CSV工具类,生成file文件
    File csvFile = CsvImportUtil.uploadFile(file);
    // 将文件内容解析,存入List容器,List<String>为每一行内容的集合,6为CSV文件每行的总列数
    List<List<String>> lists = CsvImportUtil.readCSV(csvFile.getPath(), 6);

    lists.stream().forEach(info -> {
        // 处理业务逻辑代码
        System.out.println("info:"+info);
    });

}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用POI库实现Excel文件的导入导出,也可以使用CSV文件进行导入导出。在Spring Boot中,可以使用Spring Batch来实现大批量数据的导入导出。另外,也可以使用第三方库,比如EasyExcel等来简化导入导出的操作。 ### 回答2: Spring Boot 提供了丰富的功能和工具来实现导入导出数据的功能。在导入数据方面,我们可以使用 Spring Boot 提供的 Apache POI 或 EasyExcel 等库来解析 Excel 文件,并将解析后的数据存储到数据库中。 我们首先需要在项目的依赖中添加 Apache POI 或 EasyExcel 相关的库。然后,我们可以创建一个控制器类来处理上传文件的请求,并在该类中编写逻辑来解析 Excel 文件。 在导入文件的控制器方法中,我们可以使用 POI 或 EasyExcel 提供的 API 来打开 Excel 文件,逐行读取数据,并将数据插入到数据库中。在处理 Excel 文件的过程中,我们还可以根据业务需求进行一些数据校验或转换操作。 除了 Excel 文件外,Spring Boot 还支持导入其他格式的文件,比如 CSV 文件。对于导入 CSV 文件,我们可以使用 Spring Boot 提供的 CSV 库或 OpenCSV 库来解析文件,并将解析后的数据存储到数据库中。 在导出数据方面,Spring Boot 内置了 Thymeleaf 和 FreeMarker 等模板引擎,我们可以使用这些模板引擎来生成导出的文件,比如 Excel 或 PDF 文件。 我们可以创建一个控制器类来处理导出数据的请求,并在该类中编写逻辑来生成导出的文件。在生成文件的控制器方法中,我们可以使用模板引擎来渲染导出数据的模板,并将渲染后的结果写入到文件中。 在导出文件的过程中,我们还可以通过配置相关的响应头信息,来指定文件的类型、名称和下载方式等。这样用户在访问导出链接时,会自动下载生成的文件。 总而言之,Spring Boot 提供了丰富的工具和库来实现数据的导入导出。我们可以根据需要选择合适的库和技术来处理文件,比如 Apache POI 或 EasyExcel 等用于导入 Excel 文件,Thymeleaf 或 FreeMarker 等用于导出文件,并结合控制器和服务层逻辑编写实现。 ### 回答3: Spring Boot是一个开源的Java开发框架,可以快速搭建应用程序。对于实现导入导出功能,我们可以使用Spring Boot结合相关的库来实现。 首先,我们需要在pom.xml文件中添加相关的依赖。对于导入导出功能,常用的库有Apache POI、EasyExcel等。你可以根据具体需求选择合适的库。 然后,我们可以创建一个Controller类来处理导入导出的请求。对于导出功能,我们可以在Controller中定义一个接口,当用户请求导出时,调用相关的库来生成Excel文件并返回给用户下载。 对于导入功能,我们可以在Controller中定义另一个接口,用户可以通过该接口上传Excel文件。然后,我们可以使用相关的库来读取Excel文件中的数据,并进行处理。例如,我们可以将数据存储到数据库中,或者对数据进行一定的业务操作。 在处理导入导出功能时,我们还需要注意处理异常情况。例如,对于导入功能,我们需要检查上传文件的格式和内容是否符合要求。对于导出功能,我们需要确保生成的Excel文件能够正确地下载到用户的电脑上。 在实现导入导出功能时,我们还可以结合其他的Spring Boot特性。例如,我们可以使用Spring Security来进行权限控制,只允许有权限的用户进行导入导出操作。我们也可以使用Spring AOP来实现日志记录功能,方便后续的排查和调试。 总之,使用Spring Boot结合相关的库,我们可以方便地实现导入导出功能。通过合理的结构设计和细致的异常处理,可以保证导入导出功能的稳定性和安全性。同时,我们还可以利用其他Spring Boot的特性来增强导入导出功能的实用性和扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值