Java后台生成csv实现Vue前端导出功能

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)
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值