首页 > 解决方案 > 按名称显示实体字段

问题描述

我在数据库中有很多字段的大型实体。我想形成一个仅包含选定字段的 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 映射,但似乎并不好。谢谢你。

标签: javaexcelreflection

解决方案


推荐阅读