上传文件、下载文件、数据导出excel表格整理模板

上传文件

思路:
1.设置上传的路径,上传名
2.在这个路径path上新建名为filename的文件 file
3.判断该文件的父目录是否存在,若不存在就新建一个
4.用.transferTo方法将文件上传到该目录中

 @RequestMapping(value="/register")
	 public String register(HttpServletRequest request,
			 @ModelAttribute User user,
			 Model model)throws Exception{
		// 接收参数username
		System.out.println("username = " +user.getUsername());
		// 如果文件不为空,写入上传路径
		if(!user.getHeadPortrait().isEmpty()){
			// 上传文件路径
			String path = request.getServletContext().getRealPath("/upload/");
			System.out.println("path = " + path);
			// 上传文件名
			String filename = user.getHeadPortrait().getOriginalFilename();
		    File filepath = new File(path,filename);
			// 判断路径是否存在,如果不存在就创建一个
	        if (!filepath.getParentFile().exists()) { 
	        	filepath.getParentFile().mkdirs();
	        }
	        // 将上传文件保存到一个目标文件当中
	        user.getHeadPortrait().transferTo(new File(path+File.separator+ filename));
	        // 将用户添加到model
	        model.addAttribute("user", user);
			System.out.println(request.getServletContext().getRealPath("/upload/"));
			return "userInfo";
		}else{
			return "error";
		}
	}

提交的表单类型必须是 enctype="multipart/form-data"

<form class="form-horizontal" action="register" enctype="multipart/form-data" method="post">
				
				
			</form>

注意:
如果不创建webapp文件夹和导入servlet的pom就会乱上传
如:C:\temp\Temp\tomcat-docbase.5582293453384459029.8080\upload\

	  <!-- 添加 servlet 依赖. -->
	  <dependency>
		  <groupId>javax.servlet</groupId>
		  <artifactId>javax.servlet-api</artifactId>
		  <scope>provided</scope>
	  </dependency>

若添加了就会上传到项目里
如:D:\IDEA\IDEAworkspace\fileuploadtest\src\main\webapp\upload
在这里插入图片描述

下载文件

思路:
1.给定下载的路径 path 和名称 filename
2.在这个路径path上找到这个名为filename的文件 file
3.最后通过BodyBuilder把这个文件file的内容下载下来

@RequestMapping(value="/download")
        public ResponseEntity<byte[]> download(HttpServletRequest request,
                                               @RequestParam("filename") String filename,
                                               @RequestHeader("User-Agent") String userAgent,
                                               Model model)throws Exception{
            // 下载文件路径
            String path = request.getServletContext().getRealPath(
                    "/upload/");
            // 构建File
            File file = new File(path+File.separator+ filename);



            // ok表示Http协议中的状态 200
            ResponseEntity.BodyBuilder builder = ResponseEntity.ok();
            // 内容长度
            builder.contentLength(file.length());
            // application/octet-stream : 二进制流数据(最常见的文件下载)。
            builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
            // 使用URLDecoder.decode对文件名进行解码
            filename = URLEncoder.encode(filename, "UTF-8");
            // 设置实际的响应文件名,告诉浏览器文件要用于【下载】、【保存】attachment 以附件形式
            // 不同的浏览器,处理方式不同,要根据浏览器版本进行区别判断
            if (userAgent.indexOf("MSIE") > 0) {
                // 如果是IE,只需要用UTF-8字符集进行URL编码即可
                builder.header("Content-Disposition", "attachment; filename=" + filename);
            } else {
                // 而FireFox、Chrome等浏览器,则需要说明编码的字符集
                // 注意filename后面有个*号,在UTF-8后面有两个单引号!
                builder.header("Content-Disposition", "attachment; filename*=UTF-8''" + filename);
            }
            return builder.body(FileUtils.readFileToByteArray(file));
        }

