limitations under the License.
==================================================================== */
-
-/*
- * FormulaViewer.java - finds formulas in a BIFF8 file and attempts to parse them and
- * display info about them.
- *
- * Created on November 18, 2001, 7:58 AM
- */
package org.apache.poi.hssf.dev;
import java.io.FileInputStream;
-
-//import java.io.*;
import java.util.List;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-import org.apache.poi.hssf.record.*;
-import org.apache.poi.hssf.record.formula.*;
+import org.apache.poi.hssf.model.FormulaParser;
+import org.apache.poi.hssf.record.FormulaRecord;
+import org.apache.poi.hssf.record.Record;
+import org.apache.poi.hssf.record.RecordFactory;
+import org.apache.poi.hssf.record.formula.ExpPtg;
+import org.apache.poi.hssf.record.formula.FuncPtg;
+import org.apache.poi.hssf.record.formula.OperationPtg;
+import org.apache.poi.hssf.record.formula.Ptg;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.model.*;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
/**
* FormulaViewer - finds formulas in a BIFF8 file and attempts to read them/display
private void listFormula(FormulaRecord record) {
String sep="~";
- List tokens= record.getParsedExpression();
- int numptgs = record.getNumberOfExpressionTokens();
- Ptg token = null;
- String name,numArg;
- if (tokens != null) {
- token = (Ptg) tokens.get(numptgs-1);
+ Ptg[] tokens= record.getParsedExpression();
+ Ptg token;
+ int numptgs = tokens.length;
+ String numArg;
+ token = tokens[numptgs-1];
if (token instanceof FuncPtg) {
numArg = String.valueOf(numptgs-1);
- } else { numArg = String.valueOf(-1);}
+ } else {
+ numArg = String.valueOf(-1);
+ }
StringBuffer buf = new StringBuffer();
if (token instanceof ExpPtg) return;
- buf.append(name=((OperationPtg) token).toFormulaString((HSSFWorkbook)null));
+ buf.append(((OperationPtg) token).toFormulaString((HSSFWorkbook)null));
buf.append(sep);
switch (token.getPtgClass()) {
case Ptg.CLASS_REF :
buf.append(sep);
if (numptgs>1) {
- token = (Ptg) tokens.get(numptgs-2);
+ token = tokens[numptgs-2];
switch (token.getPtgClass()) {
case Ptg.CLASS_REF :
buf.append("REF");
buf.append(sep);
buf.append(numArg);
System.out.println(buf.toString());
- } else {
- System.out.println("#NAME");
- }
}
/**
System.out.println("value = " + record.getValue());
System.out.print("xf = " + record.getXFIndex());
System.out.print(", number of ptgs = "
- + record.getNumberOfExpressionTokens());
+ + record.getParsedExpression().length);
System.out.println(", options = " + record.getOptions());
System.out.println("RPN List = "+formulaString(record));
System.out.println("Formula text = "+ composeFormula(record));
}
private String formulaString(FormulaRecord record) {
- StringBuffer formula = new StringBuffer("=");
- int numptgs = record.getNumberOfExpressionTokens();
- List tokens = record.getParsedExpression();
- Ptg token;
+
StringBuffer buf = new StringBuffer();
- for (int i=0;i<numptgs;i++) {
- token = (Ptg) tokens.get(i);
+ Ptg[] tokens = record.getParsedExpression();
+ for (int i = 0; i < tokens.length; i++) {
+ Ptg token = tokens[i];
buf.append( token.toFormulaString((HSSFWorkbook)null));
switch (token.getPtgClass()) {
case Ptg.CLASS_REF :
}
- private String composeFormula(FormulaRecord record)
+ private static String composeFormula(FormulaRecord record)
{
- return org.apache.poi.hssf.model.FormulaParser.toFormulaString((HSSFWorkbook)null,record.getParsedExpression());
+ return FormulaParser.toFormulaString((HSSFWorkbook)null, record.getParsedExpression());
}
/**
}
/**
- * get the size of the stack
- * @return size of the stack
+ * @return the formula tokens. never <code>null</code>
*/
- public int getNumberOfExpressionTokens() {
- return field_8_parsed_expr.length;
- }
-
- /**
- * @return list of formula tokens. never <code>null</code>
- */
- public List getParsedExpression() {
- return Arrays.asList(field_8_parsed_expr); // TODO - return array
+ public Ptg[] getParsedExpression() {
+ return (Ptg[]) field_8_parsed_expr.clone();
}
public void setParsedExpression(Ptg[] ptgs) {
import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.hssf.record.FormulaRecord;
import org.apache.poi.hssf.record.Record;
+import org.apache.poi.hssf.record.formula.Ptg;
import org.apache.poi.hssf.record.formula.Ref3DPtg;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.SheetReferences;
}
}
- public void testBasics() throws Exception {
+ public void testBasics() {
assertNotNull(listener.getSSTRecord());
assertNotNull(listener.getBoundSheetRecords());
assertNotNull(listener.getExternSheetRecords());
}
- public void testGetStubWorkbooks() throws Exception {
+ public void testGetStubWorkbooks() {
assertNotNull(listener.getStubWorkbook());
assertNotNull(listener.getStubHSSFWorkbook());
assertNotNull(listener.getStubHSSFWorkbook().getSheetReferences());
}
- public void testContents() throws Exception {
+ public void testContents() {
assertEquals(2, listener.getSSTRecord().getNumStrings());
assertEquals(3, listener.getBoundSheetRecords().length);
assertEquals(1, listener.getExternSheetRecords().length);
assertEquals("S2", ref.getSheetName(2));
}
- public void testFormulas() throws Exception {
- FormulaRecord fr;
+ public void testFormulas() {
+
+ FormulaRecord[] fRecs = mockListen.getFormulaRecords();
// Check our formula records
- assertEquals(6, mockListen._frecs.size());
+ assertEquals(6, fRecs.length);
Workbook stubWB = listener.getStubWorkbook();
assertNotNull(stubWB);
assertEquals("Sh3", stubWB.getSheetName(2));
// Check we can get the formula without breaking
- for(int i=0; i<mockListen._frecs.size(); i++) {
- fr = (FormulaRecord)mockListen._frecs.get(i);
- FormulaParser.toFormulaString(stubHSSF, fr.getParsedExpression());
+ for(int i=0; i<fRecs.length; i++) {
+ FormulaParser.toFormulaString(stubHSSF, fRecs[i].getParsedExpression());
}
// Peer into just one formula, and check that
// all the ptgs give back the right things
- List ptgs = ((FormulaRecord)mockListen._frecs.get(0)).getParsedExpression();
- assertEquals(1, ptgs.size());
- assertTrue(ptgs.get(0) instanceof Ref3DPtg);
+ Ptg[] ptgs = fRecs[0].getParsedExpression();
+ assertEquals(1, ptgs.length);
+ assertTrue(ptgs[0] instanceof Ref3DPtg);
- Ref3DPtg ptg = (Ref3DPtg)ptgs.get(0);
+ Ref3DPtg ptg = (Ref3DPtg)ptgs[0];
assertEquals("Sheet1!A1", ptg.toFormulaString(stubHSSF));
// Now check we get the right formula back for
// a few sample ones
+ FormulaRecord fr;
// Sheet 1 A2 is on same sheet
- fr = (FormulaRecord)mockListen._frecs.get(0);
+ fr = fRecs[0];
assertEquals(1, fr.getRow());
assertEquals(0, fr.getColumn());
assertEquals("Sheet1!A1", FormulaParser.toFormulaString(stubHSSF, fr.getParsedExpression()));
// Sheet 1 A5 is to another sheet
- fr = (FormulaRecord)mockListen._frecs.get(3);
+ fr = fRecs[3];
assertEquals(4, fr.getRow());
assertEquals(0, fr.getColumn());
assertEquals("'S2'!A1", FormulaParser.toFormulaString(stubHSSF, fr.getParsedExpression()));
// Sheet 1 A7 is to another sheet, range
- fr = (FormulaRecord)mockListen._frecs.get(5);
+ fr = fRecs[5];
assertEquals(6, fr.getRow());
assertEquals(0, fr.getColumn());
assertEquals("SUM(Sh3!A1:A4)", FormulaParser.toFormulaString(stubHSSF, fr.getParsedExpression()));
// Now, load via Usermodel and re-check
- InputStream is = HSSFTestDataSamples.openSampleFileStream("3dFormulas.xls");
- POIFSFileSystem fs = new POIFSFileSystem(is);
- HSSFWorkbook wb = new HSSFWorkbook(fs);
+ HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("3dFormulas.xls");
assertEquals("Sheet1!A1", wb.getSheetAt(0).getRow(1).getCell(0).getCellFormula());
assertEquals("SUM(Sh3!A1:A4)", wb.getSheetAt(0).getRow(6).getCell(0).getCellFormula());
}
_frecs.add(record);
}
}
+ public FormulaRecord[] getFormulaRecords() {
+ FormulaRecord[] result = new FormulaRecord[_frecs.size()];
+ _frecs.toArray(result);
+ return result;
+ }
}
}
\ No newline at end of file
package org.apache.poi.hssf.record;
-
import java.io.ByteArrayInputStream;
-import java.util.List;
import junit.framework.TestCase;
import org.apache.poi.hssf.record.formula.AttrPtg;
import org.apache.poi.hssf.record.formula.FuncVarPtg;
import org.apache.poi.hssf.record.formula.IntPtg;
+import org.apache.poi.hssf.record.formula.Ptg;
import org.apache.poi.hssf.record.formula.RefPtg;
/**
public void testCreateFormulaRecord () {
FormulaRecord record = new FormulaRecord();
record.setColumn((short)0);
- //record.setRow((short)1);
record.setRow(1);
record.setXFIndex((short)4);
- assertEquals(record.getColumn(),(short)0);
- //assertEquals(record.getRow(),(short)1);
- assertEquals((short)record.getRow(),(short)1);
- assertEquals(record.getXFIndex(),(short)4);
+ assertEquals(record.getColumn(),0);
+ assertEquals(record.getRow(), 1);
+ assertEquals(record.getXFIndex(),4);
}
/**
assertEquals("Offset 22", 1, output[26]);
}
- public void testWithConcat() throws Exception {
+ public void testWithConcat() {
// =CHOOSE(2,A2,A3,A4)
byte[] data = {
6, 0, 68, 0,
FormulaRecord fr = new FormulaRecord(inp);
- List ptgs = fr.getParsedExpression();
- assertEquals(9, ptgs.size());
- assertEquals(IntPtg.class, ptgs.get(0).getClass());
- assertEquals(AttrPtg.class, ptgs.get(1).getClass());
- assertEquals(RefPtg.class, ptgs.get(2).getClass());
- assertEquals(AttrPtg.class, ptgs.get(3).getClass());
- assertEquals(RefPtg.class, ptgs.get(4).getClass());
- assertEquals(AttrPtg.class, ptgs.get(5).getClass());
- assertEquals(RefPtg.class, ptgs.get(6).getClass());
- assertEquals(AttrPtg.class, ptgs.get(7).getClass());
- assertEquals(FuncVarPtg.class, ptgs.get(8).getClass());
+ Ptg[] ptgs = fr.getParsedExpression();
+ assertEquals(9, ptgs.length);
+ assertEquals(IntPtg.class, ptgs[0].getClass());
+ assertEquals(AttrPtg.class, ptgs[1].getClass());
+ assertEquals(RefPtg.class, ptgs[2].getClass());
+ assertEquals(AttrPtg.class, ptgs[3].getClass());
+ assertEquals(RefPtg.class, ptgs[4].getClass());
+ assertEquals(AttrPtg.class, ptgs[5].getClass());
+ assertEquals(RefPtg.class, ptgs[6].getClass());
+ assertEquals(AttrPtg.class, ptgs[7].getClass());
+ assertEquals(FuncVarPtg.class, ptgs[8].getClass());
- FuncVarPtg choose = (FuncVarPtg)ptgs.get(8);
+ FuncVarPtg choose = (FuncVarPtg)ptgs[8];
assertEquals("CHOOSE", choose.getName());
}
-
- public static void main(String [] ignored_args) {
- junit.textui.TestRunner.run(TestFormulaRecord.class);
- }
}
package org.apache.poi.hssf.usermodel;
-import java.util.List;
-
import org.apache.poi.hssf.record.CellValueRecordInterface;
import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate;
import org.apache.poi.hssf.record.formula.Ptg;
throw new IllegalArgumentException("Not a formula cell");
}
FormulaRecordAggregate fra = (FormulaRecordAggregate) vr;
- List tokens = fra.getFormulaRecord().getParsedExpression();
- Ptg[] result = new Ptg[tokens.size()];
- tokens.toArray(result);
- return result;
+ return fra.getFormulaRecord().getParsedExpression();
}
-
}
package org.apache.poi.hssf.usermodel;
import java.util.Iterator;
-import java.util.List;
import junit.framework.TestCase;
import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.record.FormulaRecord;
import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate;
+import org.apache.poi.hssf.record.formula.Ptg;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.CellValue;
import org.apache.poi.hssf.util.CellReference;
}
FormulaRecordAggregate record = (FormulaRecordAggregate) cell.getCellValueRecord();
FormulaRecord r = record.getFormulaRecord();
- List ptgs = r.getParsedExpression();
+ Ptg[] ptgs = r.getParsedExpression();
String cellRef = new CellReference(row.getRowNum(), cell.getCellNum(), false, false).formatAsString();
if(false && cellRef.equals("BP24")) { // TODO - replace System.out.println()s with asserts
System.out.print(cellRef);
- System.out.println(" - has " + r.getNumberOfExpressionTokens()
- + " ptgs:");
- for(int i=0; i<ptgs.size(); i++) {
- String c = ptgs.get(i).getClass().toString();
+ System.out.println(" - has " + ptgs.length + " ptgs:");
+ for(int i=0; i<ptgs.length; i++) {
+ String c = ptgs[i].getClass().toString();
System.out.println("\t" + c.substring(c.lastIndexOf('.')+1) );
}
System.out.println("-> " + cell.getCellFormula());
import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;
-import java.util.List;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate;
import org.apache.poi.hssf.record.formula.AreaPtg;
import org.apache.poi.hssf.record.formula.FuncVarPtg;
+import org.apache.poi.hssf.record.formula.Ptg;
/**
*
HSSFCell cellSUM = rowSUM.getCell(0);
FormulaRecordAggregate frec = (FormulaRecordAggregate) cellSUM.getCellValueRecord();
- List ops = frec.getFormulaRecord().getParsedExpression();
- assertEquals(2, ops.size());
- assertEquals(AreaPtg.class, ops.get(0).getClass());
- assertEquals(FuncVarPtg.class, ops.get(1).getClass());
+ Ptg[] ops = frec.getFormulaRecord().getParsedExpression();
+ assertEquals(2, ops.length);
+ assertEquals(AreaPtg.class, ops[0].getClass());
+ assertEquals(FuncVarPtg.class, ops[1].getClass());
// Actually stored as C1 to C65536
// (last row is -1 === 65535)
- AreaPtg ptg = (AreaPtg) ops.get(0);
+ AreaPtg ptg = (AreaPtg) ops[0];
assertEquals(2, ptg.getFirstColumn());
assertEquals(2, ptg.getLastColumn());
assertEquals(0, ptg.getFirstRow());