批量处理1——文件的上传(bootstrap+Ajax+SSM)
批量处理2——Java花式处理EXCEL
批量处理3——Excel文件导出
批量处理4——java处理压缩文件
Java知多少——相对路径和绝对路径
HTTP知多少——Content-disposition(文件下载)
点击文件导出时,需要将form表单的条件传递到后台,后台使用POI生成Excel文件,导出给用户。
1. 前端Ajax实现与后台的交互
1. 将form表单转化成JSON数据
$.fn.serializeJsonObj = function () {
var o = {};
var a = this.find("input:not(.data-submit-ignore),select:not(.data-submit-ignore),textarea:not(.data-submit-ignore)").serializeArray();
$.each(a, function () {
if (o[this.name]) {
//如果o[label]不是嵌套在数组
if (!o[this.name].push) {
//将o[label]初始为嵌套数组,如o={a,[a,b,c]}
o[this.name] = [o[this.name]];
}
//将值插入o[label]
o[this.name].push($.trim(this.value) || '');
} else {
//第一次在o中插入o[label]
o[this.name] = $.trim(this.value) || '';
}
});
return o;
};
$.fn.serializeJsonStr = function () {
//将Object对象转化为JSON对象
return JSON.stringify(this.serializeJsonObj());
};
2. html代码
3. JS代码
function exportData() {
var self = $('#exportDataBtn');
if (self.hasClass("disabled")) return;
if ($(".table-container").find("tr").size() <= 1) {
layer.alert('您所查询的结果为空,请重新设置查询条件', {icon: 0});
return;
}
layer.confirm('您是否确认以当前条件导出数据?', {
icon: 3, title: '提示', btn: ['是', '否'], yes: function () {
layer.closeAll('dialog');
$.ajax({
type: "POST",
url: "XXX/exportCheck", //校验是否可以导出
data: $('#queryFrom').serializeJsonStr(), //将表单转化成JSON串
contentType: 'application/json;charset=utf-8', //设置请求头信息
dataType: "json",
success: (function (json) {
//允许导出
if (json.retcode == 200) {
$(".search-form").attr('action', './XXX/export');
$(".search-form").attr('method', 'POST');
$(".search-form").submit();
$(".search-form").attr('action', '');
} else {
layer.alert(json.message, {icon: 2});
}
self.removeClass("disabled");
}),
error: function (json) {
self.removeClass("disabled");
layer.alert("导出失败!", {icon: 2});
},
beforeSend: function () {
self.addClass("disabled");
}
});
}
});
}
2. 后台导出Excel文件
HTTP知多少——Content-disposition(文件下载)设置响应头,使得文件以下载的形式返回给用户。
com.google.guava
guava
r09
lists.newarraylist()和new arraylist() 区别
- 获取Response输出流;
- 设置response的参数;
- 取数据库查询导出数据到List
中; - 创建List
- >对象;将User对象放入List
中; - 解析List集合为Excel记录;
@RequestMapping("/export")
public void exportData(User query, HttpServletRequest request, HttpServletResponse response) {
try {
OutputStream out = response.getOutputStream();// 取得输出流
response.reset();// 清空输出流
response.setHeader("Content-disposition",
"attachment; filename=" + ExcelUtil.toUtf8String("客户列表" + DateUtil.getCurrentTimeStr(), request) + ".xlsx");// 设定输出文件头
response.setContentType("application/msexcel");// 定义输出类型
/*根据query去数据库查询记录*/
List users=userService.userList(query);
/*按照Excel顺序,将User对象解析为List对象*/
List> result = Lists.newArrayList();
if (users != null || users.size() > 0) {
for (int i = 0; i < users.size(); i++) {
List list = new ArrayList();
User user = User.get(i);
int count = 0;
list.add(count, i + 1 + "");
list.add(++count, user.getUserId());
result.add(list);
}
}
//获取导出模板
String fileName ="XXX.xlsx";
//导出数据【填充输出流out】
ExcelUtil.fillData(result, fileName, 2, 0, out);
} catch (Exception e) {
e.printStackTrace();
}
}
public static String toUtf8String(String fileName, HttpServletRequest request) throws Exception {
final String userAgent = request.getHeader("USER-AGENT");
String finalFileName = null;
if (StringUtils.contains(userAgent, "MSIE")) {// IE浏览器
finalFileName = URLEncoder.encode(fileName, "UTF8");
} else if (StringUtils.contains(userAgent, "Mozilla")) {// google,火狐浏览器
finalFileName = new String(fileName.getBytes(), "ISO8859-1");
} else {
finalFileName = URLEncoder.encode(fileName, "UTF8");// 其他浏览器
}
return finalFileName;
}
/**
* 导出数据【填充输出流out】
*/
public static void fillData(List> result, String fileName int startRow, int startCell, OutputStream out) {
try{
//获取classpath下面的文件,转化成输入流
InputStream is = ExcelUtil.class.getClassLoader().getResourceAsStream(fileName);
XSSFWorkbook wb = new XSSFWorkbook(is);
XSSFSheet sheet = wb.getSheetAt(0);
for (List datas : result) {
int firstCell = startCell;
//获取单元格
XSSFRow row = sheet.createRow(startRow);
for (String data : datas) {
XSSFCell cell = row.createCell(firstCell);
//写入单元格内容
cell.setCellType(XSSFCell.CELL_TYPE_STRING);
cell.setCellValue(data);
firstCell++;
}
startRow++;
}
//设置输出流
wb.write(out);
} catch (Exception e) {
e.printStackTrace();
}
}
参考文章:
1. JavaScript获取表格的行数和列数
2. JSON.stringify()将对象转化成JSON
3. 表单转成JSON数据串