3

我正在使用 superCSV 将 bean 数据导出到 CSV。我希望每个单元格都双引号,而不仅仅是带有特殊字符的单元格。

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

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

4

1 回答 1

3

编辑:超级 CSV 2.1.0 的更新

从 Super CSV 2.1.0 开始,您现在可以QuoteMode通过首选项指定 a 以在通常不需要引号时启用引号。要引用每一列,您可以使用内置的AlwaysQuoteMode. 如果要为特定列启用引号,请使用ColumnQuoteMode. 请注意,您不能以这种方式禁用引用,您必须自己CsvEncoder提供才能这样做。


感谢您提请我注意该论坛帖子!看起来 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;
        }
    }

}
于 2012-04-17T10:32:07.663 回答