我想通过Reflection机制将Java Bean或ResultSet(JDBC)导出到CSV文件中。
我见过这个api:
http://opencsv.sourceforge.net/apidocs/au/com/bytecode/opencsv/bean/BeanToCsv.html
但尚未发布。
另外,如果我们可以设置一些过滤器来避免映射一些精确的字段,那就没问题了。
您知道拥有这些功能的已知API吗?
答案 0 :(得分:1)
除非有一些现成的API:我会使用
Apache commons http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/ReflectionToStringBuilder.html获取JavaBean的String表示形式。通过设置自己的ToStringStyle
,可以创建CSV样式字符串。 String的样式有许多可能的设置,包括排除字段等。
然后当然把它写入文件。
答案 1 :(得分:0)
您可以像使用输出流一样写出正常的.txt文件来写出csv文件。 如果您需要更高级的excel,我推荐使用Apache POI。它总是做得很好而且工作得很好。为我干净。
答案 2 :(得分:0)
添加到Kennets答案:
我实现了两类:一类用于标题(如果需要),一类用于正文(实际数据)
HEADER
构造函数:
this.setUseClassName(false);
this.setUseIdentityHashCode(false);
this.setContentStart("");
this.setUseFieldNames(true);
this.setFieldNameValueSeparator("");
this.setContentEnd("\n");
覆盖方法:
@Override
public void append(StringBuffer buffer, String fieldName, Object value, Boolean fullDetail) {
super.append(buffer, fieldName, "", fullDetail);
}
身体
构造函数:
this.setUseClassName(false);
this.setUseIdentityHashCode(false);
this.setContentStart("");
this.setUseFieldNames(false);
this.setContentEnd("");
this.setNullText("n.a.");
this.setArrayStart("");
this.setArrayEnd("");
this.setArraySeparator("\n");
覆盖方法:
@Override
public void append(StringBuffer buffer, String fieldName, Object value, Boolean fullDetail) {
String csvField = Optional.ofNullable(value)
.map(Objects::toString)
.map(this::escapeLineBreak)
.map(this::escapeDoubleQuote)
.map(this::escapeField)
.orElse(null);
super.append(buffer, fieldName, csvField, fullDetail);
}
格式化方法:
private String escapeDoubleQuote(final String field) {
return field.replace("\"", "\"\"");
}
private String escapeLineBreak(final String field) {
return field.replaceAll("\\R", " ");
}
private String escapeField(final String field) {
return "\"" + field + "\"";
}