在这里插入图片描述
下载要导入的pom

 <!-- Apache Commons FileUpload组件依赖,
    由于不属于Spirng Boot,所以需要加上版本
    -->
      <!--用于上传下载文件-->
      <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.3.3</version>
      </dependency>
  </dependencies>

直接将数据导出到excel表格,但是不能指定路径

思路:
1.获取所有学生的数据
2.到服务层–>

新建一个XSSFWorkbook类 对象是wb
生成一个工作表
生成第一行
生成样式
循环把每列的属性设上去
循环设置每列应该输入的数据的值

3.设定导出的路径 path 和名称 filename (后台写死了)
4.在这个路径path上新建名为filename的文件 file
5.新建一个文件输出流FileOutputStream->fos 把 wb获取的以excel保存的学生信息 输出到file文件里,并关闭输出流

控制层

 @RequestMapping(value = "/exportExcel")
    public String exportExcel(HttpServletRequest request,
                              HttpServletResponse response,
                              Model model)
            throws Exception {

        //所有学生列表
        List<User> list=userService.findAllStudent1();
        //导出变成wb
        XSSFWorkbook wb = userService.export(list);



        //文件路径
        String filePath = "D:";//文件保存路径
        String fileName = "测试文件.xlsx";//文件名称
        //新建一个文件,给定路径
        File xlsFile = new File(filePath,fileName);
        //新建输出流把学生数据输出到本地,输出到xlsFile的那个文件中
        FileOutputStream fos = new FileOutputStream(xlsFile);//创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
        wb.write(fos);//将文档对象写入文件输出流
        fos.close();//关闭流



        System.out.println("导出完成");

        return "redirect:/student/student/1/3";
    }

服务层

 //导出excel表格
    //定义表头
    String[] excelHeader = {"学号","姓名", "分数", "班级"};

    public XSSFWorkbook export(List<User> list) {
        //这里需要说明一个问题:如果是 Offices 2007以前的Excel版本,new的对象是:**HSSFWorkbook** ,Offices 2007以后的Excel版本new的对象才是XSSFWorkbook
        XSSFWorkbook wb = new XSSFWorkbook();
        //生成一个工作表
        Sheet sheet = wb.createSheet("你好");
        //生成第一行
        Row row = sheet.createRow((int) 0);
        //生成单元格的样式style
        XSSFCellStyle style = wb.createCellStyle();
        //style.setAlignment(CellStyle.ALIGN_CENTER);

        for (int i = 0; i < excelHeader.length; i++) {
            //获取每一个单元格
            Cell cell = row.createCell(i);
            //给单元格赋值
            cell.setCellValue(excelHeader[i]);
            //设置单元格的样式
            cell.setCellStyle(style);
        }

        for (int i = 0; i < list.size(); i++) {
            //得到当前行数的下一行(row.getRowNum():得到当前行数)
            row = sheet.createRow(row.getRowNum() + 1);
            User user = list.get(i);
            //赋值
            if(!user.getId().isEmpty()){
                row.createCell(0).setCellValue(user.getId());
            }
            if(!user.getUsername().isEmpty()){
                row.createCell(1).setCellValue(user.getUsername());
            }
            if(user.getScore()!=null){
                row.createCell(2).setCellValue(user.getScore());
            }
            if(user.getTeam()!=null){
                row.createCell(3).setCellValue(user.getTeam());
            }

        }
        return wb;
    }

需要导入的pom

  <!-- POI提供API给Java程序对Microsoft Office格式档案读和写的功能。-->
      <!--可用于导出excel-->
      <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi-ooxml</artifactId>
          <version>3.17</version>
      </dependency>

直接将数据导出到excel表格,可以指定路径

思路:
1.获取所有学生的数据
2.到服务层–>

新建一个XSSFWorkbook类 对象是wb
生成一个工作表
生成第一行
生成样式
循环把每列的属性设上去
循环设置每列应该输入的数据的值

