
goja.rapid.mvc.csv.CsvUtil Maven / Gradle / Ivy
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2013-2014 sagyf Yang. The Four Group.
*/
package goja.rapid.mvc.csv;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Record;
import java.sql.Timestamp;
import java.util.*;
import java.util.Map.Entry;
import static goja.core.StringPool.*;
import static goja.core.date.DateFormatter.DP_YYYY_MM_DD_HH_MM;
/**
* 该类是把数据转化成csv字符串做了简要的封装 List headers是显示数据每列的属性,建议使用字符 List data数据,单个元素格式可以为Array,list,map,model,record
* List columns 表示需要显示的数据,如果data是Array与list,输入希望显示列的下标即可 如果data是map,model,record,输入希望显示列的key值即可。
*/
public class CsvUtil {
private static UserSettings userSettings = new UserSettings();
private CsvUtil() {
}
/**
* 将文本头与数据共同转成csv字符串
*
* @param headers 列属性
* @param data 数据
* @param columns 需要显示列的key值
* @return csv字符串
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public static String createCSV(List headers, List data, List columns) {
StringBuffer strOut = new StringBuffer("");
if (null != headers && !headers.isEmpty()) { // 如果文本不为空则添加到csv字符串中
listToCSV(strOut, headers);
}
if (null == data || data.isEmpty()) {
return strOut.toString();
}
Iterator itr = data.iterator();
while (itr.hasNext()) {
Object obj = itr.next(); // 将数据添加到csv字符串
Class cls = obj.getClass();
if (cls != null && cls.isArray()) {
Object[] objs = (Object[]) obj;
for (Object obj1 : objs) {
createCol(strOut, obj1);
strOut.append(COMMA);
}
strOut = strOut.deleteCharAt(strOut.length() - 1); // 去点多余逗号
strOut.append(NEWLINE);
} else if (obj instanceof List) {
List objlist = (List) obj;
if (null == columns || columns.isEmpty()) { // 如果没有限制,默认全部显示
listToCSV(strOut, objlist);
} else {
for (Object column : columns) {
createCol(strOut, objlist.get((Integer) column));
strOut.append(COMMA);
}
strOut = strOut.deleteCharAt(strOut.length() - 1);
strOut.append(NEWLINE);
}
} else if (obj instanceof Map) {
Map objmap = (Map) obj;
if (null == columns || columns.isEmpty()) { // 如果没有限制,默认全部显示
Set keyset = objmap.keySet();
for (Object key : keyset) {
createCol(strOut, objmap.get(key));
strOut.append(COMMA);
}
strOut = strOut.deleteCharAt(strOut.length() - 1);
strOut.append(NEWLINE);
} else {
for (Object column : columns) {
createCol(strOut, objmap.get(column));
strOut.append(COMMA);
}
strOut = strOut.deleteCharAt(strOut.length() - 1);
strOut.append(NEWLINE);
}
} else if (obj instanceof Model) {
Model objmodel = (Model) obj;
if (null == columns || columns.isEmpty()) { // 如果没有限制,默认全部显示
Set> entries = objmodel._getAttrsEntrySet();
for (Entry entry : entries) {
createCol(strOut, entry.getValue());
strOut.append(COMMA);
}
strOut = strOut.deleteCharAt(strOut.length() - 1);
strOut.append(NEWLINE);
} else {
for (Object column : columns) {
createCol(strOut, objmodel.get(column + EMPTY));
strOut.append(COMMA);
}
strOut = strOut.deleteCharAt(strOut.length() - 1);
strOut.append(NEWLINE);
}
} else if (obj instanceof Record) {
Record objrecord = (Record) obj;
Map map = objrecord.getColumns();
if (null == columns || columns.isEmpty()) { // 如果没有限制,默认全部显示
Set keys = map.keySet();
for (String key : keys) {
createCol(strOut, objrecord.get(key));
strOut.append(COMMA);
}
strOut = strOut.deleteCharAt(strOut.length() - 1);
strOut.append(NEWLINE);
} else {
for (Object column : columns) {
createCol(strOut, objrecord.get(column + EMPTY));
strOut.append(COMMA);
}
strOut = strOut.deleteCharAt(strOut.length() - 1);
strOut.append(NEWLINE);
}
} else {
while (itr.hasNext()) {
Object objs = itr.next();
if (objs != null) {
createCol(strOut, objs);
strOut.append(NEWLINE);
}
}
}
obj = null;
}
return strOut.toString();
}
/**
* 把单纯的集合转化成csv字符串
*
* @param strOut StringBuffer
* @param list 数据
*/
public static void listToCSV(StringBuffer strOut, List> list) {
if (null != list && !list.isEmpty()) { // 如果文本不为空则添加到csv字符串中
for (Object aList : list) {
createCol(strOut, aList);
strOut.append(COMMA);
}
strOut = strOut.deleteCharAt(strOut.length() - 1);
strOut.append(NEWLINE);
}
}
// 把单个元素转化
public static void createCol(StringBuffer strOut, Object obj) {
if (obj != null) {
strOut.append(QUOTE);
String content;
if (obj instanceof Boolean) {
content = obj.toString();
} else if (obj instanceof Calendar) {
content = obj.toString();
} else if (obj instanceof Timestamp) {
content = DP_YYYY_MM_DD_HH_MM.format(new Date(((Timestamp) obj).getTime()));
} else if (obj instanceof Date) {
content = DP_YYYY_MM_DD_HH_MM.format((Date) obj);
} else {
content = write(String.valueOf(obj));
}
strOut.append(content);
strOut.append(QUOTE);
} else {
strOut.append("\" \" ");
}
}
public static String write(String content) {
boolean textQualify = userSettings.forceQualifier;
if (content.length() > 0) {
content = content.trim();
}
if (!textQualify
&& userSettings.useTextQualifier
&& (content.indexOf(userSettings.textQualifier) > -1
|| content.indexOf(userSettings.delimiter) > -1
|| (content.indexOf(Letters.LF) > -1 || content.indexOf(Letters.CR) > -1)
|| (content.indexOf(userSettings.recordDelimiter) > -1)
|| (content.length() > 0 && content.charAt(0) == userSettings.comment)
|| (content.length() == 0))) {
textQualify = true;
}
if (userSettings.useTextQualifier && !textQualify && content.length() > 0) {
char firstLetter = content.charAt(0);
if (firstLetter == Letters.SPACE || firstLetter == Letters.TAB) {
textQualify = true;
}
if (!textQualify && content.length() > 1) {
char lastLetter = content.charAt(content.length() - 1);
if (lastLetter == Letters.SPACE || lastLetter == Letters.TAB) {
textQualify = true;
}
}
}
if (textQualify) {
if (userSettings.escapeMode == UserSettings.ESCAPE_MODE_BACKSLASH) {
content =
replace(content, "" + Letters.BACKSLASH, "" + Letters.BACKSLASH + Letters.BACKSLASH);
content = replace(content, "" + userSettings.textQualifier, "" + Letters.BACKSLASH
+ userSettings.textQualifier);
} else {
content = replace(content, "" + userSettings.textQualifier, "" + userSettings.textQualifier
+ userSettings.textQualifier);
}
} else if (userSettings.escapeMode == UserSettings.ESCAPE_MODE_BACKSLASH) {
content =
replace(content, "" + Letters.BACKSLASH, "" + Letters.BACKSLASH + Letters.BACKSLASH);
content = replace(content, "" + userSettings.delimiter,
"" + Letters.BACKSLASH + userSettings.delimiter);
content = replace(content, "" + Letters.CR, "" + Letters.BACKSLASH + Letters.CR);
content = replace(content, "" + Letters.LF, "" + Letters.BACKSLASH + Letters.LF);
}
return content;
}
// 特殊字符的转换 "\t" -> "\\t"
public static String replace(String original, String pattern, String replace) {
final int len = pattern.length();
int found = original.indexOf(pattern);
if (found > -1) {
StringBuilder sb = new StringBuilder();
int start = 0;
while (found != -1) {
sb.append(original.substring(start, found));
sb.append(replace);
start = found + len;
found = original.indexOf(pattern, start);
}
sb.append(original.substring(start));
return sb.toString();
} else {
return original;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy