Java返回Response字符缓冲输出流,Vue接收下载
一、java后台
CsvUtil.java
package com.xxxxx.xxxx.util;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @author wangwei
* @date 2020-03-02 21:59
* @desc
**/
public class CsvUtil {
public static <T> void export(HttpServletRequest request, HttpServletResponse response, String fileName, Map<String, String> header, List<T> list) throws IOException {
String[] titleStrs = new String[header.size()];
String[] keys = new String[header.size()];
Iterator<Map.Entry<String, String>> it = header.entrySet().iterator();
int i = 0;
while (it.hasNext()) {
Map.Entry<String, String> entry = it.next();
keys[i] = entry.getKey();
titleStrs[i] = entry.getValue();
i++;
}
if (list == null) {
list = new ArrayList<>();
}
String[][] contents = new String[list.size()][titleStrs.length];
for (int j = 0; j < list.size(); j++) {
for (int k = 0; k < titleStrs.length; k++) {
try {
contents[j][k] = getFieldByKey(list.get(j), keys[k]);
} catch (Exception e) {
e.printStackTrace();
}
}
}
export(request, response, fileName, titleStrs, contents);
}
/**
* 导出excel
*/
public static void export(HttpServletRequest request, HttpServletResponse response, String fileName, String[] titleStr, String[][] content) throws IOException {
OutputStreamWriter writer = new OutputStreamWriter(response.getOutputStream(), "GBK");
BufferedWriter csvWriter = new BufferedWriter(writer, 1024);
writeRow(new String[]{fileName}, csvWriter);
response.reset();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
String fileNameTemp = fileName + sdf1.format(new Date()) + ".csv";
String formFileName;
String userAgent = request.getHeader("User-Agent");
if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
formFileName = java.net.URLEncoder.encode(fileNameTemp, "UTF-8");
} else {
// 非IE浏览器的处理:
formFileName = new String(fileNameTemp.getBytes("UTF-8"), "ISO-8859-1");
}
response.setHeader("Content-Disposition", "attachment;filename=\""
+ formFileName + "\"");
response.setContentType("multipart/form-data");
writeRow(titleStr, csvWriter);
for (String[] strings : content) {
writeRow(strings, csvWriter);
}
csvWriter.close();
writer.close();
System.out.println("Excel success");
}
public static String getFieldByKey(Object object, String key) throws Exception {
Object value;
Field[] fields = object.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if (field.getName() == null || !field.getName().equals(key)) {
continue;
}
value = field.get(object);
if (value instanceof Date) {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) value);
}
return value == null ? "" : value.toString();
}
return "";
}
/**
* 写一行数据方法
*
* @param str 数组
* @param csvWriter BufferedWriter
* @throws IOException 抛出异常
*/
private static void writeRow(String[] str, BufferedWriter csvWriter) throws IOException {
// 写入文件头部
for (String data : str) {
if (data == null || "null".equals(data)) {
csvWriter.write("=\"" + " " + "\",");
} else {
csvWriter.write("=\"" + data + "\",");
}
}
csvWriter.newLine();
}
}
YouController.java
package com.xxxxx.xxxx.controller;
import com.xxxxx.xxxx.entity.User;
import com.xxxxx.xxxx.service.IUserService;
import com.xxxxx.xxxx.util.CsvUtil;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
* 前端控制器
* </p>
*
* @author wangwei
* @since 2020-03-02
*/
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService userService;
@GetMapping("/export")
@ApiOperation(value = "导出csv文件", notes = "导出csv文件")
public void export(HttpServletRequest request, HttpServletResponse response) {
List<User> list = userService.list();
Map<String, String> header = new LinkedHashMap<>();
header.put("id", "ID");
header.put("name", "姓名");
header.put("age", "年龄");
header.put("email", "邮箱");
try {
CsvUtil.export(request, response, "xxxxxx表", header, list);
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、Vue前端
test.vue
//添加按钮
<el-button size="mini" class="filter-item" type="primary" icon="el-icon-download" @click="handleExport(scope.row)">导出</el-button>
//method方法:
handleExport(row) {
var elemIF = document.createElement('iframe')
elemIF.src = 'user/downloadExcel?snapshotTime=' + formatDate(new Date(row.snapshotTime), 'yyyy-MM-dd hh:mm') +
'&category=' + row.category
elemIF.style.display = 'none'
document.body.appendChild(elemIF)
}