class="java" name="code"> /** * * 生成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; }