Как отобразить объект в столбце с помощью apache-poi - PullRequest
0 голосов
/ 05 февраля 2019

У меня большой DTO с ровно 234 полями, и я должен отображать значения каждого поля этого DTO в столбце файла Excel, созданного с помощью apache-poi.

Это мой код:

// Blank workbook
XSSFWorkbook workbook = new XSSFWorkbook();

Sheet sheet = workbook.createSheet("Export values");

// Get the Entity
Simfoot simEntity = simService.findById(simId).get();

Row row = sheet.createRow(0);
row.createCell(1).setCellValue("Consult our values");

// and after this I want to convert my Simfoot object to a column in the third column ( so creteCell(2) ..... ).

Я хочу, чтобы в моем первом столбце ничего не было, во втором - только отображение строки («Обратитесь к нашим значениям»), а в третьем столбце - 234 поля.С полем (значением поля) в одной ячейке.Итак, 234 строки отображают одно значение в третьем столбце.

Надеюсь, это понятно.

Большое спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Используя некоторое отражение:

    // Blank workbook
    XSSFWorkbook workbook = new XSSFWorkbook();

    final Sheet sheet = workbook.createSheet("Export values");

    // Get the Entity
    final Simfoot simEntity = simService.findById(simId).get();

    Row row = sheet.createRow(0);
    row.createCell(1).setCellValue("Consult our values");

    // and after this I want to convert my Simfoot object to a column in the third column ( so creteCell(2) ..... ).
    Arrays.stream(simEntity.getClass().getDeclaredMethods())
            .filter(m -> m.getName().startsWith("get") && m.getParameterTypes().length == 0 && !void.class.equals(m.getReturnType()))
            .forEach(m -> {
                    try {
                            Object value = m.invoke(simEntity, null);
                            Row r = sheet.createRow(sheet.getLastRowNum()+1);
                            r.createCell(2).setCellValue(value == null ? "" : value.toString());
                    }
                    catch (Exception ex) {
                            // Manage Exception....
                    }
            });
0 голосов
/ 05 февраля 2019

Я добавлю метод для Simfoot, чтобы он возвращал все значения:

public List<String> getAllValues() {
    return Arrays.asList(getAtt1(), getAtt2(), .. , getAtt234());
}

Затем создайте строку для каждого атрибута, а затем вы можете объединить строки первых 2 столбцов.Пример здесь с 6 атрибутами:

int n = 6; // would be 234 for you
XSSFCellStyle styleAlignTop = workbook.createCellStyle();
styleAlignTop.setVerticalAlignment(VerticalAlignment.TOP);
Row row;
for(int i=0; i<n; i++) {
    row = sheet.createRow(i);
    if(i==0) {
        Cell cell = row.createCell(1);
        cell.setCellStyle(styleAlignTop);
        cell.setCellValue("Consult our values");
    }
    row.createCell(2).setCellValue(simEntity.getAllValues().get(i));
}
sheet.addMergedRegion(new CellRangeAddress(0, n-1, 0, 0));
sheet.addMergedRegion(new CellRangeAddress(0, n-1, 1, 1));

Это выглядит так: enter image description here

Другой способ перечислить ваши атрибуты - использовать Reflection, но я нахожу егоочень неуклюжий:

Simfoot simEntity = new Simfoot("pap", "pep", "pip", "pop", "pup", "pyp");

for(PropertyDescriptor propertyDescriptor :
    Introspector.getBeanInfo(Simfoot.class).getPropertyDescriptors()) {
        System.out.println(propertyDescriptor.getReadMethod().invoke(simEntity));
}

Выходы:

pap
pep
pip
pop
pup
pyp
class Simfoot

, поэтому вы должны отфильтровать getClass и любые другие нежелательные методы и методы получения

...