From 061a5990726611c089be06a56c7789812083cf37 Mon Sep 17 00:00:00 2001 From: haijian Date: Fri, 10 May 2019 22:42:56 +0300 Subject: [PATCH 01/12] added xlsx support for v8 --- README.md | 2 +- exporter-addon/pom.xml | 9 ++++++-- .../org/vaadin/haijian/ExcelFileBuilder.java | 20 ++++++++-------- .../java/org/vaadin/haijian/Exporter.java | 8 +++++++ .../org/vaadin/haijian/XlsFileBuilder.java | 9 ++++++++ .../org/vaadin/haijian/XlsxFileBuilder.java | 23 +++++++++++++++++++ exporter-demo/pom.xml | 2 +- .../demo/helpers/GridDemoViewCreator.java | 2 +- pom.xml | 2 +- 9 files changed, 62 insertions(+), 15 deletions(-) create mode 100644 exporter-addon/src/main/java/org/vaadin/haijian/XlsFileBuilder.java create mode 100644 exporter-addon/src/main/java/org/vaadin/haijian/XlsxFileBuilder.java diff --git a/README.md b/README.md index 4d0f8cf..d94a1ac 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,6 @@ Exporter is written by Haijian Wang Here is a simple example on how to try out the add-on component: Button downloadAsExcel = new Button("Download As Excel"); -StreamResource excelStreamResource = new StreamResource((StreamResource.StreamSource) () -> Exporter.exportAsExcel(grid), "my-excel.xls"); +StreamResource excelStreamResource = new StreamResource((StreamResource.StreamSource) () -> Exporter.exportAsXlsx(grid), "my-excel.xlsx"); FileDownloader excelFileDownloader = new FileDownloader(excelStreamResource); excelFileDownloader.extend(downloadAsExcel); diff --git a/exporter-addon/pom.xml b/exporter-addon/pom.xml index 0b58c28..2f264de 100644 --- a/exporter-addon/pom.xml +++ b/exporter-addon/pom.xml @@ -5,7 +5,7 @@ org.vaadin.haijian exporter jar - 2.0.0 + 2.0.1 Exporter @@ -70,7 +70,12 @@ org.apache.poi poi - 3.9 + 4.1.0 + + + org.apache.poi + poi-ooxml + 4.1.0 org.slf4j diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java b/exporter-addon/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java index a470444..6fd2065 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java @@ -7,6 +7,7 @@ import java.io.FileOutputStream; import java.util.Calendar; +import java.util.Date; public class ExcelFileBuilder extends FileBuilder { private static final String EXCEL_FILE_EXTENSION = ".xls"; @@ -53,20 +54,17 @@ protected void onNewCell() { @Override protected void buildCell(Object value) { if (value == null) { - cell.setCellType(Cell.CELL_TYPE_BLANK); + cell.setBlank(); } else if (value instanceof Boolean) { cell.setCellValue((Boolean) value); - cell.setCellType(Cell.CELL_TYPE_BOOLEAN); } else if (value instanceof Calendar) { - Calendar calendar = (Calendar) value; - cell.setCellValue(calendar.getTime()); - cell.setCellType(Cell.CELL_TYPE_STRING); + cell.setCellValue((Calendar) value); + } else if (value instanceof Date) { + cell.setCellValue((Date) value); } else if (value instanceof Double) { cell.setCellValue((Double) value); - cell.setCellType(Cell.CELL_TYPE_NUMERIC); } else { cell.setCellValue(value.toString()); - cell.setCellType(Cell.CELL_TYPE_STRING); } } @@ -79,7 +77,7 @@ protected void buildColumnHeaderCell(String header) { private CellStyle getBoldStyle() { if (boldStyle == null) { Font bold = workbook.createFont(); - bold.setBoldweight(Font.BOLDWEIGHT_BOLD); + bold.setBold(true); boldStyle = workbook.createCellStyle(); boldStyle.setFont(bold); @@ -96,7 +94,7 @@ protected void buildFooter() { @Override protected void resetContent() { - workbook = new HSSFWorkbook(); + workbook = createWorkbook(); sheet = workbook.createSheet(); colNr = 0; rowNr = 0; @@ -104,4 +102,8 @@ protected void resetContent() { cell = null; boldStyle = null; } + + protected Workbook createWorkbook() { + return new HSSFWorkbook(); + } } diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java b/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java index db776b0..767311b 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java @@ -12,6 +12,14 @@ public static InputStream exportAsExcel(Grid grid){ return new ExcelFileBuilder<>(grid).build(); } + public static InputStream exportAsXls(Grid grid){ + return new XlsFileBuilder<>(grid).build(); + } + + public static InputStream exportAsXlsx(Grid grid){ + return new XlsxFileBuilder<>(grid).build(); + } + public static InputStream exportAsCSV(Grid grid){ return new CSVFileBuilder<>(grid).build(); } diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/XlsFileBuilder.java b/exporter-addon/src/main/java/org/vaadin/haijian/XlsFileBuilder.java new file mode 100644 index 0000000..e8735ef --- /dev/null +++ b/exporter-addon/src/main/java/org/vaadin/haijian/XlsFileBuilder.java @@ -0,0 +1,9 @@ +package org.vaadin.haijian; + +import com.vaadin.ui.Grid; + +public class XlsFileBuilder extends ExcelFileBuilder{ + XlsFileBuilder(Grid grid) { + super(grid); + } +} diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/XlsxFileBuilder.java b/exporter-addon/src/main/java/org/vaadin/haijian/XlsxFileBuilder.java new file mode 100644 index 0000000..2480a4a --- /dev/null +++ b/exporter-addon/src/main/java/org/vaadin/haijian/XlsxFileBuilder.java @@ -0,0 +1,23 @@ +package org.vaadin.haijian; + +import com.vaadin.ui.Grid; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +public class XlsxFileBuilder extends ExcelFileBuilder{ + private static final String EXCEL_FILE_EXTENSION = ".xlsx"; + + XlsxFileBuilder(Grid grid) { + super(grid); + } + + @Override + public String getFileExtension() { + return EXCEL_FILE_EXTENSION; + } + + @Override + protected Workbook createWorkbook() { + return new XSSFWorkbook(); + } +} diff --git a/exporter-demo/pom.xml b/exporter-demo/pom.xml index 5bd310a..3921e6b 100644 --- a/exporter-demo/pom.xml +++ b/exporter-demo/pom.xml @@ -5,7 +5,7 @@ org.vaadin.haijian exporter-demo war - 2.0.0 + 2.0.1 Exporter Add-on Demo diff --git a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java index 59a19e3..3400f87 100644 --- a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java +++ b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java @@ -52,7 +52,7 @@ private static Component createGridDemo(boolean lazyLoading) { Button downloadAsExcel = new Button("Download As Excel"); Button downloadAsCSV = new Button("Download As CSV"); - StreamResource excelStreamResource = new StreamResource((StreamResource.StreamSource) () -> Exporter.exportAsExcel(grid), "my-excel.xls"); + StreamResource excelStreamResource = new StreamResource((StreamResource.StreamSource) () -> Exporter.exportAsXlsx(grid), "my-excel.xlsx"); FileDownloader excelFileDownloader = new FileDownloader(excelStreamResource); excelFileDownloader.extend(downloadAsExcel); diff --git a/pom.xml b/pom.xml index 1d6065c..e9d6cbf 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.vaadin.addons exporter-root pom - 2.0.0 + 2.0.1 Exporter Add-on Root Project From c6a2a4b0640c3241ec14880cd950dd49be939845 Mon Sep 17 00:00:00 2001 From: haijian Date: Fri, 10 May 2019 23:08:45 +0300 Subject: [PATCH 02/12] make xlsx default file extension for v8 --- README.md | 2 +- .../src/main/java/org/vaadin/haijian/Exporter.java | 6 +----- .../vaadin/haijian/demo/helpers/GridDemoViewCreator.java | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d94a1ac..5c26753 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,6 @@ Exporter is written by Haijian Wang Here is a simple example on how to try out the add-on component: Button downloadAsExcel = new Button("Download As Excel"); -StreamResource excelStreamResource = new StreamResource((StreamResource.StreamSource) () -> Exporter.exportAsXlsx(grid), "my-excel.xlsx"); +StreamResource excelStreamResource = new StreamResource((StreamResource.StreamSource) () -> Exporter.exportAsExcel(grid), "my-excel.xlsx"); FileDownloader excelFileDownloader = new FileDownloader(excelStreamResource); excelFileDownloader.extend(downloadAsExcel); diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java b/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java index 767311b..6a2c231 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java @@ -9,17 +9,13 @@ public class Exporter { private Exporter(){} public static InputStream exportAsExcel(Grid grid){ - return new ExcelFileBuilder<>(grid).build(); + return new XlsxFileBuilder<>(grid).build(); } public static InputStream exportAsXls(Grid grid){ return new XlsFileBuilder<>(grid).build(); } - public static InputStream exportAsXlsx(Grid grid){ - return new XlsxFileBuilder<>(grid).build(); - } - public static InputStream exportAsCSV(Grid grid){ return new CSVFileBuilder<>(grid).build(); } diff --git a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java index 3400f87..12aec48 100644 --- a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java +++ b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java @@ -52,7 +52,7 @@ private static Component createGridDemo(boolean lazyLoading) { Button downloadAsExcel = new Button("Download As Excel"); Button downloadAsCSV = new Button("Download As CSV"); - StreamResource excelStreamResource = new StreamResource((StreamResource.StreamSource) () -> Exporter.exportAsXlsx(grid), "my-excel.xlsx"); + StreamResource excelStreamResource = new StreamResource((StreamResource.StreamSource) () -> Exporter.exportAsExcel(grid), "my-excel.xlsx"); FileDownloader excelFileDownloader = new FileDownloader(excelStreamResource); excelFileDownloader.extend(downloadAsExcel); From 169ad2edee60ce6ded7bba17d6696558d4758703 Mon Sep 17 00:00:00 2001 From: haijian Date: Thu, 23 May 2019 15:06:36 +0300 Subject: [PATCH 03/12] added custom column header support --- .../org/vaadin/haijian/CSVFileBuilder.java | 5 ++-- .../org/vaadin/haijian/ExcelFileBuilder.java | 5 ++-- .../java/org/vaadin/haijian/Exporter.java | 19 +++++++++++--- .../java/org/vaadin/haijian/FileBuilder.java | 25 +++++++++++++++---- .../org/vaadin/haijian/XlsFileBuilder.java | 5 ++-- .../org/vaadin/haijian/XlsxFileBuilder.java | 5 ++-- .../vaadin/haijian/option/ColumnOption.java | 24 ++++++++++++++++++ .../vaadin/haijian/option/ExporterOption.java | 20 +++++++++++++++ .../demo/helpers/GridDemoViewCreator.java | 23 ++++++++++++++++- 9 files changed, 114 insertions(+), 17 deletions(-) create mode 100644 exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java create mode 100644 exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/CSVFileBuilder.java b/exporter-addon/src/main/java/org/vaadin/haijian/CSVFileBuilder.java index 5cef1aa..d9b39e5 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/CSVFileBuilder.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/CSVFileBuilder.java @@ -2,6 +2,7 @@ import com.vaadin.ui.Grid; import org.slf4j.LoggerFactory; +import org.vaadin.haijian.option.ExporterOption; import java.io.FileWriter; import java.io.IOException; @@ -11,8 +12,8 @@ public class CSVFileBuilder extends FileBuilder { private int rowNr; private int colNr; - CSVFileBuilder(Grid grid) { - super(grid); + CSVFileBuilder(Grid grid, ExporterOption option) { + super(grid, option); } @Override diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java b/exporter-addon/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java index 6fd2065..263726e 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java @@ -4,6 +4,7 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.slf4j.LoggerFactory; +import org.vaadin.haijian.option.ExporterOption; import java.io.FileOutputStream; import java.util.Calendar; @@ -20,8 +21,8 @@ public class ExcelFileBuilder extends FileBuilder { private Cell cell; private CellStyle boldStyle; - ExcelFileBuilder(Grid grid) { - super(grid); + ExcelFileBuilder(Grid grid, ExporterOption option) { + super(grid, option); } @Override diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java b/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java index 6a2c231..d9e4785 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java @@ -1,6 +1,7 @@ package org.vaadin.haijian; import com.vaadin.ui.Grid; +import org.vaadin.haijian.option.ExporterOption; import java.io.InputStream; @@ -9,14 +10,26 @@ public class Exporter { private Exporter(){} public static InputStream exportAsExcel(Grid grid){ - return new XlsxFileBuilder<>(grid).build(); + return exportAsExcel(grid, new ExporterOption()); } public static InputStream exportAsXls(Grid grid){ - return new XlsFileBuilder<>(grid).build(); + return exportAsXls(grid, new ExporterOption()); } public static InputStream exportAsCSV(Grid grid){ - return new CSVFileBuilder<>(grid).build(); + return exportAsCSV(grid, new ExporterOption()); + } + + public static InputStream exportAsExcel(Grid grid, ExporterOption option){ + return new XlsxFileBuilder<>(grid, option).build(); + } + + public static InputStream exportAsXls(Grid grid, ExporterOption option){ + return new XlsFileBuilder<>(grid, option).build(); + } + + public static InputStream exportAsCSV(Grid grid, ExporterOption option){ + return new CSVFileBuilder<>(grid, option).build(); } } diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java b/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java index c8b3870..46c763a 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java @@ -7,6 +7,8 @@ import com.vaadin.data.provider.Query; import com.vaadin.ui.Grid; import org.slf4j.LoggerFactory; +import org.vaadin.haijian.option.ColumnOption; +import org.vaadin.haijian.option.ExporterOption; import java.io.File; import java.io.FileInputStream; @@ -26,14 +28,15 @@ public abstract class FileBuilder { private Collection columns; private PropertySet propertySet; private boolean headerRowBuilt = false; + private ExporterOption option; - @SuppressWarnings("unchecked") - FileBuilder(Grid grid) { + FileBuilder(Grid grid, ExporterOption option) { this.grid = grid; columns = grid.getColumns().stream().filter(this::isExportable).collect(Collectors.toList()); if (columns.isEmpty()) { throw new ExporterException("No exportable column found, did you remember to set property name as the key for column"); } + this.option = option; } private boolean isExportable(Grid.Column column) { @@ -73,15 +76,27 @@ private void buildHeaderRow() { Optional> propertyDefinition = propertySet.getProperty(column.getId()); if (propertyDefinition.isPresent()) { onNewCell(); - buildColumnHeaderCell(propertyDefinition.get().getCaption()); + buildColumnHeaderCell(getColumnHeader(propertyDefinition.get())); } else { - LoggerFactory.getLogger(this.getClass()).warn(String.format("Column key %s is a property which cannot be found", column.getId())); + LoggerFactory.getLogger(this.getClass()).warn(String.format("Column id %s is a property which cannot be found", column.getId())); } }); headerRowBuilt = true; } + private String getColumnHeader(PropertyDefinition propertyDefinition){ + ColumnOption columnOption = option.getColumnOption(propertyDefinition.getName()); + String columnName = columnOption.getColumnName(); + if(columnName==null){ + columnName = propertyDefinition.getCaption(); + } + if(columnOption.isUpperCase()){ + columnName = columnName.toUpperCase(); + } + return columnName; + } + void buildColumnHeaderCell(String header) { } @@ -123,7 +138,7 @@ private void buildRow(T item) { onNewCell(); buildCell(propertyDefinition.get().getGetter().apply(item)); } else { - throw new ExporterException("Column key: " + column.getId() + " is a property which cannot be found"); + throw new ExporterException("Column id: " + column.getId() + " is a property which cannot be found"); } }); } diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/XlsFileBuilder.java b/exporter-addon/src/main/java/org/vaadin/haijian/XlsFileBuilder.java index e8735ef..d8e5e33 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/XlsFileBuilder.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/XlsFileBuilder.java @@ -1,9 +1,10 @@ package org.vaadin.haijian; import com.vaadin.ui.Grid; +import org.vaadin.haijian.option.ExporterOption; public class XlsFileBuilder extends ExcelFileBuilder{ - XlsFileBuilder(Grid grid) { - super(grid); + XlsFileBuilder(Grid grid, ExporterOption option) { + super(grid, option); } } diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/XlsxFileBuilder.java b/exporter-addon/src/main/java/org/vaadin/haijian/XlsxFileBuilder.java index 2480a4a..a4f93d5 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/XlsxFileBuilder.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/XlsxFileBuilder.java @@ -3,12 +3,13 @@ import com.vaadin.ui.Grid; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.vaadin.haijian.option.ExporterOption; public class XlsxFileBuilder extends ExcelFileBuilder{ private static final String EXCEL_FILE_EXTENSION = ".xlsx"; - XlsxFileBuilder(Grid grid) { - super(grid); + XlsxFileBuilder(Grid grid, ExporterOption option) { + super(grid, option); } @Override diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java b/exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java new file mode 100644 index 0000000..82f7210 --- /dev/null +++ b/exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java @@ -0,0 +1,24 @@ +package org.vaadin.haijian.option; + +public class ColumnOption { + private String columnName; + private boolean upperCase = false; + + public String getColumnName() { + return columnName; + } + + public ColumnOption columnName(String columnName) { + this.columnName = columnName; + return this; + } + + public boolean isUpperCase() { + return upperCase; + } + + public ColumnOption toUpperCase() { + this.upperCase = true; + return this; + } +} diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java b/exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java new file mode 100644 index 0000000..63c5395 --- /dev/null +++ b/exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java @@ -0,0 +1,20 @@ +package org.vaadin.haijian.option; + +import java.util.HashMap; +import java.util.Map; + +public class ExporterOption { + private Map columnOptions; + + public ColumnOption getColumnOption(String columnKey){ + getColumnOptions().putIfAbsent(columnKey, new ColumnOption()); + return getColumnOptions().get(columnKey); + } + + private Map getColumnOptions(){ + if(columnOptions == null){ + columnOptions = new HashMap<>(); + } + return columnOptions; + } +} diff --git a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java index 12aec48..433f292 100644 --- a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java +++ b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java @@ -9,6 +9,8 @@ import com.vaadin.ui.*; import com.vaadin.ui.renderers.LocalDateRenderer; import org.vaadin.haijian.Exporter; +import org.vaadin.haijian.option.ColumnOption; +import org.vaadin.haijian.option.ExporterOption; import java.io.InputStream; import java.util.ArrayList; @@ -52,6 +54,9 @@ private static Component createGridDemo(boolean lazyLoading) { Button downloadAsExcel = new Button("Download As Excel"); Button downloadAsCSV = new Button("Download As CSV"); + Button downloadAsExcelWithCustomHeader = new Button("Download As Excel With Custom Header"); + Button downloadAsCSVWithCustomHeader = new Button("Download As CSV With Custom Header"); + StreamResource excelStreamResource = new StreamResource((StreamResource.StreamSource) () -> Exporter.exportAsExcel(grid), "my-excel.xlsx"); FileDownloader excelFileDownloader = new FileDownloader(excelStreamResource); excelFileDownloader.extend(downloadAsExcel); @@ -59,7 +64,23 @@ private static Component createGridDemo(boolean lazyLoading) { StreamResource csvStreamResource = new StreamResource((StreamResource.StreamSource) () -> Exporter.exportAsCSV(grid), "my-csv.csv"); FileDownloader csvFileDownloader = new FileDownloader(csvStreamResource); csvFileDownloader.extend(downloadAsCSV); - result.addComponents(new HorizontalLayout(downloadAsExcel, downloadAsCSV)); + + + ExporterOption exporterOption = new ExporterOption(); + exporterOption.getColumnOption("name").columnName("My Name").toUpperCase(); + exporterOption.getColumnOption("email").columnName("My Email"); + exporterOption.getColumnOption("age").toUpperCase(); + + StreamResource excelStreamResourceWithCustomHeader = new StreamResource((StreamResource.StreamSource) () -> Exporter.exportAsExcel(grid, exporterOption), "my-excel-with-cutom-header.xlsx"); + FileDownloader excelFileDownloaderWithCustomHeader = new FileDownloader(excelStreamResourceWithCustomHeader); + excelFileDownloaderWithCustomHeader.extend(downloadAsExcelWithCustomHeader); + + StreamResource csvStreamResourceWithCustomHeader = new StreamResource((StreamResource.StreamSource) () -> Exporter.exportAsCSV(grid, exporterOption), "my-csv-with-custom-header.csv"); + FileDownloader csvFileDownloaderWithCustomHeader = new FileDownloader(csvStreamResourceWithCustomHeader); + csvFileDownloaderWithCustomHeader.extend(downloadAsCSVWithCustomHeader); + + + result.addComponents(new HorizontalLayout(downloadAsExcel, downloadAsCSV, downloadAsExcelWithCustomHeader, downloadAsCSVWithCustomHeader)); if(lazyLoading){ setupLazyLoadingDataProviderForGrid(grid, filter); From d6fc47d45513688db08e15a1f825a98d310027a7 Mon Sep 17 00:00:00 2001 From: Peter Lehto Date: Tue, 18 Jun 2019 09:40:59 +0300 Subject: [PATCH 04/12] Allow having external value provider for cell value as well as a function based column header retrieval. --- exporter-addon/pom.xml | 2 +- .../org/vaadin/haijian/CSVFileBuilder.java | 14 +- .../java/org/vaadin/haijian/Exporter.java | 15 ++- .../java/org/vaadin/haijian/FileBuilder.java | 121 ++++++++++++------ .../org/vaadin/haijian/XlsFileBuilder.java | 2 +- .../org/vaadin/haijian/XlsxFileBuilder.java | 2 +- .../vaadin/haijian/option/ColumnOption.java | 25 ++++ .../vaadin/haijian/option/ExporterOption.java | 15 ++- 8 files changed, 140 insertions(+), 56 deletions(-) diff --git a/exporter-addon/pom.xml b/exporter-addon/pom.xml index 2f264de..c20b666 100644 --- a/exporter-addon/pom.xml +++ b/exporter-addon/pom.xml @@ -5,7 +5,7 @@ org.vaadin.haijian exporter jar - 2.0.1 + 2.1.0 Exporter diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/CSVFileBuilder.java b/exporter-addon/src/main/java/org/vaadin/haijian/CSVFileBuilder.java index d9b39e5..499c010 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/CSVFileBuilder.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/CSVFileBuilder.java @@ -30,13 +30,13 @@ protected void resetContent() { @Override protected void buildCell(Object value) { try { - if(value == null){ + if (value == null) { writer.append(""); - }else { + } else { writer.append(value.toString()); } } catch (IOException e) { - LoggerFactory.getLogger(this.getClass()).error("Error building cell "+value, e); + LoggerFactory.getLogger(this.getClass()).error("Error building cell " + value, e); } } @@ -56,12 +56,12 @@ protected void writeToFile() { } } - private void cleanupResource(){ - try{ - if(writer!=null){ + private void cleanupResource() { + try { + if (writer != null) { writer.close(); } - }catch (IOException e){ + } catch (IOException e) { LoggerFactory.getLogger(this.getClass()).error("Unable to close the writer for CSV file", e); } } diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java b/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java index d9e4785..236bc04 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/Exporter.java @@ -7,29 +7,30 @@ public class Exporter { - private Exporter(){} + private Exporter() { + } - public static InputStream exportAsExcel(Grid grid){ + public static InputStream exportAsExcel(Grid grid) { return exportAsExcel(grid, new ExporterOption()); } - public static InputStream exportAsXls(Grid grid){ + public static InputStream exportAsXls(Grid grid) { return exportAsXls(grid, new ExporterOption()); } - public static InputStream exportAsCSV(Grid grid){ + public static InputStream exportAsCSV(Grid grid) { return exportAsCSV(grid, new ExporterOption()); } - public static InputStream exportAsExcel(Grid grid, ExporterOption option){ + public static InputStream exportAsExcel(Grid grid, ExporterOption option) { return new XlsxFileBuilder<>(grid, option).build(); } - public static InputStream exportAsXls(Grid grid, ExporterOption option){ + public static InputStream exportAsXls(Grid grid, ExporterOption option) { return new XlsFileBuilder<>(grid, option).build(); } - public static InputStream exportAsCSV(Grid grid, ExporterOption option){ + public static InputStream exportAsCSV(Grid grid, ExporterOption option) { return new CSVFileBuilder<>(grid, option).build(); } } diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java b/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java index 46c763a..48fd4c4 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java @@ -1,25 +1,28 @@ package org.vaadin.haijian; -import com.vaadin.data.BeanPropertySet; -import com.vaadin.data.PropertyDefinition; -import com.vaadin.data.PropertySet; -import com.vaadin.data.provider.DataCommunicator; -import com.vaadin.data.provider.Query; -import com.vaadin.ui.Grid; -import org.slf4j.LoggerFactory; -import org.vaadin.haijian.option.ColumnOption; -import org.vaadin.haijian.option.ExporterOption; - import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.util.Collection; +import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.slf4j.LoggerFactory; +import org.vaadin.haijian.option.ColumnOption; +import org.vaadin.haijian.option.ExporterOption; + +import com.vaadin.data.BeanPropertySet; +import com.vaadin.data.PropertyDefinition; +import com.vaadin.data.PropertySet; +import com.vaadin.data.ValueProvider; +import com.vaadin.data.provider.DataCommunicator; +import com.vaadin.data.provider.Query; +import com.vaadin.ui.Grid; + public abstract class FileBuilder { private static final String TMP_FILE_NAME = "tmp"; @@ -31,17 +34,45 @@ public abstract class FileBuilder { private ExporterOption option; FileBuilder(Grid grid, ExporterOption option) { - this.grid = grid; + this.grid = Objects.requireNonNull(grid); + this.option = Objects.requireNonNull(option); + columns = grid.getColumns().stream().filter(this::isExportable).collect(Collectors.toList()); if (columns.isEmpty()) { - throw new ExporterException("No exportable column found, did you remember to set property name as the key for column"); + throw new ExporterException( + "No exportable column found, did you remember to set property name as the key for column"); } - this.option = option; + } private boolean isExportable(Grid.Column column) { - return !column.isHidden() && column.getId() != null && !column.getId().isEmpty() - && (propertySet == null || propertySet.getProperty(column.getId()).isPresent()); + if (column.isHidden()) { + return false; + } + + if (column.getId() == null) { + return false; + } + + if (column.getId().trim().isEmpty()) { + return false; + } + + if (option.isUseItemProperties()) { + if (propertySet == null) { + return false; + } + + if (!propertySet.getProperty(column.getId()).isPresent()) { + return false; + } + } + + if (!option.getColumnOption(column.getId()).getValueProviderFunction().isPresent()) { + return false; + } + + return true; } InputStream build() { @@ -73,25 +104,35 @@ protected void resetContent() { private void buildHeaderRow() { columns.forEach(column -> { - Optional> propertyDefinition = propertySet.getProperty(column.getId()); - if (propertyDefinition.isPresent()) { - onNewCell(); - buildColumnHeaderCell(getColumnHeader(propertyDefinition.get())); + if (option.isUseItemProperties()) { + Optional> propertyDefinition = propertySet.getProperty(column.getId()); + if (propertyDefinition.isPresent()) { + onNewCell(); + buildColumnHeaderCell(getColumnHeader(propertyDefinition.get())); + } else { + LoggerFactory.getLogger(this.getClass()) + .warn(String.format("Column id %s is a property which cannot be found", column.getId())); + } } else { - LoggerFactory.getLogger(this.getClass()).warn(String.format("Column id %s is a property which cannot be found", column.getId())); + ColumnOption columnOption = option.getColumnOption(column.getId()); + columnOption.getHeaderProviderFunction().ifPresent(headerProvider -> { + String header = headerProvider.apply(column.getId()); + onNewCell(); + buildCell(header); + }); } }); + headerRowBuilt = true; } - - private String getColumnHeader(PropertyDefinition propertyDefinition){ + private String getColumnHeader(PropertyDefinition propertyDefinition) { ColumnOption columnOption = option.getColumnOption(propertyDefinition.getName()); String columnName = columnOption.getColumnName(); - if(columnName==null){ + if (columnName == null) { columnName = propertyDefinition.getCaption(); } - if(columnOption.isUpperCase()){ + if (columnOption.isUpperCase()) { columnName = columnName.toUpperCase(); } return columnName; @@ -112,8 +153,8 @@ private void buildRows() { LoggerFactory.getLogger(this.getClass()).error("Unable to get filter from DataCommunicator"); } - Query streamQuery = new Query(0, grid.getDataProvider().size(new Query(filter)), grid.getDataCommunicator().getBackEndSorting(), - grid.getDataCommunicator().getInMemorySorting(), null); + Query streamQuery = new Query(0, grid.getDataProvider().size(new Query(filter)), + grid.getDataCommunicator().getBackEndSorting(), grid.getDataCommunicator().getInMemorySorting(), null); Stream dataStream = getDataStream(streamQuery); dataStream.forEach(t -> { @@ -124,7 +165,7 @@ private void buildRows() { @SuppressWarnings("unchecked") private void buildRow(T item) { - if (propertySet == null) { + if (option.isUseItemProperties() && propertySet == null) { propertySet = (PropertySet) BeanPropertySet.get(item.getClass()); columns = columns.stream().filter(this::isExportable).collect(Collectors.toList()); } @@ -133,12 +174,21 @@ private void buildRow(T item) { onNewRow(); } columns.forEach(column -> { - Optional> propertyDefinition = propertySet.getProperty(column.getId()); - if (propertyDefinition.isPresent()) { + ColumnOption columnOption = option.getColumnOption(column.getId()); + Optional> getterFunction = columnOption.getValueProviderFunction(); + if (getterFunction.isPresent()) { + Object value = getterFunction.get().apply(item); onNewCell(); - buildCell(propertyDefinition.get().getGetter().apply(item)); + buildCell(value); } else { - throw new ExporterException("Column id: " + column.getId() + " is a property which cannot be found"); + Optional> propertyDefinition = propertySet.getProperty(column.getId()); + if (propertyDefinition.isPresent()) { + onNewCell(); + buildCell(propertyDefinition.get().getGetter().apply(item)); + } else { + throw new ExporterException( + "Column id: " + column.getId() + " is a property which cannot be found"); + } } }); } @@ -169,14 +219,13 @@ int getNumberOfColumns() { return columns.size(); } - @SuppressWarnings({"unchecked", "rawtypes"}) + @SuppressWarnings({ "unchecked", "rawtypes" }) private Stream getDataStream(Query newQuery) { Stream stream = grid.getDataProvider().fetch(newQuery); if (stream.isParallel()) { - LoggerFactory.getLogger(DataCommunicator.class) - .debug("Data provider {} has returned " - + "parallel stream on 'fetch' call", - grid.getDataProvider().getClass()); + LoggerFactory.getLogger(DataCommunicator.class).debug( + "Data provider {} has returned " + "parallel stream on 'fetch' call", + grid.getDataProvider().getClass()); stream = stream.collect(Collectors.toList()).stream(); assert !stream.isParallel(); } diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/XlsFileBuilder.java b/exporter-addon/src/main/java/org/vaadin/haijian/XlsFileBuilder.java index d8e5e33..ed660bb 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/XlsFileBuilder.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/XlsFileBuilder.java @@ -3,7 +3,7 @@ import com.vaadin.ui.Grid; import org.vaadin.haijian.option.ExporterOption; -public class XlsFileBuilder extends ExcelFileBuilder{ +public class XlsFileBuilder extends ExcelFileBuilder { XlsFileBuilder(Grid grid, ExporterOption option) { super(grid, option); } diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/XlsxFileBuilder.java b/exporter-addon/src/main/java/org/vaadin/haijian/XlsxFileBuilder.java index a4f93d5..ed22375 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/XlsxFileBuilder.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/XlsxFileBuilder.java @@ -5,7 +5,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.vaadin.haijian.option.ExporterOption; -public class XlsxFileBuilder extends ExcelFileBuilder{ +public class XlsxFileBuilder extends ExcelFileBuilder { private static final String EXCEL_FILE_EXTENSION = ".xlsx"; XlsxFileBuilder(Grid grid, ExporterOption option) { diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java b/exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java index 82f7210..58992a6 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java @@ -1,9 +1,17 @@ package org.vaadin.haijian.option; +import java.util.Optional; + +import com.vaadin.data.ValueProvider; +import com.vaadin.server.SerializableFunction; + public class ColumnOption { private String columnName; private boolean upperCase = false; + private ValueProvider valueProvider; + private SerializableFunction headerProvider; + public String getColumnName() { return columnName; } @@ -21,4 +29,21 @@ public ColumnOption toUpperCase() { this.upperCase = true; return this; } + + public void valueProviderFunction(ValueProvider valueProvider) { + this.valueProvider = valueProvider; + } + + public void headerProviderFunction(SerializableFunction headerProvider) { + this.headerProvider = headerProvider; + } + + @SuppressWarnings("unchecked") + public Optional> getValueProviderFunction() { + return Optional.ofNullable(valueProvider); + } + + public Optional> getHeaderProviderFunction() { + return Optional.ofNullable(headerProvider); + } } diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java b/exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java index 63c5395..73553c3 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java @@ -5,16 +5,25 @@ public class ExporterOption { private Map columnOptions; + private boolean useItemProperties; - public ColumnOption getColumnOption(String columnKey){ + public ColumnOption getColumnOption(String columnKey) { getColumnOptions().putIfAbsent(columnKey, new ColumnOption()); return getColumnOptions().get(columnKey); } - private Map getColumnOptions(){ - if(columnOptions == null){ + private Map getColumnOptions() { + if (columnOptions == null) { columnOptions = new HashMap<>(); } return columnOptions; } + + public boolean isUseItemProperties() { + return useItemProperties; + } + + public void setUseItemProperties(boolean useItemProperties) { + this.useItemProperties = useItemProperties; + } } From 20cb8bab871e6e351d343e5cd25aafa3f1856c0f Mon Sep 17 00:00:00 2001 From: haijian Date: Fri, 30 Aug 2019 23:19:51 +0300 Subject: [PATCH 05/12] updated pom files for 2.1.0 --- exporter-addon/pom.xml | 5 +++-- exporter-demo/pom.xml | 6 +++--- pom.xml | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/exporter-addon/pom.xml b/exporter-addon/pom.xml index c20b666..b18ed99 100644 --- a/exporter-addon/pom.xml +++ b/exporter-addon/pom.xml @@ -16,8 +16,8 @@ UTF-8 1.8 1.8 - 8.3.3 - 8.3.3 + 8.8.6 + 8.8.6 ${project.version} @@ -66,6 +66,7 @@ com.vaadin vaadin-server ${vaadin.version} + provided org.apache.poi diff --git a/exporter-demo/pom.xml b/exporter-demo/pom.xml index 3921e6b..63fd460 100644 --- a/exporter-demo/pom.xml +++ b/exporter-demo/pom.xml @@ -5,7 +5,7 @@ org.vaadin.haijian exporter-demo war - 2.0.1 + 2.1.0 Exporter Add-on Demo @@ -16,8 +16,8 @@ UTF-8 1.8 1.8 - 8.3.3 - 8.3.3 + 8.8.6 + 8.8.6 9.3.9.v20160517 diff --git a/pom.xml b/pom.xml index e9d6cbf..7e23035 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.vaadin.addons exporter-root pom - 2.0.1 + 2.1.0 Exporter Add-on Root Project From 753c1189339f01df4d385be6b4b696eeee5ea01d Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Thu, 9 Apr 2020 20:11:52 +0200 Subject: [PATCH 06/12] Resolve package names. --- exporter-addon/.gitignore | 1 + exporter-demo/.gitignore | 1 + exporter-demo/pom.xml | 4 ++++ .../src/main/java/org/vaadin/haijian/demo/DemoUI.java | 5 +++-- .../main/java/org/vaadin/haijian/demo/helpers/AgeGroup.java | 2 +- .../org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java | 2 +- .../main/java/org/vaadin/haijian/demo/helpers/Person.java | 2 +- .../java/org/vaadin/haijian/demo/helpers/PersonService.java | 2 +- 8 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 exporter-addon/.gitignore create mode 100644 exporter-demo/.gitignore diff --git a/exporter-addon/.gitignore b/exporter-addon/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/exporter-addon/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/exporter-demo/.gitignore b/exporter-demo/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/exporter-demo/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/exporter-demo/pom.xml b/exporter-demo/pom.xml index 63fd460..36de46a 100644 --- a/exporter-demo/pom.xml +++ b/exporter-demo/pom.xml @@ -85,6 +85,10 @@ 3.0.1 provided + + com.vaadin + vaadin-server + diff --git a/exporter-demo/src/main/java/org/vaadin/haijian/demo/DemoUI.java b/exporter-demo/src/main/java/org/vaadin/haijian/demo/DemoUI.java index e2b1264..6c900d0 100644 --- a/exporter-demo/src/main/java/org/vaadin/haijian/demo/DemoUI.java +++ b/exporter-demo/src/main/java/org/vaadin/haijian/demo/DemoUI.java @@ -1,4 +1,4 @@ -package org.vaadin.addons.demo; +package org.vaadin.haijian.demo; import com.vaadin.annotations.Theme; import com.vaadin.annotations.Title; @@ -6,10 +6,11 @@ import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinServlet; import com.vaadin.ui.*; -import org.vaadin.addons.demo.helpers.GridDemoViewCreator; import javax.servlet.annotation.WebServlet; +import org.vaadin.haijian.demo.helpers.GridDemoViewCreator; + @Theme("valo") @Title("Exporter Add-on Demo") @SuppressWarnings("serial") diff --git a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/AgeGroup.java b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/AgeGroup.java index 993959d..d19c185 100644 --- a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/AgeGroup.java +++ b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/AgeGroup.java @@ -1,4 +1,4 @@ -package org.vaadin.addons.demo.helpers; +package org.vaadin.haijian.demo.helpers; public class AgeGroup { diff --git a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java index 433f292..3a47ac7 100644 --- a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java +++ b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java @@ -1,4 +1,4 @@ -package org.vaadin.addons.demo.helpers; +package org.vaadin.haijian.demo.helpers; import com.vaadin.data.provider.CallbackDataProvider; import com.vaadin.data.provider.ConfigurableFilterDataProvider; diff --git a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/Person.java b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/Person.java index 9139bd2..1ef4272 100644 --- a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/Person.java +++ b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/Person.java @@ -1,4 +1,4 @@ -package org.vaadin.addons.demo.helpers; +package org.vaadin.haijian.demo.helpers; import java.time.LocalDate; diff --git a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/PersonService.java b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/PersonService.java index d1aec64..5f9cf81 100644 --- a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/PersonService.java +++ b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/PersonService.java @@ -1,4 +1,4 @@ -package org.vaadin.addons.demo.helpers; +package org.vaadin.haijian.demo.helpers; import com.vaadin.data.provider.QuerySortOrder; import com.vaadin.shared.data.sort.SortDirection; From 1ae43d8d719d48a90ce686b0d2504375d15570c0 Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Thu, 9 Apr 2020 20:16:07 +0200 Subject: [PATCH 07/12] Fix gitignore, remove target dir. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index fbc1c34..d8cf671 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,4 @@ *.cache .settings/ widgetsets/ -*/target/* +target/* From c10218858506ffdf07adff249d394aa6c486f75e Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Fri, 10 Apr 2020 02:16:12 +0200 Subject: [PATCH 08/12] Fix user override of header and value providers for exporter. --- .../java/org/vaadin/haijian/FileBuilder.java | 54 +++++++------------ .../vaadin/haijian/option/ColumnOption.java | 4 +- .../vaadin/haijian/option/ExporterOption.java | 19 +++---- .../demo/helpers/GridDemoViewCreator.java | 6 ++- 4 files changed, 36 insertions(+), 47 deletions(-) diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java b/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java index 48fd4c4..ba50594 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java @@ -6,6 +6,7 @@ import java.io.InputStream; import java.lang.reflect.Method; import java.util.Collection; +import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -22,6 +23,7 @@ import com.vaadin.data.provider.DataCommunicator; import com.vaadin.data.provider.Query; import com.vaadin.ui.Grid; +import com.vaadin.ui.Grid.Column; public abstract class FileBuilder { private static final String TMP_FILE_NAME = "tmp"; @@ -36,8 +38,7 @@ public abstract class FileBuilder { FileBuilder(Grid grid, ExporterOption option) { this.grid = Objects.requireNonNull(grid); this.option = Objects.requireNonNull(option); - - columns = grid.getColumns().stream().filter(this::isExportable).collect(Collectors.toList()); + columns = grid.getColumns().stream().filter(this::isColumnExportable).collect(Collectors.toList()); if (columns.isEmpty()) { throw new ExporterException( "No exportable column found, did you remember to set property name as the key for column"); @@ -45,7 +46,7 @@ public abstract class FileBuilder { } - private boolean isExportable(Grid.Column column) { + private boolean isColumnExportable(Grid.Column column) { if (column.isHidden()) { return false; } @@ -58,20 +59,6 @@ private boolean isExportable(Grid.Column column) { return false; } - if (option.isUseItemProperties()) { - if (propertySet == null) { - return false; - } - - if (!propertySet.getProperty(column.getId()).isPresent()) { - return false; - } - } - - if (!option.getColumnOption(column.getId()).getValueProviderFunction().isPresent()) { - return false; - } - return true; } @@ -104,8 +91,11 @@ protected void resetContent() { private void buildHeaderRow() { columns.forEach(column -> { - if (option.isUseItemProperties()) { - Optional> propertyDefinition = propertySet.getProperty(column.getId()); + if (getColumnOption(column).getHeaderProviderFunction().isPresent()) { + onNewCell(); + buildColumnHeaderCell(getColumnOption(column).getHeaderProviderFunction().get().apply(column.getId())); + } else { + Optional> propertyDefinition = propertySet.getProperty(column.getId()); if (propertyDefinition.isPresent()) { onNewCell(); buildColumnHeaderCell(getColumnHeader(propertyDefinition.get())); @@ -113,14 +103,7 @@ private void buildHeaderRow() { LoggerFactory.getLogger(this.getClass()) .warn(String.format("Column id %s is a property which cannot be found", column.getId())); } - } else { - ColumnOption columnOption = option.getColumnOption(column.getId()); - columnOption.getHeaderProviderFunction().ifPresent(headerProvider -> { - String header = headerProvider.apply(column.getId()); - onNewCell(); - buildCell(header); - }); - } + } }); headerRowBuilt = true; @@ -165,19 +148,18 @@ private void buildRows() { @SuppressWarnings("unchecked") private void buildRow(T item) { - if (option.isUseItemProperties() && propertySet == null) { + if (propertySet == null) { propertySet = (PropertySet) BeanPropertySet.get(item.getClass()); - columns = columns.stream().filter(this::isExportable).collect(Collectors.toList()); } + if (!headerRowBuilt) { buildHeaderRow(); onNewRow(); } columns.forEach(column -> { - ColumnOption columnOption = option.getColumnOption(column.getId()); - Optional> getterFunction = columnOption.getValueProviderFunction(); - if (getterFunction.isPresent()) { - Object value = getterFunction.get().apply(item); + Optional> optionalGetter = getColumnOption(column).getValueProviderFunction(); + if (optionalGetter.isPresent()) { + Object value = optionalGetter.get().apply(item); onNewCell(); buildCell(value); } else { @@ -187,12 +169,16 @@ private void buildRow(T item) { buildCell(propertyDefinition.get().getGetter().apply(item)); } else { throw new ExporterException( - "Column id: " + column.getId() + " is a property which cannot be found"); + "Property for column id: " + column.getId() + " cannot be found"); } } }); } + private ColumnOption getColumnOption(Column column) { + return option.getColumnOption(column.getId()); + } + void onNewRow() { } diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java b/exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java index 58992a6..51cbc50 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java @@ -30,11 +30,11 @@ public ColumnOption toUpperCase() { return this; } - public void valueProviderFunction(ValueProvider valueProvider) { + public void setValueProviderFunction(ValueProvider valueProvider) { this.valueProvider = valueProvider; } - public void headerProviderFunction(SerializableFunction headerProvider) { + public void setHeaderProviderFunction(SerializableFunction headerProvider) { this.headerProvider = headerProvider; } diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java b/exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java index 73553c3..149a8bb 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/option/ExporterOption.java @@ -3,27 +3,28 @@ import java.util.HashMap; import java.util.Map; +import com.vaadin.ui.Grid.Column; + public class ExporterOption { private Map columnOptions; - private boolean useItemProperties; + /** + * If does not exist empty {@linkplain ColumnOption option} will be created for given ID. + * + * @param columnKey use column {@link Column#getId() ID} + */ public ColumnOption getColumnOption(String columnKey) { getColumnOptions().putIfAbsent(columnKey, new ColumnOption()); return getColumnOptions().get(columnKey); } + /** + * @return Column mapped by {@link Column#getId() ID} + */ private Map getColumnOptions() { if (columnOptions == null) { columnOptions = new HashMap<>(); } return columnOptions; } - - public boolean isUseItemProperties() { - return useItemProperties; - } - - public void setUseItemProperties(boolean useItemProperties) { - this.useItemProperties = useItemProperties; - } } diff --git a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java index 3a47ac7..3d4fc3d 100644 --- a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java +++ b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java @@ -1,5 +1,6 @@ package org.vaadin.haijian.demo.helpers; +import com.vaadin.data.ValueProvider; import com.vaadin.data.provider.CallbackDataProvider; import com.vaadin.data.provider.ConfigurableFilterDataProvider; import com.vaadin.data.provider.DataProvider; @@ -68,8 +69,9 @@ private static Component createGridDemo(boolean lazyLoading) { ExporterOption exporterOption = new ExporterOption(); exporterOption.getColumnOption("name").columnName("My Name").toUpperCase(); - exporterOption.getColumnOption("email").columnName("My Email"); - exporterOption.getColumnOption("age").toUpperCase(); + //exporterOption.getColumnOption("email").columnName("My Email"); + exporterOption.getColumnOption("age").setHeaderProviderFunction(value -> "True " + value); + exporterOption.getColumnOption("age").setValueProviderFunction(source -> {return (int) Math.round(Math.sqrt(((Person)source).getAge()));}); StreamResource excelStreamResourceWithCustomHeader = new StreamResource((StreamResource.StreamSource) () -> Exporter.exportAsExcel(grid, exporterOption), "my-excel-with-cutom-header.xlsx"); FileDownloader excelFileDownloaderWithCustomHeader = new FileDownloader(excelStreamResourceWithCustomHeader); From 2df257cb51763f9617f251c133cd0cdd3cf93dd8 Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Fri, 10 Apr 2020 02:39:16 +0200 Subject: [PATCH 09/12] Fix user override of header and value providers for exporter. --- .../main/java/org/vaadin/haijian/option/ColumnOption.java | 4 ++-- .../vaadin/haijian/demo/helpers/GridDemoViewCreator.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java b/exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java index 51cbc50..58992a6 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/option/ColumnOption.java @@ -30,11 +30,11 @@ public ColumnOption toUpperCase() { return this; } - public void setValueProviderFunction(ValueProvider valueProvider) { + public void valueProviderFunction(ValueProvider valueProvider) { this.valueProvider = valueProvider; } - public void setHeaderProviderFunction(SerializableFunction headerProvider) { + public void headerProviderFunction(SerializableFunction headerProvider) { this.headerProvider = headerProvider; } diff --git a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java index 3d4fc3d..0615f9e 100644 --- a/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java +++ b/exporter-demo/src/main/java/org/vaadin/haijian/demo/helpers/GridDemoViewCreator.java @@ -69,9 +69,9 @@ private static Component createGridDemo(boolean lazyLoading) { ExporterOption exporterOption = new ExporterOption(); exporterOption.getColumnOption("name").columnName("My Name").toUpperCase(); - //exporterOption.getColumnOption("email").columnName("My Email"); - exporterOption.getColumnOption("age").setHeaderProviderFunction(value -> "True " + value); - exporterOption.getColumnOption("age").setValueProviderFunction(source -> {return (int) Math.round(Math.sqrt(((Person)source).getAge()));}); + exporterOption.getColumnOption("email").columnName("My Email"); + exporterOption.getColumnOption("age").headerProviderFunction(value -> "Current " + value + " x10"); + exporterOption.getColumnOption("age").valueProviderFunction(source -> {return (int) ((Person)source).getAge() * 10;}); StreamResource excelStreamResourceWithCustomHeader = new StreamResource((StreamResource.StreamSource) () -> Exporter.exportAsExcel(grid, exporterOption), "my-excel-with-cutom-header.xlsx"); FileDownloader excelFileDownloaderWithCustomHeader = new FileDownloader(excelStreamResourceWithCustomHeader); From 0fcab2fcc0f1b4d62a5bf77b18b2714ec49c0baf Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Fri, 10 Apr 2020 02:43:09 +0200 Subject: [PATCH 10/12] Revert gitignore. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d8cf671..fbc1c34 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,4 @@ *.cache .settings/ widgetsets/ -target/* +*/target/* From a22435a5b5d4e56d29c24d08b854d8e7f7e043c7 Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Fri, 10 Apr 2020 02:45:32 +0200 Subject: [PATCH 11/12] Remove autogenerated file. --- exporter-addon/.gitignore | 1 - 1 file changed, 1 deletion(-) delete mode 100644 exporter-addon/.gitignore diff --git a/exporter-addon/.gitignore b/exporter-addon/.gitignore deleted file mode 100644 index b83d222..0000000 --- a/exporter-addon/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target/ From c706a29749bb32e208da047cb7961b24fb7a0654 Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Fri, 10 Apr 2020 03:34:42 +0200 Subject: [PATCH 12/12] Fix #35 ColumnOptions. --- .../src/main/java/org/vaadin/haijian/FileBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java b/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java index 0a23a6b..6b736b9 100644 --- a/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java +++ b/exporter-addon/src/main/java/org/vaadin/haijian/FileBuilder.java @@ -147,7 +147,7 @@ private void buildRows() { @SuppressWarnings("unchecked") private void buildRow(T item) { - if (/*option.isUseItemProperties() && */propertySet == null) { + if (propertySet == null) { propertySet = (PropertySet) BeanPropertySet.get(item.getClass()); }