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>