3.设定路径 path(把路径设置到项目的webapp的文件夹里) 和名称 filename
4.在这个路径path上找到这个名为filename的文件 file,如果没有就新建,有了就覆盖
5.新建一个文件输出流FileOutputStream->fos 把 wb获取的以excel保存的学生信息 输出到file文件里,并关闭输出流
6.最后通过BodyBuilder把这个文件file的内容从webapp的路径上下载下来

控制层

@RequestMapping(value = "/exportExcel")
        public ResponseEntity<byte[]> exportExcel(HttpServletRequest request,
                                                  @RequestHeader("User-Agent") String userAgent,
                                                  Model model)throws Exception {

            //所有学生列表
            List<User> list=userService.findAllStudent1();
            //导出变成wb
            XSSFWorkbook wb = userService.export(list);


            //新建一个文件保存excel,excel放的路径path
            String path = request.getServletContext().getRealPath(
                    "/upload/");
            String filename="学生成绩分班表.xlsx";
            File file = new File(path+File.separator+filename);


            //新建输出流把学生数据输出到path的路径上,输出到file的那个文件中
            FileOutputStream fos = new FileOutputStream(file);//创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
            wb.write(fos);//将文档对象写入文件输出流
            fos.close();//关闭流



            System.out.println("导出到webapp的upload文件夹完成");



            // ok表示Http协议中的状态 200
            ResponseEntity.BodyBuilder builder = ResponseEntity.ok();
            // 内容长度
            builder.contentLength(file.length());
            // application/octet-stream : 二进制流数据(最常见的文件下载)。
            builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
            // 使用URLDecoder.decode对文件名进行解码
            filename = URLEncoder.encode(filename, "UTF-8");
            // 设置实际的响应文件名,告诉浏览器文件要用于【下载】、【保存】attachment 以附件形式
            // 不同的浏览器,处理方式不同,要根据浏览器版本进行区别判断
            if (userAgent.indexOf("MSIE") > 0) {
                // 如果是IE,只需要用UTF-8字符集进行URL编码即可
                builder.header("Content-Disposition", "attachment; filename=" + filename);
            } else {
                // 而FireFox、Chrome等浏览器,则需要说明编码的字符集
                // 注意filename后面有个*号,在UTF-8后面有两个单引号!
                builder.header("Content-Disposition", "attachment; filename*=UTF-8''" + filename);
            }
            return builder.body(FileUtils.readFileToByteArray(file));
        }

服务层

//导出excel表格
    //定义表头
    String[] excelHeader = {"学号","姓名", "分数", "班级"};

    public XSSFWorkbook export(List<User> list) {
        //这里需要说明一个问题:如果是 Offices 2007以前的Excel版本,new的对象是:**HSSFWorkbook** ,Offices 2007以后的Excel版本new的对象才是XSSFWorkbook
        XSSFWorkbook wb = new XSSFWorkbook();
        //生成一个工作表
        Sheet sheet = wb.createSheet("你好");
        //生成第一行
        Row row = sheet.createRow((int) 0);
        //生成单元格的样式style
        XSSFCellStyle style = wb.createCellStyle();
        //style.setAlignment(CellStyle.ALIGN_CENTER);

        for (int i = 0; i < excelHeader.length; i++) {
            //获取每一个单元格
            Cell cell = row.createCell(i);
            //给单元格赋值
            cell.setCellValue(excelHeader[i]);
            //设置单元格的样式
            cell.setCellStyle(style);
        }

        for (int i = 0; i < list.size(); i++) {
            //得到当前行数的下一行(row.getRowNum():得到当前行数)
            row = sheet.createRow(row.getRowNum() + 1);
            User user = list.get(i);
            //赋值
            if(!user.getId().isEmpty()){
                row.createCell(0).setCellValue(user.getId());
            }
            if(!user.getUsername().isEmpty()){
                row.createCell(1).setCellValue(user.getUsername());
            }
            if(user.getScore()!=null){
                row.createCell(2).setCellValue(user.getScore());
            }
            if(user.getTeam()!=null){
                row.createCell(3).setCellValue(user.getTeam());
            }

        }
        return wb;
    }

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值