From 11592e263b39faea00f8877568ccc964b6032e9e Mon Sep 17 00:00:00 2001 From: Lars Johansson <lars.johansson@ess.eu> Date: Thu, 19 Jan 2023 14:43:01 +0100 Subject: [PATCH] Update Excel handling for format, font, style, column width --- .../org/openepics/names/util/ExcelUtil.java | 188 +++++++++++++----- .../static/templates/NameElementCommand.xlsx | Bin 7168 -> 7151 bytes .../templates/StructureElementCommand.xlsx | Bin 7294 -> 7256 bytes 3 files changed, 142 insertions(+), 46 deletions(-) diff --git a/src/main/java/org/openepics/names/util/ExcelUtil.java b/src/main/java/org/openepics/names/util/ExcelUtil.java index 5f59d780..173fadbb 100644 --- a/src/main/java/org/openepics/names/util/ExcelUtil.java +++ b/src/main/java/org/openepics/names/util/ExcelUtil.java @@ -65,12 +65,12 @@ public class ExcelUtil { private static final Logger LOGGER = Logger.getLogger(ExcelUtil.class.getName()); - public static final String MIME_TYPE_EXCEL = "application/vnd.ms-excel"; - public static final String MIME_TYPE_OPENXML_SPREADSHEET = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; + public static final String MIME_TYPE_EXCEL = "application/vnd.ms-excel"; + public static final String MIME_TYPE_OPENXML_SPREADSHEET = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; // width (in units of 1/256th of a character width) - // column width 2.75 inch (to fit header text and uuid) - private static final int SHEET_COLUMN_WIDTH = 28 * 256 + 64; + // column width 3.44 inch (to fit header text and uuid) + private static final int SHEET_COLUMN_WIDTH = 35 * 256 + 64; private static final int NAMEELEMENTCOMMAND_LENGTH = 6; private static final String[][] NAMEELEMENT_HEADER_COMMENT = { @@ -108,7 +108,9 @@ public class ExcelUtil { {"When", "Date and time when the structure entry was created."}, {"Who", "Name (user) of who created the structure entry."} }; + private static final String ARIAL = "Arial"; private static final String SHEET = "Entries"; + private static final String TEXT = "text"; private static final String FAILED_TO_EXPORT_VALUES_TO_FILE = "Failed to export values to file"; private static final String FILE_COULD_NOT_BE_PARSED_FOR_VALUE_AT_ROW_CELL = "File could not be parsed for value at row: {0} cell: {1}"; @@ -395,14 +397,28 @@ public class ExcelUtil { try (Workbook workbook = new XSSFWorkbook(); ByteArrayOutputStream out = new ByteArrayOutputStream();) { Sheet sheet = workbook.createSheet(SHEET); - // prepare header + // prepare Drawing<?> drawing = sheet.createDrawingPatriarch(); CreationHelper factory = workbook.getCreationHelper(); ClientAnchor anchor = factory.createClientAnchor(); + + // format, font, style DataFormat format = workbook.createDataFormat(); - short textFormat = format.getFormat("text"); + short textFormat = format.getFormat(TEXT); Font headerFont = workbook.createFont(); headerFont.setBold(true); + headerFont.setFontHeightInPoints((short)12); + headerFont.setFontName(ARIAL); + Font dataFont = workbook.createFont(); + dataFont.setBold(false); + dataFont.setFontHeightInPoints((short)12); + dataFont.setFontName(ARIAL); + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setDataFormat(textFormat); + headerCellStyle.setFont(headerFont); + CellStyle dataCellStyle = workbook.createCellStyle(); + dataCellStyle.setDataFormat(textFormat); + dataCellStyle.setFont(dataFont); // header Row headerRow = sheet.createRow(0); @@ -416,10 +432,7 @@ public class ExcelUtil { sheet.setColumnWidth(columnIndex, SHEET_COLUMN_WIDTH); // style - CellStyle cellStyle = cell.getCellStyle(); - cellStyle.setDataFormat(textFormat); - cellStyle.setFont(headerFont); - cell.setCellStyle(cellStyle); + cell.setCellStyle(headerCellStyle); // comment anchor.setRow1(headerRow.getRowNum()); @@ -436,21 +449,57 @@ public class ExcelUtil { // data int rowIndex = 1; for (NameElement nameElement : nameElements) { - Row row = sheet.createRow(rowIndex++); - row.createCell(0).setCellValue(nameElement.getUuid() != null ? nameElement.getUuid().toString() : null); - row.createCell(1).setCellValue(nameElement.getParentSystemStructure() != null ? nameElement.getParentSystemStructure().toString() : null); - row.createCell(2).setCellValue(nameElement.getParentDeviceStructure() != null ? nameElement.getParentDeviceStructure().toString() : null); - row.createCell(3).setCellValue(nameElement.getIndex()); - row.createCell(4).setCellValue(nameElement.getDescription()); - row.createCell(5).setCellValue(nameElement.getComment()); - row.createCell(6).setCellValue(nameElement.getSystemStructure()); - row.createCell(7).setCellValue(nameElement.getDeviceStructure()); - row.createCell(8).setCellValue(nameElement.getName()); - row.createCell(9).setCellValue(nameElement.getStatus() != null ? nameElement.getStatus().toString() : null); - row.createCell(10).setCellValue(nameElement.isLatest()); - row.createCell(11).setCellValue(nameElement.isDeleted()); - row.createCell(12).setCellValue(DateFormat.getDateTimeInstance().format(nameElement.getWhen())); - row.createCell(13).setCellValue(nameElement.getWho()); + Row row = sheet.createRow(rowIndex++); + for (int columnIndex = 0; columnIndex < NAMEELEMENT_HEADER_COMMENT.length; columnIndex++) { + Cell cell = row.createCell(columnIndex); + cell.setCellStyle(dataCellStyle); + switch (columnIndex) { + case 0: + cell.setCellValue(nameElement.getUuid() != null ? nameElement.getUuid().toString() : null); + break; + case 1: + cell.setCellValue(nameElement.getParentSystemStructure() != null ? nameElement.getParentSystemStructure().toString() : null); + break; + case 2: + cell.setCellValue(nameElement.getParentDeviceStructure() != null ? nameElement.getParentDeviceStructure().toString() : null); + break; + case 3: + cell.setCellValue(nameElement.getIndex()); + break; + case 4: + cell.setCellValue(nameElement.getDescription()); + break; + case 5: + cell.setCellValue(nameElement.getComment()); + break; + case 6: + cell.setCellValue(nameElement.getSystemStructure()); + break; + case 7: + cell.setCellValue(nameElement.getDeviceStructure()); + break; + case 8: + cell.setCellValue(nameElement.getName()); + break; + case 9: + cell.setCellValue(nameElement.getStatus() != null ? nameElement.getStatus().toString() : null); + break; + case 10: + cell.setCellValue(nameElement.isLatest()); + break; + case 11: + cell.setCellValue(nameElement.isDeleted()); + break; + case 12: + cell.setCellValue(DateFormat.getDateTimeInstance().format(nameElement.getWhen())); + break; + case 13: + cell.setCellValue(nameElement.getWho()); + break; + default: + break; + } + } } workbook.write(out); return new ByteArrayInputStream(out.toByteArray()); @@ -485,14 +534,28 @@ public class ExcelUtil { try (Workbook workbook = new XSSFWorkbook(); ByteArrayOutputStream out = new ByteArrayOutputStream();) { Sheet sheet = workbook.createSheet(SHEET); - // prepare header + // prepare Drawing<?> drawing = sheet.createDrawingPatriarch(); CreationHelper factory = workbook.getCreationHelper(); ClientAnchor anchor = factory.createClientAnchor(); + + // format, font, style DataFormat format = workbook.createDataFormat(); - short textFormat = format.getFormat("text"); + short textFormat = format.getFormat(TEXT); Font headerFont = workbook.createFont(); headerFont.setBold(true); + headerFont.setFontHeightInPoints((short)12); + headerFont.setFontName(ARIAL); + Font dataFont = workbook.createFont(); + dataFont.setBold(false); + dataFont.setFontHeightInPoints((short)12); + dataFont.setFontName(ARIAL); + CellStyle headerCellStyle = workbook.createCellStyle(); + headerCellStyle.setDataFormat(textFormat); + headerCellStyle.setFont(headerFont); + CellStyle dataCellStyle = workbook.createCellStyle(); + dataCellStyle.setDataFormat(textFormat); + dataCellStyle.setFont(dataFont); // header Row headerRow = sheet.createRow(0); @@ -506,10 +569,7 @@ public class ExcelUtil { sheet.setColumnWidth(columnIndex, SHEET_COLUMN_WIDTH); // style - CellStyle cellStyle = cell.getCellStyle(); - cellStyle.setDataFormat(textFormat); - cellStyle.setFont(headerFont); - cell.setCellStyle(cellStyle); + cell.setCellStyle(headerCellStyle); // comment anchor.setRow1(headerRow.getRowNum()); @@ -526,21 +586,57 @@ public class ExcelUtil { // data int rowIndex = 1; for (StructureElement structureElement : structureElements) { - Row row = sheet.createRow(rowIndex++); - row.createCell(0).setCellValue(structureElement.getUuid() != null ? structureElement.getUuid().toString() : null); - row.createCell(1).setCellValue(structureElement.getType() != null ? structureElement.getType().toString() : null); - row.createCell(2).setCellValue(structureElement.getParent() != null ? structureElement.getParent().toString() : null); - row.createCell(3).setCellValue(structureElement.getName()); - row.createCell(4).setCellValue(structureElement.getMnemonic()); - row.createCell(5).setCellValue(structureElement.getDescription()); - row.createCell(6).setCellValue(structureElement.getComment()); - row.createCell(7).setCellValue(structureElement.getMnemonicPath()); - row.createCell(8).setCellValue(structureElement.getLevel()); - row.createCell(9).setCellValue(structureElement.getStatus() != null ? structureElement.getStatus().toString() : null); - row.createCell(10).setCellValue(structureElement.isLatest()); - row.createCell(11).setCellValue(structureElement.isDeleted()); - row.createCell(12).setCellValue(DateFormat.getDateTimeInstance().format(structureElement.getWhen())); - row.createCell(13).setCellValue(structureElement.getWho()); + Row row = sheet.createRow(rowIndex++); + for (int columnIndex = 0; columnIndex < NAMEELEMENT_HEADER_COMMENT.length; columnIndex++) { + Cell cell = row.createCell(columnIndex); + cell.setCellStyle(dataCellStyle); + switch (columnIndex) { + case 0: + cell.setCellValue(structureElement.getUuid() != null ? structureElement.getUuid().toString() : null); + break; + case 1: + cell.setCellValue(structureElement.getType() != null ? structureElement.getType().toString() : null); + break; + case 2: + cell.setCellValue(structureElement.getParent() != null ? structureElement.getParent().toString() : null); + break; + case 3: + cell.setCellValue(structureElement.getName()); + break; + case 4: + cell.setCellValue(structureElement.getMnemonic()); + break; + case 5: + cell.setCellValue(structureElement.getDescription()); + break; + case 6: + cell.setCellValue(structureElement.getComment()); + break; + case 7: + cell.setCellValue(structureElement.getMnemonicPath()); + break; + case 8: + cell.setCellValue(structureElement.getLevel()); + break; + case 9: + cell.setCellValue(structureElement.getStatus() != null ? structureElement.getStatus().toString() : null); + break; + case 10: + cell.setCellValue(structureElement.isLatest()); + break; + case 11: + cell.setCellValue(structureElement.isDeleted()); + break; + case 12: + cell.setCellValue(DateFormat.getDateTimeInstance().format(structureElement.getWhen())); + break; + case 13: + cell.setCellValue(structureElement.getWho()); + break; + default: + break; + } + } } workbook.write(out); return new ByteArrayInputStream(out.toByteArray()); diff --git a/src/main/resources/static/templates/NameElementCommand.xlsx b/src/main/resources/static/templates/NameElementCommand.xlsx index bddda9b8c789cd7daf1940ab52342bac678c5cf8..c7b958fc540bbadb1edc3ce9bad34bac6e23a98b 100644 GIT binary patch delta 3383 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 delta 3449 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 POb4cuLx4Q)>eT)ZyyP|$ diff --git a/src/main/resources/static/templates/StructureElementCommand.xlsx b/src/main/resources/static/templates/StructureElementCommand.xlsx index 4f0b0b720089e3491e9350cd19c5f9d1480cc220..a1307bf5471519e6f5dbb173e1d23de406feaa15 100644 GIT binary patch delta 3519 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 TH)i~=jS$XESb|~hFj4;l)>a=8 delta 3472 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 H_ul^jl5kI| -- GitLab