已知的API将Bean / ResultSet写入CSV文件

时间:2012-03-20 17:13:23

标签: java api csv

我想通过Reflection机制将Java Bean或ResultSet(JDBC)导出到CSV文件中。

我见过这个api:

http://opencsv.sourceforge.net/apidocs/au/com/bytecode/opencsv/bean/BeanToCsv.html

但尚未发布。

另外,如果我们可以设置一些过滤器来避免映射一些精确的字段,那就没问题了。

您知道拥有这些功能的已知API吗?

3 个答案:

答案 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

  • 标题样式类需要扩展ToStringStyle
  • 使用单个元素调用toString,例如ReflectionToStringBuilder.toString(firstElement,headerStyle)

构造函数:

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);
}

身体

  • body类需要扩展RecursiveToStringStyle
  • 使用数组调用toString,例如ReflectionToStringBuilder.toString(array,bodyStyle)

构造函数:

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 + "\"";
}