better support for sheet functions.... more refactoring after i have written tests for named range. Inclueds a fix for bug 9632
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@352725 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4eb8d195bd
commit
70c361f9dd
@ -88,6 +88,8 @@ import org.apache.poi.util.POILogFactory;
|
|||||||
public class Workbook {
|
public class Workbook {
|
||||||
private static final int DEBUG = POILogger.DEBUG;
|
private static final int DEBUG = POILogger.DEBUG;
|
||||||
|
|
||||||
|
public static ThreadLocal currentBook = new ThreadLocal();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* constant used to set the "codepage" wherever "codepage" is set in records
|
* constant used to set the "codepage" wherever "codepage" is set in records
|
||||||
* (which is duplciated in more than one record)
|
* (which is duplciated in more than one record)
|
||||||
|
@ -58,12 +58,17 @@ package org.apache.poi.hssf.record.formula;
|
|||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
import org.apache.poi.hssf.util.RangeAddress;
|
import org.apache.poi.hssf.util.RangeAddress;
|
||||||
import org.apache.poi.hssf.util.AreaReference;
|
import org.apache.poi.hssf.util.AreaReference;
|
||||||
|
import org.apache.poi.hssf.util.CellReference;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.model.Workbook;
|
||||||
|
import org.apache.poi.util.BitField;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Title: Area 3D Ptg - 3D referecnce (Sheet + Area)<P>
|
* Title: Area 3D Ptg - 3D referecnce (Sheet + Area)<P>
|
||||||
* Description: Defined a area in Extern Sheet. <P>
|
* Description: Defined a area in Extern Sheet. <P>
|
||||||
* REFERENCE: <P>
|
* REFERENCE: <P>
|
||||||
* @author Libin Roman (Vista Portal LDT. Developer)
|
* @author Libin Roman (Vista Portal LDT. Developer)
|
||||||
|
* @author avik
|
||||||
* @version 1.0-pre
|
* @version 1.0-pre
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -76,6 +81,9 @@ public class Area3DPtg extends Ptg
|
|||||||
private short field_3_last_row;
|
private short field_3_last_row;
|
||||||
private short field_4_first_column;
|
private short field_4_first_column;
|
||||||
private short field_5_last_column;
|
private short field_5_last_column;
|
||||||
|
|
||||||
|
private BitField rowRelative = new BitField(0x8000);
|
||||||
|
private BitField colRelative = new BitField(0x4000);
|
||||||
|
|
||||||
/** Creates new AreaPtg */
|
/** Creates new AreaPtg */
|
||||||
public Area3DPtg() {}
|
public Area3DPtg() {}
|
||||||
@ -87,10 +95,10 @@ public class Area3DPtg extends Ptg
|
|||||||
setFirstColumn((short)ar.getCells()[0].getCol());
|
setFirstColumn((short)ar.getCells()[0].getCol());
|
||||||
setLastRow((short)ar.getCells()[1].getRow());
|
setLastRow((short)ar.getCells()[1].getRow());
|
||||||
setLastColumn((short)ar.getCells()[1].getCol());
|
setLastColumn((short)ar.getCells()[1].getCol());
|
||||||
//setFirstColRelative(!ar.getCells()[0].isColAbsolute());
|
setFirstColRelative(!ar.getCells()[0].isColAbsolute());
|
||||||
//setLastColRelative(!ar.getCells()[1].isColAbsolute());
|
setLastColRelative(!ar.getCells()[1].isColAbsolute());
|
||||||
//setFirstRowRelative(!ar.getCells()[0].isRowAbsolute());
|
setFirstRowRelative(!ar.getCells()[0].isRowAbsolute());
|
||||||
//setLastRowRelative(!ar.getCells()[1].isRowAbsolute());
|
setLastRowRelative(!ar.getCells()[1].isRowAbsolute());
|
||||||
setExternSheetIndex(externIdx);
|
setExternSheetIndex(externIdx);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -114,10 +122,10 @@ public class Area3DPtg extends Ptg
|
|||||||
buffer.append("lastRow = " + getLastRow()).append("\n");
|
buffer.append("lastRow = " + getLastRow()).append("\n");
|
||||||
buffer.append("firstCol = " + getFirstColumn()).append("\n");
|
buffer.append("firstCol = " + getFirstColumn()).append("\n");
|
||||||
buffer.append("lastCol = " + getLastColumn()).append("\n");
|
buffer.append("lastCol = " + getLastColumn()).append("\n");
|
||||||
buffer.append("firstColRowRel= "
|
buffer.append("firstColRel= "
|
||||||
+ isFirstColRowRelative()).append("\n");
|
+ isFirstRowRelative()).append("\n");
|
||||||
buffer.append("lastColRowRel = "
|
buffer.append("lastColRowRel = "
|
||||||
+ isLastColRowRelative()).append("\n");
|
+ isLastRowRelative()).append("\n");
|
||||||
buffer.append("firstColRel = " + isFirstColRelative()).append("\n");
|
buffer.append("firstColRel = " + isFirstColRelative()).append("\n");
|
||||||
buffer.append("lastColRel = " + isLastColRelative()).append("\n");
|
buffer.append("lastColRel = " + isLastColRelative()).append("\n");
|
||||||
return buffer.toString();
|
return buffer.toString();
|
||||||
@ -176,14 +184,14 @@ public class Area3DPtg extends Ptg
|
|||||||
return field_4_first_column;
|
return field_4_first_column;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFirstColRowRelative()
|
public boolean isFirstRowRelative()
|
||||||
{
|
{
|
||||||
return (((getFirstColumnRaw()) & 0x8000) == 0x8000);
|
return rowRelative.isSet(field_4_first_column);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFirstColRelative()
|
public boolean isFirstColRelative()
|
||||||
{
|
{
|
||||||
return (((getFirstColumnRaw()) & 0x4000) == 0x4000);
|
return colRelative.isSet(field_4_first_column);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFirstColumn(short column)
|
public void setFirstColumn(short column)
|
||||||
@ -207,16 +215,15 @@ public class Area3DPtg extends Ptg
|
|||||||
return field_5_last_column;
|
return field_5_last_column;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isLastColRowRelative()
|
public boolean isLastRowRelative()
|
||||||
{
|
{
|
||||||
return (((getLastColumnRaw()) & 0x8000) == 1);
|
return rowRelative.isSet(field_5_last_column);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isLastColRelative()
|
public boolean isLastColRelative()
|
||||||
{
|
{
|
||||||
return (((getFirstColumnRaw()) & 0x4000) == 1);
|
return colRelative.isSet(field_5_last_column);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLastColumn(short column)
|
public void setLastColumn(short column)
|
||||||
{
|
{
|
||||||
field_5_last_column &= 0xFF00;
|
field_5_last_column &= 0xFF00;
|
||||||
@ -227,6 +234,37 @@ public class Area3DPtg extends Ptg
|
|||||||
{
|
{
|
||||||
field_5_last_column = column;
|
field_5_last_column = column;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets the first row to relative or not
|
||||||
|
* @param isRelative or not.
|
||||||
|
*/
|
||||||
|
public void setFirstRowRelative(boolean rel) {
|
||||||
|
field_4_first_column=rowRelative.setShortBoolean(field_4_first_column,rel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set whether the first column is relative
|
||||||
|
*/
|
||||||
|
public void setFirstColRelative(boolean rel) {
|
||||||
|
field_4_first_column=colRelative.setShortBoolean(field_4_first_column,rel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set whether the last row is relative or not
|
||||||
|
* @param last row relative
|
||||||
|
*/
|
||||||
|
public void setLastRowRelative(boolean rel) {
|
||||||
|
field_5_last_column=rowRelative.setShortBoolean(field_5_last_column,rel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set whether the last column should be relative or not
|
||||||
|
*/
|
||||||
|
public void setLastColRelative(boolean rel) {
|
||||||
|
field_5_last_column=colRelative.setShortBoolean(field_5_last_column,rel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getArea(){
|
public String getArea(){
|
||||||
RangeAddress ra = new RangeAddress( getFirstColumn(),getFirstRow() + 1, getLastColumn(), getLastRow() + 1);
|
RangeAddress ra = new RangeAddress( getFirstColumn(),getFirstRow() + 1, getLastColumn(), getLastRow() + 1);
|
||||||
@ -250,13 +288,20 @@ public class Area3DPtg extends Ptg
|
|||||||
|
|
||||||
public String toFormulaString()
|
public String toFormulaString()
|
||||||
{
|
{
|
||||||
String result = getArea();
|
StringBuffer retval = new StringBuffer();
|
||||||
|
Object book = Workbook.currentBook.get();
|
||||||
return result;
|
if (book != null) {
|
||||||
|
retval.append(((Workbook) book).findSheetNameFromExternSheet(this.field_1_index_extern_sheet));
|
||||||
|
retval.append('!');
|
||||||
|
}
|
||||||
|
retval.append((new CellReference(getFirstRow(),getFirstColumn(),!isFirstRowRelative(),!isFirstColRelative())).toString());
|
||||||
|
retval.append(':');
|
||||||
|
retval.append((new CellReference(getLastRow(),getLastColumn(),!isLastRowRelative(),!isLastColRelative())).toString());
|
||||||
|
return retval.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte getDefaultOperandClass() {
|
public byte getDefaultOperandClass() {
|
||||||
return Ptg.CLASS_VALUE;
|
return Ptg.CLASS_REF;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -88,9 +88,7 @@ public class AreaPtg
|
|||||||
|
|
||||||
|
|
||||||
protected AreaPtg(String arearef) {
|
protected AreaPtg(String arearef) {
|
||||||
//int[] xyxy = ReferenceUtil.getXYXYFromAreaRef(arearef);
|
|
||||||
AreaReference ar = new AreaReference(arearef);
|
AreaReference ar = new AreaReference(arearef);
|
||||||
|
|
||||||
setFirstRow((short)ar.getCells()[0].getRow());
|
setFirstRow((short)ar.getCells()[0].getRow());
|
||||||
setFirstColumn((short)ar.getCells()[0].getCol());
|
setFirstColumn((short)ar.getCells()[0].getCol());
|
||||||
setLastRow((short)ar.getCells()[1].getRow());
|
setLastRow((short)ar.getCells()[1].getRow());
|
||||||
|
@ -59,6 +59,9 @@ package org.apache.poi.hssf.record.formula;
|
|||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
import org.apache.poi.hssf.util.RangeAddress;
|
import org.apache.poi.hssf.util.RangeAddress;
|
||||||
import org.apache.poi.hssf.util.CellReference;
|
import org.apache.poi.hssf.util.CellReference;
|
||||||
|
import org.apache.poi.util.BitField;
|
||||||
|
import org.apache.poi.hssf.model.Workbook;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Title: Reference 3D Ptg <P>
|
* Title: Reference 3D Ptg <P>
|
||||||
* Description: Defined a cell in extern sheet. <P>
|
* Description: Defined a cell in extern sheet. <P>
|
||||||
@ -73,6 +76,8 @@ public class Ref3DPtg extends Ptg {
|
|||||||
private short field_1_index_extern_sheet;
|
private short field_1_index_extern_sheet;
|
||||||
private short field_2_row;
|
private short field_2_row;
|
||||||
private short field_3_column;
|
private short field_3_column;
|
||||||
|
private BitField rowRelative = new BitField(0x8000);
|
||||||
|
private BitField colRelative = new BitField(0x4000);
|
||||||
|
|
||||||
/** Creates new AreaPtg */
|
/** Creates new AreaPtg */
|
||||||
public Ref3DPtg() {}
|
public Ref3DPtg() {}
|
||||||
@ -88,8 +93,8 @@ public class Ref3DPtg extends Ptg {
|
|||||||
CellReference c= new CellReference(cellref);
|
CellReference c= new CellReference(cellref);
|
||||||
setRow((short) c.getRow());
|
setRow((short) c.getRow());
|
||||||
setColumn((short) c.getCol());
|
setColumn((short) c.getCol());
|
||||||
//setColRelative(!c.isColAbsolute());
|
setColRelative(!c.isColAbsolute());
|
||||||
//setRowRelative(!c.isRowAbsolute());
|
setRowRelative(!c.isRowAbsolute());
|
||||||
setExternSheetIndex(externIdx);
|
setExternSheetIndex(externIdx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,7 +106,7 @@ public class Ref3DPtg extends Ptg {
|
|||||||
buffer.append("Row = " + getRow()).append("\n");
|
buffer.append("Row = " + getRow()).append("\n");
|
||||||
buffer.append("Col = " + getColumn()).append("\n");
|
buffer.append("Col = " + getColumn()).append("\n");
|
||||||
buffer.append("ColRowRel= "
|
buffer.append("ColRowRel= "
|
||||||
+ isColRowRelative()).append("\n");
|
+ isRowRelative()).append("\n");
|
||||||
buffer.append("ColRel = " + isColRelative()).append("\n");
|
buffer.append("ColRel = " + isColRelative()).append("\n");
|
||||||
return buffer.toString();
|
return buffer.toString();
|
||||||
}
|
}
|
||||||
@ -141,14 +146,23 @@ public class Ref3DPtg extends Ptg {
|
|||||||
return field_3_column;
|
return field_3_column;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isColRowRelative() {
|
public boolean isRowRelative()
|
||||||
return (((getColumnRaw()) & 0x8000) == 0x8000);
|
{
|
||||||
|
return rowRelative.isSet(field_3_column);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isColRelative() {
|
public void setRowRelative(boolean rel) {
|
||||||
return (((getColumnRaw()) & 0x4000) == 0x4000);
|
field_3_column=rowRelative.setShortBoolean(field_3_column,rel);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isColRelative()
|
||||||
|
{
|
||||||
|
return colRelative.isSet(field_3_column);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setColRelative(boolean rel) {
|
||||||
|
field_3_column=colRelative.setShortBoolean(field_3_column,rel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setColumn(short column) {
|
public void setColumn(short column) {
|
||||||
field_3_column &= 0xFF00;
|
field_3_column &= 0xFF00;
|
||||||
field_3_column |= column & 0xFF;
|
field_3_column |= column & 0xFF;
|
||||||
@ -177,11 +191,16 @@ public class Ref3DPtg extends Ptg {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String toFormulaString() {
|
public String toFormulaString() {
|
||||||
String result = getArea();
|
StringBuffer retval = new StringBuffer();
|
||||||
|
Object book = Workbook.currentBook.get();
|
||||||
return result;
|
if (book != null) {
|
||||||
|
retval.append(((Workbook) book).findSheetNameFromExternSheet(this.field_1_index_extern_sheet));
|
||||||
|
retval.append('!');
|
||||||
|
}
|
||||||
|
retval.append((new CellReference(getRow(),getColumn(),!isRowRelative(),!isColRelative())).toString());
|
||||||
|
return retval.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;}
|
public byte getDefaultOperandClass() {return Ptg.CLASS_REF;}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -692,10 +692,10 @@ public class HSSFCell
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setCellFormula(String formula) {
|
public void setCellFormula(String formula) {
|
||||||
|
Workbook.currentBook.set(book);
|
||||||
if (formula==null) {
|
if (formula==null) {
|
||||||
setCellType(CELL_TYPE_BLANK,false);
|
setCellType(CELL_TYPE_BLANK,false);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
setCellType(CELL_TYPE_FORMULA,false);
|
setCellType(CELL_TYPE_FORMULA,false);
|
||||||
FormulaRecord rec = (FormulaRecord) record;
|
FormulaRecord rec = (FormulaRecord) record;
|
||||||
rec.setOptions(( short ) 2);
|
rec.setOptions(( short ) 2);
|
||||||
@ -711,17 +711,14 @@ public class HSSFCell
|
|||||||
rec.pushExpressionToken(ptg[ k ]);
|
rec.pushExpressionToken(ptg[ k ]);
|
||||||
}
|
}
|
||||||
rec.setExpressionLength(( short ) size);
|
rec.setExpressionLength(( short ) size);
|
||||||
//return rec;
|
Workbook.currentBook.set(null);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getCellFormula() {
|
public String getCellFormula() {
|
||||||
String retval=null;
|
Workbook.currentBook.set(book);
|
||||||
|
String retval = FormulaParser.toFormulaString(((FormulaRecord)record).getParsedExpression());
|
||||||
retval =
|
Workbook.currentBook.set(null);
|
||||||
FormulaParser.toFormulaString(((FormulaRecord)record).getParsedExpression());
|
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -756,7 +756,7 @@ extends TestCase {
|
|||||||
{
|
{
|
||||||
String filename = System.getProperty("HSSF.testdata.path");
|
String filename = System.getProperty("HSSF.testdata.path");
|
||||||
|
|
||||||
File file = File.createTempFile("testSheetFormula",".xls");
|
File file = File.createTempFile("testSheetFormula",".xls");
|
||||||
FileOutputStream out = new FileOutputStream(file);
|
FileOutputStream out = new FileOutputStream(file);
|
||||||
HSSFWorkbook wb = new HSSFWorkbook();
|
HSSFWorkbook wb = new HSSFWorkbook();
|
||||||
HSSFSheet s = wb.createSheet("A");
|
HSSFSheet s = wb.createSheet("A");
|
||||||
@ -770,7 +770,7 @@ extends TestCase {
|
|||||||
r = s.createRow((short)0);
|
r = s.createRow((short)0);
|
||||||
c=r.createCell((short)0); c.setCellFormula("AVERAGE(A!A1:B1)");
|
c=r.createCell((short)0); c.setCellFormula("AVERAGE(A!A1:B1)");
|
||||||
c=r.createCell((short)1); c.setCellFormula("A!A1+A!B1");
|
c=r.createCell((short)1); c.setCellFormula("A!A1+A!B1");
|
||||||
c=r.createCell((short)2); c.setCellFormula("C!A1+C!B1");
|
c=r.createCell((short)2); c.setCellFormula("A!$A$1+A!$B1");
|
||||||
wb.write(out);
|
wb.write(out);
|
||||||
out.close();
|
out.close();
|
||||||
|
|
||||||
@ -781,9 +781,9 @@ extends TestCase {
|
|||||||
s = wb.getSheet("B");
|
s = wb.getSheet("B");
|
||||||
r = s.getRow(0);
|
r = s.getRow(0);
|
||||||
c = r.getCell((short)0);
|
c = r.getCell((short)0);
|
||||||
//assertTrue("expected: AVERAGE(A!A1:B1) got: "+c.getCellFormula(), ("AVERAGE(A!A1:B1)").equals(c.getCellFormula()));
|
assertTrue("expected: AVERAGE(A!A1:B1) got: "+c.getCellFormula(), ("AVERAGE(A!A1:B1)").equals(c.getCellFormula()));
|
||||||
c = r.getCell((short)1);
|
c = r.getCell((short)1);
|
||||||
//assertTrue("expected: A!A1+A!B1 got: "+c.getCellFormula(), ("A!A1+A!B1").equals(c.getCellFormula()));
|
assertTrue("expected: A!A1+A!B1 got: "+c.getCellFormula(), ("A!A1+A!B1").equals(c.getCellFormula()));
|
||||||
in.close();
|
in.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user