根据请求动态产生文件。以导出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的工作原理.
相关推荐
springboot实现Excel文件导入与导出功能, 本次任务主要实现两个功能,一是如何将Excel文件导入后台服务器,解析文件中的内容,并且存入数据库中。二是如何将后台数据库中的数据导出为Excel表格。经过调研,实现此...
在Spring Boot中实现Excel的导入导出可以通过POI库来实现,POI是一个开源的Java库,用于处理Microsoft Office格式文件,包括Excel。一个简单的示例,演示如何在Spring Boot项目中使用POI来实现Excel的导入导出功能。...
1、Java导出动态数据为Excel文件,具体示例可以参考:https://img-blog.csdnimg.cn/1cc86ee5dffa48669e2b97283585fad2.png 2、项目使用SpringBoot,Ali3.0.5版本的easyexcel框架。 3、资源内有具体的使用说明和易...
SpringBoot整合poi实现Excel文件的导入和导出,其中单独分装出一个ExcelFormatUtil工具类来实现对单元格数据格式进行判断。
spring框架,导入excel中的数据到数据库,导出数据库数据到excel文件
本文将详细介绍在Spring Boot框架中如何将列表数据导出为Excel文件。我们将通过Apache POI库来实现这一功能,并解释其背后的原理、提供完整的流程和步骤,以及带有详细注释的代码示例。最终,读者将能够轻松地将自己...
以excel模板导出资源,前提是要自己准备excel模板,配置文件中可以写死excel的名字
SpringBootMybatis+poi+Thymeleaf实现excel文件数据导入到数据库以及从数据库将数据导出成excel
1.本动态导入导出Excel工程导入Eclipse即可用行,支持所有版本的Excel导入导出。...2.程序使用Struts2+POI+SQLSever(SSH即Struts2+Hibernate+Spring)实现Excel动态数据导入和导出,压缩包内含程序源码文件。
spingBoot 导出excel文件,jxl 支持份sheet导出,可自定以标题列
主要是springboot+myBatis+poi+mysql的使用,从数据库查询到结果集导出excel到本地,从本地中的excel文件导入到数据库中。
Java springboot简单实现excel表导出导入.md
SpringBoot +Mybatis +POI导入、导出Excel文件 简单清晰几个类,处理SpringBoot 导入导出excel doc目录下 是mysql数据库脚本 和 导入的模板
使用的struts2_spring_ibatis框架,根据模板文件导出Excel
本篇文章主要介绍了Spring 实现excel及pdf导出表格示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
NULL 博文链接:https://dengli19881102.iteye.com/blog/1006011
带领我们直接实现Excel文件的直接导出下载,后续开发不需要开发很多代码,直接继承已经写好的代码,增加一个Xml配置就可以直接导出。具体实现代码大家跟随小编一起通过本文学习吧
走Gateway下载Excel后打不开,打开乱码,文件大小变大- 解决方式一。 不走Gateway时,下载的Excel正常
resource里面有模板,在junit测试类中修改为本地存在路径即可导出文件,在junit测试类中修改for循环的i可以模拟百万级数据导出。注意common-poi使用的SXSSFWorkbook(这个只支持xlsx)支持缓存导出,但是这个只支持...
Java导出数据为excel表格,超级详细的,内容包含所需要的jar及所有相关文件,结合Mybatis+Spring+Mysql技术等技术内容丰富,步骤也比较详细,可以直接用到日常开发中使用,有不懂的地方可以留言