生成CSV文件的公共方法_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 生成CSV文件的公共方法

生成CSV文件的公共方法

 2014/5/3 1:11:34  13813962825  程序员俱乐部  我要评论(0)
  • 摘要:/****生成CSV文件:第一行是文件标题,第二行是字段名称,第三行开始是具体的业务数据<br>*〈功能详细描述〉**@paramfileName:文件名*@paramtitle:文件标题*@paramcloumnNames:字段名数组*@paramkeys:字段Key数组*@paramdataList:数据列表*@paramresponse*@see[相关类/方法](可选)*@since[产品/模块版本](可选)*/publicstaticvoiddownLoadCsv
  • 标签:方法 文件
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;
    }
上一篇: java之 序列化和反序列化 下一篇: 没有下一篇了!
发表评论
用户名: 匿名