[bug-67778] try to make formula eval involving external workbooks more robust

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1913045 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
PJ Fanning 2023-10-17 08:36:07 +00:00
parent f869dc6f74
commit 236710df4e

View File

@ -111,33 +111,8 @@ public abstract class BaseXSSFFormulaEvaluator extends BaseFormulaEvaluator {
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(), (long)rowIndex + 1, cellR, cellValue);
}
}
if (externalSheet != null) {
processEvalCell((XSSFEvaluationCell) evalCell, externalSheet, area3DPxg);
}
}
@ -145,6 +120,41 @@ public abstract class BaseXSSFFormulaEvaluator extends BaseFormulaEvaluator {
}
}
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);
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);
}
}
}
}
}
@Override
protected void setCellType(Cell cell, CellType cellType) {
if (cell instanceof XSSFCell) {