生成CSV文件的公共方法

本文介绍了一种生成CSV文件的方法,包括如何设置文件标题、字段名称,并处理特殊字符以确保CSV格式正确。此外还提供了处理长数字和以0开头数字的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


/**
*
* 生成CSV文件:第一行是文件标题,第二行是字段名称,第三行开始是具体的业务数据 <br>
* 〈功能详细描述〉
*
* @param fileName:文件名
* @param title:文件标题
* @param cloumnNames:字段名数组
* @param keys:字段Key数组
* @param dataList:数据列表
* @param response
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public static void downLoadCsv(String fileName, String title, String[] cloumnNames, String[] keys,
List<Map<String, Object>> dataList, HttpServletResponse response) {
response.reset();
PrintWriter out = null;
try {
response.setContentType("application/octet-stream;charset=GB2312");
response.setHeader("Content-disposition", "attachment; filename="
+ new String(fileName.getBytes("GBK"), "ISO-8859-1") + ".csv");
out = response.getWriter();

// 如果存在标题,则写入标题
if (!StringUtil.isEmpty(title)) {
out.write(title + "\r\n");
}

// 如果存在抬头字段,则写入抬头字段
if (null != cloumnNames && cloumnNames.length > 0) {
StringBuilder cloumns = new StringBuilder(100);
for (String headStr : cloumnNames) {
cloumns.append(headStr).append(",");
}
cloumns.deleteCharAt(cloumns.length() - 1);
cloumns.append("\r\n");
out.write(cloumns.toString());
}

// 添加业务数据
if (null != keys && keys.length > 0 && null != dataList && !dataList.isEmpty()) {
// 遍历业务数据List
for (Map<String, Object> dataMap : dataList) {
StringBuilder line = new StringBuilder(100);

// 遍历业务数据Map的value
for (String key : keys) {
// 处理字段值,使其符合CSV格式
String value = processCsvValue(MapUtils.getString(dataMap, key, ""));
// 将value值添加至输出字符序列
line.append(value).append(",");
}
line.deleteCharAt(line.length() - 1);
line.append("\r\n");

out.write(line.toString());
}
}
} catch (IOException e) {
logger.error("下载异常" + e.getMessage());
} finally {
IOUtils.closeQuietly(out);
}
}

public static String processCsvValue(String s) {
if (StringUtils.isBlank(s)) {
return "";
}
String value = s.trim();
// 包含有逗号、双引号、空格、换行符、回车符、空字符则将此字段用双引号引起来,
if (value.indexOf('"') > -1 || value.indexOf(",") > -1 || value.indexOf("\n") > -1 || value.indexOf('\r') > -1) {
StringBuffer csvValue = new StringBuffer();
return csvValue.append('"').append(value).append('"').toString();
} else {
if (isAppendTabToStr(value)) {
return value + "\t";
}
return value;
}
}

/**
*
* 是否在字符串的后面追加TAB符(对于超过16位的数字和以0开始的数字在用Excel打开时格式会发生错乱,因此在其末尾追加TAB) <br>
* 〈功能详细描述〉
*
* @param value
* @return
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
private static boolean isAppendTabToStr(String value) {
if (value.matches("^[0-9\\.]{16,}$")) {
return true;
}

if (value.matches("^[0-9\\.]{1,}$") && value.startsWith("0")) {
return true;
}

return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值