supporting changes for bug 58452: copy cell formulas containing unregistered function names

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1711600 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Javen O'Neal 2015-10-31 11:39:01 +00:00
parent 07cf6736ae
commit 2354bbb0b0
5 changed files with 42 additions and 1 deletions

View File

@ -63,6 +63,11 @@ public final class HSSFEvaluationWorkbook implements FormulaRenderingWorkbook, E
_iBook = book.getWorkbook(); _iBook = book.getWorkbook();
} }
@Override
public HSSFName createName() {
return _uBook.createName();
}
public int getExternalSheetIndex(String sheetName) { public int getExternalSheetIndex(String sheetName) {
int sheetIndex = _uBook.getSheetIndex(sheetName); int sheetIndex = _uBook.getSheetIndex(sheetName);
return _iBook.checkExternSheet(sheetIndex); return _iBook.checkExternSheet(sheetIndex);
@ -79,6 +84,10 @@ public final class HSSFEvaluationWorkbook implements FormulaRenderingWorkbook, E
int extIx = getSheetExtIx(sheet); int extIx = getSheetExtIx(sheet);
return new Area3DPtg(areaRef, extIx); return new Area3DPtg(areaRef, extIx);
} }
/**
* Return an external name (named range, function, user-defined function) Ptg
*/
@Override
public NameXPtg getNameXPtg(String name, SheetIdentifier sheet) { public NameXPtg getNameXPtg(String name, SheetIdentifier sheet) {
int sheetRefIndex = getSheetExtIx(sheet); int sheetRefIndex = getSheetExtIx(sheet);
return _iBook.getNameXPtg(name, sheetRefIndex, _uBook.getUDFFinder()); return _iBook.getNameXPtg(name, sheetRefIndex, _uBook.getUDFFinder());

View File

@ -19,6 +19,7 @@ package org.apache.poi.ss.formula;
import org.apache.poi.ss.SpreadsheetVersion; import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.formula.ptg.Ptg; import org.apache.poi.ss.formula.ptg.Ptg;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.util.AreaReference; import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.CellReference;
@ -35,6 +36,14 @@ public interface FormulaParsingWorkbook {
*/ */
EvaluationName getName(String name, int sheetIndex); EvaluationName getName(String name, int sheetIndex);
/**
* Return the underlying workbook
*/
Name createName();
/**
* Return an external name (named range, function, user-defined function) Ptg
*/
Ptg getNameXPtg(String name, SheetIdentifier sheet); Ptg getNameXPtg(String name, SheetIdentifier sheet);
/** /**

View File

@ -40,6 +40,9 @@ public final class NameXPxg extends OperandPtg implements Pxg {
public NameXPxg(String sheetName, String nameName) { public NameXPxg(String sheetName, String nameName) {
this(-1, sheetName, nameName); this(-1, sheetName, nameName);
} }
public NameXPxg(String nameName) {
this(-1, null, nameName);
}
public String toString(){ public String toString(){
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();

View File

@ -130,6 +130,15 @@ public abstract class BaseXSSFEvaluationWorkbook implements FormulaRenderingWork
} }
} }
/**
* Return EvaluationName wrapper around the matching XSSFName (named range)
* @param name case-aware but case-insensitive named range in workbook
* @param sheetIndex index of sheet if named range scope is limited to one sheet
* if named range scope is global to the workbook, sheetIndex is -1.
* @return If name is a named range in the workbook, returns
* EvaluationName corresponding to that named range
* Returns null if there is no named range with the same name and scope in the workbook
*/
public EvaluationName getName(String name, int sheetIndex) { public EvaluationName getName(String name, int sheetIndex) {
for (int i = 0; i < _uBook.getNumberOfNames(); i++) { for (int i = 0; i < _uBook.getNumberOfNames(); i++) {
XSSFName nm = _uBook.getNameAt(i); XSSFName nm = _uBook.getNameAt(i);
@ -137,7 +146,7 @@ public abstract class BaseXSSFEvaluationWorkbook implements FormulaRenderingWork
int nameSheetindex = nm.getSheetIndex(); int nameSheetindex = nm.getSheetIndex();
if (name.equalsIgnoreCase(nameText) && if (name.equalsIgnoreCase(nameText) &&
(nameSheetindex == -1 || nameSheetindex == sheetIndex)) { (nameSheetindex == -1 || nameSheetindex == sheetIndex)) {
return new Name(_uBook.getNameAt(i), i, this); return new Name(nm, i, this);
} }
} }
return sheetIndex == -1 ? null : getName(name, -1); return sheetIndex == -1 ? null : getName(name, -1);
@ -179,6 +188,10 @@ public abstract class BaseXSSFEvaluationWorkbook implements FormulaRenderingWork
} }
/**
* Return an external name (named range, function, user-defined function) Pxg
*/
@Override
public NameXPxg getNameXPtg(String name, SheetIdentifier sheet) { public NameXPxg getNameXPtg(String name, SheetIdentifier sheet) {
// First, try to find it as a User Defined Function // First, try to find it as a User Defined Function
IndexedUDFFinder udfFinder = (IndexedUDFFinder)getUDFFinder(); IndexedUDFFinder udfFinder = (IndexedUDFFinder)getUDFFinder();
@ -290,6 +303,10 @@ public abstract class BaseXSSFEvaluationWorkbook implements FormulaRenderingWork
int ix = namePtg.getIndex(); int ix = namePtg.getIndex();
return new Name(_uBook.getNameAt(ix), ix, this); return new Name(_uBook.getNameAt(ix), ix, this);
} }
@Override
public XSSFName createName() {
return _uBook.createName();
}
public UDFFinder getUDFFinder(){ public UDFFinder getUDFFinder(){
return _uBook.getUDFFinder(); return _uBook.getUDFFinder();

View File

@ -44,6 +44,9 @@ public class XSSFTestDataSamples {
*/ */
public static final String TEST_OUTPUT_DIR = "poi.test.xssf.output.dir"; public static final String TEST_OUTPUT_DIR = "poi.test.xssf.output.dir";
public static File getSampleFile(String sampleFileName) {
return HSSFTestDataSamples.getSampleFile(sampleFileName);
}
public static OPCPackage openSamplePackage(String sampleName) { public static OPCPackage openSamplePackage(String sampleName) {
try { try {
return OPCPackage.open( return OPCPackage.open(