`

生成CSV文件的公共方法

阅读更多
   /**
     * 
     * 生成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;
    }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics