From 9ec25a19f453ad9725c8b88d7f9fe9334476761f Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Mon, 1 Apr 2024 08:55:18 -0500 Subject: [PATCH] CE-881 - Pivot table cleanup --- .../ExcelPoiBasedStreamingExportStreamer.java | 85 ++++++++++++++----- 1 file changed, 66 insertions(+), 19 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/excel/poi/ExcelPoiBasedStreamingExportStreamer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/excel/poi/ExcelPoiBasedStreamingExportStreamer.java index 670bcbba..01c11efd 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/excel/poi/ExcelPoiBasedStreamingExportStreamer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/excel/poi/ExcelPoiBasedStreamingExportStreamer.java @@ -41,6 +41,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; @@ -56,6 +57,7 @@ import com.kingsrook.qqq.backend.core.model.actions.reporting.pivottable.PivotTa import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.metadata.fields.DisplayFormat; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType; import com.kingsrook.qqq.backend.core.model.metadata.reporting.QReportField; import com.kingsrook.qqq.backend.core.model.metadata.reporting.QReportView; import com.kingsrook.qqq.backend.core.model.metadata.reporting.ReportType; @@ -83,6 +85,8 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelPoiBasedStreamingExportStreamer implements ExportStreamerInterface { private static final QLogger LOG = QLogger.getLogger(ExcelPoiBasedStreamingExportStreamer.class); + public static final String EXCEL_DATE_FORMAT = "yyyy-MM-dd"; + public static final String EXCEL_DATE_TIME_FORMAT = "yyyy-MM-dd H:mm:ss"; private List views; private ExportInput exportInput; @@ -102,9 +106,10 @@ public class ExcelPoiBasedStreamingExportStreamer implements ExportStreamerInter private Writer activeSheetWriter = null; private StreamedPoiSheetWriter sheetWriter = null; - private QReportView currentView = null; - private Map> fieldsPerView = new HashMap<>(); - private Map rowsPerView = new HashMap<>(); + private QReportView currentView = null; + private Map> fieldsPerView = new HashMap<>(); + private Map rowsPerView = new HashMap<>(); + private Map labelViewsByName = new HashMap<>(); @@ -145,7 +150,13 @@ public class ExcelPoiBasedStreamingExportStreamer implements ExportStreamerInter int sheetCounter = 1; for(QReportView view : views) { - String label = Objects.requireNonNullElse(view.getLabel(), "Sheet " + sheetCounter); + String label = Objects.requireNonNullElse(view.getLabel(), "Sheet " + sheetCounter); + + ///////////////////////////////////////////////////////////////////////////////////////////// + // track the actually-used sheet labels (needed for referencing in pivot table generation) // + ///////////////////////////////////////////////////////////////////////////////////////////// + labelViewsByName.put(view.getName(), label); + XSSFSheet sheet = workbook.createSheet(label); String sheetReference = sheet.getPackagePart().getPartName().getName().substring(1); sheetMapByExcelReference.put(sheetReference, sheet); @@ -304,7 +315,38 @@ public class ExcelPoiBasedStreamingExportStreamer implements ExportStreamerInter // todo - some bug where, if use a group-by field here, then ... it doesn't get used for the grouping. // // g-sheets does let me do this, so, maybe, download their file and see how it's different? // ///////////////////////////////////////////////////////////////////////////////////////////////////////// - pivotTable.addColumnLabel(DataConsolidateFunction.valueOf(value.getFunction().name()), columnLabelColumnIndex); + String labelPrefix = value.getFunction().name() + " of "; + String label = labelPrefix + QInstanceEnricher.nameToLabel(value.getFieldName()); + String valueFormat = null; + + Optional optSourceField = dataView.getColumns().stream().filter(c -> c.getName().equals(value.getFieldName())).findFirst(); + if(optSourceField.isPresent()) + { + QReportField sourceField = optSourceField.get(); + + if(StringUtils.hasContent(sourceField.getLabel())) + { + label = labelPrefix + sourceField.getLabel(); + } + + if(StringUtils.hasContent(sourceField.getDisplayFormat())) + { + valueFormat = DisplayFormat.getExcelFormat(sourceField.getDisplayFormat()); + } + else + { + if(QFieldType.DATE.equals(sourceField.getType())) + { + valueFormat = EXCEL_DATE_FORMAT; + } + else if(QFieldType.DATE_TIME.equals(sourceField.getType())) + { + valueFormat = EXCEL_DATE_TIME_FORMAT; + } + } + } + + pivotTable.addColumnLabel(DataConsolidateFunction.valueOf(value.getFunction().name()), columnLabelColumnIndex, label, valueFormat); } } @@ -336,11 +378,11 @@ public class ExcelPoiBasedStreamingExportStreamer implements ExportStreamerInter CreationHelper createHelper = workbook.getCreationHelper(); XSSFCellStyle dateStyle = workbook.createCellStyle(); - dateStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-MM-dd")); + dateStyle.setDataFormat(createHelper.createDataFormat().getFormat(EXCEL_DATE_FORMAT)); styles.put("date", dateStyle); XSSFCellStyle dateTimeStyle = workbook.createCellStyle(); - dateTimeStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-MM-dd H:mm:ss")); + dateTimeStyle.setDataFormat(createHelper.createDataFormat().getFormat(EXCEL_DATE_TIME_FORMAT)); styles.put("datetime", dateTimeStyle); styles.put("title", poiExcelStylerInterface.createStyleForTitle(workbook, createHelper)); @@ -348,11 +390,11 @@ public class ExcelPoiBasedStreamingExportStreamer implements ExportStreamerInter styles.put("footer", poiExcelStylerInterface.createStyleForFooter(workbook, createHelper)); XSSFCellStyle footerDateStyle = poiExcelStylerInterface.createStyleForFooter(workbook, createHelper); - footerDateStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-MM-dd")); + footerDateStyle.setDataFormat(createHelper.createDataFormat().getFormat(EXCEL_DATE_FORMAT)); styles.put("footer-date", footerDateStyle); XSSFCellStyle footerDateTimeStyle = poiExcelStylerInterface.createStyleForFooter(workbook, createHelper); - footerDateTimeStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-MM-dd H:mm:ss")); + footerDateTimeStyle.setDataFormat(createHelper.createDataFormat().getFormat(EXCEL_DATE_TIME_FORMAT)); styles.put("footer-datetime", footerDateTimeStyle); } @@ -732,16 +774,21 @@ public class ExcelPoiBasedStreamingExportStreamer implements ExportStreamerInter ///////////////////////////////////////////////////////////////////////////////////// activeSheetWriter = new OutputStreamWriter(zipOutputStream); activeSheetWriter.write(String.format(""" - - - - - - - %s - - - """, CellReference.convertNumToColString(dataView.getColumns().size() - 1), rowsPerView.get(dataView.getName()), dataView.getColumns().size(), StringUtils.join("\n", cachedFieldElements))); + + + + + + + %s + + + """, + labelViewsByName.get(dataView.getName()), + CellReference.convertNumToColString(dataView.getColumns().size() - 1), + rowsPerView.get(dataView.getName()), + dataView.getColumns().size(), + StringUtils.join("\n", cachedFieldElements))); } catch(Exception e) {