最近在做新版本的开发,大部分的页面都需要实现导出功能,最开始倒是没觉得有多难,做一个前台导出,对缓存的数据做一个渲染+导出就好了。但是在综合考虑了所有业务之后,单纯的前台导出,貌似并不能解决所有的问题。于是我的系统里面现在一共存在了三种导出方式,一一列举吧。
1.js实现前台导出
这个没什么太多好说的,直接上工具代码,代码简单易懂,就不用讲使用方式了吧。
export function exportExcel(columns, dataList, filename) {
const resultData = []
const columnLabels = []
for (const col of columns) {
columnLabels.push(col.label)
}
resultData.push(columnLabels.join(','))
for (const data of dataList) {
const columnValues = []
for (const col of columns) {
if (col.render) {
columnValues.push(col.render(data[col.prop]))
} else {
columnValues.push(data[col.prop])
}
}
resultData.push(columnValues.join(','))
}
const blob = new Blob(['\ufeff' + resultData.join('\n')], { type: 'text/csv; charset=UTF-8' })
const a = document.createElement('a')
a.href = URL.createObjectURL(blob)
a.setAttribute('download', filename + '.csv')
a.click()
}
2.java实现导出csv
一般我是推荐使用这种方式进行导出的,只需要构造自己需要的header map和data map的list就可以。header map的键与data map的键一致;header map的值为csv文件中显示的header(就是你想展示什么,值就写什么就对了,可以自己看代码理解);data map的值就是要显示的数据。值得注意的是,如果希望header按照自己需要的顺序导出到文件中,记得将header map声明为LinkedHashMap(有序)。
import org.mmi.tws.common.exception.AdminException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author DiCaprito
*/
@Service
public class ExportService {
private static final Logger LOGGER = LoggerFactory.getLogger(ExportService.class);
public void exportExcel(HttpServletResponse response, String fileName, Map<String, String> header, List<Map<String, Object>> dataList) {
LOGGER.info("[ExportService]#Start to export excel.");
StringBuilder sb = new StringBuilder();
List<String> keyList = new ArrayList<>();
int index = 0;
//生成头部
for (Map.Entry<String, String> entry : header.entrySet()) {
if (index > 0) {
sb.append(",");
}
String key = entry.getKey();
String value = entry.getValue();
sb.append(value.replace(',', ','));
keyList.add(key);
index++;
}
sb.append("\r\n");
//生成数据
for (Map<String, Object> map : dataList) {
index = 0;
for (String key : keyList) {
Object value = map.get(key);
if (index > 0) {
sb.append(",");
}
if (val