From bee0e9bcd445df06e3a22f6a9e680231e0cebd16 Mon Sep 17 00:00:00 2001 From: lewa <lene.wasskog@nibio.no> Date: Wed, 28 Aug 2024 18:25:25 +0200 Subject: [PATCH] feat: Add meta sheet with info about download, make header row bold --- .../logic/service/ObservationService.java | 2 +- .../vips/logic/util/ExcelFileGenerator.java | 47 +++++++++++++++---- .../vips/logic/i18n/vipslogictexts.properties | 6 +++ .../logic/i18n/vipslogictexts_nb.properties | 6 +++ 4 files changed, 50 insertions(+), 11 deletions(-) diff --git a/src/main/java/no/nibio/vips/logic/service/ObservationService.java b/src/main/java/no/nibio/vips/logic/service/ObservationService.java index 046ff1ac..12aa050d 100755 --- a/src/main/java/no/nibio/vips/logic/service/ObservationService.java +++ b/src/main/java/no/nibio/vips/logic/service/ObservationService.java @@ -200,7 +200,7 @@ public class ObservationService { try { List<ObservationListItem> observations = getFilteredObservationListItems(organizationId, observationTimeSeriesId, pestId, cropId, cropCategoryId, fromStr, toStr, userUUID, localeStr, isPositive); - byte[] excelFile = ExcelFileGenerator.generateExcel(user, locale, observations); + byte[] excelFile = ExcelFileGenerator.generateExcel(user, locale, now, fromStr, toStr, observations); return Response .ok(excelFile) diff --git a/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java b/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java index 918b3a14..0be1c944 100644 --- a/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java +++ b/src/main/java/no/nibio/vips/logic/util/ExcelFileGenerator.java @@ -16,14 +16,16 @@ import org.slf4j.LoggerFactory; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; public final class ExcelFileGenerator { - private static Logger LOGGER = LoggerFactory.getLogger(ExcelFileGenerator.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ExcelFileGenerator.class); private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); private static final ObjectMapper objectMapper = new ObjectMapper(); private enum ColumnIndex { @@ -73,24 +75,43 @@ public final class ExcelFileGenerator { } } - public static byte[] generateExcel(VipsLogicUser user, ULocale locale, List<ObservationListItem> observations) throws IOException { + public static byte[] generateExcel(VipsLogicUser user, ULocale locale, LocalDateTime now, String fromStr, String toStr, List<ObservationListItem> observations) throws IOException { ResourceBundle rb = ResourceBundle.getBundle("no.nibio.vips.logic.i18n.vipslogictexts", locale.toLocale()); boolean isAdmin = user != null && (user.isSuperUser() || user.isOrganizationAdmin()); LOGGER.info("Create Excel file containing {} observations for {} user", observations.size(), isAdmin ? "admin": "regular"); try (XSSFWorkbook workbook = new XSSFWorkbook(); ByteArrayOutputStream out = new ByteArrayOutputStream()) { - // Create main mainSheet for all observations, with header row + // Create main sheet for all observations, with header row Sheet mainSheet = workbook.createSheet(rb.getString("allObservations")); createHeaderRow(isAdmin, mainSheet, rb); int mainSheetRowIndex = 1; // Add one row for each observation in list of all observations for (ObservationListItem item : observations) { - createItemRow(isAdmin, workbook, mainSheet, mainSheetRowIndex++, item, rb); + createItemRow(isAdmin, mainSheet, mainSheetRowIndex++, item, rb); } autoSizeColumns(mainSheet, 0, ColumnIndex.INDEX_DATA.getIndex(isAdmin) - 1); + // Create meta sheet for information about the download + Sheet metaSheet = workbook.createSheet(rb.getString("downloadInfo")); + Row userRow = metaSheet.createRow(0); + userRow.createCell(0).setCellValue(rb.getString("downloadedBy")); + userRow.createCell(1).setCellValue(user != null ? user.getFullName(): rb.getString("unregisteredUser")); + Row timeRow = metaSheet.createRow(1); + timeRow.createCell(0).setCellValue(rb.getString("downloadedTime")); + timeRow.createCell(1).setCellValue(DATE_TIME_FORMATTER.format(now)); + Row fromRow = metaSheet.createRow(2); + fromRow.createCell(0).setCellValue(rb.getString("dateStart")); + fromRow.createCell(1).setCellValue(fromStr); + Row toRow = metaSheet.createRow(3); + toRow.createCell(0).setCellValue(rb.getString("dateEnd")); + toRow.createCell(1).setCellValue(toStr); + Row countRow = metaSheet.createRow(4); + countRow.createCell(0).setCellValue(rb.getString("observationCount")); + countRow.createCell(1).setCellValue(observations.size()); + autoSizeColumns(metaSheet, 0, 1); + // Prepare list of observations for each type of pest Map<Integer, List<ObservationListItem>> pestObservations = getObservationsForEachPest(observations); @@ -111,7 +132,7 @@ public final class ExcelFileGenerator { int pestSheetRowIndex = 1; for (ObservationListItem item : observationsForPest) { - Row row = createItemRow(isAdmin, workbook, pestSheet, pestSheetRowIndex++, item, rb); + Row row = createItemRow(isAdmin, pestSheet, pestSheetRowIndex++, item, rb); if (item.getObservationData() != null) { Map<String, Object> observationDataMap = objectMapper.readValue(item.getObservationData(), HashMap.class); @@ -214,9 +235,15 @@ public final class ExcelFileGenerator { * @return the newly created header row */ public static Row createHeaderRow(boolean isAdmin, Sheet sheet, ResourceBundle rb) { + Font font = sheet.getWorkbook().createFont(); + font.setBold(true); + CellStyle style = sheet.getWorkbook().createCellStyle(); + style.setFont(font); Row headerRow = sheet.createRow(0); for (ColumnIndex columnIndex : ColumnIndex.forUser(isAdmin)) { - headerRow.createCell(columnIndex.getIndex(isAdmin)).setCellValue(columnIndex.getColumnHeading(rb)); + Cell cell = headerRow.createCell(columnIndex.getIndex(isAdmin)); + cell.setCellStyle(style); + cell.setCellValue(columnIndex.getColumnHeading(rb)); } return headerRow; } @@ -225,16 +252,15 @@ public final class ExcelFileGenerator { * Create row with given index, for given observation list item * * @param isAdmin Whether the user is a logged in admin - * @param workbook The current workbook * @param sheet The sheet to which a row will be added * @param rowIndex The index of the row * @param item The item of which to add data * @return the newly created row */ - private static Row createItemRow(boolean isAdmin, XSSFWorkbook workbook, Sheet sheet, int rowIndex, ObservationListItem item, ResourceBundle rb) throws JsonProcessingException { + private static Row createItemRow(boolean isAdmin, Sheet sheet, int rowIndex, ObservationListItem item, ResourceBundle rb) throws JsonProcessingException { LocalDate localDateOfObservation = item.getTimeOfObservation().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); Row row = sheet.createRow(rowIndex); - addObservationLinkToFirstCol(isAdmin, workbook, row, item.getObservationId()); + addObservationLinkToFirstCol(isAdmin, row, item.getObservationId()); row.createCell(ColumnIndex.DATE.getIndex(isAdmin)).setCellValue(localDateOfObservation.format(DATE_FORMATTER)); row.createCell(ColumnIndex.POI_NAME.getIndex(isAdmin)).setCellValue(item.getLocationPointOfInterestName()); @@ -265,10 +291,11 @@ public final class ExcelFileGenerator { return rb.getString("no"); } - private static void addObservationLinkToFirstCol(boolean isAdmin, Workbook workbook, Row row, Integer observationId) { + private static void addObservationLinkToFirstCol(boolean isAdmin, Row row, Integer observationId) { Cell cell = row.createCell(ColumnIndex.ID.getIndex(isAdmin)); cell.setCellValue(observationId); + Workbook workbook = row.getSheet().getWorkbook(); CreationHelper creationHelper = workbook.getCreationHelper(); Hyperlink hyperlink = creationHelper.createHyperlink(HyperlinkType.URL); //hyperlink.setAddress("https://www.vips-landbruk.no/observations/" + observationId); diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties index 3eea5dd6..8d980b99 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties @@ -1062,3 +1062,9 @@ observationId=Observation isBroadcast=Is broadcast yes=Yes no=No +downloadInfo=About download +downloadedBy=Downloaded by +unregisteredUser=Unregistered user +downloadedTime=Time of download +observationCount=Observation count + diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties index 5a4ae449..afa6a491 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties @@ -1061,3 +1061,9 @@ observationId=Observasjon isBroadcast=Er kringkastet yes=Ja no=Nei +downloadInfo=Om nedlastingen +downloadedBy=Lastet ned av +unregisteredUser=Uregistrert bruker +downloadedTime=Tidspunkt for nedlasting +observationCount=Antall observasjoner + -- GitLab