SuperCSV引用每个导出的单元格

时间:2012-04-16 15:41:43

标签: java csv export-to-csv quote supercsv

我正在使用superCSV将bean数据导出为CSV。我想要引用每个单元格,而不仅仅是带有特殊字符的单元格。

现在,使用CsvPreference.EXCEL_NORTH_EUROPE_PREFERENCE,即使具有特殊字符的单元格也不会被引用。 (使用EXCEL_PREFERENCE设置包含'。'的地址。引用。)

我的目标是以MS Office(匈牙利语)可以使用的方式导出地址,电话号码,所有内容,即不会将电话号码转换为+36000000000至36000000000。

1 个答案:

答案 0 :(得分:3)

编辑:Super CSV 2.1.0的更新

从Super CSV 2.1.0开始,您现在可以通过首选项指定QuoteMode,以便在通常不需要时启用引号。要引用每一列,您可以使用内置的AlwaysQuoteMode。如果要为特定列启用引号,请使用ColumnQuoteMode。请注意,您无法以这种方式停用引用,您必须提供自己的CsvEncoder来执行此操作。


感谢您将forum post提请我注意!看起来Kasper没有开始实现该功能。我会看到我能为即将发布的版本做些什么:)

您可以在自己的项目中扩展Super CSV实施,而不是攻击Super CSV源以添加“引用所有”功能。正如您所提到的,如果包含特殊字符(引号,逗号等),Super CSV仅引用整个字段 - 如果字段包含前导/尾随空格,它也会执行此操作。

考虑到这一点,你没有理由不能编写自己的Writer来覆盖escapeString()方法(你必须确保它尚未被引用)。

package org.supercsv.io;

import java.io.Writer;

import org.supercsv.prefs.CsvPreference;

public class QuoteAllCsvBeanWriter extends CsvBeanWriter {

    public QuoteAllCsvBeanWriter(Writer writer, CsvPreference preference) {
        super(writer, preference);
    }

    @Override
    protected String escapeString(String csvElement) {

        // perform normal escaping
        final String escaped = super.escapeString(csvElement);

        // add surrounding quotes if required
        final String quote = String.valueOf((char) preference.getQuoteChar());
        if (escaped.startsWith(quote) && escaped.endsWith(quote)){
            return escaped;
        } else {
            return quote + escaped + quote;
        }
    }

}