461 lines
12 KiB
Java
461 lines
12 KiB
Java
package jxl.read.biff;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Iterator;
|
|
import jxl.Cell;
|
|
import jxl.CellType;
|
|
import jxl.CellView;
|
|
import jxl.Hyperlink;
|
|
import jxl.Image;
|
|
import jxl.LabelCell;
|
|
import jxl.Range;
|
|
import jxl.Sheet;
|
|
import jxl.SheetSettings;
|
|
import jxl.WorkbookSettings;
|
|
import jxl.biff.CellReferenceHelper;
|
|
import jxl.biff.EmptyCell;
|
|
import jxl.biff.FormattingRecords;
|
|
import jxl.biff.Type;
|
|
import jxl.biff.WorkspaceInformationRecord;
|
|
import jxl.biff.drawing.Chart;
|
|
import jxl.biff.drawing.DrawingData;
|
|
import jxl.biff.drawing.DrawingGroupObject;
|
|
import jxl.format.CellFormat;
|
|
|
|
public class SheetImpl implements Sheet {
|
|
private File excelFile;
|
|
|
|
private SSTRecord sharedStrings;
|
|
|
|
private BOFRecord sheetBof;
|
|
|
|
private BOFRecord workbookBof;
|
|
|
|
private FormattingRecords formattingRecords;
|
|
|
|
private String name;
|
|
|
|
private int numRows;
|
|
|
|
private int numCols;
|
|
|
|
private Cell[][] cells;
|
|
|
|
private int startPosition;
|
|
|
|
private ColumnInfoRecord[] columnInfos;
|
|
|
|
private RowRecord[] rowRecords;
|
|
|
|
private ArrayList rowProperties;
|
|
|
|
private ArrayList columnInfosArray;
|
|
|
|
private ArrayList sharedFormulas;
|
|
|
|
private ArrayList hyperlinks;
|
|
|
|
private ArrayList charts;
|
|
|
|
private ArrayList drawings;
|
|
|
|
private ArrayList images;
|
|
|
|
private DataValidation dataValidation;
|
|
|
|
private Range[] mergedCells;
|
|
|
|
private boolean columnInfosInitialized;
|
|
|
|
private boolean rowRecordsInitialized;
|
|
|
|
private boolean nineteenFour;
|
|
|
|
private WorkspaceInformationRecord workspaceOptions;
|
|
|
|
private boolean hidden;
|
|
|
|
private PLSRecord plsRecord;
|
|
|
|
private ButtonPropertySetRecord buttonPropertySet;
|
|
|
|
private SheetSettings settings;
|
|
|
|
private int[] rowBreaks;
|
|
|
|
private WorkbookParser workbook;
|
|
|
|
private WorkbookSettings workbookSettings;
|
|
|
|
SheetImpl(File f, SSTRecord sst, FormattingRecords fr, BOFRecord sb, BOFRecord wb, boolean nf, WorkbookParser wp) throws BiffException {
|
|
this.excelFile = f;
|
|
this.sharedStrings = sst;
|
|
this.formattingRecords = fr;
|
|
this.sheetBof = sb;
|
|
this.workbookBof = wb;
|
|
this.columnInfosArray = new ArrayList();
|
|
this.sharedFormulas = new ArrayList();
|
|
this.hyperlinks = new ArrayList();
|
|
this.rowProperties = new ArrayList(10);
|
|
this.columnInfosInitialized = false;
|
|
this.rowRecordsInitialized = false;
|
|
this.nineteenFour = nf;
|
|
this.workbook = wp;
|
|
this.workbookSettings = this.workbook.getSettings();
|
|
this.startPosition = f.getPos();
|
|
if (this.sheetBof.isChart())
|
|
this.startPosition -= this.sheetBof.getLength() + 4;
|
|
Record r = null;
|
|
int bofs = 1;
|
|
while (bofs >= 1) {
|
|
r = f.next();
|
|
if (r.getCode() == Type.EOF.value)
|
|
bofs--;
|
|
if (r.getCode() == Type.BOF.value)
|
|
bofs++;
|
|
}
|
|
}
|
|
|
|
public Cell getCell(String loc) {
|
|
return getCell(CellReferenceHelper.getColumn(loc), CellReferenceHelper.getRow(loc));
|
|
}
|
|
|
|
public Cell getCell(int column, int row) {
|
|
EmptyCell emptyCell;
|
|
if (this.cells == null)
|
|
readSheet();
|
|
Cell c = this.cells[row][column];
|
|
if (c == null) {
|
|
emptyCell = new EmptyCell(column, row);
|
|
this.cells[row][column] = (Cell)emptyCell;
|
|
}
|
|
return (Cell)emptyCell;
|
|
}
|
|
|
|
public Cell findCell(String contents) {
|
|
Cell cell = null;
|
|
boolean found = false;
|
|
for (int i = 0; i < getRows() && !found; i++) {
|
|
Cell[] row = getRow(i);
|
|
for (int j = 0; j < row.length && !found; j++) {
|
|
if (row[j].getContents().equals(contents)) {
|
|
cell = row[j];
|
|
found = true;
|
|
}
|
|
}
|
|
}
|
|
return cell;
|
|
}
|
|
|
|
public LabelCell findLabelCell(String contents) {
|
|
LabelCell cell = null;
|
|
boolean found = false;
|
|
for (int i = 0; i < getRows() && !found; i++) {
|
|
Cell[] row = getRow(i);
|
|
for (int j = 0; j < row.length && !found; j++) {
|
|
if ((row[j].getType() == CellType.LABEL || row[j].getType() == CellType.STRING_FORMULA) && row[j].getContents().equals(contents)) {
|
|
cell = (LabelCell)row[j];
|
|
found = true;
|
|
}
|
|
}
|
|
}
|
|
return cell;
|
|
}
|
|
|
|
public int getRows() {
|
|
if (this.cells == null)
|
|
readSheet();
|
|
return this.numRows;
|
|
}
|
|
|
|
public int getColumns() {
|
|
if (this.cells == null)
|
|
readSheet();
|
|
return this.numCols;
|
|
}
|
|
|
|
public Cell[] getRow(int row) {
|
|
if (this.cells == null)
|
|
readSheet();
|
|
boolean found = false;
|
|
int col = this.numCols - 1;
|
|
while (col >= 0 && !found) {
|
|
if (this.cells[row][col] != null) {
|
|
found = true;
|
|
continue;
|
|
}
|
|
col--;
|
|
}
|
|
Cell[] c = new Cell[col + 1];
|
|
for (int i = 0; i <= col; i++)
|
|
c[i] = getCell(i, row);
|
|
return c;
|
|
}
|
|
|
|
public Cell[] getColumn(int col) {
|
|
if (this.cells == null)
|
|
readSheet();
|
|
boolean found = false;
|
|
int row = this.numRows - 1;
|
|
while (row >= 0 && !found) {
|
|
if (this.cells[row][col] != null) {
|
|
found = true;
|
|
continue;
|
|
}
|
|
row--;
|
|
}
|
|
Cell[] c = new Cell[row + 1];
|
|
for (int i = 0; i <= row; i++)
|
|
c[i] = getCell(col, i);
|
|
return c;
|
|
}
|
|
|
|
public String getName() {
|
|
return this.name;
|
|
}
|
|
|
|
final void setName(String s) {
|
|
this.name = s;
|
|
}
|
|
|
|
public boolean isHidden() {
|
|
return this.hidden;
|
|
}
|
|
|
|
public ColumnInfoRecord getColumnInfo(int col) {
|
|
if (!this.columnInfosInitialized) {
|
|
Iterator i = this.columnInfosArray.iterator();
|
|
ColumnInfoRecord cir = null;
|
|
while (i.hasNext()) {
|
|
cir = i.next();
|
|
int startcol = Math.max(0, cir.getStartColumn());
|
|
int endcol = Math.min(this.columnInfos.length - 1, cir.getEndColumn());
|
|
for (int c = startcol; c <= endcol; c++)
|
|
this.columnInfos[c] = cir;
|
|
if (endcol < startcol)
|
|
this.columnInfos[startcol] = cir;
|
|
}
|
|
this.columnInfosInitialized = true;
|
|
}
|
|
return (col < this.columnInfos.length) ? this.columnInfos[col] : null;
|
|
}
|
|
|
|
public ColumnInfoRecord[] getColumnInfos() {
|
|
ColumnInfoRecord[] infos = new ColumnInfoRecord[this.columnInfosArray.size()];
|
|
for (int i = 0; i < this.columnInfosArray.size(); i++)
|
|
infos[i] = this.columnInfosArray.get(i);
|
|
return infos;
|
|
}
|
|
|
|
final void setHidden(boolean h) {
|
|
this.hidden = h;
|
|
}
|
|
|
|
final void clear() {
|
|
this.cells = (Cell[][])null;
|
|
this.mergedCells = null;
|
|
this.columnInfosArray.clear();
|
|
this.sharedFormulas.clear();
|
|
this.hyperlinks.clear();
|
|
this.columnInfosInitialized = false;
|
|
if (!this.workbookSettings.getGCDisabled())
|
|
System.gc();
|
|
}
|
|
|
|
final void readSheet() {
|
|
if (!this.sheetBof.isWorksheet()) {
|
|
this.numRows = 0;
|
|
this.numCols = 0;
|
|
this.cells = new Cell[0][0];
|
|
}
|
|
SheetReader reader = new SheetReader(this.excelFile, this.sharedStrings, this.formattingRecords, this.sheetBof, this.workbookBof, this.nineteenFour, this.workbook, this.startPosition, this);
|
|
reader.read();
|
|
this.numRows = reader.getNumRows();
|
|
this.numCols = reader.getNumCols();
|
|
this.cells = reader.getCells();
|
|
this.rowProperties = reader.getRowProperties();
|
|
this.columnInfosArray = reader.getColumnInfosArray();
|
|
this.hyperlinks = reader.getHyperlinks();
|
|
this.charts = reader.getCharts();
|
|
this.drawings = reader.getDrawings();
|
|
this.dataValidation = reader.getDataValidation();
|
|
this.mergedCells = reader.getMergedCells();
|
|
this.settings = reader.getSettings();
|
|
this.settings.setHidden(this.hidden);
|
|
this.rowBreaks = reader.getRowBreaks();
|
|
this.workspaceOptions = reader.getWorkspaceOptions();
|
|
this.plsRecord = reader.getPLS();
|
|
this.buttonPropertySet = reader.getButtonPropertySet();
|
|
reader = null;
|
|
if (!this.workbookSettings.getGCDisabled())
|
|
System.gc();
|
|
if (this.columnInfosArray.size() > 0) {
|
|
ColumnInfoRecord cir = this.columnInfosArray.get(this.columnInfosArray.size() - 1);
|
|
this.columnInfos = new ColumnInfoRecord[cir.getEndColumn() + 1];
|
|
} else {
|
|
this.columnInfos = new ColumnInfoRecord[0];
|
|
}
|
|
}
|
|
|
|
public Hyperlink[] getHyperlinks() {
|
|
Hyperlink[] hl = new Hyperlink[this.hyperlinks.size()];
|
|
for (int i = 0; i < this.hyperlinks.size(); i++)
|
|
hl[i] = this.hyperlinks.get(i);
|
|
return hl;
|
|
}
|
|
|
|
public Range[] getMergedCells() {
|
|
if (this.mergedCells == null)
|
|
return new Range[0];
|
|
return this.mergedCells;
|
|
}
|
|
|
|
public RowRecord[] getRowProperties() {
|
|
RowRecord[] rp = new RowRecord[this.rowProperties.size()];
|
|
for (int i = 0; i < rp.length; i++)
|
|
rp[i] = this.rowProperties.get(i);
|
|
return rp;
|
|
}
|
|
|
|
public DataValidation getDataValidation() {
|
|
return this.dataValidation;
|
|
}
|
|
|
|
RowRecord getRowInfo(int r) {
|
|
if (!this.rowRecordsInitialized) {
|
|
this.rowRecords = new RowRecord[getRows()];
|
|
Iterator i = this.rowProperties.iterator();
|
|
int rownum = 0;
|
|
RowRecord rr = null;
|
|
while (i.hasNext()) {
|
|
rr = i.next();
|
|
rownum = rr.getRowNumber();
|
|
if (rownum < this.rowRecords.length)
|
|
this.rowRecords[rownum] = rr;
|
|
}
|
|
this.rowRecordsInitialized = true;
|
|
}
|
|
return this.rowRecords[r];
|
|
}
|
|
|
|
public final int[] getRowPageBreaks() {
|
|
return this.rowBreaks;
|
|
}
|
|
|
|
public final Chart[] getCharts() {
|
|
Chart[] ch = new Chart[this.charts.size()];
|
|
for (int i = 0; i < ch.length; i++)
|
|
ch[i] = this.charts.get(i);
|
|
return ch;
|
|
}
|
|
|
|
public final DrawingGroupObject[] getDrawings() {
|
|
DrawingGroupObject[] dr = new DrawingGroupObject[this.drawings.size()];
|
|
dr = (DrawingGroupObject[])this.drawings.toArray((Object[])dr);
|
|
return dr;
|
|
}
|
|
|
|
public boolean isProtected() {
|
|
return this.settings.isProtected();
|
|
}
|
|
|
|
public WorkspaceInformationRecord getWorkspaceOptions() {
|
|
return this.workspaceOptions;
|
|
}
|
|
|
|
public SheetSettings getSettings() {
|
|
return this.settings;
|
|
}
|
|
|
|
WorkbookParser getWorkbook() {
|
|
return this.workbook;
|
|
}
|
|
|
|
public CellFormat getColumnFormat(int col) {
|
|
CellView cv = getColumnView(col);
|
|
return cv.getFormat();
|
|
}
|
|
|
|
public int getColumnWidth(int col) {
|
|
return getColumnView(col).getSize() / 256;
|
|
}
|
|
|
|
public CellView getColumnView(int col) {
|
|
ColumnInfoRecord cir = getColumnInfo(col);
|
|
CellView cv = new CellView();
|
|
if (cir != null) {
|
|
cv.setDimension(cir.getWidth() / 256);
|
|
cv.setSize(cir.getWidth());
|
|
cv.setHidden(cir.getHidden());
|
|
cv.setFormat((CellFormat)this.formattingRecords.getXFRecord(cir.getXFIndex()));
|
|
} else {
|
|
cv.setDimension(this.settings.getDefaultColumnWidth() / 256);
|
|
cv.setSize(this.settings.getDefaultColumnWidth());
|
|
}
|
|
return cv;
|
|
}
|
|
|
|
public int getRowHeight(int row) {
|
|
return getRowView(row).getDimension();
|
|
}
|
|
|
|
public CellView getRowView(int row) {
|
|
RowRecord rr = getRowInfo(row);
|
|
CellView cv = new CellView();
|
|
if (rr != null) {
|
|
cv.setDimension(rr.getRowHeight());
|
|
cv.setSize(rr.getRowHeight());
|
|
cv.setHidden(rr.isCollapsed());
|
|
} else {
|
|
cv.setDimension(this.settings.getDefaultRowHeight());
|
|
cv.setSize(this.settings.getDefaultRowHeight());
|
|
}
|
|
return cv;
|
|
}
|
|
|
|
public BOFRecord getSheetBof() {
|
|
return this.sheetBof;
|
|
}
|
|
|
|
public BOFRecord getWorkbookBof() {
|
|
return this.workbookBof;
|
|
}
|
|
|
|
public PLSRecord getPLS() {
|
|
return this.plsRecord;
|
|
}
|
|
|
|
public ButtonPropertySetRecord getButtonPropertySet() {
|
|
return this.buttonPropertySet;
|
|
}
|
|
|
|
public int getNumberOfImages() {
|
|
if (this.images == null)
|
|
initializeImages();
|
|
return this.images.size();
|
|
}
|
|
|
|
public Image getDrawing(int i) {
|
|
if (this.images == null)
|
|
initializeImages();
|
|
return this.images.get(i);
|
|
}
|
|
|
|
private void initializeImages() {
|
|
if (this.images != null)
|
|
return;
|
|
this.images = new ArrayList();
|
|
DrawingGroupObject[] dgos = getDrawings();
|
|
for (int i = 0; i < dgos.length; i++) {
|
|
if (dgos[i] instanceof jxl.biff.drawing.Drawing)
|
|
this.images.add(dgos[i]);
|
|
}
|
|
}
|
|
|
|
public DrawingData getDrawingData() {
|
|
SheetReader reader = new SheetReader(this.excelFile, this.sharedStrings, this.formattingRecords, this.sheetBof, this.workbookBof, this.nineteenFour, this.workbook, this.startPosition, this);
|
|
reader.read();
|
|
return reader.getDrawingData();
|
|
}
|
|
}
|