record ExcelCellWriter()

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);
    }
    


}