我正在使用superCSV将bean数据导出为CSV。我想要引用每个单元格,而不仅仅是带有特殊字符的单元格。
现在,使用CsvPreference.EXCEL_NORTH_EUROPE_PREFERENCE,即使具有特殊字符的单元格也不会被引用。 (使用EXCEL_PREFERENCE设置包含'。'的地址。引用。)
我的目标是以MS Office(匈牙利语)可以使用的方式导出地址,电话号码,所有内容,即不会将电话号码转换为+36000000000至36000000000。
答案 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;
}
}
}