一次下载与导出的博弈
一:针对Excel导出如果导出的数据量较小,一般2w条左右(不定原因是由于js中var 变量的长度有限)
var str = "单元格1,单元格2,单元格3,单元格4,...";
str += '\n';
$.ajax({
url: ".../downLoadToExcel",
dataType: 'json',
data: params,
success: function (data) {
for (var i = 0; i <data.length; i++) {
for (var item in data[i]) {
str += data[i][item] + '\t,';
}
str += '\n';
}
}
});
var uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(str);
//通过创建a标签实现
var link = document.createElement("a");
link.href = uri;
//对下载的文件命名
link.download = "导出Excel.csv";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);

二:通过前端请求由Java后端Poi技术导出(流导出,可以是很多格式,比如zip,或者xlsx,xls,csv等)
上代码:适用于大Excel导出
@RequestMapping(value = "downLoadToExcel")
public void downLoadToExcel(User user, HttpServletRequest request, HttpServletResponse response) throws IOException {
// ZipOutputStream zipOutputStream = new ZipOutputStream(out);
ServletOutputStream out = response.getOutputStream();
try {
List<Map<String, Object>> list = testService.downLoadToExcel(user);
request.setCharacterEncoding("UTF-8");
//Excel的行对应的类型名
String[] header = {"","","",""};
double len = list.size();
int ys = 0;
if (len < 60000) {
ys = 1;
} else {
ys = (int) Math.ceil(len / 60000);
}
Workbook wb = new SXSSFWorkbook();
response.setContentType("application/octet-stream; charset=utf-8");
response.setHeader("Content-Disposition", "attachment; filename=" + Encodes.urlEncode("表名.xlsx"));
for (int i = 0; i < ys; i++) {
List<Map<String, Object>> bllist = new ArrayList<>();
double bllen = (i + 1) * 60000;
if (bllen > len) {
bllen = len;
}
for (int j = i * 60000; j < bllen; j++) {
bllist.add(list.get(j));
}
Sheet sheet = wb.createSheet("sheet" + i);
Row r = sheet.createRow(0);
for (int z = 0; z < header.length; z++) {
Cell cell = r.createCell(z);
cell.setCellValue(header[z]);
}
int rownum = 1;
for (Map info : bllist) {
LinkedHashMap lmap = (LinkedHashMap) info;
Row row = sheet.createRow(rownum++);
int number = 0;
for (Iterator it = lmap.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it.next();
Cell cell = row.createCell(number++);
cell.setCellValue(entry.getValue().toString());
}
}
}
// ZipEntry z = new ZipEntry("Excel名称" + ".xslx");
// zipOutputStream.putNextEntry(z);
// wb.write(zipOutputStream);
// zipOutputStream.flush();
wb.write(out);
out.flush();
} catch (Exception e) {
//logger.info("错误信息");
} finally {
//注意关闭顺序,否则可能文件错误
// if (zipOutputStream != null) {
// zipOutputStream.close();
// }
if (out != null) {
out.close();
}
}
return;
}
其中也可以选择使用Zip打包的方式写入流(注释代码便是)对应的前端可以使用 a标签下载,form表单提交,window.location.open等请求方式获取下载流。
var link = document.createElement("a");
link.href ="/downLoadToExcel?cs1=1&cs2=2";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);

浙公网安备 33010602011771号