From 13f73c5731a7729a0fa3e045af51433fff69e6e0 Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Thu, 9 May 2019 13:31:50 +0200 Subject: [PATCH 01/15] Add option for custom grid column header text. --- README.md | 10 ++++++++++ .../org/vaadin/haijian/CSVFileBuilder.java | 5 +++-- .../org/vaadin/haijian/ExcelFileBuilder.java | 5 +++-- .../java/org/vaadin/haijian/Exporter.java | 9 +++++---- .../java/org/vaadin/haijian/FileBuilder.java | 19 +++++++++++++++++-- 5 files changed, 38 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 9f669dc..8a5c81e 100755 --- a/README.md +++ b/README.md @@ -24,6 +24,16 @@ Grid grid = new Grid<>(); grid.addColumn(Person::getEmail).setKey("email"); ``` +### Custom column header text + +Create map where Column is key and header text is value. Pass that map as argument to Exporter subclass constructor. +If map is null then default column key will be used for creating column header in excel. +``` +private Map, String> gridHeaderMap; +... +Exporter.exportAsExcel(grid, gridHeaderMap) +``` + Exporter works as using reflection to read property from each item, any column without a valid key will be ignored. ## Development instructions diff --git a/src/main/java/org/vaadin/haijian/CSVFileBuilder.java b/src/main/java/org/vaadin/haijian/CSVFileBuilder.java index 203b2b0..477625c 100644 --- a/src/main/java/org/vaadin/haijian/CSVFileBuilder.java +++ b/src/main/java/org/vaadin/haijian/CSVFileBuilder.java @@ -5,14 +5,15 @@ import java.io.FileWriter; import java.io.IOException; +import java.util.Map; public class CSVFileBuilder extends FileBuilder { private FileWriter writer; private int rowNr; private int colNr; - CSVFileBuilder(Grid grid) { - super(grid); + CSVFileBuilder(Grid grid, Map, String> columnHeaders) { + super(grid, columnHeaders); } @Override diff --git a/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java b/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java index 0763700..d3ab673 100644 --- a/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java +++ b/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java @@ -7,6 +7,7 @@ import java.io.FileOutputStream; import java.util.Calendar; +import java.util.Map; public class ExcelFileBuilder extends FileBuilder { private static final String EXCEL_FILE_EXTENSION = ".xls"; @@ -19,8 +20,8 @@ public class ExcelFileBuilder extends FileBuilder { private Cell cell; private CellStyle boldStyle; - ExcelFileBuilder(Grid grid) { - super(grid); + ExcelFileBuilder(Grid grid, Map, String> columnHeaders) { + super(grid, columnHeaders); } @Override diff --git a/src/main/java/org/vaadin/haijian/Exporter.java b/src/main/java/org/vaadin/haijian/Exporter.java index a5ecc7e..39626d4 100644 --- a/src/main/java/org/vaadin/haijian/Exporter.java +++ b/src/main/java/org/vaadin/haijian/Exporter.java @@ -1,5 +1,6 @@ package org.vaadin.haijian; +import java.util.Map; import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.server.InputStreamFactory; @@ -7,11 +8,11 @@ public class Exporter { private Exporter(){} - public static InputStreamFactory exportAsExcel(Grid grid){ - return new ExcelFileBuilder<>(grid)::build; + public static InputStreamFactory exportAsExcel(Grid grid, Map, String> columnHeaders){ + return new ExcelFileBuilder<>(grid, columnHeaders)::build; } - public static InputStreamFactory exportAsCSV(Grid grid){ - return new CSVFileBuilder<>(grid)::build; + public static InputStreamFactory exportAsCSV(Grid grid, Map, String> columnHeaders){ + return new CSVFileBuilder<>(grid, columnHeaders)::build; } } diff --git a/src/main/java/org/vaadin/haijian/FileBuilder.java b/src/main/java/org/vaadin/haijian/FileBuilder.java index a0b37e9..ce6aab3 100644 --- a/src/main/java/org/vaadin/haijian/FileBuilder.java +++ b/src/main/java/org/vaadin/haijian/FileBuilder.java @@ -15,6 +15,7 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Collection; +import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -24,13 +25,15 @@ public abstract class FileBuilder { File file; private Grid grid; + private Map, String> columnHeaders; private Collection columns; private PropertySet propertySet; private boolean headerRowBuilt = false; @SuppressWarnings("unchecked") - FileBuilder(Grid grid) { + FileBuilder(Grid grid, Map, String> columnHeaders) { this.grid = grid; + this.columnHeaders = columnHeaders; columns = grid.getColumns().stream().filter(this::isExportable).collect(Collectors.toList()); try { Field field = Grid.class.getDeclaredField("propertySet"); @@ -80,6 +83,7 @@ protected void resetContent() { } private void buildHeaderRow() { + if (columnHeaders == null) { columns.forEach(column -> { Optional> propertyDefinition = propertySet.getProperty(column.getKey()); if (propertyDefinition.isPresent()) { @@ -89,7 +93,18 @@ private void buildHeaderRow() { LoggerFactory.getLogger(this.getClass()).warn(String.format("Column key %s is a property which cannot be found", column.getKey())); } }); - headerRowBuilt = true; + } else { + columns.forEach(column -> { + String columnHeader = columnHeaders.get(column); + if (columnHeader != null) { + onNewCell(); + buildColumnHeaderCell(columnHeader); + } else { + LoggerFactory.getLogger(this.getClass()).warn(String.format("Column with key %s have not column header value defined in map", column.getKey())); + } + }); + } + headerRowBuilt = true; } From b4d362ea7698f9b7105fecb3813c874f95097e61 Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Fri, 10 May 2019 21:07:21 +0200 Subject: [PATCH 02/15] Fix repeated excel export. Before it was loosing the header row when export was clicked more then one time. --- src/main/java/org/vaadin/haijian/FileBuilder.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/vaadin/haijian/FileBuilder.java b/src/main/java/org/vaadin/haijian/FileBuilder.java index ce6aab3..51edf23 100644 --- a/src/main/java/org/vaadin/haijian/FileBuilder.java +++ b/src/main/java/org/vaadin/haijian/FileBuilder.java @@ -28,7 +28,6 @@ public abstract class FileBuilder { private Map, String> columnHeaders; private Collection columns; private PropertySet propertySet; - private boolean headerRowBuilt = false; @SuppressWarnings("unchecked") FileBuilder(Grid grid, Map, String> columnHeaders) { @@ -50,7 +49,7 @@ public abstract class FileBuilder { } } - private boolean isExportable(Grid.Column column) { + private boolean isExportable(Grid.Column column) { return column.isVisible() && column.getKey() != null && !column.getKey().isEmpty() && (propertySet == null || propertySet.getProperty(column.getKey()).isPresent()); } @@ -74,6 +73,7 @@ private void initTempFile() throws IOException { } private void buildFileContent() { + buildHeaderRow(); buildRows(); buildFooter(); } @@ -83,6 +83,7 @@ protected void resetContent() { } private void buildHeaderRow() { + onNewRow(); if (columnHeaders == null) { columns.forEach(column -> { Optional> propertyDefinition = propertySet.getProperty(column.getKey()); @@ -103,9 +104,8 @@ private void buildHeaderRow() { LoggerFactory.getLogger(this.getClass()).warn(String.format("Column with key %s have not column header value defined in map", column.getKey())); } }); - } - headerRowBuilt = true; } + } void buildColumnHeaderCell(String header) { @@ -128,21 +128,18 @@ private void buildRows() { Stream dataStream = getDataStream(streamQuery); dataStream.forEach(t -> { - onNewRow(); buildRow(t); }); } @SuppressWarnings("unchecked") private void buildRow(T item) { + onNewRow(); 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 -> { Optional> propertyDefinition = propertySet.getProperty(column.getKey()); if (propertyDefinition.isPresent()) { From a046098c5d1714d33c646f712b561fdf4d922b56 Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Sat, 5 Oct 2019 12:06:42 +0200 Subject: [PATCH 03/15] Add cell styles and data formats by types. --- .../haijian/CellValueTypeConverter.java | 33 +++++++ .../java/org/vaadin/haijian/DataFormats.java | 25 +++++ .../org/vaadin/haijian/ExcelFileBuilder.java | 94 ++++++++++++++++--- .../org/vaadin/haijian/TypeDataFormats.java | 61 ++++++++++++ .../org/vaadin/haijian/WorkbookStyles.java | 37 ++++++++ 5 files changed, 239 insertions(+), 11 deletions(-) create mode 100644 src/main/java/org/vaadin/haijian/CellValueTypeConverter.java create mode 100644 src/main/java/org/vaadin/haijian/DataFormats.java create mode 100644 src/main/java/org/vaadin/haijian/TypeDataFormats.java create mode 100644 src/main/java/org/vaadin/haijian/WorkbookStyles.java diff --git a/src/main/java/org/vaadin/haijian/CellValueTypeConverter.java b/src/main/java/org/vaadin/haijian/CellValueTypeConverter.java new file mode 100644 index 0000000..150d6e9 --- /dev/null +++ b/src/main/java/org/vaadin/haijian/CellValueTypeConverter.java @@ -0,0 +1,33 @@ +package org.vaadin.haijian; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Calendar; +import java.util.Date; + +import org.apache.poi.ss.usermodel.Cell; + +public class CellValueTypeConverter { + + public void setValue(Cell cell, LocalDateTime localDateTime) { + cell.setCellValue(convertLocalDateTimeToDate(localDateTime)); + } + + public void setValue(Cell cell, LocalDate localDateTime) { + cell.setCellValue(convertLocalDateToDate(localDateTime)); + } + + public void setValue(Cell cell, Calendar localDateTime) { + cell.setCellValue(localDateTime.getTime()); + } + + public Date convertLocalDateToDate(LocalDate dateToConvert) { + return Date.from(dateToConvert.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); + } + + public Date convertLocalDateTimeToDate(LocalDateTime dateToConvert) { + return Date.from(dateToConvert.atZone(ZoneId.systemDefault()).toInstant()); + } + +} diff --git a/src/main/java/org/vaadin/haijian/DataFormats.java b/src/main/java/org/vaadin/haijian/DataFormats.java new file mode 100644 index 0000000..89630f0 --- /dev/null +++ b/src/main/java/org/vaadin/haijian/DataFormats.java @@ -0,0 +1,25 @@ +package org.vaadin.haijian; + +import java.time.LocalDateTime; +import java.util.Calendar; +import java.util.Date; +import java.util.Map; +import java.time.LocalDate; + +public interface DataFormats { + + void numberFormat(Class clazz, String format); + + void localDateTimeFormat(Class clazz, String format); + + void localDateFormat(Class clazz, String format); + + void calendarFormat(Class clazz, String format); + + void dateFormat(Class clazz, String format); + + public Map, String> getTypeFormatsMap(); + + + +} diff --git a/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java b/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java index d3ab673..9af1461 100644 --- a/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java +++ b/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java @@ -1,14 +1,26 @@ package org.vaadin.haijian; -import com.vaadin.flow.component.grid.Grid; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.*; -import org.slf4j.LoggerFactory; - import java.io.FileOutputStream; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.Calendar; +import java.util.Date; import java.util.Map; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CreationHelper; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.slf4j.LoggerFactory; + +import com.vaadin.flow.component.grid.Grid; + public class ExcelFileBuilder extends FileBuilder { private static final String EXCEL_FILE_EXTENSION = ".xls"; @@ -20,8 +32,30 @@ public class ExcelFileBuilder extends FileBuilder { private Cell cell; private CellStyle boldStyle; + private DataFormats dataFormats; + private CellValueTypeConverter converter; + private WorkbookStyles styles; + ExcelFileBuilder(Grid grid, Map, String> columnHeaders) { super(grid, columnHeaders); + this.dataFormats = new TypeDataFormats(); + this.converter = new CellValueTypeConverter(); + } + + ExcelFileBuilder(Grid grid, Map, String> columnHeaders, DataFormats dataFormats) { + this(grid, columnHeaders); + this.dataFormats = dataFormats; + } + + ExcelFileBuilder(Grid grid, Map, String> columnHeaders, CellValueTypeConverter converter) { + this(grid, columnHeaders); + this.converter = converter; + } + + ExcelFileBuilder(Grid grid, Map, String> columnHeaders, DataFormats dataFormats, + CellValueTypeConverter converter) { + this(grid, columnHeaders, dataFormats); + this.converter = converter; } @Override @@ -58,17 +92,49 @@ protected void buildCell(Object value) { } else if (value instanceof Boolean) { cell.setCellValue((Boolean) value); cell.setCellType(Cell.CELL_TYPE_BOOLEAN); + } else if (value instanceof Number) { + buildNumericCell((Number) value); } else if (value instanceof Calendar) { - Calendar calendar = (Calendar) value; - cell.setCellValue(calendar.getTime()); - cell.setCellType(Cell.CELL_TYPE_STRING); - } else if (value instanceof Double) { - cell.setCellValue((Double) value); - cell.setCellType(Cell.CELL_TYPE_NUMERIC); + converter.setValue(cell, (Calendar) value); + } else if (value instanceof Date) { + Date date = (Date) value; + cell.setCellValue(date); + } else if (value instanceof LocalDate) { + converter.setValue(cell, (LocalDate) value); + } else if (value instanceof LocalDateTime) { + converter.setValue(cell, (LocalDateTime) value); } else { cell.setCellValue(value.toString()); cell.setCellType(Cell.CELL_TYPE_STRING); } + + styles.setStyle(cell, value.getClass()); + + } + + protected void buildNumericCell(Number value) { + + cell.setCellType(Cell.CELL_TYPE_NUMERIC); + + if (value instanceof Double) { + cell.setCellValue((Double) value); + + } else if (value instanceof Long) { + cell.setCellValue((Long) value); + + } else if (value instanceof Integer) { + cell.setCellValue((Integer) value); + + } else if (value instanceof BigDecimal) { + cell.setCellValue(((BigDecimal) value).doubleValue()); + + } else { + // TODO - this convesrion + cell.setCellValue(value.doubleValue()); + } + + styles.setStyle(cell, value.getClass()); + } @Override @@ -104,5 +170,11 @@ protected void resetContent() { row = null; cell = null; boldStyle = null; + + createCellStyleDataFormats(); + } + + private void createCellStyleDataFormats() { + styles = new WorkbookStyles(workbook, dataFormats); } } diff --git a/src/main/java/org/vaadin/haijian/TypeDataFormats.java b/src/main/java/org/vaadin/haijian/TypeDataFormats.java new file mode 100644 index 0000000..21d3e39 --- /dev/null +++ b/src/main/java/org/vaadin/haijian/TypeDataFormats.java @@ -0,0 +1,61 @@ +package org.vaadin.haijian; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class TypeDataFormats implements DataFormats { + + private final Map, String> typeFormatsMap; + + public TypeDataFormats() { + this.typeFormatsMap = new HashMap, String>(); + typeFormatsMap.put(Integer.class, "0"); + typeFormatsMap.put(Long.class, "0"); + typeFormatsMap.put(Double.class, "0.00"); + typeFormatsMap.put(BigDecimal.class, "0.00"); + typeFormatsMap.put(LocalDateTime.class, "m/d/yy h:mm"); + typeFormatsMap.put(Date.class, "m/d/yy h:mm"); + typeFormatsMap.put(Calendar.class, "m/d/yy h:mm"); + typeFormatsMap.put(LocalDate.class, "m/d/yy"); + } + + @Override + public void numberFormat(Class clazz, String format) { + setTypeFormat(clazz, format); + } + + @Override + public void localDateTimeFormat(Class clazz, String format) { + setTypeFormat(clazz, format); + } + + @Override + public void localDateFormat(Class clazz, String format) { + setTypeFormat(clazz, format); + } + + @Override + public void calendarFormat(Class clazz, String format) { + setTypeFormat(clazz, format); + } + + @Override + public void dateFormat(Class clazz, String format) { + setTypeFormat(clazz, format); + } + + private void setTypeFormat(Class clazz, String format) { + typeFormatsMap.put(clazz, format); + } + + @Override + public Map, String> getTypeFormatsMap() { + return typeFormatsMap; + } + +} diff --git a/src/main/java/org/vaadin/haijian/WorkbookStyles.java b/src/main/java/org/vaadin/haijian/WorkbookStyles.java new file mode 100644 index 0000000..50d92fa --- /dev/null +++ b/src/main/java/org/vaadin/haijian/WorkbookStyles.java @@ -0,0 +1,37 @@ +package org.vaadin.haijian; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CreationHelper; +import org.apache.poi.ss.usermodel.Workbook; + +public class WorkbookStyles { + + private final Map, CellStyle> stylesWithDataFormats; + private CreationHelper createHelper; + private Workbook workbook; + + public WorkbookStyles(Workbook workbook, DataFormats dataFormats) { + this.workbook = workbook; + this.stylesWithDataFormats = new HashMap, CellStyle>(); + + createHelper = workbook.getCreationHelper(); + + dataFormats.getTypeFormatsMap().forEach(this::createCellStyeWithDataFormat); + } + + private void createCellStyeWithDataFormat(Class clazz, String format) { + CellStyle cellStyle = workbook.createCellStyle(); + cellStyle.setDataFormat(createHelper.createDataFormat().getFormat(format)); + stylesWithDataFormats.put(clazz, cellStyle); + } + + public void setStyle(Cell cell, Class clazz) { + if (stylesWithDataFormats.containsKey(clazz)) { + cell.setCellStyle(stylesWithDataFormats.get(clazz)); + } + } +} From ae8a0a651f073a2ea01412d70c5173d38b17e4ce Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Sat, 5 Oct 2019 13:38:05 +0200 Subject: [PATCH 04/15] Refactor and cleanup. --- .../haijian/CellValueTypeConverter.java | 5 ++++ .../java/org/vaadin/haijian/DataFormats.java | 19 +++++++------- .../org/vaadin/haijian/ExcelFileBuilder.java | 22 +++++----------- .../java/org/vaadin/haijian/Exporter.java | 22 +++++++++++++--- .../org/vaadin/haijian/TypeDataFormats.java | 26 +++++++++++++------ .../org/vaadin/haijian/WorkbookStyles.java | 5 ++++ 6 files changed, 63 insertions(+), 36 deletions(-) diff --git a/src/main/java/org/vaadin/haijian/CellValueTypeConverter.java b/src/main/java/org/vaadin/haijian/CellValueTypeConverter.java index 150d6e9..3fd0d35 100644 --- a/src/main/java/org/vaadin/haijian/CellValueTypeConverter.java +++ b/src/main/java/org/vaadin/haijian/CellValueTypeConverter.java @@ -8,6 +8,11 @@ import org.apache.poi.ss.usermodel.Cell; +/** + * + * @author Krunoslav Magazin + * Oct 5, 2019 + */ public class CellValueTypeConverter { public void setValue(Cell cell, LocalDateTime localDateTime) { diff --git a/src/main/java/org/vaadin/haijian/DataFormats.java b/src/main/java/org/vaadin/haijian/DataFormats.java index 89630f0..1373792 100644 --- a/src/main/java/org/vaadin/haijian/DataFormats.java +++ b/src/main/java/org/vaadin/haijian/DataFormats.java @@ -1,25 +1,24 @@ package org.vaadin.haijian; -import java.time.LocalDateTime; -import java.util.Calendar; -import java.util.Date; import java.util.Map; -import java.time.LocalDate; +/** + * + * @author Krunoslav Magazin + * Oct 5, 2019 + */ public interface DataFormats { void numberFormat(Class clazz, String format); - void localDateTimeFormat(Class clazz, String format); + void localDateTimeFormat( String format); - void localDateFormat(Class clazz, String format); + void localDateFormat( String format); - void calendarFormat(Class clazz, String format); + void calendarFormat( String format); - void dateFormat(Class clazz, String format); + void dateFormat( String format); public Map, String> getTypeFormatsMap(); - - } diff --git a/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java b/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java index 9af1461..93cb61c 100644 --- a/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java +++ b/src/main/java/org/vaadin/haijian/ExcelFileBuilder.java @@ -4,7 +4,6 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.ZoneId; import java.util.Calendar; import java.util.Date; import java.util.Map; @@ -12,7 +11,6 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; @@ -21,6 +19,12 @@ import com.vaadin.flow.component.grid.Grid; +/** + * + * Modified Oct 5, 2019 by Krunoslav Magazin - added data formats and type + * conversion + * + */ public class ExcelFileBuilder extends FileBuilder { private static final String EXCEL_FILE_EXTENSION = ".xls"; @@ -113,23 +117,11 @@ protected void buildCell(Object value) { } protected void buildNumericCell(Number value) { - cell.setCellType(Cell.CELL_TYPE_NUMERIC); - if (value instanceof Double) { - cell.setCellValue((Double) value); - - } else if (value instanceof Long) { - cell.setCellValue((Long) value); - - } else if (value instanceof Integer) { - cell.setCellValue((Integer) value); - - } else if (value instanceof BigDecimal) { + if (value instanceof BigDecimal) { cell.setCellValue(((BigDecimal) value).doubleValue()); - } else { - // TODO - this convesrion cell.setCellValue(value.doubleValue()); } diff --git a/src/main/java/org/vaadin/haijian/Exporter.java b/src/main/java/org/vaadin/haijian/Exporter.java index 39626d4..b571960 100644 --- a/src/main/java/org/vaadin/haijian/Exporter.java +++ b/src/main/java/org/vaadin/haijian/Exporter.java @@ -6,13 +6,29 @@ public class Exporter { - private Exporter(){} + private Exporter() { + } - public static InputStreamFactory exportAsExcel(Grid grid, Map, String> columnHeaders){ + public static InputStreamFactory exportAsExcel(Grid grid, Map, String> columnHeaders) { return new ExcelFileBuilder<>(grid, columnHeaders)::build; } - public static InputStreamFactory exportAsCSV(Grid grid, Map, String> columnHeaders){ + public static InputStreamFactory exportAsExcel(Grid grid, Map, String> columnHeaders, + DataFormats dataFormats) { + return new ExcelFileBuilder<>(grid, columnHeaders, dataFormats)::build; + } + + public static InputStreamFactory exportAsExcel(Grid grid, Map, String> columnHeaders, + CellValueTypeConverter converter) { + return new ExcelFileBuilder<>(grid, columnHeaders, converter)::build; + } + + public static InputStreamFactory exportAsExcel(Grid grid, Map, String> columnHeaders, + DataFormats dataFormats, CellValueTypeConverter converter) { + return new ExcelFileBuilder<>(grid, columnHeaders, dataFormats, converter)::build; + } + + public static InputStreamFactory exportAsCSV(Grid grid, Map, String> columnHeaders) { return new CSVFileBuilder<>(grid, columnHeaders)::build; } } diff --git a/src/main/java/org/vaadin/haijian/TypeDataFormats.java b/src/main/java/org/vaadin/haijian/TypeDataFormats.java index 21d3e39..7460b77 100644 --- a/src/main/java/org/vaadin/haijian/TypeDataFormats.java +++ b/src/main/java/org/vaadin/haijian/TypeDataFormats.java @@ -8,6 +8,16 @@ import java.util.HashMap; import java.util.Map; +import org.apache.poi.ss.usermodel.BuiltinFormats; + +/** + * + * @author Krunoslav Magazin + * Oct 5, 2019 + * + * Initialize default excel formats. Excel {@link BuiltinFormats} use locale to format value.

+ * + */ public class TypeDataFormats implements DataFormats { private final Map, String> typeFormatsMap; @@ -30,23 +40,23 @@ public void numberFormat(Class clazz, String format) { } @Override - public void localDateTimeFormat(Class clazz, String format) { - setTypeFormat(clazz, format); + public void localDateTimeFormat( String format) { + setTypeFormat(LocalDateTime.class, format); } @Override - public void localDateFormat(Class clazz, String format) { - setTypeFormat(clazz, format); + public void localDateFormat( String format) { + setTypeFormat(LocalDate.class, format); } @Override - public void calendarFormat(Class clazz, String format) { - setTypeFormat(clazz, format); + public void calendarFormat( String format) { + setTypeFormat(Calendar.class, format); } @Override - public void dateFormat(Class clazz, String format) { - setTypeFormat(clazz, format); + public void dateFormat( String format) { + setTypeFormat(Date.class, format); } private void setTypeFormat(Class clazz, String format) { diff --git a/src/main/java/org/vaadin/haijian/WorkbookStyles.java b/src/main/java/org/vaadin/haijian/WorkbookStyles.java index 50d92fa..9b26394 100644 --- a/src/main/java/org/vaadin/haijian/WorkbookStyles.java +++ b/src/main/java/org/vaadin/haijian/WorkbookStyles.java @@ -8,6 +8,11 @@ import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.Workbook; +/** + * + * @author Krunoslav Magazin + * Oct 5, 2019 + */ public class WorkbookStyles { private final Map, CellStyle> stylesWithDataFormats; From b14a89541fa2cccfa4cc41b1b09a1eca6a59b6a9 Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Sat, 5 Oct 2019 13:38:22 +0200 Subject: [PATCH 05/15] Update README. --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8a5c81e..786479a 100755 --- a/README.md +++ b/README.md @@ -33,8 +33,17 @@ private Map, String> gridHeaderMap; ... Exporter.exportAsExcel(grid, gridHeaderMap) ``` - Exporter works as using reflection to read property from each item, any column without a valid key will be ignored. + +### Data formats, excel builtin and custom + +By default excel exporter will use default excel data formats for date, time and numbers. To set custom formats: +``` +TypeDataFormats formats = new TypeDataFormats(); +formats.localDateFormat("DDD-MMM-YY"); +Exporter.exportAsExcel(grid, gridHeaderMap, formats); +``` + ## Development instructions From 26d82fd9e94791e6c23f6bddf1a64cca8d0c853d Mon Sep 17 00:00:00 2001 From: simpletasks Date: Sat, 5 Oct 2019 13:40:27 +0200 Subject: [PATCH 06/15] Fix sub title. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 786479a..ff73502 100755 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Exporter.exportAsExcel(grid, gridHeaderMap) ``` Exporter works as using reflection to read property from each item, any column without a valid key will be ignored. -### Data formats, excel builtin and custom +### Data formats, excel builtin and custom data formats By default excel exporter will use default excel data formats for date, time and numbers. To set custom formats: ``` From 9707f7ba588139011bf31e0163ad6fb1b75e567e Mon Sep 17 00:00:00 2001 From: simpletasks Date: Sat, 5 Oct 2019 13:42:02 +0200 Subject: [PATCH 07/15] Fix example code. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ff73502..9905f47 100755 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Exporter works as using reflection to read property from each item, any column w By default excel exporter will use default excel data formats for date, time and numbers. To set custom formats: ``` -TypeDataFormats formats = new TypeDataFormats(); +DataFormats formats = new TypeDataFormats(); formats.localDateFormat("DDD-MMM-YY"); Exporter.exportAsExcel(grid, gridHeaderMap, formats); ``` From d40305ead9fd1882d0c172280157413ec08c6ba8 Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Sat, 5 Oct 2019 15:48:52 +0200 Subject: [PATCH 08/15] Update and fix demo. --- .../java/org/vaadin/haijian/Exporter.java | 18 +++-- .../java/org/vaadin/haijian/FileBuilder.java | 79 ++++++++++--------- .../java/org/vaadin/haijian/DemoView.java | 16 +++- .../haijian/helpers/GridDemoViewCreator.java | 66 ++++++++++++++-- 4 files changed, 130 insertions(+), 49 deletions(-) diff --git a/src/main/java/org/vaadin/haijian/Exporter.java b/src/main/java/org/vaadin/haijian/Exporter.java index b571960..c987130 100644 --- a/src/main/java/org/vaadin/haijian/Exporter.java +++ b/src/main/java/org/vaadin/haijian/Exporter.java @@ -9,25 +9,31 @@ public class Exporter { private Exporter() { } + public static InputStreamFactory exportAsExcel(Grid grid) { + return new ExcelFileBuilder<>(grid, null)::build; + } + public static InputStreamFactory exportAsExcel(Grid grid, Map, String> columnHeaders) { return new ExcelFileBuilder<>(grid, columnHeaders)::build; } - public static InputStreamFactory exportAsExcel(Grid grid, Map, String> columnHeaders, - DataFormats dataFormats) { + public static InputStreamFactory exportAsExcel(Grid grid, Map, String> columnHeaders, DataFormats dataFormats) { return new ExcelFileBuilder<>(grid, columnHeaders, dataFormats)::build; } - public static InputStreamFactory exportAsExcel(Grid grid, Map, String> columnHeaders, - CellValueTypeConverter converter) { + public static InputStreamFactory exportAsExcel(Grid grid, Map, String> columnHeaders, CellValueTypeConverter converter) { return new ExcelFileBuilder<>(grid, columnHeaders, converter)::build; } - public static InputStreamFactory exportAsExcel(Grid grid, Map, String> columnHeaders, - DataFormats dataFormats, CellValueTypeConverter converter) { + public static InputStreamFactory exportAsExcel(Grid grid, Map, String> columnHeaders, DataFormats dataFormats, + CellValueTypeConverter converter) { return new ExcelFileBuilder<>(grid, columnHeaders, dataFormats, converter)::build; } + public static InputStreamFactory exportAsCSV(Grid grid) { + return new CSVFileBuilder<>(grid, null)::build; + } + public static InputStreamFactory exportAsCSV(Grid grid, Map, String> columnHeaders) { return new CSVFileBuilder<>(grid, columnHeaders)::build; } diff --git a/src/main/java/org/vaadin/haijian/FileBuilder.java b/src/main/java/org/vaadin/haijian/FileBuilder.java index 51edf23..7397a7b 100644 --- a/src/main/java/org/vaadin/haijian/FileBuilder.java +++ b/src/main/java/org/vaadin/haijian/FileBuilder.java @@ -1,13 +1,5 @@ package org.vaadin.haijian; -import com.vaadin.flow.component.grid.Grid; -import com.vaadin.flow.data.binder.BeanPropertySet; -import com.vaadin.flow.data.binder.PropertyDefinition; -import com.vaadin.flow.data.binder.PropertySet; -import com.vaadin.flow.data.provider.DataCommunicator; -import com.vaadin.flow.data.provider.Query; -import org.slf4j.LoggerFactory; - import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -20,19 +12,28 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.slf4j.LoggerFactory; + +import com.vaadin.flow.component.grid.Grid; +import com.vaadin.flow.data.binder.BeanPropertySet; +import com.vaadin.flow.data.binder.PropertyDefinition; +import com.vaadin.flow.data.binder.PropertySet; +import com.vaadin.flow.data.provider.DataCommunicator; +import com.vaadin.flow.data.provider.Query; + public abstract class FileBuilder { private static final String TMP_FILE_NAME = "tmp"; File file; private Grid grid; - private Map, String> columnHeaders; + private Map, String> customColumnHeaders; private Collection columns; private PropertySet propertySet; @SuppressWarnings("unchecked") FileBuilder(Grid grid, Map, String> columnHeaders) { this.grid = grid; - this.columnHeaders = columnHeaders; + this.customColumnHeaders = columnHeaders; columns = grid.getColumns().stream().filter(this::isExportable).collect(Collectors.toList()); try { Field field = Grid.class.getDeclaredField("propertySet"); @@ -41,6 +42,9 @@ public abstract class FileBuilder { if (propertySetRaw != null) { propertySet = (PropertySet) propertySetRaw; } + if (propertySet == null && columnHeaders == null) { + throw new ExporterException("Create Grid with bean type or create Grid with adding columns and columns headers map."); + } } catch (Exception e) { throw new ExporterException("couldn't read propertyset information from grid", e); } @@ -83,29 +87,32 @@ protected void resetContent() { } private void buildHeaderRow() { - onNewRow(); - if (columnHeaders == null) { - columns.forEach(column -> { - Optional> propertyDefinition = propertySet.getProperty(column.getKey()); - if (propertyDefinition.isPresent()) { - onNewCell(); - buildColumnHeaderCell(propertyDefinition.get().getCaption()); - } else { - LoggerFactory.getLogger(this.getClass()).warn(String.format("Column key %s is a property which cannot be found", column.getKey())); - } - }); - } else { - columns.forEach(column -> { - String columnHeader = columnHeaders.get(column); - if (columnHeader != null) { - onNewCell(); - buildColumnHeaderCell(columnHeader); - } else { - LoggerFactory.getLogger(this.getClass()).warn(String.format("Column with key %s have not column header value defined in map", column.getKey())); - } - }); + onNewRow(); + if (customColumnHeaders == null) { + columns.forEach(column -> { + // when grid created with bean type + if (propertySet != null) { + Optional> propertyDefinition = propertySet.getProperty(column.getKey()); + if (propertyDefinition.isPresent()) { + onNewCell(); + buildColumnHeaderCell(propertyDefinition.get().getCaption()); + } else { + LoggerFactory.getLogger(this.getClass()).warn(String.format("Column key %s is a property which cannot be found", column.getKey())); + } + } + }); + } else { + columns.forEach(column -> { + String columnHeader = customColumnHeaders.get(column); + if (columnHeader != null) { + onNewCell(); + buildColumnHeaderCell(columnHeader); + } else { + LoggerFactory.getLogger(this.getClass()).warn(String.format("Column with key %s have not column header value defined in map", column.getKey())); + } + }); + } } - } void buildColumnHeaderCell(String header) { @@ -177,14 +184,12 @@ 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/src/test/java/org/vaadin/haijian/DemoView.java b/src/test/java/org/vaadin/haijian/DemoView.java index 7bffc37..bea1070 100755 --- a/src/test/java/org/vaadin/haijian/DemoView.java +++ b/src/test/java/org/vaadin/haijian/DemoView.java @@ -12,6 +12,19 @@ public class DemoView extends HorizontalLayout { public DemoView() { setWidth("100%"); + + VerticalLayout withBeanTypeGrid = new VerticalLayout(); + expand(withBeanTypeGrid); + withBeanTypeGrid.add(new Span("Grid With Bean type default property names")); + Component beanTypeGrid = GridDemoViewCreator.createGridWithBeanTypeDemo(); + withBeanTypeGrid.add(beanTypeGrid); + + VerticalLayout withBeanTypeGridCustomHeaders = new VerticalLayout(); + expand(withBeanTypeGridCustomHeaders); + withBeanTypeGridCustomHeaders.add(new Span("Grid With Bean type custom property names")); + Component beanTypeGridCustomHeaders = GridDemoViewCreator.createGridWithBeanTypeCustomHeadersDemo(); + withBeanTypeGridCustomHeaders.add(beanTypeGridCustomHeaders); + VerticalLayout withNormalGrid = new VerticalLayout(); expand(withNormalGrid); withNormalGrid.add(new Span("Grid With List data provider")); @@ -23,6 +36,7 @@ public DemoView() { Component lazyGrid = GridDemoViewCreator.createGridWithLazyLoadingDemo(); withLazyLoadingGrid.add(new Span("Grid with Lazy loading data provider")); withLazyLoadingGrid.add(lazyGrid); - add(withNormalGrid, withLazyLoadingGrid); + + add(withBeanTypeGrid, withBeanTypeGridCustomHeaders, withNormalGrid, withLazyLoadingGrid); } } diff --git a/src/test/java/org/vaadin/haijian/helpers/GridDemoViewCreator.java b/src/test/java/org/vaadin/haijian/helpers/GridDemoViewCreator.java index 0f1ea11..ce603ef 100644 --- a/src/test/java/org/vaadin/haijian/helpers/GridDemoViewCreator.java +++ b/src/test/java/org/vaadin/haijian/helpers/GridDemoViewCreator.java @@ -3,6 +3,7 @@ import com.vaadin.flow.component.Component; import com.vaadin.flow.component.combobox.ComboBox; import com.vaadin.flow.component.grid.Grid; +import com.vaadin.flow.component.grid.Grid.Column; import com.vaadin.flow.component.html.Anchor; import com.vaadin.flow.component.orderedlayout.FlexComponent; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; @@ -17,20 +18,68 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class GridDemoViewCreator { final static PersonService service = new PersonService(); + public static Component createGridWithBeanTypeDemo() { + return createGridBeanTypeDemo(false); + } + + public static Component createGridWithBeanTypeCustomHeadersDemo() { + return createGridBeanTypeDemo(true); + } - public static Component createGridWithListDataProviderDemo(){ + public static Component createGridWithListDataProviderDemo() { return createGridDemo(false); } - public static Component createGridWithLazyLoadingDemo(){ + public static Component createGridWithLazyLoadingDemo() { return createGridDemo(true); } + private static Component createGridBeanTypeDemo(boolean isCustomHeaders) { + VerticalLayout result = new VerticalLayout(); + final List groups = new ArrayList<>(); + groups.add(new AgeGroup(0, 18)); + groups.add(new AgeGroup(19, 26)); + groups.add(new AgeGroup(27, 40)); + groups.add(new AgeGroup(41, 100)); + + final ComboBox filter = new ComboBox<>("Filter", groups); + result.add(filter); + + final Grid grid = new Grid<>(Person.class); + grid.setPageSize(10); + result.setHorizontalComponentAlignment(FlexComponent.Alignment.STRETCH, grid); + + result.add(grid); + + setupListDataProviderForGrid(grid, filter); + + // custom columns names + Map, String> customHeaderCaptions = new HashMap, String>(); + customHeaderCaptions.put(grid.getColumnByKey("name"), "Full name"); + customHeaderCaptions.put(grid.getColumnByKey("email"), "E-mail"); + customHeaderCaptions.put(grid.getColumnByKey("age"), "Old"); + customHeaderCaptions.put(grid.getColumnByKey("birthday"), "Day of birth"); + + Anchor downloadAsExcel = null; + + if (isCustomHeaders) { + downloadAsExcel = new Anchor(new StreamResource("my-excel.xls", Exporter.exportAsExcel(grid, customHeaderCaptions)), "Download As Excel"); + } else { + downloadAsExcel = new Anchor(new StreamResource("my-excel.xls", Exporter.exportAsExcel(grid)), "Download As Excel"); + } + Anchor downloadAsCSV = new Anchor(new StreamResource("my-csv.csv", Exporter.exportAsCSV(grid)), "Download As CSV"); + result.add(new HorizontalLayout(downloadAsExcel, downloadAsCSV)); + + return result; + } + private static Component createGridDemo(boolean lazyLoading) { VerticalLayout result = new VerticalLayout(); final List groups = new ArrayList<>(); @@ -52,13 +101,20 @@ private static Component createGridDemo(boolean lazyLoading) { result.add(grid); - if(lazyLoading){ + if (lazyLoading) { setupLazyLoadingDataProviderForGrid(grid, filter); - }else{ + } else { setupListDataProviderForGrid(grid, filter); } - Anchor downloadAsExcel = new Anchor(new StreamResource("my-excel.xls", Exporter.exportAsExcel(grid)), "Download As Excel"); + // custom columns names + Map, String> customHeaderCaptions = new HashMap, String>(); + customHeaderCaptions.put(grid.getColumnByKey("name"), "Full name"); + customHeaderCaptions.put(grid.getColumnByKey("email"), "E-mail"); + customHeaderCaptions.put(grid.getColumnByKey("age"), "Old"); + customHeaderCaptions.put(grid.getColumnByKey("birthday"), "Day of birth"); + + Anchor downloadAsExcel = new Anchor(new StreamResource("my-excel.xls", Exporter.exportAsExcel(grid, customHeaderCaptions)), "Download As Excel"); Anchor downloadAsCSV = new Anchor(new StreamResource("my-csv.csv", Exporter.exportAsCSV(grid)), "Download As CSV"); result.add(new HorizontalLayout(downloadAsExcel, downloadAsCSV)); From 5a103bd404aabecadea8f363ebe90aedf5028ea0 Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Sat, 5 Oct 2019 16:34:16 +0200 Subject: [PATCH 09/15] Fix CSV example. --- .../java/org/vaadin/haijian/helpers/GridDemoViewCreator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/vaadin/haijian/helpers/GridDemoViewCreator.java b/src/test/java/org/vaadin/haijian/helpers/GridDemoViewCreator.java index ce603ef..a3b7091 100644 --- a/src/test/java/org/vaadin/haijian/helpers/GridDemoViewCreator.java +++ b/src/test/java/org/vaadin/haijian/helpers/GridDemoViewCreator.java @@ -115,7 +115,7 @@ private static Component createGridDemo(boolean lazyLoading) { customHeaderCaptions.put(grid.getColumnByKey("birthday"), "Day of birth"); Anchor downloadAsExcel = new Anchor(new StreamResource("my-excel.xls", Exporter.exportAsExcel(grid, customHeaderCaptions)), "Download As Excel"); - Anchor downloadAsCSV = new Anchor(new StreamResource("my-csv.csv", Exporter.exportAsCSV(grid)), "Download As CSV"); + Anchor downloadAsCSV = new Anchor(new StreamResource("my-csv.csv", Exporter.exportAsCSV(grid, customHeaderCaptions)), "Download As CSV"); result.add(new HorizontalLayout(downloadAsExcel, downloadAsCSV)); return result; From f9dc61dda788c777687c4e819ade101cad289ffe Mon Sep 17 00:00:00 2001 From: simpletasks Date: Sat, 5 Oct 2019 16:39:53 +0200 Subject: [PATCH 10/15] Update README. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9905f47..5304e2c 100755 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ grid.addColumn(Person::getEmail).setKey("email"); ### Custom column header text -Create map where Column is key and header text is value. Pass that map as argument to Exporter subclass constructor. +When grid is created with bean type create map where Column is key and header text is value. Pass that map as argument to Exporter subclass constructor. If map is null then default column key will be used for creating column header in excel. ``` private Map, String> gridHeaderMap; @@ -34,6 +34,7 @@ private Map, String> gridHeaderMap; Exporter.exportAsExcel(grid, gridHeaderMap) ``` Exporter works as using reflection to read property from each item, any column without a valid key will be ignored. +In case when grid is created without bean type (adding columns with value providers) then map with column headers is mandatory. ### Data formats, excel builtin and custom data formats From f7e7e58cf129dbb8ecc20a229153b13c73f119ee Mon Sep 17 00:00:00 2001 From: simpletasks Date: Sat, 5 Oct 2019 16:42:24 +0200 Subject: [PATCH 11/15] Update README. --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5304e2c..eb0f8fd 100755 --- a/README.md +++ b/README.md @@ -26,6 +26,8 @@ grid.addColumn(Person::getEmail).setKey("email"); ### Custom column header text +Exporter works as using reflection to read property from each item, any column without a valid key will be ignored. + When grid is created with bean type create map where Column is key and header text is value. Pass that map as argument to Exporter subclass constructor. If map is null then default column key will be used for creating column header in excel. ``` @@ -33,7 +35,7 @@ private Map, String> gridHeaderMap; ... Exporter.exportAsExcel(grid, gridHeaderMap) ``` -Exporter works as using reflection to read property from each item, any column without a valid key will be ignored. + In case when grid is created without bean type (adding columns with value providers) then map with column headers is mandatory. ### Data formats, excel builtin and custom data formats From 1832d0e0f1425a05f28c140898450abf4f40d0c5 Mon Sep 17 00:00:00 2001 From: simpletasks Date: Sat, 5 Oct 2019 16:43:44 +0200 Subject: [PATCH 12/15] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eb0f8fd..d1ae102 100755 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ grid.addColumn(Person::getEmail).setKey("email"); Exporter works as using reflection to read property from each item, any column without a valid key will be ignored. -When grid is created with bean type create map where Column is key and header text is value. Pass that map as argument to Exporter subclass constructor. +When grid is created using bean type create map where Column is key and header text is value. Pass that map as argument to Exporter subclass constructor. If map is null then default column key will be used for creating column header in excel. ``` private Map, String> gridHeaderMap; From 72e612a959015fb7da5beec539e7ff6399b2224b Mon Sep 17 00:00:00 2001 From: simpletasks Date: Sat, 5 Oct 2019 16:46:07 +0200 Subject: [PATCH 13/15] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d1ae102..3d4e20a 100755 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Exporter.exportAsExcel(grid, gridHeaderMap) In case when grid is created without bean type (adding columns with value providers) then map with column headers is mandatory. -### Data formats, excel builtin and custom data formats +### Data formats, excel built-in and custom data formats By default excel exporter will use default excel data formats for date, time and numbers. To set custom formats: ``` From 5c4e6c2f44673c57797d9cbb2f977178a9254a5d Mon Sep 17 00:00:00 2001 From: simpletasks Date: Fri, 10 Apr 2020 04:11:43 +0200 Subject: [PATCH 14/15] Update branch (#5) * Add option for custom grid column header text. * Fix repeated excel export. Before it was loosing the header row when export was clicked more then one time. * enclosing cell value in quotes if it contains comma character when exporting to CSV Co-authored-by: haiwan Co-authored-by: Alex Marchenko --- src/main/java/org/vaadin/haijian/CSVFileBuilder.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/vaadin/haijian/CSVFileBuilder.java b/src/main/java/org/vaadin/haijian/CSVFileBuilder.java index 477625c..69f1c1f 100644 --- a/src/main/java/org/vaadin/haijian/CSVFileBuilder.java +++ b/src/main/java/org/vaadin/haijian/CSVFileBuilder.java @@ -32,6 +32,8 @@ protected void buildCell(Object value) { try { if(value == null){ writer.append(""); + }else if (value.toString().contains(",")) { + writer.append("\"").append(value.toString()).append("\""); }else { writer.append(value.toString()); } From 0e38657796dbf8fb854b9053bb68f95dc2934e1e Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Fri, 10 Apr 2020 12:18:36 +0200 Subject: [PATCH 15/15] Fix merge commit. --- src/main/java/org/vaadin/haijian/FileBuilder.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/vaadin/haijian/FileBuilder.java b/src/main/java/org/vaadin/haijian/FileBuilder.java index 063c7a8..7397a7b 100644 --- a/src/main/java/org/vaadin/haijian/FileBuilder.java +++ b/src/main/java/org/vaadin/haijian/FileBuilder.java @@ -113,7 +113,6 @@ private void buildHeaderRow() { }); } } - } void buildColumnHeaderCell(String header) {