csv文件导入数据库 springboot+vue

csv文件导入数据库

1、导入依赖

<!-- 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>    
<version>1.4</version>
</dependency>

2、创建工具类

package com.example.csvdemo.tool;
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;


/**
 * csv 导入工具类
 * @author gdd
 */
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;
    }
}

3、编写controller接收

package com.example.csvdemo.controller;

import com.example.csvdemo.dao.OilMeterDao;
import com.example.csvdemo.domain.OilMeter;
import com.example.csvdemo.http.HttpResult;
import com.example.csvdemo.tool.CsvImportUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.time.LocalDateTime;
import java.util.List;

@RestController
@CrossOrigin(origins = "http://localhost:8080")
@RequestMapping("/oil")
public class OilManagement {

    @Autowired
    OilMeterDao oilMeterDao;
    @PostMapping("/csv/import")
    public HttpResult csvImport(@RequestParam MultipartFile file ){
        // 使用CSV工具类,生成file文件
        File csvFile = CsvImportUtil.uploadFile(file);
        // 将文件内容解析,存入List容器,List<String>为每一行内容的集合,2为CSV文件每行的总列数
        List<List<String>> lists = CsvImportUtil.readCSV(csvFile.getPath(), 2);
        if (lists.size()<1){
            return HttpResult.error("上传失败,文件内容为空或模板不对");
        }
        OilMeter oilMeter = new OilMeter();
        for(int i=0;i<lists.size();i++){
            //转换格式,时间必须是2022-10-04T00:06:12 类型
            oilMeter.setTime(LocalDateTime.parse(lists.get(i).get(0)));
            oilMeter.setOilQuantity(Float.valueOf(lists.get(i).get(1)));
            oilMeterDao.insertOil(oilMeter);
        }
        // 删 除文件
        csvFile.delete();
        return HttpResult.ok("文件上传成功");
    }
}

特别注意:
(1)List为每一行内容的集合,2为CSV文件每行的总列数
(2)csv 时间格式为2022-10-04T00:06:12 类型

附前端代码

<template>
  <div>
  <el-upload
      drag
      ref="upload"
      class="upload-demo"
      action="http://localhost:8999/oil/csv/import"
      :on-success='upLoadSuccess'
      :file-list="fileList"
  >
  <i class="el-icon-upload"></i>
  <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
  <div class="el-upload__tip" slot="tip">只能上传csv文件</div>
  </el-upload>
  </div>
</template>

<script>
export default {
  name: "dataUpload",
  data: function() {
    return {
      fileList:[],
    };
  },
  methods: {
    //成功后的回调函数 response响应 file显示文件列表提醒
    upLoadSuccess(response, file)
     {
      if (file != null) {
        if (response.code !=200) {
          console.log(response.code+response+file)
          // 响应码不为0时,标识后台上传文件出错啦
          file.status = 'error'
          let fileName = file.name
          file.name = file.name + '---上传失败'
          this.$message({
            type: 'error', message: fileName + '上传失败'
          })
        } else {
          file.name = file.name + '---上传成功'
        }
      }
     },
  },
}
</script>

<style scoped>

</style>

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
前端可以使用FileReader API将Excel文件读取为二进制数据,然后将其发送到后端Java服务器。后端可以使用Apache POI或JExcelAPI等Java库来解析Excel文件并将其转换为数据。以下是一个简单的代码示例: 前端代码: ``` <template> <div> <input type="file" @change="handleFileChange"> </div> </template> <script> export default { methods: { handleFileChange(event) { const file = event.target.files[0] const reader = new FileReader() reader.onload = () => { const data = reader.result this.uploadFile(data) } reader.readAsBinaryString(file) }, uploadFile(data) { // 将数据发送到后端Java服务器 } } } </script> ``` 后端代码: ``` @PostMapping("/upload") public List<List<String>> uploadExcel(@RequestParam("file") MultipartFile file) throws IOException { Workbook workbook = WorkbookFactory.create(file.getInputStream()); Sheet sheet = workbook.getSheetAt(0); List<List<String>> data = new ArrayList<>(); for (Row row : sheet) { List<String> rowData = new ArrayList<>(); for (Cell cell : row) { rowData.add(cell.toString()); } data.add(rowData); } return data; } ``` 这个示例使用Spring Boot和Apache POI来处理Excel文件。在这个例子中,我们将Excel文件作为MultipartFile对象上传到后端,并使用WorkbookFactory创建一个Workbook对象。然后,我们使用getSheetAt方法获取第一个Sheet对象,并使用for循环遍历每一行和每一列,将每个单元格的值添加到一个字符串列表中,并将该列表添加到数据列表中。最后,我们返回数据列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值