in extensions/vw/tabular/excel/src/main/java/org/apache/causeway/extensions/tabular/excel/exporter/ExcelCellWriter.java [35:173]
record ExcelCellWriter(
/**
* If a cell's cardinality exceeds this threshold, truncate with '... has more' label at the end.
*/
int maxCellElements,
ExcelImageHandler imageHandler) {
private static final String POI_LINE_DELIMITER = "\n";
/**
* @return lines actually written to the cell (1 or more)
*/
int setCellValue(
final TabularColumn column,
final TabularCell tabularCell,
final Cell cell,
final CellStyleProvider cellStyleProvider) {
if(tabularCell.cardinality() == 0) {
cell.setBlank();
return 1;
}
if(tabularCell.eitherValueOrLabelSupplier().isRight()) {
String joinedElementsLiteral = tabularCell.labels()
.limit(maxCellElements)
.collect(Collectors.joining(POI_LINE_DELIMITER));
// if cardinality exceeds threshold, truncate with 'has more' label at the end
final int overflow = tabularCell.cardinality() - maxCellElements;
if(overflow>0) {
joinedElementsLiteral += POI_LINE_DELIMITER + String.format("(has %d more)", overflow);
}
cell.setCellValue(joinedElementsLiteral);
cellStyleProvider.applyMultilineStyle(cell);
return overflow>0
? maxCellElements + 1
: tabularCell.cardinality();
}
final var valueAsObj = tabularCell.eitherValueOrLabelSupplier().leftIfAny();
// null guard
if(valueAsObj == null) {
cell.setBlank();
return 1;
}
// String
if(valueAsObj instanceof CharSequence value) {
cell.setCellValue(value.toString());
return 1;
}
// boolean
if(valueAsObj instanceof Boolean value) {
cell.setCellValue(value);
return 1;
}
// date
if(valueAsObj instanceof Date value) {
setCellValueForDate(cell, value, cellStyleProvider);
return 1;
}
if(valueAsObj instanceof LocalDate value) {
Date date = _TimeConversion.toDate(value);
setCellValueForDate(cell, date, cellStyleProvider);
return 1;
}
if(valueAsObj instanceof LocalDateTime value) {
Date date = _TimeConversion.toDate(value);
setCellValueForDate(cell, date, cellStyleProvider);
return 1;
}
if(valueAsObj instanceof OffsetDateTime value) {
Date date = _TimeConversion.toDate(value);
setCellValueForDate(cell, date, cellStyleProvider);
return 1;
}
// number
if(valueAsObj instanceof Double value) {
setCellValueForDouble(cell, value);
return 1;
}
if(valueAsObj instanceof Float value) {
setCellValueForDouble(cell, value);
return 1;
}
if(valueAsObj instanceof BigDecimal value) {
setCellValueForDouble(cell, value.doubleValue());
return 1;
}
if(valueAsObj instanceof BigInteger value) {
setCellValueForDouble(cell, value.doubleValue());
return 1;
}
if(valueAsObj instanceof Long value) {
setCellValueForDouble(cell, value);
return 1;
}
if(valueAsObj instanceof Integer value) {
setCellValueForDouble(cell, value);
return 1;
}
if(valueAsObj instanceof Short value) {
setCellValueForDouble(cell, value);
return 1;
}
if(valueAsObj instanceof Byte value) {
setCellValueForDouble(cell, value);
return 1;
}
// image
if(valueAsObj instanceof BufferedImage value) {
imageHandler.addImage(value, cell);
return 1;
}
// if all else fails fallback to value's toString method
final String objectAsStr = tabularCell.labels().findFirst().orElseGet(valueAsObj::toString);
cell.setCellValue(objectAsStr);
return 1;
}
private static void setCellValueForDouble(final Cell cell, final double value) {
cell.setCellValue(value);
}
private static void setCellValueForDate(final Cell cell, final Date date, final CellStyleProvider cellStyleProvider) {
cell.setCellValue(date);
cellStyleProvider.applyDateStyle(cell);
}
}