mirror of
https://github.com/apache/poi.git
synced 2026-02-27 20:40:08 +08:00
[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:
parent
f869dc6f74
commit
236710df4e
@ -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) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user