1:测试数据200多万,项目使用,问题:打开csv文件后发现,文字乱码,暂时没解决,这里提供一个思路
2:csv工具类
package com.wptx.comm.config;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.collections.CollectionUtils;
public class CsvExportUtil {
/**
* CSV文件列分隔符
*/
private static final String CSV_COLUMN_SEPARATOR = ",";
/**
* CSV文件行分隔符
*/
private static final String CSV_ROW_SEPARATOR = "\r\n";
private final static byte commonCsvHead[] = { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF };
/**
* @param dataList 集合数据
* @param titles 表头部数据
* @param keys 表内容的键值
* @param os 输出流
*/
public static void doExport(List<Map<String, Object>> dataList, String titles, String keys, OutputStream os) throws Exception {
// 保证线程安全
StringBuffer buf = new StringBuffer();
String[] titleArr = null;
String[] keyArr = null;
titleArr = titles.split(",");
keyArr = keys.split(",");
// 组装表头
for (String title : titleArr) {
buf.append(title).append(CSV_COLUMN_SEPARATOR);
}
buf.append(CSV_ROW_SEPARATOR);
// 组装数据
if (CollectionUtils.isNotEmpty(dataList)) {
for (Map<String, Object> data : dataList) {
for (String key : keyArr) {
buf.append(data.get(key)).append(CSV_COLUMN_SEPARATOR);
}
buf.append(CSV_ROW_SEPARATOR);
}
}
os.write(buf.toString().getBytes("gbk"));
os.flush();
}
/**
* 设置Header
*
* @param fileName
* @param response
* @throws UnsupportedEncodingException
*/
public static void responseSetProperties(String fileName, HttpServletResponse res) throws UnsupportedEncodingException {
// 设置文件后缀
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String fn = fileName + sdf.format(new Date()) + ".csv";
// 读取字符编码
String utf = "UTF-8";
// 设置响应
res.setContentType("application/csv;charset=UTF-8");//application/ms-txt.numberformat:@ || application/csv;charset=UTF-8
res.setCharacterEncoding(utf);
res.setHeader("Pragma", "public");
res.setHeader("Cache-Control", "max-age=30");
res.setHeader("Content-Disposition:attachment", "filename=" + URLEncoder.encode(fn, utf));
}
}
3:业务层
// 查询需要导出的数据
List<TaskStoreItemDTO> dataList = mapper.export(taskId);
// 构造导出数据结构
// 设置表头
String titles = "组号,组名,时间";
// 设置每列字段和实体类字段一致
String keys = "tabNbr,regionName,smallRegionName";
// 构造导出数据
List<Map<String, Object>> datas = new ArrayList<>();
Map<String, Object> map = null;
for (TaskStoreItemDTO data : dataList) {
map = new HashMap<>();
map.put("tabNbr", data.getTabNbr());
map.put("regionName", data.getRegionName());
map.put("smallRegionName", data.getSmallRegionName());
datas.add(map);
}
// 设置导出文件前缀
String fName = "data_";
// 文件导出
try {
OutputStream os = res.getOutputStream();
CsvExportUtil.responseSetProperties(fName, res);
CsvExportUtil.doExport(datas, titles, keys, os);
os.close();
} catch (Exception e) {
log.error("导出失败", e.getMessage());
return ResultVOUtil.error(ErrorEnum.EXPORT_GOODS_TABNBR_ISNULL);
}