higherzjm 2017-12-14 05:18 采纳率: 33.3%
浏览 1336
已采纳

如何解决springmvc用jxl下载excel文件指定文件名的问题

如下是用jxl下载excel的代码代码:
@RequestMapping(value = "downexceljxl")
@ResponseBody
public void downexceljxl(HttpServletRequest request, HttpServletResponse response) {
try {
response.setContentType("application/vnd.ms-excel");
OutputStream os=response.getOutputStream();
WritableWorkbook workbook = Workbook.createWorkbook(os);
WritableSheet sheet = workbook.createSheet("First Sheet",0);
Label xuexiao = new Label(0,0,"学校");//列,行,值
sheet.addCell(xuexiao);
Label zhuanye = new Label(1,0,"专业");
sheet.addCell(zhuanye);
Label jingzhengli = new Label(2,0,"专业竞争力");
sheet.addCell(jingzhengli);

        Label qinghua = new Label(0,1,"清华大学");
        sheet.addCell(qinghua);
        Label jisuanji = new Label(1,1,"计算机专业");
        sheet.addCell(jisuanji);
        Label gao = new Label(2,1,"高");
        sheet.addCell(gao);
        workbook.write();
        workbook.close();
        response.setHeader("Content-disposition", "attachment;filename="+java.net.URLEncoder.encode("excel.xls", "UTF-8"));
        os.close();
    }catch (Exception e){
        e.printStackTrace();
    }
}

简单的springmvc代码,用jxl下载excel, 发现谷歌浏览器左下角下载下来的文件名是
downexceljxl.do,为什么不是excel.xls,可以像poi下载excel一样指定文件名吗,望技术牛人帮忙解答一下,谢谢

如下是poi下载excel的例子可以生成指定文件名(**希望能对需要的人带来帮助**),
  @RequestMapping(value = "downexcelpoi")
@ResponseBody
public void downexcelpoi(HttpServletRequest request, HttpServletResponse response)  {
    try {
        //response.reset();//重置输出流
        response.setContentType("application/vnd.ms-excel");

        final String sheetname = "sheet";
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFCellStyle style = workbook.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        HSSFFont font = workbook.createFont();
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        style.setFont(font);
        HSSFSheet sheet;
        sheet = workbook.createSheet(sheetname);

        HSSFRow row = sheet.createRow(0);
        HSSFCell cell = row.createCell(0);
        cell.setCellType(HSSFCell.CELL_TYPE_STRING);
        cell.setCellValue(new HSSFRichTextString("姓名"));
        cell = row.createCell(1);
        cell.setCellType(HSSFCell.CELL_TYPE_STRING);
        cell.setCellValue(new HSSFRichTextString("年龄"));
        for (int i=1;i<10;i++){
            row = sheet.createRow(i);
            cell = row.createCell(0);
            cell.setCellType(HSSFCell.CELL_TYPE_STRING);
            cell.setCellValue(new HSSFRichTextString("姓名"+i));
            cell = row.createCell(1);
            cell.setCellType(HSSFCell.CELL_TYPE_STRING);
            cell.setCellValue(new HSSFRichTextString("年龄"+i));
        }

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            workbook.write(bos);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            throw new Exception("导出失败");
        }
        byte[] ba = bos.toByteArray();
        bos.close();
        ByteArrayInputStream bis = new ByteArrayInputStream(ba);
        HSSFWorkbook xwb = (HSSFWorkbook) WorkbookFactory.create(bis);
        OutputStream out=response.getOutputStream();
        xwb.write(bos);
        response.setHeader("Content-disposition", "attachment;filename="+java.net.URLEncoder.encode("excel.xls", "UTF-8"));
    }catch (Exception e){
        e.printStackTrace();
    }
}
  • 写回答

4条回答 默认 最新

  • 途径的你 2017-12-14 06:09
    关注

    具体没太理解你的意思;但是springMVC用jxl导出excel就相当于jxl生成一个excel子啊你的某个目录下;再用下载的方式下载下来;生成的路径无所谓
    只要你能够读取到那个生成的excel就行
    这是我写的;希望能帮到你

    //导出
    @RequestMapping(value = "/dingdanExcel")
    public void downloadExcel(HttpServletRequest request,HttpServletResponse response, OrderQueryParms orderParam) throws IOException {
        //导出文件内容到到项目下
        String savePath=request.getSession().getServletContext().getRealPath("/webpage/device");
        String fileName="123.csv";
        ResultDto<DataGridVo<OrderDto>> queryOrder = orderService.queryOrder(orderParam);
        DingdanExcel.toDingdanExcel(queryOrder.getData().getList(),savePath+"/123.csv");
        //下载
        response.setContentType("application/vnd.ms-excel");
        File file = new File(savePath+System.getProperty("file.separator")+fileName);
        // 清空response
        response.reset();
        // 设置response的Header
        response.addHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("gbk"),"iso-8859-1"));  //转码之后下载的文件不会出现中文乱码
        response.addHeader("Content-Length", "" + file.length());
        try{
            //以流的形式下载文件
            InputStream fis = new BufferedInputStream(new FileInputStream(savePath+System.getProperty("file.separator")+fileName));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?