117 lines
3.4 KiB
Java
117 lines
3.4 KiB
Java
package jxl.read.biff;
|
|
|
|
import common.Assert;
|
|
import common.Logger;
|
|
import jxl.CellType;
|
|
import jxl.LabelCell;
|
|
import jxl.StringFormulaCell;
|
|
import jxl.WorkbookSettings;
|
|
import jxl.biff.FormattingRecords;
|
|
import jxl.biff.FormulaData;
|
|
import jxl.biff.IntegerHelper;
|
|
import jxl.biff.StringHelper;
|
|
import jxl.biff.Type;
|
|
import jxl.biff.WorkbookMethods;
|
|
import jxl.biff.formula.ExternalSheet;
|
|
import jxl.biff.formula.FormulaException;
|
|
import jxl.biff.formula.FormulaParser;
|
|
|
|
class StringFormulaRecord extends CellValue implements LabelCell, FormulaData, StringFormulaCell {
|
|
private static Logger logger = Logger.getLogger(StringFormulaRecord.class);
|
|
|
|
private String value;
|
|
|
|
private ExternalSheet externalSheet;
|
|
|
|
private WorkbookMethods nameTable;
|
|
|
|
private String formulaString;
|
|
|
|
private byte[] data;
|
|
|
|
public StringFormulaRecord(Record t, File excelFile, FormattingRecords fr, ExternalSheet es, WorkbookMethods nt, SheetImpl si, WorkbookSettings ws) {
|
|
super(t, fr, si);
|
|
this.externalSheet = es;
|
|
this.nameTable = nt;
|
|
this.data = getRecord().getData();
|
|
int pos = excelFile.getPos();
|
|
Record nextRecord = excelFile.next();
|
|
int count = 0;
|
|
while (nextRecord.getType() != Type.STRING && count < 4) {
|
|
nextRecord = excelFile.next();
|
|
count++;
|
|
}
|
|
Assert.verify((count < 4), " @ " + pos);
|
|
readString(nextRecord.getData(), ws);
|
|
}
|
|
|
|
public StringFormulaRecord(Record t, FormattingRecords fr, ExternalSheet es, WorkbookMethods nt, SheetImpl si) {
|
|
super(t, fr, si);
|
|
this.externalSheet = es;
|
|
this.nameTable = nt;
|
|
this.data = getRecord().getData();
|
|
this.value = "";
|
|
}
|
|
|
|
private void readString(byte[] d, WorkbookSettings ws) {
|
|
int pos = 0;
|
|
int chars = IntegerHelper.getInt(d[0], d[1]);
|
|
if (chars == 0) {
|
|
this.value = "";
|
|
return;
|
|
}
|
|
pos += 2;
|
|
int optionFlags = d[pos];
|
|
pos++;
|
|
if ((optionFlags & 0xF) != optionFlags) {
|
|
pos = 0;
|
|
chars = IntegerHelper.getInt(d[0], (byte)0);
|
|
optionFlags = d[1];
|
|
pos = 2;
|
|
}
|
|
boolean extendedString = ((optionFlags & 0x4) != 0);
|
|
boolean richString = ((optionFlags & 0x8) != 0);
|
|
if (richString)
|
|
pos += 2;
|
|
if (extendedString)
|
|
pos += 4;
|
|
boolean asciiEncoding = ((optionFlags & 0x1) == 0);
|
|
if (asciiEncoding) {
|
|
this.value = StringHelper.getString(d, chars, pos, ws);
|
|
} else {
|
|
this.value = StringHelper.getUnicodeString(d, chars, pos);
|
|
}
|
|
}
|
|
|
|
public String getContents() {
|
|
return this.value;
|
|
}
|
|
|
|
public String getString() {
|
|
return this.value;
|
|
}
|
|
|
|
public CellType getType() {
|
|
return CellType.STRING_FORMULA;
|
|
}
|
|
|
|
public byte[] getFormulaData() throws FormulaException {
|
|
if (!getSheet().getWorkbook().getWorkbookBof().isBiff8())
|
|
throw new FormulaException(FormulaException.biff8Supported);
|
|
byte[] d = new byte[this.data.length - 6];
|
|
System.arraycopy(this.data, 6, d, 0, this.data.length - 6);
|
|
return d;
|
|
}
|
|
|
|
public String getFormula() throws FormulaException {
|
|
if (this.formulaString == null) {
|
|
byte[] tokens = new byte[this.data.length - 22];
|
|
System.arraycopy(this.data, 22, tokens, 0, tokens.length);
|
|
FormulaParser fp = new FormulaParser(tokens, this, this.externalSheet, this.nameTable, getSheet().getWorkbook().getSettings());
|
|
fp.parse();
|
|
this.formulaString = fp.getFormula();
|
|
}
|
|
return this.formulaString;
|
|
}
|
|
}
|