writableworkbookimpl.java
来自「jexcelapi_2_4, JXL的API, JXL是JAVA读取EXCEL的」· Java 代码 · 共 1,039 行 · 第 1/2 页
JAVA
1,039 行
PrecisionRecord pc = new PrecisionRecord(false);
outputFile.write(pc);
RefreshAllRecord rar = new RefreshAllRecord(false);
outputFile.write(rar);
BookboolRecord bb = new BookboolRecord(true);
outputFile.write(bb);
// Write out all the fonts used
fonts.write(outputFile);
// Write out the cell formats used within this workbook
formatRecords.write(outputFile);
// Write out the palette, if it exists
if (formatRecords.getPalette() != null)
{
outputFile.write(formatRecords.getPalette());
}
// Write out the uses elfs record
UsesElfsRecord uer = new UsesElfsRecord();
outputFile.write(uer);
// Write out the boundsheet records. Keep a handle to each one's
// position so we can write in the stream offset later
int[] boundsheetPos = new int[getNumberOfSheets()];
Sheet sheet = null;
for (int i = 0; i < getNumberOfSheets(); i++)
{
boundsheetPos[i] = outputFile.getPos();
sheet = getSheet(i);
BoundsheetRecord br = new BoundsheetRecord
(sheet.getName());
if (sheet.getSettings().isHidden())
{
br.setHidden();
}
if ( ( (WritableSheetImpl) sheets.get(i)).isChartOnly())
{
br.setChartOnly();
}
outputFile.write(br);
}
CountryRecord cr = new CountryRecord();
outputFile.write(cr);
// Write out the external sheet record, if it exists
if (externSheet != null)
{
//Write out all the supbook records
for (int i = 0; i < supbooks.length ; i++)
{
outputFile.write(supbooks[i]);
}
outputFile.write(externSheet);
}
// Write out the names, if any exists
if (names != null)
{
for (int i = 0 ; i < names.length ; i++)
{
outputFile.write(names[i]);
}
}
// Write out the mso drawing group, if it exists
/* if (msoDrawingGroup != null)
{
outputFile.write(msoDrawingGroup);
}
*/
if (drawingGroup != null)
{
drawingGroup.write(outputFile);
}
sharedStrings.write(outputFile);
EOFRecord eof = new EOFRecord();
outputFile.write(eof);
// Write out the sheets
WritableSheetImpl wsheet = null;
for (int i = 0; i < getNumberOfSheets(); i++)
{
// first go back and modify the offset we wrote out for the
// boundsheet record
outputFile.setData
(IntegerHelper.getFourBytes(outputFile.getPos()),
boundsheetPos[i] + 4);
wsheet = (WritableSheetImpl) getSheet(i);
// Select the first sheet in the workbook
if (i == 0)
{
wsheet.getSettings().setSelected();
}
wsheet.write();
}
}
/**
* Produces a writable copy of the workbook passed in by
* creating copies of each sheet in the specified workbook and adding
* them to its own record
*
* @param w the workbook to copy
*/
private void copyWorkbook(Workbook w)
{
int numSheets = w.getNumberOfSheets();
wbProtected = w.isProtected();
Sheet s = null;
WritableSheetImpl ws = null;
for (int i = 0 ; i < numSheets; i++)
{
s = w.getSheet(i);
ws = (WritableSheetImpl) createSheet(s.getName(),i, false);
ws.copy(s);
}
}
/**
* Copies the specified sheet and places it at the index
* specified by the parameter
*
* @param s the index of the sheet to copy
* @param name the name of the new sheet
* @param index the position of the new sheet
*/
public void copySheet(int s, String name, int index)
{
WritableSheet sheet = getSheet(s);
WritableSheetImpl ws = (WritableSheetImpl) createSheet(name, index);
ws.copy(sheet);
}
/**
* Copies the specified sheet and places it at the index
* specified by the parameter
*
* @param s the name of the sheet to copy
* @param name the name of the new sheet
* @param index the position of the new sheet
*/
public void copySheet(String s, String name, int index)
{
WritableSheet sheet = getSheet(s);
WritableSheetImpl ws = (WritableSheetImpl) createSheet(name, index);
ws.copy(sheet);
}
/**
* Indicates whether or not this workbook is protected
*
* @param prot protected flag
*/
public void setProtected(boolean prot)
{
wbProtected = prot;
}
/**
* Rationalizes the cell formats, and then passes the resultant XF index
* mappings to each sheet in turn
*/
private void rationalize()
{
IndexMapping fontMapping = formatRecords.rationalizeFonts();
IndexMapping formatMapping = formatRecords.rationalizeDisplayFormats();
IndexMapping xfMapping = formatRecords.rationalize(fontMapping,
formatMapping);
WritableSheetImpl wsi = null;
for (int i = 0; i < sheets.size(); i++)
{
wsi = (WritableSheetImpl) sheets.get(i);
wsi.rationalize(xfMapping, fontMapping, formatMapping);
}
}
/**
* Gets the name of the external sheet specified by the index
*
* @param index the external sheet index
* @return the name of the external sheet
*/
public String getExternalSheetName(int index)
{
int supbookIndex = externSheet.getSupbookIndex(index);
SupbookRecord sr = supbooks[supbookIndex];
int firstTab = externSheet.getFirstTabIndex(index);
int lastTab = externSheet.getLastTabIndex(index);
Assert.verify(firstTab == lastTab);
if (sr.getType() == SupbookRecord.INTERNAL)
{
// It's an internal reference - get the name from the sheets list
WritableSheet ws = getSheet(firstTab);
return ws.getName();
}
else if (sr.getType() == SupbookRecord.EXTERNAL)
{
Assert.verify(false);
}
// An unknown supbook - return unkown
return "[UNKNOWN]";
}
/**
* Parsing of formulas is only supported for a subset of the available
* biff version, so we need to test to see if this version is acceptable
*
* @return the BOF record, which
*/
public jxl.read.biff.BOFRecord getWorkbookBof()
{
return null;
}
/**
* Gets the index of the external sheet for the name
*
* @param sheetName
* @return the sheet index of the external sheet index
*/
public int getExternalSheetIndex(int index)
{
if (externSheet == null)
{
return index;
}
Assert.verify(externSheet != null);
int firstTab = externSheet.getFirstTabIndex(index);
int lastTab = externSheet.getLastTabIndex(index);
Assert.verify(firstTab == lastTab);
return firstTab;
}
/**
* Gets the external sheet index for the sheet name
* @param sheetName
* @return the sheet index or -1 if the sheet could not be found
*/
public int getExternalSheetIndex(String sheetName)
{
if (externSheet == null)
{
externSheet = new ExternalSheetRecord();
supbooks = new SupbookRecord[1];
supbooks[0] = new SupbookRecord(getNumberOfSheets());
}
// Iterate through the sheets records
boolean found = false;
Iterator i = sheets.iterator();
int sheetpos = 0;
WritableSheetImpl s = null;
while (i.hasNext() && !found)
{
s = (WritableSheetImpl) i.next();
if (s.getName().equals(sheetName))
{
found = true;
}
else
{
sheetpos++;
}
}
if (!found)
{
return -1;
}
// Check that the supbook record at position zero is internal and contains
// all the sheets
Assert.verify(supbooks[0].getType() == SupbookRecord.INTERNAL &&
supbooks[0].getNumberOfSheets() == getNumberOfSheets());
return externSheet.getIndex(0, sheetpos);
}
/**
* Sets the RGB value for the specified colour for this workbook
*
* @param c the colour whose RGB value is to be overwritten
* @param r the red portion to set (0-255)
* @param g the green portion to set (0-255)
* @param b the blue portion to set (0-255)
*/
public void setColourRGB(Colour c, int r, int g, int b)
{
formatRecords.setColourRGB(c,r,g,b);
}
/**
* Gets the name at the specified index
*
* @param index the index into the name table
* @return the name of the cell
*/
public String getName(int index)
{
Assert.verify(index >= 0 && index < names.length);
return names[index].getName();
}
/**
* Gets the index of the name record for the name
*
* @param name
* @return the index in the name table
*/
public int getNameIndex(String name)
{
NameRecord nr = (NameRecord) nameRecords.get(name);
return nr != null ? nr.getIndex() : -1;
}
/**
* Adds a cell to workbook wide range of cells which need adjustment
* following a row/column insert or remove
*
* @param f the cell to add to the list
*/
void addRCIRCell(CellValue cv)
{
rcirCells.add(cv);
}
/**
* Called when a column is inserted on the specified sheet. Notifies all
* RCIR cells of this change
*
* @param s the sheet on which the column was inserted
* @param col the column number which was inserted
*/
void columnInserted(WritableSheetImpl s, int col)
{
int externalSheetIndex = getExternalSheetIndex(s.getName());
for (Iterator i = rcirCells.iterator() ; i.hasNext() ;)
{
CellValue cv = (CellValue) i.next();
cv.columnInserted(s, externalSheetIndex, col);
}
}
/**
* Called when a column is removed on the specified sheet. Notifies all
* RCIR cells of this change
*
* @param s the sheet on which the column was removed
* @param col the column number which was removed
*/
void columnRemoved(WritableSheetImpl s, int col)
{
int externalSheetIndex = getExternalSheetIndex(s.getName());
for (Iterator i = rcirCells.iterator() ; i.hasNext() ;)
{
CellValue cv = (CellValue) i.next();
cv.columnRemoved(s, externalSheetIndex, col);
}
}
/**
* Called when a row is inserted on the specified sheet. Notifies all
* RCIR cells of this change
*
* @param s the sheet on which the row was inserted
* @param row the row number which was inserted
*/
void rowInserted(WritableSheetImpl s, int row)
{
int externalSheetIndex = getExternalSheetIndex(s.getName());
for (Iterator i = rcirCells.iterator() ; i.hasNext() ;)
{
CellValue cv = (CellValue) i.next();
cv.rowInserted(s, externalSheetIndex, row);
}
}
/**
* Called when a row is inserted on the specified sheet. Notifies all
* RCIR cells of this change
*
* @param s the sheet on which the row was removed
* @param row the row number which was removed
*/
void rowRemoved(WritableSheetImpl s, int row)
{
int externalSheetIndex = getExternalSheetIndex(s.getName());
for (Iterator i = rcirCells.iterator() ; i.hasNext() ;)
{
CellValue cv = (CellValue) i.next();
cv.rowRemoved(s, externalSheetIndex, row);
}
}
/**
* Gets the named cell from this workbook. If the name refers to a
* range of cells, then the cell on the top left is returned. If
* the name cannot be found, null is returned
*
* @param the name of the cell/range to search for
* @return the cell in the top left of the range if found, NULL
* otherwise
*/
public WritableCell findCellByName(String name)
{
NameRecord nr = (NameRecord) nameRecords.get(name);
if (nr == null)
{
return null;
}
NameRecord.NameRange[] ranges = nr.getRanges();
// Go and retrieve the first cell in the first range
int sheetIndex = getExternalSheetIndex(ranges[0].getFirstSheet());
WritableSheet s = getSheet(sheetIndex);
WritableCell cell = s.getWritableCell(ranges[0].getFirstColumn(),
ranges[0].getFirstRow());
return cell;
}
/**
* Gets the named range from this workbook. The Range object returns
* contains all the cells from the top left to the bottom right
* of the range.
* If the named range comprises an adjacent range,
* the Range[] will contain one object; for non-adjacent
* ranges, it is necessary to return an array of length greater than
* one.
* If the named range contains a single cell, the top left and
* bottom right cell will be the same cell
*
* @param the name of the cell/range to search for
* @return the range of cells
*/
public Range[] findByName(String name)
{
NameRecord nr = (NameRecord) nameRecords.get(name);
if (nr == null)
{
return null;
}
NameRecord.NameRange[] ranges = nr.getRanges();
Range[] cellRanges = new Range[ranges.length];
for (int i = 0; i < ranges.length ; i++)
{
cellRanges[i] = new RangeImpl(this,
this,
ranges[i].getFirstSheet(),
ranges[i].getFirstColumn(),
ranges[i].getFirstRow(),
ranges[i].getLastSheet(),
ranges[i].getLastColumn(),
ranges[i].getLastRow());
}
return cellRanges;
}
void addDrawing(Drawing d)
{
if (drawingGroup == null)
{
drawingGroup = new DrawingGroup(DrawingGroup.WRITE);
}
drawingGroup.add(d);
}
void removeDrawing(Drawing d)
{
Assert.verify(drawingGroup != null);
drawingGroup.remove(d);
}
DrawingGroup getDrawingGroup()
{
return drawingGroup;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?