pjfanning commented on a change in pull request #296: URL: https://github.com/apache/poi/pull/296#discussion_r789822635
########## File path: poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/BaseXSSFFormulaEvaluator.java ########## @@ -26,10 +28,12 @@ Licensed to the Apache Software Foundation (ASF) under one or more import org.apache.poi.ss.formula.eval.NumberEval; import org.apache.poi.ss.formula.eval.StringEval; import org.apache.poi.ss.formula.eval.ValueEval; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellType; Review comment: can you keep the full imports as opposed to using wildcards? ########## File path: poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java ########## @@ -1299,6 +1296,50 @@ void testIgnoreTrashParts() throws Exception { } } + @Test + void testCacheExternalWorkbook() throws Exception { + String nameA = "cache-external-workbook-a.xlsx"; + + try ( + UnsynchronizedByteArrayOutputStream bosA = new UnsynchronizedByteArrayOutputStream(); + UnsynchronizedByteArrayOutputStream bosB = new UnsynchronizedByteArrayOutputStream(); + XSSFWorkbook workbookA = new XSSFWorkbook(); + XSSFWorkbook workbookB = new XSSFWorkbook() + ) { + XSSFRow row1 = workbookA.createSheet().createRow(0); + double v1 = 10, v2 = 10, sum = v1 + v2; + row1.createCell(0).setCellValue(v1); + row1.createCell(1).setCellValue(v2); + + XSSFRow row = workbookB.createSheet().createRow(0); + XSSFCell cell = row.createCell(0); + + workbookB.linkExternalWorkbook(nameA, workbookA); + String formula = String.format(LocaleUtil.getUserLocale(), "SUM('[%s]Sheet0'!A1:B1)", nameA); + cell.setCellFormula(formula); + XSSFFormulaEvaluator evaluator = workbookB.getCreationHelper().createFormulaEvaluator(); + evaluator.evaluateFormulaCell(cell); + + assertEquals(sum, cell.getNumericCellValue()); + + workbookA.write(bosA); + workbookB.write(bosB); + FileOutputStream f1 = new FileOutputStream(nameA); Review comment: please avoid writing files in tests, use UnsynchronizedByteArrayOutputStream instead ########## File path: poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFWorkbook.java ########## @@ -60,11 +61,7 @@ Licensed to the Apache Software Foundation (ASF) under one or more import org.apache.poi.xssf.XSSFITestDataProvider; import org.apache.poi.xssf.model.StylesTable; import org.junit.jupiter.api.Test; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCalcPr; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotCache; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbookPr; Review comment: again, keep the non-wildcard imports ########## File path: poi-ooxml/src/main/java/org/apache/poi/xssf/model/ExternalLinksTable.java ########## @@ -33,10 +33,7 @@ Licensed to the Apache Software Foundation (ASF) under one or more import org.apache.poi.util.Internal; import org.apache.poi.util.Removal; import org.apache.xmlbeans.XmlException; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTExternalDefinedName; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTExternalLink; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTExternalSheetName; Review comment: can you keep the full imports as opposed to using wildcards? ########## File path: poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/BaseXSSFFormulaEvaluator.java ########## @@ -73,9 +78,60 @@ protected CellValue evaluateFormulaCellValue(Cell cell) { throw new RuntimeException("Unexpected eval class (" + eval.getClass().getName() + ")"); } + /** + * cache cell value of external workbook + * + * @param evalCell sourceCell + */ + private void cacheExternalWorkbookCells(EvaluationCell evalCell) { + // + Ptg[] formulaTokens = getEvaluationWorkbook().getFormulaTokens(evalCell); + for (Ptg ptg : formulaTokens) { + if (ptg instanceof Area3DPxg) { + Area3DPxg area3DPxg = (Area3DPxg) ptg; + if (area3DPxg.getExternalWorkbookNumber() > 0) { + EvaluationWorkbook.ExternalSheet externalSheet = getEvaluationWorkbook().getExternalSheet(area3DPxg.getSheetName(), area3DPxg.getLastSheetName(), area3DPxg.getExternalWorkbookNumber()); + + XSSFCell xssfCell = ((XSSFEvaluationCell) evalCell).getXSSFCell(); + XSSFWorkbook externalWorkbook = (XSSFWorkbook) xssfCell.getSheet().getWorkbook().getCreationHelper().getReferencedWorkbooks().get(externalSheet.getWorkbookName()); + ExternalLinksTable externalLinksTable = xssfCell.getSheet().getWorkbook().getExternalLinksTable().get(area3DPxg.getExternalWorkbookNumber() - 1); + + int firstSheet = externalWorkbook.getSheetIndex(area3DPxg.getSheetName()); + int lastSheet = firstSheet; + if (area3DPxg.getLastSheetName() != null) { + lastSheet = externalWorkbook.getSheetIndex(area3DPxg.getLastSheetName()); + } + + for (int sheetIndex = firstSheet; sheetIndex <= lastSheet; sheetIndex++) { + XSSFSheet sheet = externalWorkbook.getSheetAt(sheetIndex); + int firstRow = area3DPxg.getFirstRow(); + int lastRow = area3DPxg.getLastRow(); + for (int rowIndex = firstRow; rowIndex <= lastRow; rowIndex++) { + XSSFRow row = sheet.getRow(rowIndex); + int firstColumn = area3DPxg.getFirstColumn(); + int lastColumn = area3DPxg.getLastColumn(); + for (int cellIndex = firstColumn; cellIndex <= lastColumn; cellIndex++) { + XSSFCell cell = row.getCell(cellIndex); + String cellValue = cell.getRawValue(); + String cellR = new CellReference(cell).formatAsString(false); + externalLinksTable.cacheData(sheet.getSheetName(), rowIndex + 1, cellR, cellValue); + + } + } + + } + System.out.println("externalLinksTable = " + externalLinksTable); Review comment: Please remove the system outs or replace with log4j debug statements -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: dev-unsubscr...@poi.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@poi.apache.org For additional commands, e-mail: dev-h...@poi.apache.org