Fizik26
Fizik26

Reputation: 839

How to display an Object in a column with apache-poi

I have a big DTO with exactly 234 fields, and I have to display values of each fields of this DTO in a column of an Excel file created with apache-poi.

This is my code :

// 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) ..... ).

I want to have in my first column : nothing , in my second only the String display ( "Consult our values" ) and in my third column I need to have my 234 fields. With an field ( the value of the field ) in one cell. So, 234 rows displaying one value in the third column.

I hope that it is clear.

Thanks a lot for your help.

Upvotes: 0

Views: 1369

Answers (2)

Bentaye
Bentaye

Reputation: 9756

I'll add a method on Simfoot to return all the values:

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

Then create a row per attribute, and then you can merge the rows of the first 2 columns. Example here with 6 attributes:

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));

It shows like this: enter image description here

Another way to list your attributes would be to use Reflection but I find it very clunky:

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));
}

Outputs:

pap
pep
pip
pop
pup
pyp
class Simfoot

so you have to filter out getClass and any other unwanted methods and getters

Upvotes: 0

mnesarco
mnesarco

Reputation: 2768

Using some reflection:

    // 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....
                    }
            });

Upvotes: 1

Related Questions