post请求导出CSV

需要的jar包

<dependency>
	<groupId>com.opencsv</groupId>
	<artifactId>opencsv</artifactId>
	<version>5.5.2</version>
</dependency>

api

export: (data) => {
	return axios({
		url: '/export',
		method: 'post',
		data,
		responseType: 'blob'
	})
}

处理响应

handleExport: () => {
	api.export(param).then((res) => {
		const link = document.createElement('a')
		let blob = new Blob([res.data], {type: 'text/csv'})
		link.style.display = 'none'
		link.href = URL.createObjectURL(blob)
		let fileName = res.headers['finename']
		link.setAttribute('download', decodeURI(fileName))
		document.body.appendChild(link)
		link.click()
		document.body.removeChild(link)
	})
}

Controller

@Slf4j
@RestController
@RequestMapping(value = "/demo", produces = "application/json;charset=utf-8")
public class DemoController{

	@Autowired
	DemoService demoService;
	
	@RequestMapping(value = "/export")
	public void export(@RequestBody JSONObject param, HttpServletResponse response) {
		log.info("导出CSV /demo/export 接收参数:" + JSONObject.toJSONString(param));
		demoService.export(param, response);
	}
	
	@RequestMapping(value = "/export")
	public void export(@RequestBody JSONObject param, HttpServletResponse response) {
		log.info("导出CSV /demo/export 接收参数:" + JSONObject.toJSONString(param));
		demoService.export(param, response);
	}
}

Service

public void export(JSONObject param, HttpServletResponse response) {
	String date = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
	String fileName = "导出" + date + ".csv";
	// 获取要导出的数据
	List<JSONObject> data = demoMapper.export(param);
	// 表头
	String[] titles = {"姓名", "性别", "身高"};
	// 列名(或实体类的属性名),与data中保持一致,顺序与表头保持一致
	String[] columns = {"name", "sex", "height"};
	
	try (OutputStream out = response.getOutputStream();
		 CSVParserWriter writer = new CSVParserWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8), new  RFC4180ParserBuilder().build(), "\n")) {
		response.setHeader("Content-Disposition", "attachment");
		response.setHeader("filename", URLEncoder.encode(fileName, "UTF8"));
		response.setContentType("text/csv");
		// 表头
		writer.writeNext(titles);
		// 数据
		for (JSONObject task : data) {
			List<String> row1 = new ArrayList<>();
			for (String column: columns) {
				row1.add(String.valueOf(task.get(column)));
			}
			String[] row2 = row1.toArray(new String[0]);
			writer.writeNext(row2);
		}
		writer.flush();
	} catch (Exception e) {
		e.printStackTrace();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值