You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by jo...@apache.org on 2008/08/12 00:55:39 UTC
svn commit: r684971 - in /poi/trunk/src: java/org/apache/poi/hssf/model/
java/org/apache/poi/hssf/record/ java/org/apache/poi/hssf/record/formula/
java/org/apache/poi/hssf/usermodel/ testcases/org/apache/poi/hssf/data/
testcases/org/apache/poi/hssf/mod...
Author: josh
Date: Mon Aug 11 15:55:38 2008
New Revision: 684971
URL: http://svn.apache.org/viewvc?rev=684971&view=rev
Log:
initial work on supporting calls to add-in functions
Added:
poi/trunk/src/testcases/org/apache/poi/hssf/data/testNames.xls (with props)
Removed:
poi/trunk/src/java/org/apache/poi/hssf/record/ExternSheetSubRecord.java
Modified:
poi/trunk/src/java/org/apache/poi/hssf/model/FormulaParser.java
poi/trunk/src/java/org/apache/poi/hssf/model/LinkTable.java
poi/trunk/src/java/org/apache/poi/hssf/model/Workbook.java
poi/trunk/src/java/org/apache/poi/hssf/record/ExternSheetRecord.java
poi/trunk/src/java/org/apache/poi/hssf/record/NameRecord.java
poi/trunk/src/java/org/apache/poi/hssf/record/SupBookRecord.java
poi/trunk/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java
poi/trunk/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFName.java
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
poi/trunk/src/testcases/org/apache/poi/hssf/data/FormulaEvalTestData.xls
poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java
poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestExternalFunctionFormulas.java
poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/eval/TestExternalFunction.java
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
Modified: poi/trunk/src/java/org/apache/poi/hssf/model/FormulaParser.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/FormulaParser.java?rev=684971&r1=684970&r2=684971&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/FormulaParser.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/FormulaParser.java Mon Aug 11 15:55:38 2008
@@ -26,6 +26,7 @@
import org.apache.poi.hssf.record.formula.function.FunctionMetadata;
import org.apache.poi.hssf.record.formula.function.FunctionMetadataRegistry;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
+import org.apache.poi.hssf.usermodel.HSSFName;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.AreaReference;
import org.apache.poi.hssf.util.CellReference;
@@ -369,13 +370,31 @@
* @param name case preserved function name (as it was entered/appeared in the formula).
*/
private ParseNode function(String name) {
- NamePtg nameToken = null;
- // Note regarding parameter -
- if(!AbstractFunctionPtg.isInternalFunctionName(name)) {
- // external functions get a Name token which points to a defined name record
- nameToken = new NamePtg(name, this.book);
-
+ Ptg nameToken = null;
+ if(!AbstractFunctionPtg.isBuiltInFunctionName(name)) {
+ // user defined function
// in the token tree, the name is more or less the first argument
+
+
+ int nameIndex = book.getNameIndex(name);
+ if (nameIndex >= 0) {
+ HSSFName hName = book.getNameAt(nameIndex);
+ if (!hName.isFunctionName()) {
+ throw new FormulaParseException("Attempt to use name '" + name
+ + "' as a function, but defined name in workbook does not refer to a function");
+ }
+
+ // calls to user-defined functions within the workbook
+ // get a Name token which points to a defined name record
+ nameToken = new NamePtg(name, this.book);
+ } else {
+
+ nameToken = book.getNameXPtg(name);
+ if (nameToken == null) {
+ throw new FormulaParseException("Name '" + name
+ + "' is completely unknown in the current workbook");
+ }
+ }
}
Match('(');
@@ -389,11 +408,11 @@
* Generates the variable function ptg for the formula.
* <p>
* For IF Formulas, additional PTGs are added to the tokens
- * @param name
+ * @param name a {@link NamePtg} or {@link NameXPtg} or <code>null</code>
* @param numArgs
* @return Ptg a null is returned if we're in an IF formula, it needs extreme manipulation and is handled in this function
*/
- private ParseNode getFunction(String name, NamePtg namePtg, ParseNode[] args) {
+ private ParseNode getFunction(String name, Ptg namePtg, ParseNode[] args) {
FunctionMetadata fm = FunctionMetadataRegistry.getFunctionByName(name.toUpperCase());
int numArgs = args.length;
Modified: poi/trunk/src/java/org/apache/poi/hssf/model/LinkTable.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/LinkTable.java?rev=684971&r1=684970&r2=684971&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/LinkTable.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/LinkTable.java Mon Aug 11 15:55:38 2008
@@ -25,11 +25,11 @@
import org.apache.poi.hssf.record.CRNRecord;
import org.apache.poi.hssf.record.CountryRecord;
import org.apache.poi.hssf.record.ExternSheetRecord;
-import org.apache.poi.hssf.record.ExternSheetSubRecord;
import org.apache.poi.hssf.record.ExternalNameRecord;
import org.apache.poi.hssf.record.NameRecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.SupBookRecord;
+import org.apache.poi.hssf.record.formula.NameXPtg;
/**
* Link Table (OOO pdf reference: 4.10.3 ) <p/>
@@ -122,6 +122,19 @@
public String getNameText(int definedNameIndex) {
return _externalNameRecords[definedNameIndex].getText();
}
+
+ /**
+ * Performs case-insensitive search
+ * @return -1 if not found
+ */
+ public int getIndexOfName(String name) {
+ for (int i = 0; i < _externalNameRecords.length; i++) {
+ if(_externalNameRecords[i].getText().equalsIgnoreCase(name)) {
+ return i;
+ }
+ }
+ return -1;
+ }
}
private final ExternalBookBlock[] _externalBookBlocks;
@@ -270,42 +283,31 @@
}
- public short getIndexToSheet(short num) {
- return _externSheetRecord.getREFRecordAt(num).getIndexToFirstSupBook();
+ public int getIndexToSheet(int extRefIndex) {
+ return _externSheetRecord.getFirstSheetIndexFromRefIndex(extRefIndex);
}
- public int getSheetIndexFromExternSheetIndex(int externSheetNumber) {
- if (externSheetNumber >= _externSheetRecord.getNumOfREFStructures()) {
+ public int getSheetIndexFromExternSheetIndex(int extRefIndex) {
+ if (extRefIndex >= _externSheetRecord.getNumOfRefs()) {
return -1;
}
- return _externSheetRecord.getREFRecordAt(externSheetNumber).getIndexToFirstSupBook();
+ return _externSheetRecord.getFirstSheetIndexFromRefIndex(extRefIndex);
}
- public short addSheetIndexToExternSheet(short sheetNumber) {
-
- ExternSheetSubRecord record = new ExternSheetSubRecord();
- record.setIndexToFirstSupBook(sheetNumber);
- record.setIndexToLastSupBook(sheetNumber);
- _externSheetRecord.addREFRecord(record);
- _externSheetRecord.setNumOfREFStructures((short)(_externSheetRecord.getNumOfREFStructures() + 1));
- return (short)(_externSheetRecord.getNumOfREFStructures() - 1);
+ public int addSheetIndexToExternSheet(int sheetNumber) {
+ // TODO - what about the first parameter (extBookIndex)?
+ return _externSheetRecord.addRef(0, sheetNumber, sheetNumber);
}
- public short checkExternSheet(int sheetNumber) {
+ public short checkExternSheet(int sheetIndex) {
//Trying to find reference to this sheet
- int nESRs = _externSheetRecord.getNumOfREFStructures();
- for(short i=0; i< nESRs; i++) {
- ExternSheetSubRecord esr = _externSheetRecord.getREFRecordAt(i);
-
- if (esr.getIndexToFirstSupBook() == sheetNumber
- && esr.getIndexToLastSupBook() == sheetNumber){
- return i;
- }
+ int i = _externSheetRecord.getRefIxForSheet(sheetIndex);
+ if (i>=0) {
+ return (short)i;
}
-
//We Haven't found reference to this sheet
- return addSheetIndexToExternSheet((short) sheetNumber);
+ return (short)addSheetIndexToExternSheet((short) sheetIndex);
}
@@ -326,11 +328,31 @@
}
public int getNumberOfREFStructures() {
- return _externSheetRecord.getNumOfREFStructures();
+ return _externSheetRecord.getNumOfRefs();
}
public String resolveNameXText(int refIndex, int definedNameIndex) {
- short extBookIndex = _externSheetRecord.getREFRecordAt(refIndex).getIndexToSupBook();
+ int extBookIndex = _externSheetRecord.getExtbookIndexFromRefIndex(refIndex);
return _externalBookBlocks[extBookIndex].getNameText(definedNameIndex);
}
+
+ public NameXPtg getNameXPtg(String name) {
+ // first find any external book block that contains the name:
+ for (int i = 0; i < _externalBookBlocks.length; i++) {
+ int definedNameIndex = _externalBookBlocks[i].getIndexOfName(name);
+ if (definedNameIndex < 0) {
+ continue;
+ }
+ // found it.
+ int sheetRefIndex = findRefIndexFromExtBookIndex(i);
+ if (sheetRefIndex >= 0) {
+ return new NameXPtg(sheetRefIndex, definedNameIndex);
+ }
+ }
+ return null;
+ }
+
+ private int findRefIndexFromExtBookIndex(int extBookIndex) {
+ return _externSheetRecord.findRefIndexFromExtBookIndex(extBookIndex);
+ }
}
Modified: poi/trunk/src/java/org/apache/poi/hssf/model/Workbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/Workbook.java?rev=684971&r1=684970&r2=684971&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/Workbook.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/Workbook.java Mon Aug 11 15:55:38 2008
@@ -15,21 +15,70 @@
limitations under the License.
==================================================================== */
-
package org.apache.poi.hssf.model;
-import org.apache.poi.ddf.*;
-import org.apache.poi.hssf.record.*;
-import org.apache.poi.hssf.util.HSSFColor;
-import org.apache.poi.hssf.util.SheetReferences;
-import org.apache.poi.util.POILogFactory;
-import org.apache.poi.util.POILogger;
-
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
+import org.apache.poi.ddf.EscherBSERecord;
+import org.apache.poi.ddf.EscherBoolProperty;
+import org.apache.poi.ddf.EscherContainerRecord;
+import org.apache.poi.ddf.EscherDggRecord;
+import org.apache.poi.ddf.EscherOptRecord;
+import org.apache.poi.ddf.EscherProperties;
+import org.apache.poi.ddf.EscherRGBProperty;
+import org.apache.poi.ddf.EscherRecord;
+import org.apache.poi.ddf.EscherSplitMenuColorsRecord;
+import org.apache.poi.hssf.record.BOFRecord;
+import org.apache.poi.hssf.record.BackupRecord;
+import org.apache.poi.hssf.record.BookBoolRecord;
+import org.apache.poi.hssf.record.BoundSheetRecord;
+import org.apache.poi.hssf.record.CodepageRecord;
+import org.apache.poi.hssf.record.CountryRecord;
+import org.apache.poi.hssf.record.DSFRecord;
+import org.apache.poi.hssf.record.DateWindow1904Record;
+import org.apache.poi.hssf.record.DrawingGroupRecord;
+import org.apache.poi.hssf.record.EOFRecord;
+import org.apache.poi.hssf.record.ExtSSTRecord;
+import org.apache.poi.hssf.record.ExtendedFormatRecord;
+import org.apache.poi.hssf.record.ExternSheetRecord;
+import org.apache.poi.hssf.record.FileSharingRecord;
+import org.apache.poi.hssf.record.FnGroupCountRecord;
+import org.apache.poi.hssf.record.FontRecord;
+import org.apache.poi.hssf.record.FormatRecord;
+import org.apache.poi.hssf.record.HideObjRecord;
+import org.apache.poi.hssf.record.HyperlinkRecord;
+import org.apache.poi.hssf.record.InterfaceEndRecord;
+import org.apache.poi.hssf.record.InterfaceHdrRecord;
+import org.apache.poi.hssf.record.MMSRecord;
+import org.apache.poi.hssf.record.NameRecord;
+import org.apache.poi.hssf.record.PaletteRecord;
+import org.apache.poi.hssf.record.PasswordRecord;
+import org.apache.poi.hssf.record.PasswordRev4Record;
+import org.apache.poi.hssf.record.PrecisionRecord;
+import org.apache.poi.hssf.record.ProtectRecord;
+import org.apache.poi.hssf.record.ProtectionRev4Record;
+import org.apache.poi.hssf.record.RecalcIdRecord;
+import org.apache.poi.hssf.record.Record;
+import org.apache.poi.hssf.record.RefreshAllRecord;
+import org.apache.poi.hssf.record.SSTRecord;
+import org.apache.poi.hssf.record.StyleRecord;
+import org.apache.poi.hssf.record.SupBookRecord;
+import org.apache.poi.hssf.record.TabIdRecord;
+import org.apache.poi.hssf.record.UnicodeString;
+import org.apache.poi.hssf.record.UseSelFSRecord;
+import org.apache.poi.hssf.record.WindowOneRecord;
+import org.apache.poi.hssf.record.WindowProtectRecord;
+import org.apache.poi.hssf.record.WriteAccessRecord;
+import org.apache.poi.hssf.record.WriteProtectRecord;
+import org.apache.poi.hssf.record.formula.NameXPtg;
+import org.apache.poi.hssf.util.HSSFColor;
+import org.apache.poi.hssf.util.SheetReferences;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
+
/**
* Low level model implementation of a Workbook. Provides creational methods
* for settings and objects contained in the workbook object.
@@ -55,7 +104,7 @@
* @version 1.0-pre
*/
public final class Workbook implements Model {
- private static final int DEBUG = POILogger.DEBUG;
+ private static final int DEBUG = POILogger.DEBUG;
/**
* constant used to set the "codepage" wherever "codepage" is set in records
@@ -461,19 +510,23 @@
/**
* Sets the BOF for a given sheet
*
- * @param sheetnum the number of the sheet to set the positing of the bof for
+ * @param sheetIndex the number of the sheet to set the positing of the bof for
* @param pos the actual bof position
*/
- public void setSheetBof(int sheetnum, int pos) {
+ public void setSheetBof(int sheetIndex, int pos) {
if (log.check( POILogger.DEBUG ))
- log.log(DEBUG, "setting bof for sheetnum =", new Integer(sheetnum),
+ log.log(DEBUG, "setting bof for sheetnum =", new Integer(sheetIndex),
" at pos=", new Integer(pos));
- checkSheets(sheetnum);
- (( BoundSheetRecord ) boundsheets.get(sheetnum))
+ checkSheets(sheetIndex);
+ getBoundSheetRec(sheetIndex)
.setPositionOfBof(pos);
}
+ private BoundSheetRecord getBoundSheetRec(int sheetIndex) {
+ return ((BoundSheetRecord) boundsheets.get(sheetIndex));
+ }
+
/**
* Returns the position of the backup record.
*/
@@ -509,7 +562,7 @@
{
for ( int i = 0; i < boundsheets.size(); i++ )
{
- BoundSheetRecord boundSheetRecord = (BoundSheetRecord) boundsheets.get( i );
+ BoundSheetRecord boundSheetRecord = getBoundSheetRec(i);
if (excludeSheetIdx != i && name.equalsIgnoreCase(boundSheetRecord.getSheetname()))
return true;
}
@@ -526,7 +579,7 @@
*/
public void setSheetName(int sheetnum, String sheetname, short encoding ) {
checkSheets(sheetnum);
- BoundSheetRecord sheet = (BoundSheetRecord)boundsheets.get( sheetnum );
+ BoundSheetRecord sheet = getBoundSheetRec(sheetnum);
sheet.setSheetname(sheetname);
sheet.setSheetnameLength( (byte)sheetname.length() );
sheet.setCompressedUnicodeFlag( (byte)encoding );
@@ -548,13 +601,11 @@
/**
* gets the name for a given sheet.
*
- * @param sheetnum the sheet number (0 based)
+ * @param sheetIndex the sheet number (0 based)
* @return sheetname the name for the sheet
*/
-
- public String getSheetName(int sheetnum) {
- return (( BoundSheetRecord ) boundsheets.get(sheetnum))
- .getSheetname();
+ public String getSheetName(int sheetIndex) {
+ return getBoundSheetRec(sheetIndex).getSheetname();
}
/**
@@ -565,8 +616,7 @@
*/
public boolean isSheetHidden(int sheetnum) {
- BoundSheetRecord bsr = ( BoundSheetRecord ) boundsheets.get(sheetnum);
- return bsr.isHidden();
+ return getBoundSheetRec(sheetnum).isHidden();
}
/**
@@ -577,8 +627,7 @@
*/
public void setSheetHidden(int sheetnum, boolean hidden) {
- BoundSheetRecord bsr = ( BoundSheetRecord ) boundsheets.get(sheetnum);
- bsr.setHidden(hidden);
+ getBoundSheetRec(sheetnum).setHidden(hidden);
}
/**
* get the sheet's index
@@ -851,7 +900,7 @@
if (record instanceof BoundSheetRecord) {
if(!wroteBoundSheets) {
for (int i = 0; i < boundsheets.size(); i++) {
- len+= ((BoundSheetRecord)boundsheets.get(i))
+ len+= getBoundSheetRec(i)
.serialize(pos+offset+len, data);
}
wroteBoundSheets = true;
@@ -1134,8 +1183,8 @@
retval.setWidth(( short ) 0x3a5c);
retval.setHeight(( short ) 0x23be);
retval.setOptions(( short ) 0x38);
- retval.setSelectedTab(( short ) 0x0);
- retval.setDisplayedTab(( short ) 0x0);
+ retval.setActiveSheetIndex( 0x0);
+ retval.setFirstVisibleTab(0x0);
retval.setNumSelectedTabs(( short ) 1);
retval.setTabWidthRatio(( short ) 0x258);
return retval;
@@ -1882,15 +1931,15 @@
* @return sheet name
*/
public String findSheetNameFromExternSheet(short num){
- String result="";
- short indexToSheet = linkTable.getIndexToSheet(num);
+ int indexToSheet = linkTable.getIndexToSheet(num);
- if (indexToSheet>-1) { //error check, bail out gracefully!
- result = getSheetName(indexToSheet);
+ if (indexToSheet < 0) {
+ // TODO - what does '-1' mean here?
+ //error check, bail out gracefully!
+ return "";
}
-
- return result;
+ return getSheetName(indexToSheet);
}
/**
@@ -2402,6 +2451,8 @@
public String resolveNameXText(int refIndex, int definedNameIndex) {
return linkTable.resolveNameXText(refIndex, definedNameIndex);
}
-}
-
+ public NameXPtg getNameXPtg(String name) {
+ return getOrCreateLinkTable().getNameXPtg(name);
+ }
+}
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/ExternSheetRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/ExternSheetRecord.java?rev=684971&r1=684970&r2=684971&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/ExternSheetRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/ExternSheetRecord.java Mon Aug 11 15:55:38 2008
@@ -1,4 +1,3 @@
-
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,29 +14,85 @@
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
-
package org.apache.poi.hssf.record;
-import org.apache.poi.util.LittleEndian;
-
import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.poi.util.LittleEndian;
/**
- * Title: Extern Sheet <P>
- * Description: A List of Inndexes to SupBook <P>
- * REFERENCE: <P>
+ * EXTERNSHEET (0x0017)<br/>
+ * A List of Indexes to EXTERNALBOOK (supplemental book) Records <p/>
+ *
* @author Libin Roman (Vista Portal LDT. Developer)
- * @version 1.0-pre
*/
-
public class ExternSheetRecord extends Record {
- public final static short sid = 0x17;
- private short field_1_number_of_REF_sturcutres;
- private ArrayList field_2_REF_structures;
+ public final static short sid = 0x0017;
+ private List _list;
+
+ private final class RefSubRecord {
+ public static final int ENCODED_SIZE = 6;
+
+ /** index to External Book Block (which starts with a EXTERNALBOOK record) */
+ private int _extBookIndex;
+ private int _firstSheetIndex; // may be -1 (0xFFFF)
+ private int _lastSheetIndex; // may be -1 (0xFFFF)
+
+
+ /** a Constructor for making new sub record
+ */
+ public RefSubRecord(int extBookIndex, int firstSheetIndex, int lastSheetIndex) {
+ _extBookIndex = extBookIndex;
+ _firstSheetIndex = firstSheetIndex;
+ _lastSheetIndex = lastSheetIndex;
+ }
+
+ /**
+ * @param in the RecordInputstream to read the record from
+ */
+ public RefSubRecord(RecordInputStream in) {
+ this(in.readShort(), in.readShort(), in.readShort());
+ }
+ public int getExtBookIndex(){
+ return _extBookIndex;
+ }
+ public int getFirstSheetIndex(){
+ return _firstSheetIndex;
+ }
+ public int getLastSheetIndex(){
+ return _lastSheetIndex;
+ }
+
+ public String toString() {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("extBook=").append(_extBookIndex);
+ buffer.append(" firstSheet=").append(_firstSheetIndex);
+ buffer.append(" lastSheet=").append(_lastSheetIndex);
+ return buffer.toString();
+ }
+
+ /**
+ * called by the class that is responsible for writing this sucker.
+ * Subclasses should implement this so that their data is passed back in a
+ * byte array.
+ *
+ * @param offset to begin writing at
+ * @param data byte array containing instance data
+ * @return number of bytes written
+ */
+ public void serialize(int offset, byte [] data) {
+ LittleEndian.putUShort(data, 0 + offset, _extBookIndex);
+ LittleEndian.putUShort(data, 2 + offset, _firstSheetIndex);
+ LittleEndian.putUShort(data, 4 + offset, _lastSheetIndex);
+ }
+ }
+
+
public ExternSheetRecord() {
- field_2_REF_structures = new ArrayList();
+ _list = new ArrayList();
}
/**
@@ -68,72 +123,60 @@
* @param in the RecordInputstream to read the record from
*/
protected void fillFields(RecordInputStream in) {
- field_2_REF_structures = new ArrayList();
+ _list = new ArrayList();
- field_1_number_of_REF_sturcutres = in.readShort();
+ int nItems = in.readShort();
- for (int i = 0 ; i < field_1_number_of_REF_sturcutres ; ++i) {
- ExternSheetSubRecord rec = new ExternSheetSubRecord(in);
+ for (int i = 0 ; i < nItems ; ++i) {
+ RefSubRecord rec = new RefSubRecord(in);
- field_2_REF_structures.add( rec);
+ _list.add( rec);
}
}
- /**
- * sets the number of the REF structors , that is in Excel file
- * @param numStruct number of REF structs
- */
- public void setNumOfREFStructures(short numStruct) {
- field_1_number_of_REF_sturcutres = numStruct;
- }
-
+
/**
- * return the number of the REF structors , that is in Excel file
- * @return number of REF structs
+ * @return number of REF structures
*/
- public short getNumOfREFStructures() {
- return field_1_number_of_REF_sturcutres;
+ public int getNumOfRefs() {
+ return _list.size();
}
/**
* adds REF struct (ExternSheetSubRecord)
* @param rec REF struct
*/
- public void addREFRecord(ExternSheetSubRecord rec) {
- field_2_REF_structures.add(rec);
+ public void addREFRecord(RefSubRecord rec) {
+ _list.add(rec);
}
/** returns the number of REF Records, which is in model
* @return number of REF records
*/
public int getNumOfREFRecords() {
- return field_2_REF_structures.size();
+ return _list.size();
}
- /** returns the REF record (ExternSheetSubRecord)
- * @param elem index to place
- * @return REF record
- */
- public ExternSheetSubRecord getREFRecordAt(int elem) {
- ExternSheetSubRecord result = ( ExternSheetSubRecord ) field_2_REF_structures.get(elem);
-
- return result;
- }
public String toString() {
- StringBuffer buffer = new StringBuffer();
-
- buffer.append("[EXTERNSHEET]\n");
- buffer.append(" numOfRefs = ").append(getNumOfREFStructures()).append("\n");
- for (int k=0; k < this.getNumOfREFRecords(); k++) {
- buffer.append("refrec #").append(k).append('\n');
- buffer.append(getREFRecordAt(k).toString());
- buffer.append("----refrec #").append(k).append('\n');
+ StringBuffer sb = new StringBuffer();
+ int nItems = _list.size();
+ sb.append("[EXTERNSHEET]\n");
+ sb.append(" numOfRefs = ").append(nItems).append("\n");
+ for (int i=0; i < nItems; i++) {
+ sb.append("refrec #").append(i).append(": ");
+ sb.append(getRef(i).toString());
+ sb.append('\n');
}
- buffer.append("[/EXTERNSHEET]\n");
+ sb.append("[/EXTERNSHEET]\n");
- return buffer.toString();
+ return sb.toString();
+ }
+
+
+ private int getDataSize() {
+ return 2 + _list.size() * RefSubRecord.ENCODED_SIZE;
}
/**
@@ -146,24 +189,29 @@
* @return number of bytes written
*/
public int serialize(int offset, byte [] data) {
- LittleEndian.putShort(data, 0 + offset, sid);
- LittleEndian.putShort(data, 2 + offset,(short)(2 + (getNumOfREFRecords() *6)));
+ int dataSize = getDataSize();
- LittleEndian.putShort(data, 4 + offset, getNumOfREFStructures());
+ int nItems = _list.size();
+
+ LittleEndian.putShort(data, 0 + offset, sid);
+ LittleEndian.putUShort(data, 2 + offset, dataSize);
+ LittleEndian.putUShort(data, 4 + offset, nItems);
int pos = 6 ;
- for (int k = 0; k < getNumOfREFRecords(); k++) {
- ExternSheetSubRecord record = getREFRecordAt(k);
- System.arraycopy(record.serialize(), 0, data, pos + offset, 6);
-
+ for (int i = 0; i < nItems; i++) {
+ getRef(i).serialize(offset + pos, data);
pos +=6;
}
- return getRecordSize();
+ return dataSize + 4;
}
+
+ private RefSubRecord getRef(int i) {
+ return (RefSubRecord) _list.get(i);
+ }
public int getRecordSize() {
- return 4 + 2 + getNumOfREFRecords() * 6;
+ return 4 + getDataSize();
}
/**
@@ -172,4 +220,44 @@
public short getSid() {
return sid;
}
+
+ public int getExtbookIndexFromRefIndex(int refIndex) {
+ return getRef(refIndex).getExtBookIndex();
+ }
+
+ /**
+ * @return -1 if not found
+ */
+ public int findRefIndexFromExtBookIndex(int extBookIndex) {
+ int nItems = _list.size();
+ for (int i = 0; i < nItems; i++) {
+ if (getRef(i).getExtBookIndex() == extBookIndex) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public int getFirstSheetIndexFromRefIndex(int extRefIndex) {
+ return getRef(extRefIndex).getFirstSheetIndex();
+ }
+
+ /**
+ * @return index of newly added ref
+ */
+ public int addRef(int extBookIndex, int firstSheetIndex, int lastSheetIndex) {
+ _list.add(new RefSubRecord(extBookIndex, firstSheetIndex, lastSheetIndex));
+ return _list.size() - 1;
+ }
+
+ public int getRefIxForSheet(int sheetIndex) {
+ int nItems = _list.size();
+ for (int i = 0; i < nItems; i++) {
+ RefSubRecord ref = getRef(i);
+ if (ref.getFirstSheetIndex() == sheetIndex && ref.getLastSheetIndex() == sheetIndex) {
+ return i;
+ }
+ }
+ return -1;
+ }
}
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/NameRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/NameRecord.java?rev=684971&r1=684970&r2=684971&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/NameRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/NameRecord.java Mon Aug 11 15:55:38 2008
@@ -34,7 +34,7 @@
import org.apache.poi.util.StringUtil;
/**
- * Title: Name Record (aka Named Range) <P>
+ * Title: DEFINEDNAME Record (0x0018) <p/>
* Description: Defines a named range within a workbook. <P>
* REFERENCE: <P>
* @author Libin Roman (Vista Portal LDT. Developer)
@@ -43,10 +43,7 @@
* @version 1.0-pre
*/
public final class NameRecord extends Record {
- /**
- */
- public final static short sid = 0x18; //Docs says that it is 0x218
-
+ public final static short sid = 0x0018;
/**Included for completeness sake, not implemented
*/
public final static byte BUILTIN_CONSOLIDATE_AREA = (byte)1;
@@ -92,14 +89,15 @@
*/
public final static byte BUILTIN_SHEET_TITLE = (byte)12;
- public static final short OPT_HIDDEN_NAME = (short) 0x0001;
- public static final short OPT_FUNCTION_NAME = (short) 0x0002;
- public static final short OPT_COMMAND_NAME = (short) 0x0004;
- public static final short OPT_MACRO = (short) 0x0008;
- public static final short OPT_COMPLEX = (short) 0x0010;
- public static final short OPT_BUILTIN = (short) 0x0020;
- public static final short OPT_BINDATA = (short) 0x1000;
-
+ private static final class Option {
+ public static final int OPT_HIDDEN_NAME = 0x0001;
+ public static final int OPT_FUNCTION_NAME = 0x0002;
+ public static final int OPT_COMMAND_NAME = 0x0004;
+ public static final int OPT_MACRO = 0x0008;
+ public static final int OPT_COMPLEX = 0x0010;
+ public static final int OPT_BUILTIN = 0x0020;
+ public static final int OPT_BINDATA = 0x1000;
+ }
private short field_1_option_flag;
private byte field_2_keyboard_shortcut;
@@ -124,13 +122,13 @@
/** Creates new NameRecord */
public NameRecord() {
- field_13_name_definition = new Stack();
+ field_13_name_definition = new Stack();
- field_12_name_text = new String();
- field_14_custom_menu_text = new String();
- field_15_description_text = new String();
- field_16_help_topic_text = new String();
- field_17_status_bar_text = new String();
+ field_12_name_text = new String();
+ field_14_custom_menu_text = new String();
+ field_15_description_text = new String();
+ field_16_help_topic_text = new String();
+ field_17_status_bar_text = new String();
}
/**
@@ -139,7 +137,7 @@
* @param in the RecordInputstream to read the record from
*/
public NameRecord(RecordInputStream in) {
- super(in);
+ super(in);
}
/**
@@ -148,26 +146,26 @@
*/
public NameRecord(byte builtin, int sheetNumber)
{
- this();
- this.field_12_builtIn_name = builtin;
- this.setOptionFlag((short)(this.getOptionFlag() | OPT_BUILTIN));
- this.setNameTextLength((byte)1);
- field_6_sheetNumber = sheetNumber; //the extern sheets are set through references
-
- //clearing these because they are not used with builtin records
+ this();
+ this.field_12_builtIn_name = builtin;
+ this.setOptionFlag((short)(this.field_1_option_flag | Option.OPT_BUILTIN));
+ this.setNameTextLength((byte)1);
+ field_6_sheetNumber = sheetNumber; //the extern sheets are set through references
+
+ //clearing these because they are not used with builtin records
this.setCustomMenuLength((byte)0);
this.setDescriptionTextLength((byte)0);
this.setHelpTopicLength((byte)0);
this.setStatusBarLength((byte)0);
-
+
}
/** sets the option flag for the named range
* @param flag option flag
*/
public void setOptionFlag(short flag){
- field_1_option_flag = flag;
+ field_1_option_flag = flag;
}
@@ -175,21 +173,21 @@
* @param shortcut keyboard shortcut
*/
public void setKeyboardShortcut(byte shortcut){
- field_2_keyboard_shortcut = shortcut;
+ field_2_keyboard_shortcut = shortcut;
}
/** sets the name of the named range length
* @param length name length
*/
public void setNameTextLength(byte length){
- field_3_length_name_text = length;
+ field_3_length_name_text = length;
}
/** sets the definition (reference - formula) length
* @param length defenition length
*/
public void setDefinitionTextLength(short length){
- field_4_length_name_definition = length;
+ field_4_length_name_definition = length;
}
/** sets the index number to the extern sheet (thats is what writen in documentation
@@ -197,9 +195,9 @@
* @param index extern sheet index
*/
public void setUnused(short index){
- field_5_index_to_sheet = index;
+ field_5_index_to_sheet = index;
- // field_6_equals_to_index_to_sheet is equal to field_5_index_to_sheet
+ // field_6_equals_to_index_to_sheet is equal to field_5_index_to_sheet
// field_6_equals_to_index_to_sheet = index;
}
@@ -209,7 +207,7 @@
*/
public int getSheetNumber()
{
- return field_6_sheetNumber;
+ return field_6_sheetNumber;
}
/**
@@ -217,14 +215,14 @@
* @see FnGroupCountRecord
*/
public byte getFnGroup() {
- int masked = field_1_option_flag & 0x0fc0;
- return (byte) (masked >> 4);
+ int masked = field_1_option_flag & 0x0fc0;
+ return (byte) (masked >> 4);
}
public void setSheetNumber(int value)
{
- field_6_sheetNumber = value;
+ field_6_sheetNumber = value;
}
@@ -232,87 +230,87 @@
* @param length custom menu length
*/
public void setCustomMenuLength(byte length){
- field_7_length_custom_menu = length;
+ field_7_length_custom_menu = length;
}
/** sets the length of named range description
* @param length description length
*/
public void setDescriptionTextLength(byte length){
- field_8_length_description_text = length;
+ field_8_length_description_text = length;
}
/** sets the help topic length
* @param length help topic length
*/
public void setHelpTopicLength(byte length){
- field_9_length_help_topic_text = length;
+ field_9_length_help_topic_text = length;
}
/** sets the length of the status bar text
* @param length status bar text length
*/
public void setStatusBarLength(byte length){
- field_10_length_status_bar_text = length;
+ field_10_length_status_bar_text = length;
}
/** sets the compressed unicode flag
* @param flag unicode flag
*/
public void setCompressedUnicodeFlag(byte flag) {
- field_11_compressed_unicode_flag = flag;
+ field_11_compressed_unicode_flag = flag;
}
/** sets the name of the named range
* @param name named range name
*/
public void setNameText(String name){
- field_12_name_text = name;
- setCompressedUnicodeFlag(
+ field_12_name_text = name;
+ setCompressedUnicodeFlag(
StringUtil.hasMultibyte(name) ? (byte)1 : (byte)0
- );
+ );
}
/** sets the custom menu text
* @param text custom menu text
*/
public void setCustomMenuText(String text){
- field_14_custom_menu_text = text;
+ field_14_custom_menu_text = text;
}
/** sets the description text
* @param text the description text
*/
public void setDescriptionText(String text){
- field_15_description_text = text;
+ field_15_description_text = text;
}
/** sets the help topic text
* @param text help topix text
*/
public void setHelpTopicText(String text){
- field_16_help_topic_text = text;
+ field_16_help_topic_text = text;
}
/** sets the status bar text
* @param text status bar text
*/
public void setStatusBarText(String text){
- field_17_status_bar_text = text;
+ field_17_status_bar_text = text;
}
/** gets the option flag
* @return option flag
*/
public short getOptionFlag(){
- return field_1_option_flag;
+ return field_1_option_flag;
}
/** returns the keyboard shortcut
* @return keyboard shortcut
*/
public byte getKeyboardShortcut(){
- return field_2_keyboard_shortcut ;
+ return field_2_keyboard_shortcut ;
}
/**
@@ -320,7 +318,7 @@
* @return name length
*/
public byte getNameTextLength(){
- return field_3_length_name_text;
+ return field_3_length_name_text;
}
/**
@@ -338,92 +336,90 @@
* @return definition length
*/
public short getDefinitionLength(){
- return field_4_length_name_definition;
+ return field_4_length_name_definition;
}
/** gets the index to extern sheet
* @return index to extern sheet
*/
public short getUnused(){
- return field_5_index_to_sheet;
+ return field_5_index_to_sheet;
}
/** gets the custom menu length
* @return custom menu length
*/
public byte getCustomMenuLength(){
- return field_7_length_custom_menu;
+ return field_7_length_custom_menu;
}
/** gets the description text length
* @return description text length
*/
public byte getDescriptionTextLength(){
- return field_8_length_description_text;
+ return field_8_length_description_text;
}
/** gets the help topic length
* @return help topic length
*/
public byte getHelpTopicLength(){
- return field_9_length_help_topic_text;
+ return field_9_length_help_topic_text;
}
/** get the status bar text length
* @return satus bar length
*/
public byte getStatusBarLength(){
- return field_10_length_status_bar_text;
+ return field_10_length_status_bar_text;
}
/** gets the name compressed Unicode flag
* @return compressed unicode flag
*/
public byte getCompressedUnicodeFlag() {
- return field_11_compressed_unicode_flag;
+ return field_11_compressed_unicode_flag;
}
+
/**
* @return true if name is hidden
*/
public boolean isHiddenName() {
- return (field_1_option_flag & OPT_HIDDEN_NAME) != 0;
+ return (field_1_option_flag & Option.OPT_HIDDEN_NAME) != 0;
}
-
/**
* @return true if name is a function
*/
public boolean isFunctionName() {
- return (field_1_option_flag & OPT_FUNCTION_NAME) != 0;
+ return (field_1_option_flag & Option.OPT_FUNCTION_NAME) != 0;
}
+
/**
* @return true if name is a command
*/
public boolean isCommandName() {
- return (field_1_option_flag & OPT_COMMAND_NAME) != 0;
+ return (field_1_option_flag & Option.OPT_COMMAND_NAME) != 0;
}
-
/**
* @return true if function macro or command macro
*/
public boolean isMacro() {
- return (field_1_option_flag & OPT_MACRO) != 0;
+ return (field_1_option_flag & Option.OPT_MACRO) != 0;
}
-
/**
* @return true if array formula or user defined
*/
public boolean isComplexFunction() {
- return (field_1_option_flag & OPT_COMPLEX) != 0;
+ return (field_1_option_flag & Option.OPT_COMPLEX) != 0;
}
-
/**Convenience Function to determine if the name is a built-in name
*/
public boolean isBuiltInName()
{
- return ((this.getOptionFlag() & OPT_BUILTIN) != 0);
+ return ((this.field_1_option_flag & Option.OPT_BUILTIN) != 0);
}
@@ -440,7 +436,7 @@
*/
public byte getBuiltInName()
{
- return this.field_12_builtIn_name;
+ return this.field_12_builtIn_name;
}
@@ -448,39 +444,39 @@
* @return definition -- can be null if we cant parse ptgs
*/
public List getNameDefinition() {
- return field_13_name_definition;
+ return field_13_name_definition;
}
public void setNameDefinition(Stack nameDefinition) {
- field_13_name_definition = nameDefinition;
+ field_13_name_definition = nameDefinition;
}
/** get the custom menu text
* @return custom menu text
*/
public String getCustomMenuText(){
- return field_14_custom_menu_text;
+ return field_14_custom_menu_text;
}
/** gets the description text
* @return description text
*/
public String getDescriptionText(){
- return field_15_description_text;
+ return field_15_description_text;
}
/** get the help topic text
* @return gelp topic text
*/
public String getHelpTopicText(){
- return field_16_help_topic_text;
+ return field_16_help_topic_text;
}
/** gets the status bar text
* @return status bar text
*/
public String getStatusBarText(){
- return field_17_status_bar_text;
+ return field_17_status_bar_text;
}
/**
@@ -490,9 +486,9 @@
* @param id alleged id for this record
*/
protected void validateSid(short id) {
- if (id != sid) {
- throw new RecordFormatException("NOT A valid Name RECORD");
- }
+ if (id != sid) {
+ throw new RecordFormatException("NOT A valid Name RECORD");
+ }
}
/**
@@ -504,21 +500,21 @@
*/
public int serialize( int offset, byte[] data )
{
- LittleEndian.putShort( data, 0 + offset, sid );
- short size = (short)( 15 + getTextsLength() + getNameDefinitionSize());
- LittleEndian.putShort( data, 2 + offset, size );
- // size defined below
- LittleEndian.putShort( data, 4 + offset, getOptionFlag() );
- data[6 + offset] = getKeyboardShortcut();
- data[7 + offset] = getNameTextLength();
- LittleEndian.putShort( data, 8 + offset, getDefinitionLength() );
- LittleEndian.putShort( data, 10 + offset, getUnused() );
- LittleEndian.putUShort( data, 12 + offset, field_6_sheetNumber);
- data[14 + offset] = getCustomMenuLength();
- data[15 + offset] = getDescriptionTextLength();
- data[16 + offset] = getHelpTopicLength();
- data[17 + offset] = getStatusBarLength();
- data[18 + offset] = getCompressedUnicodeFlag();
+ LittleEndian.putShort( data, 0 + offset, sid );
+ short size = (short)( 15 + getTextsLength() + getNameDefinitionSize());
+ LittleEndian.putShort( data, 2 + offset, size );
+ // size defined below
+ LittleEndian.putShort( data, 4 + offset, getOptionFlag() );
+ data[6 + offset] = getKeyboardShortcut();
+ data[7 + offset] = getNameTextLength();
+ LittleEndian.putShort( data, 8 + offset, getDefinitionLength() );
+ LittleEndian.putShort( data, 10 + offset, getUnused() );
+ LittleEndian.putUShort( data, 12 + offset, field_6_sheetNumber);
+ data[14 + offset] = getCustomMenuLength();
+ data[15 + offset] = getDescriptionTextLength();
+ data[16 + offset] = getHelpTopicLength();
+ data[17 + offset] = getStatusBarLength();
+ data[18 + offset] = getCompressedUnicodeFlag();
int start_of_name_definition = 19 + field_3_length_name_text;
@@ -536,20 +532,20 @@
Ptg.serializePtgStack(field_13_name_definition, data, start_of_name_definition + offset );
- int start_of_custom_menu_text = start_of_name_definition + field_4_length_name_definition;
- StringUtil.putCompressedUnicode( getCustomMenuText(), data, start_of_custom_menu_text + offset );
+ int start_of_custom_menu_text = start_of_name_definition + field_4_length_name_definition;
+ StringUtil.putCompressedUnicode( getCustomMenuText(), data, start_of_custom_menu_text + offset );
- int start_of_description_text = start_of_custom_menu_text + field_7_length_custom_menu;
- StringUtil.putCompressedUnicode( getDescriptionText(), data, start_of_description_text + offset );
+ int start_of_description_text = start_of_custom_menu_text + field_7_length_custom_menu;
+ StringUtil.putCompressedUnicode( getDescriptionText(), data, start_of_description_text + offset );
- int start_of_help_topic_text = start_of_description_text + field_8_length_description_text;
- StringUtil.putCompressedUnicode( getHelpTopicText(), data, start_of_help_topic_text + offset );
+ int start_of_help_topic_text = start_of_description_text + field_8_length_description_text;
+ StringUtil.putCompressedUnicode( getHelpTopicText(), data, start_of_help_topic_text + offset );
- int start_of_status_bar_text = start_of_help_topic_text + field_9_length_help_topic_text;
- StringUtil.putCompressedUnicode( getStatusBarText(), data, start_of_status_bar_text + offset );
+ int start_of_status_bar_text = start_of_help_topic_text + field_9_length_help_topic_text;
+ StringUtil.putCompressedUnicode( getStatusBarText(), data, start_of_status_bar_text + offset );
- return getRecordSize();
- /* } */
+ return getRecordSize();
+ /* } */
}
/**
@@ -557,83 +553,83 @@
* @return total length
*/
public int getTextsLength(){
- int result;
+ int result;
- result = getRawNameTextLength() + getDescriptionTextLength() +
+ result = getRawNameTextLength() + getDescriptionTextLength() +
getHelpTopicLength() + getStatusBarLength();
- return result;
+ return result;
}
private int getNameDefinitionSize() {
int result = 0;
- List list = field_13_name_definition;
-
- for (int k = 0; k < list.size(); k++)
- {
+ List list = field_13_name_definition;
+
+ for (int k = 0; k < list.size(); k++)
+ {
Ptg ptg = ( Ptg ) list.get(k);
result += ptg.getSize();
- }
- return result;
+ }
+ return result;
}
/** returns the record size
*/
public int getRecordSize(){
- int result;
+ int result;
- result = 19 + getTextsLength() + getNameDefinitionSize();
-
+ result = 19 + getTextsLength() + getNameDefinitionSize();
+
- return result;
+ return result;
}
/** gets the extern sheet number
* @return extern sheet index
*/
public short getExternSheetNumber(){
- if (field_13_name_definition == null || field_13_name_definition.isEmpty()) return 0;
- Ptg ptg = (Ptg) field_13_name_definition.peek();
- short result = 0;
-
- if (ptg.getClass() == Area3DPtg.class){
- result = ((Area3DPtg) ptg).getExternSheetIndex();
-
- } else if (ptg.getClass() == Ref3DPtg.class){
- result = ((Ref3DPtg) ptg).getExternSheetIndex();
- }
+ if (field_13_name_definition == null || field_13_name_definition.isEmpty()) return 0;
+ Ptg ptg = (Ptg) field_13_name_definition.peek();
+ short result = 0;
+
+ if (ptg.getClass() == Area3DPtg.class){
+ result = ((Area3DPtg) ptg).getExternSheetIndex();
+
+ } else if (ptg.getClass() == Ref3DPtg.class){
+ result = ((Ref3DPtg) ptg).getExternSheetIndex();
+ }
- return result;
+ return result;
}
/** sets the extern sheet number
* @param externSheetNumber extern sheet number
*/
public void setExternSheetNumber(short externSheetNumber){
- Ptg ptg;
+ Ptg ptg;
- if (field_13_name_definition == null || field_13_name_definition.isEmpty()){
- field_13_name_definition = new Stack();
- ptg = createNewPtg();
- } else {
- ptg = (Ptg) field_13_name_definition.peek();
- }
-
- if (ptg.getClass() == Area3DPtg.class){
- ((Area3DPtg) ptg).setExternSheetIndex(externSheetNumber);
-
- } else if (ptg.getClass() == Ref3DPtg.class){
- ((Ref3DPtg) ptg).setExternSheetIndex(externSheetNumber);
- }
+ if (field_13_name_definition == null || field_13_name_definition.isEmpty()){
+ field_13_name_definition = new Stack();
+ ptg = createNewPtg();
+ } else {
+ ptg = (Ptg) field_13_name_definition.peek();
+ }
+
+ if (ptg.getClass() == Area3DPtg.class){
+ ((Area3DPtg) ptg).setExternSheetIndex(externSheetNumber);
+
+ } else if (ptg.getClass() == Ref3DPtg.class){
+ ((Ref3DPtg) ptg).setExternSheetIndex(externSheetNumber);
+ }
}
private Ptg createNewPtg(){
- Ptg ptg = new Area3DPtg();
- field_13_name_definition.push(ptg);
+ Ptg ptg = new Area3DPtg();
+ field_13_name_definition.push(ptg);
- return ptg;
+ return ptg;
}
/** gets the reference , the area only (range)
@@ -647,55 +643,55 @@
* @param ref area reference
*/
public void setAreaReference(String ref){
- //Trying to find if what ptg do we need
- RangeAddress ra = new RangeAddress(ref);
- Ptg oldPtg;
- Ptg ptg;
-
- if (field_13_name_definition==null ||field_13_name_definition.isEmpty()){
- field_13_name_definition = new Stack();
- oldPtg = createNewPtg();
- } else {
- //Trying to find extern sheet index
- oldPtg = (Ptg) field_13_name_definition.pop();
- }
-
- short externSheetIndex = 0;
-
- if (oldPtg.getClass() == Area3DPtg.class){
- externSheetIndex = ((Area3DPtg) oldPtg).getExternSheetIndex();
-
- } else if (oldPtg.getClass() == Ref3DPtg.class){
- externSheetIndex = ((Ref3DPtg) oldPtg).getExternSheetIndex();
- }
+ //Trying to find if what ptg do we need
+ RangeAddress ra = new RangeAddress(ref);
+ Ptg oldPtg;
+ Ptg ptg;
+
+ if (field_13_name_definition==null ||field_13_name_definition.isEmpty()){
+ field_13_name_definition = new Stack();
+ oldPtg = createNewPtg();
+ } else {
+ //Trying to find extern sheet index
+ oldPtg = (Ptg) field_13_name_definition.pop();
+ }
+
+ short externSheetIndex = 0;
+
+ if (oldPtg.getClass() == Area3DPtg.class){
+ externSheetIndex = ((Area3DPtg) oldPtg).getExternSheetIndex();
+
+ } else if (oldPtg.getClass() == Ref3DPtg.class){
+ externSheetIndex = ((Ref3DPtg) oldPtg).getExternSheetIndex();
+ }
- if (ra.hasRange()) {
+ if (ra.hasRange()) {
// Is it contiguous or not?
AreaReference[] refs =
AreaReference.generateContiguous(ref);
- this.setDefinitionTextLength((short)0);
+ this.setDefinitionTextLength((short)0);
- // Add the area reference(s)
+ // Add the area reference(s)
for(int i=0; i<refs.length; i++) {
- ptg = new Area3DPtg();
- ((Area3DPtg) ptg).setExternSheetIndex(externSheetIndex);
- ((Area3DPtg) ptg).setArea(refs[i].formatAsString());
- field_13_name_definition.push(ptg);
- this.setDefinitionTextLength( (short)(getDefinitionLength() + ptg.getSize()) );
+ ptg = new Area3DPtg();
+ ((Area3DPtg) ptg).setExternSheetIndex(externSheetIndex);
+ ((Area3DPtg) ptg).setArea(refs[i].formatAsString());
+ field_13_name_definition.push(ptg);
+ this.setDefinitionTextLength( (short)(getDefinitionLength() + ptg.getSize()) );
}
// And then a union if we had more than one area
if(refs.length > 1) {
ptg = UnionPtg.instance;
- field_13_name_definition.push(ptg);
- this.setDefinitionTextLength( (short)(getDefinitionLength() + ptg.getSize()) );
+ field_13_name_definition.push(ptg);
+ this.setDefinitionTextLength( (short)(getDefinitionLength() + ptg.getSize()) );
}
- } else {
- ptg = new Ref3DPtg();
- ((Ref3DPtg) ptg).setExternSheetIndex(externSheetIndex);
- ((Ref3DPtg) ptg).setArea(ref);
- field_13_name_definition.push(ptg);
- this.setDefinitionTextLength((short)ptg.getSize());
- }
+ } else {
+ ptg = new Ref3DPtg();
+ ((Ref3DPtg) ptg).setExternSheetIndex(externSheetIndex);
+ ((Ref3DPtg) ptg).setArea(ref);
+ field_13_name_definition.push(ptg);
+ this.setDefinitionTextLength((short)ptg.getSize());
+ }
}
/**
@@ -705,47 +701,47 @@
* @param in the RecordInputstream to read the record from
*/
protected void fillFields(RecordInputStream in) {
- field_1_option_flag = in.readShort();
- field_2_keyboard_shortcut = in.readByte();
- field_3_length_name_text = in.readByte();
- field_4_length_name_definition = in.readShort();
- field_5_index_to_sheet = in.readShort();
- field_6_sheetNumber = in.readUShort();
- field_7_length_custom_menu = in.readByte();
- field_8_length_description_text = in.readByte();
- field_9_length_help_topic_text = in.readByte();
- field_10_length_status_bar_text = in.readByte();
-
- //store the name in byte form if it's a builtin name
- field_11_compressed_unicode_flag= in.readByte();
- if (this.isBuiltInName()) {
- field_12_builtIn_name = in.readByte();
- } else {
- if (field_11_compressed_unicode_flag == 1) {
- field_12_name_text = in.readUnicodeLEString(field_3_length_name_text);
- } else {
- field_12_name_text = in.readCompressedUnicode(field_3_length_name_text);
- }
- }
-
- field_13_name_definition = Ptg.createParsedExpressionTokens(field_4_length_name_definition, in);
-
- //Who says that this can only ever be compressed unicode???
- field_14_custom_menu_text = in.readCompressedUnicode(LittleEndian.ubyteToInt(field_7_length_custom_menu));
+ field_1_option_flag = in.readShort();
+ field_2_keyboard_shortcut = in.readByte();
+ field_3_length_name_text = in.readByte();
+ field_4_length_name_definition = in.readShort();
+ field_5_index_to_sheet = in.readShort();
+ field_6_sheetNumber = in.readUShort();
+ field_7_length_custom_menu = in.readByte();
+ field_8_length_description_text = in.readByte();
+ field_9_length_help_topic_text = in.readByte();
+ field_10_length_status_bar_text = in.readByte();
+
+ //store the name in byte form if it's a builtin name
+ field_11_compressed_unicode_flag= in.readByte();
+ if (this.isBuiltInName()) {
+ field_12_builtIn_name = in.readByte();
+ } else {
+ if (field_11_compressed_unicode_flag == 1) {
+ field_12_name_text = in.readUnicodeLEString(field_3_length_name_text);
+ } else {
+ field_12_name_text = in.readCompressedUnicode(field_3_length_name_text);
+ }
+ }
+
+ field_13_name_definition = Ptg.createParsedExpressionTokens(field_4_length_name_definition, in);
- field_15_description_text = in.readCompressedUnicode(LittleEndian.ubyteToInt(field_8_length_description_text));
+ //Who says that this can only ever be compressed unicode???
+ field_14_custom_menu_text = in.readCompressedUnicode(LittleEndian.ubyteToInt(field_7_length_custom_menu));
- field_16_help_topic_text = in.readCompressedUnicode(LittleEndian.ubyteToInt(field_9_length_help_topic_text));
+ field_15_description_text = in.readCompressedUnicode(LittleEndian.ubyteToInt(field_8_length_description_text));
- field_17_status_bar_text = in.readCompressedUnicode(LittleEndian.ubyteToInt(field_10_length_status_bar_text));
- /*} */
+ field_16_help_topic_text = in.readCompressedUnicode(LittleEndian.ubyteToInt(field_9_length_help_topic_text));
+
+ field_17_status_bar_text = in.readCompressedUnicode(LittleEndian.ubyteToInt(field_10_length_status_bar_text));
+ /*} */
}
/**
* return the non static version of the id for this record.
*/
public short getSid() {
- return sid;
+ return sid;
}
/*
20 00
@@ -802,53 +798,53 @@
* @see Object#toString()
*/
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuffer buffer = new StringBuffer();
- buffer.append("[NAME]\n");
- buffer.append(" .option flags = ").append( HexDump.toHex( field_1_option_flag ) )
- .append("\n");
- buffer.append(" .keyboard shortcut = ").append( HexDump.toHex( field_2_keyboard_shortcut ) )
- .append("\n");
- buffer.append(" .length of the name = ").append( field_3_length_name_text )
- .append("\n");
- buffer.append(" .size of the formula data = ").append( field_4_length_name_definition )
- .append("\n");
- buffer.append(" .unused = ").append( field_5_index_to_sheet )
- .append("\n");
- buffer.append(" .index to sheet (1-based, 0=Global) = ").append( field_6_sheetNumber )
- .append("\n");
- buffer.append(" .Length of menu text (character count) = ").append( field_7_length_custom_menu )
- .append("\n");
- buffer.append(" .Length of description text (character count) = ").append( field_8_length_description_text )
- .append("\n");
- buffer.append(" .Length of help topic text (character count) = ").append( field_9_length_help_topic_text )
- .append("\n");
- buffer.append(" .Length of status bar text (character count) = ").append( field_10_length_status_bar_text )
- .append("\n");
- buffer.append(" .Name (Unicode flag) = ").append( field_11_compressed_unicode_flag )
- .append("\n");
- buffer.append(" .Name (Unicode text) = ").append( getNameText() )
- .append("\n");
-
- buffer.append(" .Parts (" + field_13_name_definition.size() +"):")
- .append("\n");
- Iterator it = field_13_name_definition.iterator();
- while(it.hasNext()) {
+ buffer.append("[NAME]\n");
+ buffer.append(" .option flags = ").append( HexDump.toHex( field_1_option_flag ) )
+ .append("\n");
+ buffer.append(" .keyboard shortcut = ").append( HexDump.toHex( field_2_keyboard_shortcut ) )
+ .append("\n");
+ buffer.append(" .length of the name = ").append( field_3_length_name_text )
+ .append("\n");
+ buffer.append(" .size of the formula data = ").append( field_4_length_name_definition )
+ .append("\n");
+ buffer.append(" .unused = ").append( field_5_index_to_sheet )
+ .append("\n");
+ buffer.append(" .index to sheet (1-based, 0=Global) = ").append( field_6_sheetNumber )
+ .append("\n");
+ buffer.append(" .Length of menu text (character count) = ").append( field_7_length_custom_menu )
+ .append("\n");
+ buffer.append(" .Length of description text (character count) = ").append( field_8_length_description_text )
+ .append("\n");
+ buffer.append(" .Length of help topic text (character count) = ").append( field_9_length_help_topic_text )
+ .append("\n");
+ buffer.append(" .Length of status bar text (character count) = ").append( field_10_length_status_bar_text )
+ .append("\n");
+ buffer.append(" .Name (Unicode flag) = ").append( field_11_compressed_unicode_flag )
+ .append("\n");
+ buffer.append(" .Name (Unicode text) = ").append( getNameText() )
+ .append("\n");
+
+ buffer.append(" .Parts (" + field_13_name_definition.size() +"):")
+ .append("\n");
+ Iterator it = field_13_name_definition.iterator();
+ while(it.hasNext()) {
Ptg ptg = (Ptg)it.next();
buffer.append(" " + ptg.toString()).append("\n");
- }
-
- buffer.append(" .Menu text (Unicode string without length field) = ").append( field_14_custom_menu_text )
- .append("\n");
- buffer.append(" .Description text (Unicode string without length field) = ").append( field_15_description_text )
- .append("\n");
- buffer.append(" .Help topic text (Unicode string without length field) = ").append( field_16_help_topic_text )
- .append("\n");
- buffer.append(" .Status bar text (Unicode string without length field) = ").append( field_17_status_bar_text )
- .append("\n");
- buffer.append("[/NAME]\n");
-
- return buffer.toString();
+ }
+
+ buffer.append(" .Menu text (Unicode string without length field) = ").append( field_14_custom_menu_text )
+ .append("\n");
+ buffer.append(" .Description text (Unicode string without length field) = ").append( field_15_description_text )
+ .append("\n");
+ buffer.append(" .Help topic text (Unicode string without length field) = ").append( field_16_help_topic_text )
+ .append("\n");
+ buffer.append(" .Status bar text (Unicode string without length field) = ").append( field_17_status_bar_text )
+ .append("\n");
+ buffer.append("[/NAME]\n");
+
+ return buffer.toString();
}
/**Creates a human readable name for built in types
@@ -856,23 +852,23 @@
*/
protected String translateBuiltInName(byte name)
{
- switch (name)
- {
- case NameRecord.BUILTIN_AUTO_ACTIVATE : return "Auto_Activate";
- case NameRecord.BUILTIN_AUTO_CLOSE : return "Auto_Close";
- case NameRecord.BUILTIN_AUTO_DEACTIVATE : return "Auto_Deactivate";
- case NameRecord.BUILTIN_AUTO_OPEN : return "Auto_Open";
- case NameRecord.BUILTIN_CONSOLIDATE_AREA : return "Consolidate_Area";
- case NameRecord.BUILTIN_CRITERIA : return "Criteria";
- case NameRecord.BUILTIN_DATABASE : return "Database";
- case NameRecord.BUILTIN_DATA_FORM : return "Data_Form";
- case NameRecord.BUILTIN_PRINT_AREA : return "Print_Area";
- case NameRecord.BUILTIN_PRINT_TITLE : return "Print_Titles";
- case NameRecord.BUILTIN_RECORDER : return "Recorder";
- case NameRecord.BUILTIN_SHEET_TITLE : return "Sheet_Title";
-
- }
-
- return "Unknown";
+ switch (name)
+ {
+ case NameRecord.BUILTIN_AUTO_ACTIVATE : return "Auto_Activate";
+ case NameRecord.BUILTIN_AUTO_CLOSE : return "Auto_Close";
+ case NameRecord.BUILTIN_AUTO_DEACTIVATE : return "Auto_Deactivate";
+ case NameRecord.BUILTIN_AUTO_OPEN : return "Auto_Open";
+ case NameRecord.BUILTIN_CONSOLIDATE_AREA : return "Consolidate_Area";
+ case NameRecord.BUILTIN_CRITERIA : return "Criteria";
+ case NameRecord.BUILTIN_DATABASE : return "Database";
+ case NameRecord.BUILTIN_DATA_FORM : return "Data_Form";
+ case NameRecord.BUILTIN_PRINT_AREA : return "Print_Area";
+ case NameRecord.BUILTIN_PRINT_TITLE : return "Print_Titles";
+ case NameRecord.BUILTIN_RECORDER : return "Recorder";
+ case NameRecord.BUILTIN_SHEET_TITLE : return "Sheet_Title";
+
+ }
+
+ return "Unknown";
}
}
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/SupBookRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/SupBookRecord.java?rev=684971&r1=684970&r2=684971&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/SupBookRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/SupBookRecord.java Mon Aug 11 15:55:38 2008
@@ -22,7 +22,7 @@
/**
* Title: Sup Book (EXTERNALBOOK) <P>
- * Description: A External Workbook Description (Suplemental Book)
+ * Description: A External Workbook Description (Supplemental Book)
* Its only a dummy record for making new ExternSheet Record <P>
* REFERENCE: 5.38<P>
* @author Libin Roman (Vista Portal LDT. Developer)
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java?rev=684971&r1=684970&r2=684971&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java Mon Aug 11 15:55:38 2008
@@ -110,7 +110,7 @@
* @return <code>true</code> if the name specifies a standard worksheet function,
* <code>false</code> if the name should be assumed to be an external function.
*/
- public static final boolean isInternalFunctionName(String name) {
+ public static final boolean isBuiltInFunctionName(String name) {
short ix = FunctionMetadataRegistry.lookupIndexByName(name.toUpperCase());
return ix >= 0;
}
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java?rev=684971&r1=684970&r2=684971&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java Mon Aug 11 15:55:38 2008
@@ -22,41 +22,55 @@
import org.apache.poi.hssf.record.RecordInputStream;
/**
- *
- * @author aviks
+ *
+ * @author aviks
*/
public final class NameXPtg extends OperandPtg {
- public final static short sid = 0x39;
- private final static int SIZE = 7;
- private short field_1_ixals; // index to REF entry in externsheet record
- private short field_2_ilbl; //index to defined name or externname table(1 based)
- private short field_3_reserved; // reserved must be 0
-
-
- public NameXPtg(RecordInputStream in) {
- field_1_ixals = in.readShort();
- field_2_ilbl = in.readShort();
- field_3_reserved = in.readShort();
- }
-
- public void writeBytes(byte [] array, int offset) {
- array[ offset + 0 ] = (byte)(sid + getPtgClass());
- LittleEndian.putShort(array, offset + 1, field_1_ixals);
- LittleEndian.putShort(array,offset+3, field_2_ilbl);
- LittleEndian.putShort(array, offset + 5, field_3_reserved);
- }
-
- public int getSize() {
- return SIZE;
- }
-
- public String toFormulaString(HSSFWorkbook book)
- {
- // -1 to convert definedNameIndex from 1-based to zero-based
- return book.resolveNameXText(field_1_ixals, field_2_ilbl-1);
- }
-
- public byte getDefaultOperandClass() {
+ public final static short sid = 0x39;
+ private final static int SIZE = 7;
+
+ /** index to REF entry in externsheet record */
+ private int _sheetRefIndex;
+ /** index to defined name or externname table(1 based) */
+ private int _nameNumber;
+ /** reserved must be 0 */
+ private int _reserved;
+
+ private NameXPtg(int sheetRefIndex, int nameNumber, int reserved) {
+ _sheetRefIndex = sheetRefIndex;
+ _nameNumber = nameNumber;
+ _reserved = reserved;
+ }
+
+ /**
+ * @param sheetRefIndex index to REF entry in externsheet record
+ * @param nameIndex index to defined name or externname table
+ */
+ public NameXPtg(int sheetRefIndex, int nameIndex) {
+ this(sheetRefIndex, nameIndex + 1, 0);
+ }
+
+ public NameXPtg(RecordInputStream in) {
+ this(in.readUShort(), in.readUShort(), in.readUShort());
+ }
+
+ public void writeBytes(byte[] array, int offset) {
+ LittleEndian.putByte(array, offset + 0, sid + getPtgClass());
+ LittleEndian.putUShort(array, offset + 1, _sheetRefIndex);
+ LittleEndian.putUShort(array, offset + 3, _nameNumber);
+ LittleEndian.putUShort(array, offset + 5, _reserved);
+ }
+
+ public int getSize() {
+ return SIZE;
+ }
+
+ public String toFormulaString(HSSFWorkbook book) {
+ // -1 to convert definedNameIndex from 1-based to zero-based
+ return book.resolveNameXText(_sheetRefIndex, _nameNumber - 1);
+ }
+
+ public byte getDefaultOperandClass() {
return Ptg.CLASS_VALUE;
}
}
Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFName.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFName.java?rev=684971&r1=684970&r2=684971&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFName.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFName.java Mon Aug 11 15:55:38 2008
@@ -22,67 +22,57 @@
import org.apache.poi.hssf.util.RangeAddress;
/**
- * Title: High Level Represantion of Named Range <P>
- * REFERENCE: <P>
+ * High Level Representation of a 'defined name' which could be a 'built-in' name,
+ * 'named range' or name of a user defined function.
+ *
* @author Libin Roman (Vista Portal LDT. Developer)
*/
-
-public class HSSFName {
- private HSSFWorkbook book;
- private NameRecord name;
+public final class HSSFName {
+ private HSSFWorkbook _book;
+ private NameRecord _definedNameRec;
/** Creates new HSSFName - called by HSSFWorkbook to create a sheet from
* scratch.
*
* @see org.apache.poi.hssf.usermodel.HSSFWorkbook#createName()
* @param name the Name Record
- * @param book lowlevel Workbook object associated with the sheet.
+ * @param book workbook object associated with the sheet.
*/
-
- protected HSSFName(HSSFWorkbook book, NameRecord name) {
- this.book = book;
- this.name = name;
+ /* package */ HSSFName(HSSFWorkbook book, NameRecord name) {
+ _book = book;
+ _definedNameRec = name;
}
/** Get the sheets name which this named range is referenced to
- * @return sheet name, which this named range refered to
+ * @return sheet name, which this named range referred to
*/
-
public String getSheetName() {
- String result ;
- short indexToExternSheet = name.getExternSheetNumber();
+ short indexToExternSheet = _definedNameRec.getExternSheetNumber();
- result = book.getWorkbook().findSheetNameFromExternSheet(indexToExternSheet);
-
- return result;
+ return _book.getWorkbook().findSheetNameFromExternSheet(indexToExternSheet);
}
/**
- * gets the name of the named range
- * @return named range name
+ * @return text name of this defined name
*/
-
public String getNameName(){
- String result = name.getNameText();
-
- return result;
+ return _definedNameRec.getNameText();
}
/**
* sets the name of the named range
* @param nameName named range name to set
*/
-
public void setNameName(String nameName){
- name.setNameText(nameName);
- name.setNameTextLength((byte)nameName.length());
- Workbook wb = book.getWorkbook();
+ _definedNameRec.setNameText(nameName);
+ _definedNameRec.setNameTextLength((byte)nameName.length());
+ Workbook wb = _book.getWorkbook();
//Check to ensure no other names have the same case-insensitive name
for ( int i = wb.getNumNames()-1; i >=0; i-- )
{
NameRecord rec = wb.getNameRecord(i);
- if (rec != name) {
+ if (rec != _definedNameRec) {
if (rec.getNameText().equalsIgnoreCase(getNameName()))
throw new IllegalArgumentException("The workbook already contains this name (case-insensitive)");
}
@@ -90,31 +80,24 @@
}
/**
- * gets the reference of the named range
- * @return reference of the named range
+ * Note - this method only applies to named ranges
+ * @return the formula text defining the named range
*/
-
public String getReference() {
- String result;
- result = name.getAreaReference(book);
-
- return result;
+ if (_definedNameRec.isFunctionName()) {
+ throw new IllegalStateException("Only applicable to named ranges");
+ }
+ return _definedNameRec.getAreaReference(_book);
}
-
-
/**
* sets the sheet name which this named range referenced to
* @param sheetName the sheet name of the reference
*/
-
private void setSheetName(String sheetName){
- int sheetNumber = book.getSheetIndex(sheetName);
-
- short externSheetNumber = book.getExternalSheetIndex(sheetNumber);
- name.setExternSheetNumber(externSheetNumber);
-// name.setIndexToSheet(externSheetNumber);
-
+ int sheetNumber = _book.getSheetIndex(sheetName);
+ short externSheetNumber = _book.getExternalSheetIndex(sheetNumber);
+ _definedNameRec.setExternSheetNumber(externSheetNumber);
}
@@ -122,7 +105,6 @@
* sets the reference of this named range
* @param ref the reference to set
*/
-
public void setReference(String ref){
RangeAddress ra = new RangeAddress(ref);
@@ -134,8 +116,7 @@
}
//allow the poi utilities to parse it out
- name.setAreaReference(ref);
-
+ _definedNameRec.setAreaReference(ref);
}
/**
@@ -147,4 +128,14 @@
String ref = getReference();
return "#REF!".endsWith(ref);
}
+ public boolean isFunctionName() {
+ return _definedNameRec.isFunctionName();
+ }
+ public String toString() {
+ StringBuffer sb = new StringBuffer(64);
+ sb.append(getClass().getName()).append(" [");
+ sb.append(_definedNameRec.getNameText());
+ sb.append("]");
+ return sb.toString();
+ }
}
Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java?rev=684971&r1=684970&r2=684971&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java Mon Aug 11 15:55:38 2008
@@ -17,36 +17,52 @@
package org.apache.poi.hssf.usermodel;
+import java.io.ByteArrayInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Stack;
+
import org.apache.poi.POIDocument;
import org.apache.poi.ddf.EscherBSERecord;
import org.apache.poi.ddf.EscherBitmapBlip;
-import org.apache.poi.ddf.EscherRecord;
import org.apache.poi.ddf.EscherBlipRecord;
+import org.apache.poi.ddf.EscherRecord;
import org.apache.poi.hssf.model.Sheet;
import org.apache.poi.hssf.model.Workbook;
-import org.apache.poi.hssf.record.*;
+import org.apache.poi.hssf.record.AbstractEscherHolderRecord;
+import org.apache.poi.hssf.record.BackupRecord;
+import org.apache.poi.hssf.record.DrawingGroupRecord;
+import org.apache.poi.hssf.record.EmbeddedObjectRefSubRecord;
+import org.apache.poi.hssf.record.ExtendedFormatRecord;
+import org.apache.poi.hssf.record.FontRecord;
+import org.apache.poi.hssf.record.LabelRecord;
+import org.apache.poi.hssf.record.LabelSSTRecord;
+import org.apache.poi.hssf.record.NameRecord;
+import org.apache.poi.hssf.record.ObjRecord;
+import org.apache.poi.hssf.record.Record;
+import org.apache.poi.hssf.record.RecordFactory;
+import org.apache.poi.hssf.record.SSTRecord;
+import org.apache.poi.hssf.record.UnicodeString;
+import org.apache.poi.hssf.record.UnknownRecord;
import org.apache.poi.hssf.record.formula.Area3DPtg;
import org.apache.poi.hssf.record.formula.MemFuncPtg;
+import org.apache.poi.hssf.record.formula.NameXPtg;
import org.apache.poi.hssf.record.formula.UnionPtg;
import org.apache.poi.hssf.usermodel.HSSFRow.MissingCellPolicy;
import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.hssf.util.SheetReferences;
-import org.apache.poi.poifs.filesystem.*;
+import org.apache.poi.poifs.filesystem.DirectoryNode;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
-import java.io.ByteArrayInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Stack;
-
/**
* High level representation of a workbook. This is the first object most users
* will construct whether they are reading or writing a workbook. It is also the
@@ -1640,9 +1656,16 @@
}
}
- private byte[] newUID()
- {
- byte[] bytes = new byte[16];
- return bytes;
+ private static byte[] newUID() {
+ return new byte[16];
}
+
+ /**
+ * Note - This method should only used by POI internally.
+ * It may get deleted or change definition in future POI versions
+ */
+ public NameXPtg getNameXPtg(String name) {
+ return workbook.getNameXPtg(name);
+ }
+
}
Modified: poi/trunk/src/testcases/org/apache/poi/hssf/data/FormulaEvalTestData.xls
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/data/FormulaEvalTestData.xls?rev=684971&r1=684970&r2=684971&view=diff
==============================================================================
Binary files - no diff available.
Added: poi/trunk/src/testcases/org/apache/poi/hssf/data/testNames.xls
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/data/testNames.xls?rev=684971&view=auto
==============================================================================
Binary file - no diff available.
Propchange: poi/trunk/src/testcases/org/apache/poi/hssf/data/testNames.xls
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Modified: poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java?rev=684971&r1=684970&r2=684971&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java Mon Aug 11 15:55:38 2008
@@ -20,6 +20,7 @@
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
+import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.model.FormulaParser.FormulaParseException;
import org.apache.poi.hssf.record.formula.AbstractFunctionPtg;
import org.apache.poi.hssf.record.formula.AddPtg;
@@ -123,12 +124,15 @@
}
public void testMacroFunction() {
- HSSFWorkbook w = new HSSFWorkbook();
- Ptg[] ptg = FormulaParser.parse("FOO()", w);
+ // testNames.xls contains a VB function called 'myFunc'
+ HSSFWorkbook w = HSSFTestDataSamples.openSampleWorkbook("testNames.xls");
+
+ Ptg[] ptg = FormulaParser.parse("myFunc()", w);
+ // myFunc() actually takes 1 parameter. Don't know if POI will ever be able to detect this problem
// the name gets encoded as the first arg
NamePtg tname = (NamePtg) ptg[0];
- assertEquals("FOO", tname.toFormulaString(w));
+ assertEquals("myFunc", tname.toFormulaString(w));
AbstractFunctionPtg tfunc = (AbstractFunctionPtg) ptg[1];
assertTrue(tfunc.isExternalFunction());
Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestExternalFunctionFormulas.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestExternalFunctionFormulas.java?rev=684971&r1=684970&r2=684971&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestExternalFunctionFormulas.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestExternalFunctionFormulas.java Mon Aug 11 15:55:38 2008
@@ -17,11 +17,19 @@
package org.apache.poi.hssf.record.formula;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
import junit.framework.TestCase;
import org.apache.poi.hssf.HSSFTestDataSamples;
+import org.apache.poi.hssf.model.FormulaParser;
+import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.CellValue;
/**
* Tests for functions from external workbooks (e.g. YEARFRAC).
*
@@ -30,17 +38,45 @@
*/
public final class TestExternalFunctionFormulas extends TestCase {
-
- /**
- * tests <tt>NameXPtg.toFormulaString(Workbook)</tt> and logic in Workbook below that
- */
- public void testReadFormulaContainingExternalFunction() {
- HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("externalFunctionExample.xls");
-
- String expectedFormula = "YEARFRAC(B1,C1)";
- HSSFSheet sht = wb.getSheetAt(0);
- String cellFormula = sht.getRow(0).getCell((short)0).getCellFormula();
- assertEquals(expectedFormula, cellFormula);
- }
-
+ /**
+ * tests <tt>NameXPtg.toFormulaString(Workbook)</tt> and logic in Workbook below that
+ */
+ public void testReadFormulaContainingExternalFunction() {
+ HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("externalFunctionExample.xls");
+
+ String expectedFormula = "YEARFRAC(B1,C1)";
+ HSSFSheet sht = wb.getSheetAt(0);
+ String cellFormula = sht.getRow(0).getCell(0).getCellFormula();
+ assertEquals(expectedFormula, cellFormula);
+ }
+
+ public void testParse() {
+ HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("externalFunctionExample.xls");
+ Ptg[] ptgs = FormulaParser.parse("YEARFRAC(B1,C1)", wb);
+ assertEquals(4, ptgs.length);
+ assertEquals(NameXPtg.class, ptgs[0].getClass());
+
+ wb.getSheetAt(0).getRow(0).createCell(6).setCellFormula("YEARFRAC(C1,B1)");
+ if (false) {
+ // In case you fancy checking in excel
+ try {
+ File tempFile = File.createTempFile("testExtFunc", ".xls");
+ FileOutputStream fout = new FileOutputStream(tempFile);
+ wb.write(fout);
+ fout.close();
+ System.out.println("check out " + tempFile.getAbsolutePath());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ public void DISABLEDtestEvaluate() {
+ HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("externalFunctionExample.xls");
+ HSSFSheet sheet = wb.getSheetAt(0);
+ HSSFCell cell = sheet.getRow(0).getCell(0);
+ HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(sheet, wb);
+ CellValue evalResult = fe.evaluate(cell);
+ evalResult.toString();
+ }
}
Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/eval/TestExternalFunction.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/eval/TestExternalFunction.java?rev=684971&r1=684970&r2=684971&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/eval/TestExternalFunction.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/eval/TestExternalFunction.java Mon Aug 11 15:55:38 2008
@@ -17,8 +17,11 @@
package org.apache.poi.hssf.record.formula.eval;
+import java.io.IOException;
+
import junit.framework.TestCase;
+import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
import org.apache.poi.hssf.usermodel.HSSFName;
@@ -34,20 +37,33 @@
/**
* Checks that an external function can get invoked from the formula evaluator.
+ * @throws IOException
+
*/
public void testInvoke() {
- HSSFWorkbook wb = new HSSFWorkbook();
- HSSFSheet sheet = wb.createSheet();
- wb.setSheetName(0, "Sheet1");
- HSSFRow row = sheet.createRow(0);
- HSSFCell cell = row.createCell(0);
-
- HSSFName hssfName = wb.createName();
- hssfName.setNameName("myFunc");
-
- cell.setCellFormula("myFunc()");
- String actualFormula=cell.getCellFormula();
- assertEquals("myFunc()", actualFormula);
+
+ HSSFWorkbook wb;
+ HSSFSheet sheet;
+ HSSFCell cell;
+ if (false) {
+ // TODO - this code won't work until we can create user-defined functions directly with POI
+ wb = new HSSFWorkbook();
+ sheet = wb.createSheet();
+ wb.setSheetName(0, "Sheet1");
+ HSSFName hssfName = wb.createName();
+ hssfName.setNameName("myFunc");
+
+ } else {
+ // This sample spreadsheet already has a VB function called 'myFunc'
+ wb = HSSFTestDataSamples.openSampleWorkbook("testNames.xls");
+ sheet = wb.getSheetAt(0);
+ HSSFRow row = sheet.createRow(0);
+ cell = row.createCell(1);
+ }
+
+ cell.setCellFormula("myFunc()");
+ String actualFormula=cell.getCellFormula();
+ assertEquals("myFunc()", actualFormula);
HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(sheet, wb);
CellValue evalResult = fe.evaluate(cell);
Modified: poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java?rev=684971&r1=684970&r2=684971&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java Mon Aug 11 15:55:38 2008
@@ -415,6 +415,9 @@
for(int i = 0 ; i < wb.getNumberOfNames(); i++){
HSSFName name = wb.getNameAt(i);
name.getNameName();
+ if (name.isFunctionName()) {
+ continue;
+ }
name.getReference();
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org