У меня есть список объектов, которые являются экземплярами ряда подклассов базового класса. Я пытался записать эти объекты вместе в один файл CSV.
Каждый класс содержит поля базового класса и добавляет пару дополнительных полей.
То, чего я пытаюсь добиться, это выписать CSV, имеющий сначала поля базового класса, а затем столбцы, идущие от остальных подклассов. Это, конечно, означает, что подклассы, которые не содержат конкретного имени столбца, должны иметь это поле пустым.
Я пытался добиться этого с помощью OpenCSV и SuperCSV, но мне не удалось настроить их для этого. Глядя на код библиотек, я почти уверен, что OpenCSV не сделает этого. Используя SuperCSV с Dozer, я получил несколько классов для записи в один файл, но я не могу получить пустые столбцы там, где у класса отсутствует определенное поле столбца.
Очевидно, что я могу написать свой собственный модуль записи CSV, чтобы достичь этого, но мне было интересно, сможет ли кто-нибудь помочь мне найти решение, основанное на существующей библиотеке модуля записи CSV.
Редактировать: код SuperCSV добавлен ниже по запросу комментатора
private static final String[] FIELD_MAPPING = new String[] { "documentNumber", "lineOfBusiness", "clientId", "childClass1Field", };
private static final String[] FIELD_MAPPING2 = new String[] { "documentNumber", "lineOfBusiness", "clientId", "childClass2Field1", "childClass2Field2"};
public static void writeWithCsvBeanWriter(PrintWriter writer, List<ParentClass> documents) throws Exception {
CsvDozerBeanWriter beanWriter = null;
try {
beanWriter = new CsvDozerBeanWriter(writer, CsvPreference.STANDARD_PREFERENCE);
final String[] header = new String[] { "documentNumber", "lineOfBusiness", "clientId", "childClass1Field", "childClass2Field1", "childClass2Field2"};
beanWriter.configureBeanMapping(ChildClass1.class, FIELD_MAPPING);
beanWriter.configureBeanMapping(ChildClass2.class, FIELD_MAPPING2);
final CellProcessor[] processors = new CellProcessor[] { new Optional(), new Optional(), new Optional(), new Optional() }
final CellProcessor[] processors2 = new CellProcessor[] { new Optional(), new Optional(), new Optional(), new Optional(), new Optional() }
beanWriter.writeHeader(header);
for (final ParentClass document : documents) {
if (document instanceof ChildClass1) {
beanWriter.write(document, processors);
} else {
beanWriter.write(document, processors2);
}
}
} finally {
if (beanWriter != null) {
beanWriter.close();
}
}
}