Search code examples
vaadinexport-to-excelvaadin7

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?


Solution

  • 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