Ortzi
Ortzi

Reputation: 373

Vaadin excel export with converter values

I'm trying to export an Excel corresponding to a FilterTable using Vaadin TableExport. That Filtertable has some columns storing Dates and other class type elements, so I'm using setConverter function to print them as specific Strings:

filerTable.setConverter("dateColumn", dateConverter);
filerTable.setConverter("myClassColumn", myClassConverter);

dateConverter and myClassConverter are instances of some classes to print that column values as Strings.

The problem comes when I want to export the table as an Excel: That setConverter conversions are not being applied to the output file. For example, date cells are being exported as string ('42741,0080787037' instead of '06/01/17 0:11'). The code section to export the Excel file is:

ExcelExport exp = new ExcelExport(new CustomTableHolder(filerTable), "excel.xls");
exp.setRowHeaders(true);
exp.export();

Is there any way to export the table exactly as shown, having applied setConverter function?

Upvotes: 2

Views: 786

Answers (1)

Morfic
Morfic

Reputation: 15518

Looking at the add-on sources, it seems that this feature is supported but 2 things have to happen in order for it to work:

Code:

public class ExcelExportTableComponent extends VerticalLayout {

    public ExcelExportTableComponent() {
        // basic table configuration
        Table table = new PropertyFormatTable();
        BeanItemContainer<Person> itemContainer = new BeanItemContainer<>(Person.class);
        table.setContainerDataSource(itemContainer);
        table.setConverter("age", new AgeConverter());

        // add some dummy data to the table
        Random random = new Random();
        for (int i = 0; i < 10; i++) {
            itemContainer.addItem(new Person("Name " + i, "Surname " + i, random.nextInt(99) + 1));
        }

        // add components to the layout
        addComponent(table);
        addComponent(new Button("Export to excel", event -> {
            ExcelExport excelExport = new ExcelExport(table);
            excelExport.setUseTableFormatPropertyValue(true);
            excelExport.excludeCollapsedColumns();
            excelExport.setReportTitle("Demo Report");
            excelExport.export();
        }));
    }


    // basic bean for data binding
    public static class Person {
        private String name;
        private String surname;
        private int age;

        public Person(String name, String surname, int age) {
            this.name = name;
            this.surname = surname;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getSurname() {
            return surname;
        }

        public void setSurname(String surname) {
            this.surname = surname;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }

    // custom converter
    private static class AgeConverter implements Converter<String, Integer> {
        @Override
        public Integer convertToModel(String value, Class<? extends Integer> targetType, Locale locale) throws ConversionException {
            return Integer.valueOf(value.substring(0, value.indexOf(" years")));
        }

        @Override
        public String convertToPresentation(Integer value, Class<? extends String> targetType, Locale locale) throws ConversionException {
            return String.valueOf(value) + " years";
        }

        @Override
        public Class<Integer> getModelType() {
            return Integer.class;
        }

        @Override
        public Class<String> getPresentationType() {
            return String.class;
        }
    }
}

Output:

Output

Upvotes: 2

Related Questions