`
asjava
  • 浏览: 136986 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

Spring实现的动态文件下载(以Excel导出为例)

 
阅读更多

根据请求动态产生文件。以导出Excel文件为例。页面查询结果POST提交给服务器,生成Excel文件,返回浏览器弹出下载框。
方法一:产生临时文件的方式(ajax提交)
由于ajax的返回类型(dataType)只有xml、text、json、html等类型,没有“流”类型.所以不能通过将Excel文件写入Response对象的方式下载。
只能在服务器的临时目录生成目标Excel文件,再将其地址返回给浏览器,实现下载。
前端js代码
        $.ajax({
            type : 'POST',
            url : “/download”, // 处理请求的url
            data : "postInfo=" + JSON.stringify(js), // 提交给服务器的数据
            async : false,
            success : function(data){
                window.open(baseURL + data); // baseURL是工程名,例:/project1
            }
        });

后台控制器代码:
    /**
     * 根据JSON格式的字符串生成xlsx文件
     * @param printWriter
     * @param req
     * @throws IOException
     */
    @RequestMapping(value = "/download", method = RequestMethod.POST)
    public void saveAsXlsx(HttpServletRequest req, PrintWriter pw) {
        // 使用apache的POI,根据提交过来的数据(从HttpServletRequest中取得)
        // 生成目标Excel文件,放在"工程目录/WebContent/WEB-INF/upload"下
        // 下面直接返回地址,实际项目中要动态产生地址
        pw.write("/tmp/filename.xlsx");
        pw.flush();
        pw.close();

    }

spring 的配置文件要加入静态文件访问权限:
<mvc:resources location="/WEB-INF/tmp/" mapping="/tmp/**"/>

工作原理:ajax提交POST请求到控制器“saveAsXlsx”方法生成目标Excel文件,PrintWriter对象返回文件路径,客户端判断服务器返回状态为success,于是调用success指向函数,执行window.open(baseURL + data),提交资源请求“工程/tmp/filename.xlsx”,spring 查看配置文件发现配置,<mvc:resources location="/WEB-INF/tmp/" mapping="/tmp/**"/>,直接将请求资源返回浏览器,浏览器根据设置判断是打开,还是下载。

第二种方法:用spring framework的AbstractXlsxStreamingView类实现(指定结果集)导出为Excel(xlsx)
先百度,找到AbstractExcelView类,但帮助文件里已经标上了Deprecated,推荐Spring 4.2以后使用 AbstractXlsView and its AbstractXlsxView and AbstractXlsxStreamingView。

前端js代码
    function saveDataAs() {
        var js={};    // 待传向后台的JSON对象
        js.filenameSaveAs=$("#spanFilenameSaveAs").html() + "产量统计"; // 待保存的文件名
       
        // 根据具体业务准备待提交的数据,此部分代码根据实际添加...
        var postData = JSON.stringify(js);    // 准备好提交的数据
        var urlGo = baseURL + "/index/saveAsXlsx";
        download(urlGo,postData);
    }
   
    /**
     * 代码生成表单(实际提交请求由此表单发起),提交下载请求
     * @param url
     * @param postData
     */
     function download(url,postData) {
        var form = $("<form>");       // 定义一个form表单
        form.attr('style', 'display:none');   // 在form表单中添加查询参数
        form.attr('target', '');
        form.attr('method', 'post');// 使用POST方式提交
        form.attr('action', url);

        var input1 = $('<input>');
        input1.attr('type', 'hidden');
        input1.attr('name', 'postInfo');
        input1.attr('value', postData);
        $('body').append(form);  //将表单放置在web中
        form.append(input1);       //将查询参数控件添加到表单上
        form.submit();
     }

后台定义Excel文件处理类,给spring返回用:
// 导入相应包
...
import org.springframework.web.servlet.view.document.AbstractXlsxStreamingView;

public class MyXlsxView extends AbstractXlsxStreamingView {

    @Override
    protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest req,
            HttpServletResponse resp) throws Exception {
        // 取前台提交的数据
        String postInfo = req.getParameter("postInfo");
        JSONObject jsPI = new JSONObject(postInfo);
        // 标题栏
        JSONArray jsT = jsPI.getJSONArray("thead");
        // 文件名
        String filename = jsPI.getString("filenameSaveAs") + ".xlsx"; // 取下载时客户端Excel的名称
        SXSSFWorkbook sxssWb = (SXSSFWorkbook)workbook;
        Sheet sheet = sxssWb.createSheet("sheet1");
        int iniRow = 0;
        Row row = sheet.createRow((short) iniRow);
        Cell cell = null;
        // 添加表格标题行
        for(int i = iniRow; i < jsT.length(); ++i){
            cell = row.createCell(i);
            cell.setCellType(SXSSFCell.CELL_TYPE_STRING);
            cell.setCellValue(jsT.getString(i));
        }
        ++iniRow; // 标题行完成,下移一行
       
        // 商品内容
        JSONArray sc = jsPI.getJSONArray("pdInfo");
        // 商品的一行
        JSONObject jsL = null;
        // 添加表格内容
        for(int pdRow = iniRow; pdRow < sc.length() + iniRow; ++pdRow){
            row = sheet.createRow(pdRow);    // 在指定行创建一个Row对象
            jsL = sc.getJSONObject(pdRow-iniRow);
            int col = 0;
            cell = row.createCell(col++);
            cell.setCellType(SXSSFCell.CELL_TYPE_STRING);
            cell.setCellValue(jsL.getString("barCode"));
            cell = row.createCell(col++);
            cell.setCellValue(jsL.getString("styleCode"));
            ...
           
        }

        //处理中文文件名
        String reqCharset = req.getCharacterEncoding(); /*根据request的getCharacterEncoding得到请求时的编码*/ 
        filename = new String(filename.getBytes(reqCharset), "ISO8859-1");  
        resp.setCharacterEncoding(reqCharset);
        // 若想下载时自动填好文件名,则需要设置响应头的"Content-disposition"
        resp.setHeader("Content-disposition", "attachment;filename=" + filename);
    }
}

后台控制器代码:
    /**
     * 根据JSON格式的字符串生成xlsx文件
     */
    @RequestMapping(value = "index/saveAsXlsx", method = RequestMethod.POST)
    public ModelAndView saveAsXlsx(ModelMap model){
       
        MyXlsxView ve = new MyXlsxView();    
        return new ModelAndView(ve, model);
    }

关于抽象类AbstractXlsxStreamingView的用法, 这个类要求用户继承此类,并实现buildExcelDocument()方法, 在此方法中构建待返回的Excel文件, 如果希望客户端保存文件具有默认的文件名, 则需设置响应头的"Content-disposition"属性(对应代码:resp.setHeader("Content-disposition", "attachment;filename=" + filename);),如果不设置则spring会使用客户端提交请求时的url(本例中提交的是baseURL + "/index/saveAsXlsx", 则spring会截取后面的saveAsXlsx作为默认文件名).

当控制器返回时(return new ModelAndView(ve, model);), Spring负责调用,用户类的buildExcelDocument()方法, 把此方法参数workbook所指向的实际对象返回给浏览器,供用户下载.

第一种方法的优点是逻辑容易理解,缺点是生成了临时文件,之后还要处理(不然就会越来越多),程序不够优雅.
第二种方法的优点是程序组织非常优雅,控制器代码量很少,缺点(其实也不算真正的缺点)是需要了解AbstractXlsxStreamingView的工作原理.

分享到:
评论
1 楼 18335864773 2017-11-22  
pageoffice 插件可以实现文档的在线打开编辑保存.同时下载也是非常简单的,就调用一个另存的方法就可以.

相关推荐

    使用Springboot实现excel的导入导出

    在Spring Boot中实现Excel的导入导出可以通过POI库来实现,POI是一个开源的Java库,用于处理Microsoft Office格式文件,包括Excel。一个简单的示例,演示如何在Spring Boot项目中使用POI来实现Excel的导入导出功能。...

    Spring Boot中实现列表数据导出为Excel文件

    ### Spring Boot中实现列表数据导出为Excel文件 #### 一、引言 在现代企业应用开发中,数据导出是一项常见的需求。特别是在基于Spring Boot的项目中,开发者经常需要将数据库中的数据导出到Excel文件,以便进行...

    基于spring的以excel模板的导入导出

    本篇文章将深入探讨如何基于Spring实现基于Excel模板的导入导出功能。 首先,我们来理解“基于excel模板的导入导出”这个概念。这意味着系统允许用户使用预先定义的Excel模板进行数据的导入和导出。模板通常包含了...

    SpringBoot +Mybatis +POI导入、导出Excel文件

    本项目通过集成这三个组件,实现了Excel文件的导入与导出功能,为业务流程提供了便捷的数据交互手段。 首先,我们来了解一下SpringBoot。SpringBoot是Spring框架的简化版,它简化了配置和项目初始化过程,通过内置...

    SpringBoot整合poi实现Excel文件的导入和导出.pdf

    在SpringBoot项目中,我们经常需要处理Excel文件的导入与导出功能,这在数据分析、数据交换等场景中尤其常见。Apache POI 是一个流行的Java库,它允许开发者读写Microsoft Office格式的文件,包括Excel。下面我们将...

    Spring3 MVC + POI 实现 Excel与MySQL 的导入导出

    本主题聚焦于如何利用Spring3 MVC框架结合Apache POI库来实现在Java环境中Excel与MySQL数据库之间的数据导入与导出。 Spring3 MVC是Spring框架的一个组件,专门用于构建Web应用程序,它提供了模型-视图-控制器(MVC...

    springboot实现Excel文件导入与导出功能

    springboot实现Excel文件导入与导出功能, 本次任务主要实现两个功能,一是如何将Excel文件导入后台服务器,解析文件中的内容,并且存入数据库中。二是如何将后台数据库中的数据导出为Excel表格。经过调研,实现此...

    SpringBootMybatis+poi+Thymeleaf实现excel文件数据导入到数据库以及从数据库将数据导出成excel.zip

    总的来说,这个项目展示了如何在Java环境中,结合Spring Boot的便利性,利用MyBatis进行数据库操作,借助Apache POI处理Excel文件,以及Thymeleaf生成动态页面,实现数据的导入导出功能。这是一个综合性的Java Web...

    Jett+Spring MVC实现Excel导出

    在本文中,我们将深入探讨如何使用Jett和Spring MVC框架来实现...如果你需要更多关于Jett和Spring MVC的详细信息,可以参考我的CSDN博客《Jxls+Spring MVC实现Excel导出》,在那里我会进一步探讨相关技术和最佳实践。

    spring ext 日志管理和导出excel

    2. 创建一个处理Excel导出的Service类,使用POI API创建HSSFWorkbook对象,定义工作表和样式。 3. 使用循环遍历需要导出的数据,并填充到工作表的单元格中。 4. 将Workbook对象写入到HttpServletResponse的...

    关于Java使用EasyExcel导出动态数据为Excel文件SpringBoot代码项目示例

    1、Java导出动态数据为Excel文件,具体示例可以参考:https://img-blog.csdnimg.cn/1cc86ee5dffa48669e2b97283585fad2.png 2、项目使用SpringBoot,Ali3.0.5版本的easyexcel框架。 3、资源内有具体的使用说明和易...

    spring MVC 导出excel

    Spring MVC 是一个强大的Java web开发框架,用于构建可维护、高性能和灵活的Web应用程序。在“spring MVC 导出excel...通过不断实践和优化,Spring MVC结合Apache POI可以实现功能强大且用户体验良好的Excel导出功能。

    spring boot+mybatis plus+easy poi实现数据库导出成excel和excel导入到数据库.zip

    开发者利用了Spring Boot、MyBatis Plus和EasyPoi库来实现了一个功能强大的数据交互系统,允许用户将数据库中的数据导出为Excel格式,同时也能将Excel文件的数据导入到数据库中。下面将详细介绍这些技术及其应用。 ...

    Spring Boot 系列教程 EasyPoi导出Excel下载

    在本教程中,我们将深入探讨如何使用Spring Boot和EasyPoi库来实现Excel文件的导出功能。Spring Boot是Java开发中的一个热门框架,它简化了设置和配置过程,使得开发更加高效。EasyPoi则是一个针对Apache POI的简化...

    Jxls+Spring MVC实现Excel导出

    "Jxls+Spring MVC实现Excel导出"的主题聚焦于如何利用Jxls库和Spring MVC框架来实现这一功能。Jxls是一个强大的Java库,它扩展了Apache POI,使得在Excel模板上进行编程变得简单,而Spring MVC是Spring框架的一部分...

    spring导出Excel

    在Java开发中,Spring Boot框架提供了许多便利的功能,其中之...通过上述步骤,你可以实现一个简单但功能强大的Excel导出功能。在实际项目中,还可以根据需求扩展,比如增加模板支持、多Sheet导出、数据格式化等功能。

    java配置文件动态配置excel导出动态数据并发送email

    在Java开发中,有时我们需要根据业务需求动态生成Excel文件,并将其作为附件发送电子邮件。这个过程涉及到几个关键的技术点,包括Java配置文件的使用、Excel的数据动态生成、以及邮件的发送。接下来,我们将深入探讨...

    Springboot+Poi实现Excel的导入导出

    1. **Excel导出**: - 使用POI库,可以创建HSSFWorkbook对象来代表一个Excel工作簿,HSSFSheet表示工作表,HSSFRow表示行,HSSFCell表示单元格。通过这些对象,我们可以填充数据到Excel文件。 - 数据查询:调用...

    struts2_spring_ibatis根据模板文件导出Excel

    在这个项目中,“struts2_spring_ibatis根据模板文件导出Excel”是利用这三大框架实现了一个功能,即根据预设的模板文件生成并导出Excel电子表格。 首先,Struts2是基于Model-View-Controller(MVC)架构的Web应用...

    struts2+hibernate+spring+jfreechart+导出excel+导出pdf完美整合.zip

    这个压缩包文件“struts2+hibernate+spring+jfreechart+导出excel+导出pdf完美整合.zip”显然是一个整合了这些技术的示例项目,用于演示如何在实际开发中实现数据处理、视图展示以及文件导出功能。 首先,Struts2 ...

Global site tag (gtag.js) - Google Analytics