Author: fanningpj
Date: Tue Oct 17 08:36:07 2023
New Revision: 1913045

URL: http://svn.apache.org/viewvc?rev=1913045&view=rev
Log:
[bug-67778] try to make formula eval involving external workbooks more robust

Modified:
    
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/BaseXSSFFormulaEvaluator.java

Modified: 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/BaseXSSFFormulaEvaluator.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/BaseXSSFFormulaEvaluator.java?rev=1913045&r1=1913044&r2=1913045&view=diff
==============================================================================
--- 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/BaseXSSFFormulaEvaluator.java
 (original)
+++ 
poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/BaseXSSFFormulaEvaluator.java
 Tue Oct 17 08:36:07 2023
@@ -111,36 +111,46 @@ public abstract class BaseXSSFFormulaEva
                 Area3DPxg area3DPxg = (Area3DPxg) ptg;
                 if (area3DPxg.getExternalWorkbookNumber() > 0) {
                     EvaluationWorkbook.ExternalSheet externalSheet = 
getEvaluationWorkbook().getExternalSheet(area3DPxg.getSheetName(), 
area3DPxg.getLastSheetName(), area3DPxg.getExternalWorkbookNumber());
+                    if (externalSheet != null) {
+                        processEvalCell((XSSFEvaluationCell) evalCell, 
externalSheet, area3DPxg);
+                    }
+                }
 
-                    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());
-                    }
+    private static void processEvalCell(XSSFEvaluationCell evalCell,
+                                        EvaluationWorkbook.ExternalSheet 
externalSheet, Area3DPxg area3DPxg) {
+        XSSFCell xssfCell = evalCell.getXSSFCell();
+
+        XSSFWorkbook xssfWorkbook = xssfCell.getSheet().getWorkbook();
+        XSSFWorkbook externalWorkbook = (XSSFWorkbook) 
xssfWorkbook.getCreationHelper()
+                .getReferencedWorkbooks().get(externalSheet.getWorkbookName());
+        ExternalLinksTable externalLinksTable = 
xssfWorkbook.getExternalLinksTable().get(area3DPxg.getExternalWorkbookNumber() 
- 1);
 
-                    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(), (long)rowIndex + 1, cellR, 
cellValue);
-                            }
-                        }
+        if (externalWorkbook != null && externalLinksTable != null) {
+            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(), 
(long)rowIndex + 1, cellR, cellValue);
                     }
                 }
-
             }
         }
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to