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

Reply via email to