实现文件的下载功能(SpringMVC)

实现文件的下载功能,下载excel文件
两种实现方式
一:下载本地指定路径下的指定文件。

前端代码:

<a id="download1" type="hidden" style='color:red' href='填写后台指定coltroller-方法的地址'>&nbsp;&nbsp;下载数据</a>
  • 1

Controller层代码:

@RequestMapping("download")    
    @ResponseBody
    public ResponseEntity<byte[]> download() throws IOException {

        ResponseEntity<byte[]> a = null;
        try {
            a = tranddelService.downloadExcel();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  a;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

ServiceImpl实现类方法:

public ResponseEntity<byte[]> downloadExcel() throws Exception{
        //下载文件名称-下载后文件的名称+后缀
        String name = "数据.xls";
        //要下载文件的路径
        String route = Utils.getRequest().getSession().getServletContext().getRealPath("/")+"file/qs/error/error.xls";
        //根据路径创建file
        File file=new File(route);  //存放太那些好的excel的绝对路径
        HttpHeaders headers = new HttpHeaders();    
        String fileName=new String(name.getBytes("UTF-8"),"iso-8859-1");//为了解决中文名称乱码问题  
        headers.setContentDispositionFormData("attachment", fileName);   
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Tip:
Utils.getRequest()为获取request的方法,自己重写的。

二:设置模板路径,填充模板信息,下载。

设置模板下载和按照路径下载在实现层有区别

public ResponseEntity<byte[]> downloadExcel() throws Exception{
        ExcelPoi excelPoi = new ExcelPoi();
        /* 个入文件数据的业务
        Map<String , String> map = new HashMap<String, String>();
        //转date格式
        Date today = DateUtil.strToDate(date);
        //昨天的 yyyy-MM-dd
        String Yesterday = DateUtil.get4yMd(DateUtil.getNextDay1(today));
        //前天 yyyy-MM-dd
        String TWOYesterday = DateUtil.get4yMd(DateUtil.getNextDay2(today));
        map.put("Yesterday", Yesterday);
        map.put("TWOYesterday", TWOYesterday);
        List<Map<String, Object>> list = bankbilldataDao.getList("getBnoFile", map);*/
        //拼接写入excel文件的那个数据格式
        List<String[]> li = retExcelStr(list);
        String filePath = excelPoi.writer(date, li);
        String name = filePath.substring(filePath.length()-19,filePath.length());
        File file=new File(filePath);
        HttpHeaders headers = new HttpHeaders();    
        String fileName=new String(name.getBytes("UTF-8"),"iso-8859-1");//为了解决中文名称乱码问题  
        headers.setContentDispositionFormData("attachment", fileName);   
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),    
                headers, HttpStatus.CREATED);
}
    //方法的作用:写入文件提出的公用类,会调用公用类,需要传进去List<String[]>类型的数据写入。String[]数据的顺序就是一行的从左到右顺序
    public List<String[]> retExcelStr(List<Map<String, Object>> list){
        List<String[]> retList = new ArrayList<String[]>(); 
        StringBuilder stringBuilder = new StringBuilder();
        if(list.size() > 0){ 
            for (int i = 0;i < list.size();i++){
                String bno = (String) list.get(i).get("BNO");
                stringBuilder.append(bno).append(",");
            }
            String[] retStrArray = stringBuilder.substring(0,stringBuilder.length()-1).split(",");
            retList.add(retStrArray);
        }
        return retList;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

Tip:
excelPoi.writer(date, li);

public  String writer(String date,List<String[]> list) {  
          try {
                Workbook wb = null;  
                wb = new XSSFWorkbook( new FileInputStream(getRequest().getSession().getServletContext().getRealPath("/")+"mode/qsMode.xlsx"));  
                Sheet sheet1=wb.getSheetAt(0);
                if(list.size()>0){
                     for(int i=0;i<list.get(0).length;i++){
                        Row row = (Row) sheet1.createRow(i+1);  
                         Cell cell = row.createCell(0);  
                         cell.setCellValue(list.get(0)[i]);  
                    }
                }
                new File(getRequest().getSession().getServletContext().getRealPath("/")+"file/qs/"+new SimpleDateFormat("yyyyMMdd").format(new Date())).mkdirs();
                f = getRequest().getSession().getServletContext().getRealPath("/")+"file/qs/"+new SimpleDateFormat("yyyyMMdd").format(new Date())+"/"+date+"商编文件.xlsx";
                OutputStream stream= new FileOutputStream(f);
                wb.write(stream);  
                stream.close();  
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }  
        return f;
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

模板为:qsMode.xlsx文件,只有第一列有头信息,只写入第一列的值

猜你喜欢

转载自blog.csdn.net/qq_16713463/article/details/79634631