From 957b6a403650ebc9a81352a939f3352b1392b14f Mon Sep 17 00:00:00 2001 From: jam01 Date: Mon, 20 Nov 2023 12:41:16 -0600 Subject: [PATCH 1/2] handle formulas --- .../plugins/DefaultExcelPlugin.java | 38 ++++++++++-------- .../xtrasonnet/plugins/ExcelPluginTest.java | 14 +++++++ xtrasonnet/src/test/resources/formula.xlsx | Bin 0 -> 4828 bytes 3 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 xtrasonnet/src/test/resources/formula.xlsx diff --git a/xtrasonnet/src/main/java/io/github/jam01/xtrasonnet/plugins/DefaultExcelPlugin.java b/xtrasonnet/src/main/java/io/github/jam01/xtrasonnet/plugins/DefaultExcelPlugin.java index 95be7fb..7d47a6b 100644 --- a/xtrasonnet/src/main/java/io/github/jam01/xtrasonnet/plugins/DefaultExcelPlugin.java +++ b/xtrasonnet/src/main/java/io/github/jam01/xtrasonnet/plugins/DefaultExcelPlugin.java @@ -12,6 +12,7 @@ import io.github.jam01.xtrasonnet.document.MediaTypes; import io.github.jam01.xtrasonnet.spi.BasePlugin; import io.github.jam01.xtrasonnet.spi.PluginException; +import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Workbook; @@ -20,6 +21,7 @@ import sjsonnet.EvalScope; import sjsonnet.Position; import sjsonnet.Val; +import upickle.core.Visitor; import java.io.File; import java.io.IOException; @@ -70,22 +72,7 @@ public Val.Literal read(Document doc, Position pos) throws PluginException { var cVisitor = rVisitor.subVisitor(); var type = cell.getCellType(); - Val.Literal val = null; - if (CellType.BOOLEAN == type) { - if (cell.getBooleanCellValue()) val = (Val.Literal) cVisitor.visitTrue(-1); - else cVisitor.visitFalse(-1); - } else if (CellType.NUMERIC == type) { - if (DateUtil.isCellDateFormatted(cell)) { - val = (Val.Literal) cVisitor.visitString(cell.getLocalDateTimeCellValue().toString(), -1); - } else { - val = (Val.Literal) cVisitor.visitFloat64(cell.getNumericCellValue(), -1); - } - } else if (CellType.STRING == type || CellType.FORMULA == type || CellType.BLANK == type) { - val = (Val.Literal) cVisitor.visitString(cell.getStringCellValue(), -1); - } else { - throw new IllegalArgumentException("Cannot represent type: " + type.toString() + " as a jsonnet element"); - } - + Val.Literal val = literalOf(type, cell, cVisitor); rVisitor.visitValue(val, -1); } sVisitor.visitValue(rVisitor.visitEnd(-1), -1); @@ -99,6 +86,25 @@ public Val.Literal read(Document doc, Position pos) throws PluginException { return bVisitor.visitEnd(-1); } + private static Val.Literal literalOf(CellType type, Cell cell, Visitor cVisitor) { + if (CellType.BOOLEAN == type) { + if (cell.getBooleanCellValue()) return (Val.Literal) cVisitor.visitTrue(-1); + else return (Val.Literal) cVisitor.visitFalse(-1); + } else if (CellType.NUMERIC == type) { + if (DateUtil.isCellDateFormatted(cell)) { + return (Val.Literal) cVisitor.visitString(cell.getLocalDateTimeCellValue().toString(), -1); + } else { + return (Val.Literal) cVisitor.visitFloat64(cell.getNumericCellValue(), -1); + } + } else if (CellType.STRING == type || CellType.BLANK == type) { + return (Val.Literal) cVisitor.visitString(cell.getStringCellValue(), -1); + } else if (CellType.FORMULA == type) { + return literalOf(cell.getCachedFormulaResultType(), cell, cVisitor); + } else { + throw new IllegalArgumentException("Cannot represent type: " + type.toString() + " as a jsonnet element"); + } + } + @Override public Document write(Val input, MediaType mediaType, Class targetType, EvalScope ev) throws PluginException { throw new UnsupportedOperationException("Writing excel files is unsupported"); diff --git a/xtrasonnet/src/test/java/io/github/jam01/xtrasonnet/plugins/ExcelPluginTest.java b/xtrasonnet/src/test/java/io/github/jam01/xtrasonnet/plugins/ExcelPluginTest.java index b7bad1b..0a7ce24 100644 --- a/xtrasonnet/src/test/java/io/github/jam01/xtrasonnet/plugins/ExcelPluginTest.java +++ b/xtrasonnet/src/test/java/io/github/jam01/xtrasonnet/plugins/ExcelPluginTest.java @@ -16,6 +16,8 @@ import org.junit.jupiter.api.Test; import org.skyscreamer.jsonassert.JSONAssert; +import java.util.Collections; + public class ExcelPluginTest { private final String simple_xlsx_json = """ { @@ -107,4 +109,16 @@ public void read_xlsx_dates() throws JSONException { JSONAssert.assertEquals(dates_xlsx_json, doc.getContent(), true); Assertions.assertEquals(MediaTypes.APPLICATION_JSON, doc.getMediaType()); } + + public String formula_xlsx_json = """ + {"Sheet3":[{"A":"","B":"","C":"","D":"","E":""},{"A":"","B":60,"C":60,"D":3600,"E":""}]}"""; + + @Test + public void read_xlsx_formula() throws JSONException { + var doc = new Transformer("payload") + .transform(Document.of(TestUtils.resourceAsFile("formula.xlsx"), MediaTypes.APPLICATION_EXCEL)); + + JSONAssert.assertEquals(formula_xlsx_json, doc.getContent(), true); + Assertions.assertEquals(MediaTypes.APPLICATION_JSON, doc.getMediaType()); + } } diff --git a/xtrasonnet/src/test/resources/formula.xlsx b/xtrasonnet/src/test/resources/formula.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..37a89251f940fca1a04affb8649d92f60f006ede GIT binary patch literal 4828 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 NOY!V@;(tH%{{Uy>3R?gG literal 0 HcmV?d00001 From f4f1dd92908a3446e29c5a7881715c470165f193 Mon Sep 17 00:00:00 2001 From: Jose Montoya Date: Mon, 20 Nov 2023 12:43:19 -0600 Subject: [PATCH 2/2] jdk 21 --- .github/workflows/ci.yaml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 838d662..f3b856d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -12,11 +12,10 @@ jobs: with: # needed for license-plugin to check last modified date of each file fetch-depth: 0 - - name: Set up JDK - uses: oracle-actions/setup-java@v1 + - uses: actions/setup-java@v3 with: - website: jdk.java.net - release: 19 + distribution: 'oracle' + java-version: '20' - name: Cache local Maven repository uses: actions/cache@v3 with: