根据请求动态产生文件。以导出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的工作原理.
相关推荐
在Spring Boot中实现Excel的导入导出可以通过POI库来实现,POI是一个开源的Java库,用于处理Microsoft Office格式文件,包括Excel。一个简单的示例,演示如何在Spring Boot项目中使用POI来实现Excel的导入导出功能。...
### Spring Boot中实现列表数据导出为Excel文件 #### 一、引言 在现代企业应用开发中,数据导出是一项常见的需求。特别是在基于Spring Boot的项目中,开发者经常需要将数据库中的数据导出到Excel文件,以便进行...
本篇文章将深入探讨如何基于Spring实现基于Excel模板的导入导出功能。 首先,我们来理解“基于excel模板的导入导出”这个概念。这意味着系统允许用户使用预先定义的Excel模板进行数据的导入和导出。模板通常包含了...
本项目通过集成这三个组件,实现了Excel文件的导入与导出功能,为业务流程提供了便捷的数据交互手段。 首先,我们来了解一下SpringBoot。SpringBoot是Spring框架的简化版,它简化了配置和项目初始化过程,通过内置...
在SpringBoot项目中,我们经常需要处理Excel文件的导入与导出功能,这在数据分析、数据交换等场景中尤其常见。Apache POI 是一个流行的Java库,它允许开发者读写Microsoft Office格式的文件,包括Excel。下面我们将...
本主题聚焦于如何利用Spring3 MVC框架结合Apache POI库来实现在Java环境中Excel与MySQL数据库之间的数据导入与导出。 Spring3 MVC是Spring框架的一个组件,专门用于构建Web应用程序,它提供了模型-视图-控制器(MVC...
springboot实现Excel文件导入与导出功能, 本次任务主要实现两个功能,一是如何将Excel文件导入后台服务器,解析文件中的内容,并且存入数据库中。二是如何将后台数据库中的数据导出为Excel表格。经过调研,实现此...
总的来说,这个项目展示了如何在Java环境中,结合Spring Boot的便利性,利用MyBatis进行数据库操作,借助Apache POI处理Excel文件,以及Thymeleaf生成动态页面,实现数据的导入导出功能。这是一个综合性的Java Web...
在本文中,我们将深入探讨如何使用Jett和Spring MVC框架来实现...如果你需要更多关于Jett和Spring MVC的详细信息,可以参考我的CSDN博客《Jxls+Spring MVC实现Excel导出》,在那里我会进一步探讨相关技术和最佳实践。
2. 创建一个处理Excel导出的Service类,使用POI API创建HSSFWorkbook对象,定义工作表和样式。 3. 使用循环遍历需要导出的数据,并填充到工作表的单元格中。 4. 将Workbook对象写入到HttpServletResponse的...
1、Java导出动态数据为Excel文件,具体示例可以参考:https://img-blog.csdnimg.cn/1cc86ee5dffa48669e2b97283585fad2.png 2、项目使用SpringBoot,Ali3.0.5版本的easyexcel框架。 3、资源内有具体的使用说明和易...
Spring MVC 是一个强大的Java web开发框架,用于构建可维护、高性能和灵活的Web应用程序。在“spring MVC 导出excel...通过不断实践和优化,Spring MVC结合Apache POI可以实现功能强大且用户体验良好的Excel导出功能。
开发者利用了Spring Boot、MyBatis Plus和EasyPoi库来实现了一个功能强大的数据交互系统,允许用户将数据库中的数据导出为Excel格式,同时也能将Excel文件的数据导入到数据库中。下面将详细介绍这些技术及其应用。 ...
在本教程中,我们将深入探讨如何使用Spring Boot和EasyPoi库来实现Excel文件的导出功能。Spring Boot是Java开发中的一个热门框架,它简化了设置和配置过程,使得开发更加高效。EasyPoi则是一个针对Apache POI的简化...
"Jxls+Spring MVC实现Excel导出"的主题聚焦于如何利用Jxls库和Spring MVC框架来实现这一功能。Jxls是一个强大的Java库,它扩展了Apache POI,使得在Excel模板上进行编程变得简单,而Spring MVC是Spring框架的一部分...
在Java开发中,Spring Boot框架提供了许多便利的功能,其中之...通过上述步骤,你可以实现一个简单但功能强大的Excel导出功能。在实际项目中,还可以根据需求扩展,比如增加模板支持、多Sheet导出、数据格式化等功能。
在Java开发中,有时我们需要根据业务需求动态生成Excel文件,并将其作为附件发送电子邮件。这个过程涉及到几个关键的技术点,包括Java配置文件的使用、Excel的数据动态生成、以及邮件的发送。接下来,我们将深入探讨...
1. **Excel导出**: - 使用POI库,可以创建HSSFWorkbook对象来代表一个Excel工作簿,HSSFSheet表示工作表,HSSFRow表示行,HSSFCell表示单元格。通过这些对象,我们可以填充数据到Excel文件。 - 数据查询:调用...
在这个项目中,“struts2_spring_ibatis根据模板文件导出Excel”是利用这三大框架实现了一个功能,即根据预设的模板文件生成并导出Excel电子表格。 首先,Struts2是基于Model-View-Controller(MVC)架构的Web应用...
这个压缩包文件“struts2+hibernate+spring+jfreechart+导出excel+导出pdf完美整合.zip”显然是一个整合了这些技术的示例项目,用于演示如何在实际开发中实现数据处理、视图展示以及文件导出功能。 首先,Struts2 ...