#java #excel #reflection
Вопрос:
У меня есть большая сущность со многими полями в базе данных. Я хотел бы сформировать документ excel, содержащий только выбранные поля — я имею в виду выбранные пользователем.
@Data
@Entity
@Table(name = "ATTRIBUTE")
public class attribute {
@Column(name = "INN")
private String inn;
@Column(name = "OWNERSHIP")
private String ownership;
@Column(name = "NAME")
private String name;
//...
}
@PostMapping("/create")
public ResponseEntity<StreamingResponseBody> createDocument(@RequestBody List<String> attributes) {
//...
}
Так, в списке атрибутов может быть любая комбинация названий полей — «имя», «владение» и т.д., Поэтому, если пользователь выбрал поля «имя» и «владение», то в результирующем документе должно быть только два этих поля.
Очевидный путь-использовать api отражения, это довольно простой способ, но очень уродливый IMO.
public byte[] formDocument(Attribute attribute, List<String> fields) {
try (Workbook book = new XSSFWorkbook();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
Sheet sheet = book.createSheet();
Row row = createRow();
for (String field : fields) {
createCell(row, attribute, field);
}
book.write(outputStream);
return outputStream.toByteArray();
} catch (IOException e) {
throw new ExcelException();
}
}
//....
public Object getFieldValue(Attribute attribute, String fieldName) throws IllegalAccessException {
Optional<Field> requiredField = Arrays.stream(Attribute.class.getDeclaredFields())
.filter(field -> field.getName().equals(fieldName))
.findFirst();
if (requiredField.isPresent()) {
return requiredField.get().get(attribute);
} else {
throw new FieldNotFoundException();
}
}
Что-то вроде этого. Итак, я хотел бы спросить — есть ли более чистые, более красивые способы сделать это? Я думал о некотором отображении json, но это не кажется лучше.
Спасибо.
Комментарии:
1. На самом деле это не решение, а скорее совет, который мог бы помочь: взгляните на GraphQL graphql.org