.xml文件依赖配置

  <!--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>

java-CSV工具类

@Data
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);
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 层java类

@Api(value = "后台考勤管理模块")  //Swagger测试文件
@CrossOrigin // 关于跨域
@RestController // 表明为Controller层
@RequestMapping("/admin/attendance") // url请求路径
public class AttendanceAdminController { @Autowired
AttendanceService attendanceService; @ApiOperation(value = "后台出勤信息Csv批量导入")
@PostMapping("/csv/import/{month}")
public R csvImport(
@ApiParam(name = "month",value = "月份",required = true)
@PathVariable String month, @ApiParam(name = "file", value = "Csv文件",required = true)
@RequestParam MultipartFile file ){
// 使用CSV工具类,生成file文件
File csvFile = CsvImportUtil.uploadFile(file);
// 将文件内容解析,存入List容器,List<String>为每一行内容的集合,20为CSV文件每行的总列数
List<List<String>> lists = CsvImportUtil.readCSV(csvFile.getPath(), 20); if (lists.size()<1){
return R.error().message("上传失败").data("errorMsg","文件内容为空或模板不对");
}
List<String> errorMsg = attendanceService.csvImport(month,lists);
// 删 除文件
csvFile.delete();
if (errorMsg.size()==0){
return R.ok().message("文件上传成功");
} return R.error().message("上传失败").data("errorMsg",errorMsg); }
}

后边service层和mapper层代码就不赘述了,因为功能和需求不同,写法就不一样,重点是CSV文件接收和解析,并将数据存入List容器使用。

Springboot 上传CSV文件并将数据存入数据库的更多相关文章

  1. Springboot(九).多文件上传下载文件(并将url存入数据库表中)

    一.   文件上传 这里我们使用request.getSession().getServletContext().getRealPath("/static")的方式来设置文件的存储 ...

  2. elementUI 上传.csv文件不成功 导入功能

    前言:element上传excel文件   导入功能 目标:点击导入,将excel表格的数据填充到表格. <el-upload class="upload-demo" :ac ...

  3. SpringBoot上传任意文件功能的实现

    一.pom文件依赖的添加 <dependencies> <dependency> <groupId>org.springframework.boot</gro ...

  4. CodeIgniter 无法上传 CSV 文件

    本篇文章由:http://xinpure.com/codeigniter-unable-to-upload-a-csv-file/ 解决 CodeIgniter 中使用 Upload 类无法上传 CS ...

  5. Django上传excel表格并将数据写入数据库

    前言: 最近公司领导要统计技术部门在各个业务条线花费的工时百分比,而 jira 当前的 Tempo 插件只能统计个人工时.于是就写了个报表工具,将 jira 中导出的个人工时excel表格 导入数据库 ...

  6. 【asp.net】asp.net实现上传Excel文件并读取数据

    #前台代码:使用服务端控件实现上传 <form id="form1" runat="server"> <div> <asp:Fil ...

  7. springboot上传下载文件

    在yml配置相关内容 spring: # mvc: throw-exception-if-no-handler-found: true #静态资源 static-path-pattern: /** r ...

  8. 解决springBoot上传大文件异常问题

    上传文件过大时的报错: org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size ex ...

  9. php 上传csv文件

    php fgetcsv()函数 定义和用法 fgetcsv() 函数从文件指针中读入一行并解析 CSV 字段. 与 fgets() 类似,不同的是 fgetcsv() 解析读入的行并找出 CSV 格式 ...

随机推荐

  1. Java标识符中常见的命名规则

    标识符:就是给类,接口,方法,变量等起名字.组成规则:A:英文字母大小写B:数字字符C:$和_注意事项:A:不能以数字开头B:不能使Java中的关键字C:Java语言严格区分大小写常见的命名规则:见名 ...

  2. pytorch实现MLP并在MNIST数据集上验证

    写在前面 由于MLP的实现框架已经非常完善,网上搜到的代码大都大同小异,而且MLP的实现是deeplearning学习过程中较为基础的一个实验.因此完全可以找一份源码以参考,重点在于照着源码手敲一遍, ...

  3. SQLI-LABS学习笔记(二)

    逼话少说,如有错误,烦请指出,谢谢 这两天生病,效率很低 第5关 打开页面 发现跟前几题不同,没有直接返回数据.. 加个单引号 You have an error in your SQL syntax ...

  4. Inno Setup: Ask for reboot after uninstall

     https://stackoverflow.com/questions/36497580/inno-setup-ask-for-reboot-after-uninstall   Use Uninst ...

  5. Qt5 escape spaces in path

    There are two possible ways. You can either use escaped quotes (inserting the string between quotes) ...

  6. css之Grid Layout详解

    css之Grid Layout详解 CSS Grid Layout擅长将页面划分为主要区域,或者在从HTML基元构建的控件的各个部分之间定义大小,位置和图层之间的关系. 与表格一样,网格布局使作者能够 ...

  7. 百度云BaaS体系揭秘,突破共识机制、单机计算和串行处理三大瓶颈

    区块链作为去中心化的技术机制拥有广泛的应用场景与市场潜能.自2017年爆发式增长后,区块链虽然已经进入平稳期,但仍然存在概念混淆.技术性能制约.智能合约制约.共识机制.网络建设等痛点.为了打破行业壁垒 ...

  8. falsk-web 表单

    web 表单 回顾 在上一章节中,我们定义了一个简单的模板,使用占位符来虚拟了暂未实现的部分,比如用户以及文章等. 在本章我们将要讲述应用程序的特性之一–表单,我们将会详细讨论如何使用 web 表单. ...

  9. 自定义Bootstrap样式弹出框

    最近做的一些功能需要用到Bootstrap,然而原来的系统并没有引入Bootstrap,为了新写的控件能够应用于老的页面,又不需要在老的页面上引入全套的Bootstrap文件决定写一个模仿Bootst ...

  10. 从零开始搭建口袋妖怪管理系统(4)-借助webpack4.6工程化项目(上)

    "手动是不可能手动的了,这辈子都不可能手动的了." 一.目标 上一章我们借助ngRoute,完成了口袋妖怪SPA系统的多模块导航开发,但是现在引用的东西越来越多,项目文件目录开始变 ...