From 88b9e48287e67db6faf0878054114886ce7c1d8b Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sun, 13 Jan 2019 17:13:57 +0000 Subject: [PATCH] Add reproducer for bug 60355 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1851208 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xssf/usermodel/TestUnfixedBugs.java | 62 +++++++++++++++++- test-data/spreadsheet/HsGetVal.xlsx | Bin 0 -> 16441 bytes 2 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 test-data/spreadsheet/HsGetVal.xlsx diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java index eb392080c2..cf8fa3a3fc 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java @@ -27,22 +27,30 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Calendar; import java.util.Date; - -import org.apache.poi.hssf.HSSFTestDataSamples; +import java.util.Hashtable; + +import org.apache.poi.ss.formula.OperationEvaluationContext; +import org.apache.poi.ss.formula.eval.NumberEval; +import org.apache.poi.ss.formula.eval.ValueEval; +import org.apache.poi.ss.formula.functions.FreeRefFunction; +import org.apache.poi.ss.formula.udf.AggregatingUDFFinder; +import org.apache.poi.ss.formula.udf.DefaultUDFFinder; +import org.apache.poi.ss.formula.udf.UDFFinder; import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.FormulaEvaluator; import org.apache.poi.ss.usermodel.RichTextString; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.util.CellAddress; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellUtil; import org.apache.poi.ss.util.RegionUtil; import org.apache.poi.util.LocaleUtil; import org.apache.poi.xssf.SXSSFITestDataProvider; import org.apache.poi.xssf.XSSFTestDataSamples; -import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.junit.Test; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow; @@ -334,4 +342,52 @@ public final class TestUnfixedBugs { } } + @Test + public void testBug60355() throws IOException { + try (Workbook workbook = XSSFTestDataSamples.openSampleWorkbook("HsGetVal.xlsx")){ + + Sheet sheet = workbook.getSheetAt(workbook.getActiveSheetIndex()); + System.out.println("cell_4_1 formula:" + sheet.getRow(4).getCell(1).getCellFormula()); + System.out.println("cell_4_2 formula:" + sheet.getRow(4).getCell(2).getCellFormula()); + + // hard code HsGetValue test values for formulas on the sheet + Hashtable cellToValueTable = new Hashtable<>(); + CellAddress cell4_1 = new CellAddress(4, 1); + cellToValueTable.put(cell4_1, "678.0"); + CellAddress cell4_2 = new CellAddress(4, 2); + cellToValueTable.put(cell4_2, "123.0"); + + String[] functionNames = {HsGetValue.name}; + FreeRefFunction[] functionImpls = {new HsGetValue(cellToValueTable)}; + UDFFinder udfs = new DefaultUDFFinder(functionNames, functionImpls); + UDFFinder udfToolpack = new AggregatingUDFFinder(udfs); + workbook.addToolPack(udfToolpack); + + FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator(); + formulaEvaluator.setIgnoreMissingWorkbooks(true); + formulaEvaluator.evaluateAll(); + } + } + + public class HsGetValue implements FreeRefFunction { + public static final String name = "HsGetValue"; + + private Hashtable cellValues; + + public HsGetValue(Hashtable cellValues) { + super(); + this.cellValues = cellValues; + } + + @Override + public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext evaluationContext) { + int row = evaluationContext.getRowIndex(); + int column = evaluationContext.getColumnIndex(); + CellAddress cell = new CellAddress(row, column); + + String value = cellValues.get(cell); + return new NumberEval( Double.parseDouble(value) ); + } + + } } diff --git a/test-data/spreadsheet/HsGetVal.xlsx b/test-data/spreadsheet/HsGetVal.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a32d120a7424a84bd29b51ba8eadcb86a5be38cb GIT binary patch literal 16441 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
8zbtT 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