这当然可以通过 Super CSV 实现。只需在 nameMapping 数组中提供一个 null 条目即可始终写入一个空白列。
private static void writePartial() throws IOException {
Person person1 = new Person("John", "K", "Smith");
Person person2 = new Person("Sally", "T", "Brown");
CsvPreference csvPrefs = new CsvPreference.Builder('"', ';', "\n").build();
String[] nameMapping = new String[] { "firstName", null, "lastName" };
try (ICsvBeanWriter writer = new CsvBeanWriter(new FileWriter("output.csv"), csvPrefs)) {
writer.writeHeader("firstName", "middleName", "lastName");
for( Person p : Arrays.asList(person1, person2) ) {
writer.write(p, nameMapping);
}
}
}
你应该得到以下输出:
firstName;middleName;lastName
John;;Smith
Sally;;Brown
这可能是最简单的解决方案,但如果您需要更灵活的方法(例如,您可能想要验证字段值,但永远不要编写它),那么您可以创建一个自定义单元处理器以确保该字段永远不会书面。
只需定义一个始终忽略 bean 中的值的单元处理器:
public class Ignore extends CellProcessorAdaptor {
@Override
public Object execute(Object value, CsvContext context) {
return null;
}
}
然后使用它:
private static void writePartial() throws IOException {
Person person1 = new Person("John", "K", "Smith");
Person person2 = new Person("Sally", "T", "Brown");
CsvPreference csvPrefs = new CsvPreference.Builder('"', ';', "\n").build();
String[] nameMapping = new String[] { "firstName", "middleName", "lastName" };
CellProcessor[] processors = new CellProcessor[] { new Optional(), new Ignore(), new Optional() };
try (ICsvBeanWriter writer = new CsvBeanWriter(new FileWriter("output.csv"), csvPrefs)) {
writer.writeHeader(nameMapping);
for( Person p : Arrays.asList(person1, person2) ) {
writer.write(p, nameMapping, processors);
}
}
}
因此,您可以将其链接在一起 new NotNull(new Ignore()) 以验证 bean 的 middleName 字段始终具有值,但永远不要写入它。这也意味着如果您稍后改变主意并想要写入该值,您可以将 Ignore() 处理器替换为 Optional()(或 NotNull(),或任何您喜欢的),然后查看它应该写中间名字段,而不是忽略它。