四. SpringBoot 实现 Csv文件的导入和导出
按照上一章节的模式,进行修改.
四.一 前端页面
<!doctype html> <!--注意:引入thymeleaf的名称空间--> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta http-equiv="Content-Type"content="text/html;charset=UTF-8"> <title>文件上传</title> <link rel="StyleSheet" href="webjars/bootstrap/3.4.1/css/bootstrap.css" type="text/css"> </head> <body class="container"> <p class="h1">导入文件</p> <form action="uploadCsv" method="post" enctype="multipart/form-data"> <div class="form-group"> <div class="custom-file"> <input type="file" class="custom-file-input" id="file" name="file"> <label class="file-label" for="file">选择文件</label> </div> </div> <button type="submit" class="btn btn-primary">上传</button> </form> <p class="h1">文件导出</p> <a href="downloadCsv">导出Csv文件</a> <script type="text/javascript" src="webjars/jquery/3.5.1/jquery.js"></script> <script type="text/javascript" src="webjars/bootstrap/3.4.1/js/bootstrap.js"></script> </body> </html>
四.二 Csv文件导入
四.二.一 导入逻辑处理
/** * 上传Excel文件,获取文件里面的内容. * @date 2021/11/4 21:12 * @author zk_yjl * @return */ @PostMapping("/uploadCsv") @ResponseBody public String uploadCsv(@RequestParam MultipartFile file) throws IOException { String realPath =uploadFilePath; File newFile = new File(realPath); // 如果文件夹不存在、则新建 if (!newFile.exists()){ newFile.mkdirs(); } // 上传 File uploadFile=new File(newFile, file.getOriginalFilename()); file.transferTo(uploadFile); //读取文件信息,主要是这一行 List<User> userList = CsvUtil.getReader().read(new FileReader(uploadFile), User.class); userList.forEach(n->{ log.info("输出内容:>>>"+n); //可以进行具体的业务操作 }); String uploadPath=realPath+"/"+file.getOriginalFilename(); return "上传文件成功,地址为:"+uploadPath; }
四.二.二 导入上传测试
将 header.csv 文件进行上传
后端控制台 将 文件中的内容打印出来
四.三 Csv文件导出
四.三.一 导出文件逻辑处理
/** * 下载Excel文件 * @date 2021/11/4 21:12 * @author zk_yjl * @return */ @GetMapping("/downloadCsv") @ResponseBody public void downloadCsv(HttpServletResponse response) throws IOException { //1. 通过传入的参数,和相关的业务代码逻辑处理,获取相应的数据. //2. 将数据进行转换,转换成 List<User> 的形式. List<User> dataList= DataUtil.createDataList("两个蝴蝶飞"); //将数据进行下载. // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman try { //响应类型 response.setContentType("multipart/form-data"); response.setCharacterEncoding("utf-8"); //进行下载 // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 String fileName = URLEncoder.encode("员工表", "UTF-8").replaceAll("\\+", "%20"); //响应的是 .csv 文件的后缀 response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".csv"); // 这里需要设置不关闭流 String filePath=uploadFilePath+File.separator+fileName+".csv"; File file=new File(filePath); if(!file.exists()){ file.createNewFile(); } //将数据,写入到 文件里面。 主要是这一行代码逻辑 CsvUtil.getWriter(file, Charset.forName("UTF-8")).writeBeans(dataList).close(); downloadFile(response,file); //将该文件删除 file.delete(); } catch (Exception e) { // 重置response response.reset(); response.setContentType("application/json"); response.setCharacterEncoding("utf-8"); Map<String, String> map = new HashMap<String, String>(); map.put("status", "failure"); map.put("message", "下载文件失败" + e.getMessage()); JSONObject jsonObject=new JSONObject();; response.getWriter().println(jsonObject.toString()); } } /** * @return boolean * @Description 下载文件 * @Param response,file **/ public boolean downloadFile(HttpServletResponse response, File file) { FileInputStream fileInputStream = null; BufferedInputStream bufferedInputStream = null; OutputStream os = null; try { fileInputStream = new FileInputStream(file); bufferedInputStream = new BufferedInputStream(fileInputStream); os = response.getOutputStream(); //MS产本头部需要插入BOM //如果不写入这几个字节,会导致用Excel打开时,中文显示乱码 os.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}); byte[] buffer = new byte[1024]; int i = bufferedInputStream.read(buffer); while (i != -1) { os.write(buffer, 0, i); i = bufferedInputStream.read(buffer); } return true; } catch (IOException e) { e.printStackTrace(); } finally { //关闭流 if (os != null) { try { os.flush(); os.close(); } catch (IOException e) { e.printStackTrace(); } } if (bufferedInputStream != null) { try { bufferedInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (fileInputStream != null) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } file.delete(); } return false; }
四.三.二 导出测试
点击导出文件,可以进行相应的下载.