Merged revisions 695264,695303,695420 via svnmerge from
https://svn.apache.org:443/repos/asf/poi/trunk ........ r695264 | josh | 2008-09-14 19:55:28 +0100 (Sun, 14 Sep 2008) | 1 line Fix for bug 45978 - removed eager initialisation of SheetReferences ........ r695303 | nick | 2008-09-14 23:19:06 +0100 (Sun, 14 Sep 2008) | 1 line Make a start on exposing the StyleRecord details into HSSFCellStyle, but not fully there yet ........ r695420 | nick | 2008-09-15 12:02:18 +0100 (Mon, 15 Sep 2008) | 1 line Finish exposing the name of Named Cell Styles via HSSFCellStyle (normally held on the parent style though) ........ git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@695549 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
b832a6411d
commit
8f5ffb8256
@ -66,6 +66,8 @@
|
|||||||
<action dev="POI-DEVELOPERS" type="add">Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx</action>
|
<action dev="POI-DEVELOPERS" type="add">Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx</action>
|
||||||
</release>
|
</release>
|
||||||
<release version="3.1.1-alpha1" date="2008-??-??">
|
<release version="3.1.1-alpha1" date="2008-??-??">
|
||||||
|
<action dev="POI-DEVELOPERS" type="add">Expose the name of Named Cell Styles via HSSFCellStyle (normally held on the parent style though)</action>
|
||||||
|
<action dev="POI-DEVELOPERS" type="fix">45978 - Fixed IOOBE in Ref3DPtg.toFormulaString() due eager initialisation of SheetReferences</action>
|
||||||
<action dev="POI-DEVELOPERS" type="add">Made HSSFFormulaEvaluator no longer require initialisation with sheet or row</action>
|
<action dev="POI-DEVELOPERS" type="add">Made HSSFFormulaEvaluator no longer require initialisation with sheet or row</action>
|
||||||
<action dev="POI-DEVELOPERS" type="add">Extended support for cached results of formula cells</action>
|
<action dev="POI-DEVELOPERS" type="add">Extended support for cached results of formula cells</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45639 - Fixed AIOOBE due to bad index logic in ColumnInfoRecordsAggregate</action>
|
<action dev="POI-DEVELOPERS" type="fix">45639 - Fixed AIOOBE due to bad index logic in ColumnInfoRecordsAggregate</action>
|
||||||
|
@ -63,6 +63,8 @@
|
|||||||
<action dev="POI-DEVELOPERS" type="add">Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx</action>
|
<action dev="POI-DEVELOPERS" type="add">Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx</action>
|
||||||
</release>
|
</release>
|
||||||
<release version="3.1.1-alpha1" date="2008-??-??">
|
<release version="3.1.1-alpha1" date="2008-??-??">
|
||||||
|
<action dev="POI-DEVELOPERS" type="add">Expose the name of Named Cell Styles via HSSFCellStyle (normally held on the parent style though)</action>
|
||||||
|
<action dev="POI-DEVELOPERS" type="fix">45978 - Fixed IOOBE in Ref3DPtg.toFormulaString() due eager initialisation of SheetReferences</action>
|
||||||
<action dev="POI-DEVELOPERS" type="add">Made HSSFFormulaEvaluator no longer require initialisation with sheet or row</action>
|
<action dev="POI-DEVELOPERS" type="add">Made HSSFFormulaEvaluator no longer require initialisation with sheet or row</action>
|
||||||
<action dev="POI-DEVELOPERS" type="add">Extended support for cached results of formula cells</action>
|
<action dev="POI-DEVELOPERS" type="add">Extended support for cached results of formula cells</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45639 - Fixed AIOOBE due to bad index logic in ColumnInfoRecordsAggregate</action>
|
<action dev="POI-DEVELOPERS" type="fix">45639 - Fixed AIOOBE due to bad index logic in ColumnInfoRecordsAggregate</action>
|
||||||
|
@ -348,10 +348,6 @@ final class LinkTable {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getNumberOfREFStructures() {
|
|
||||||
return _externSheetRecord.getNumOfRefs();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String resolveNameXText(int refIndex, int definedNameIndex) {
|
public String resolveNameXText(int refIndex, int definedNameIndex) {
|
||||||
int extBookIndex = _externSheetRecord.getExtbookIndexFromRefIndex(refIndex);
|
int extBookIndex = _externSheetRecord.getExtbookIndexFromRefIndex(refIndex);
|
||||||
return _externalBookBlocks[extBookIndex].getNameText(definedNameIndex);
|
return _externalBookBlocks[extBookIndex].getNameText(definedNameIndex);
|
||||||
|
@ -26,7 +26,6 @@ import org.apache.poi.ddf.*;
|
|||||||
import org.apache.poi.hssf.record.*;
|
import org.apache.poi.hssf.record.*;
|
||||||
import org.apache.poi.hssf.record.formula.NameXPtg;
|
import org.apache.poi.hssf.record.formula.NameXPtg;
|
||||||
import org.apache.poi.hssf.util.HSSFColor;
|
import org.apache.poi.hssf.util.HSSFColor;
|
||||||
import org.apache.poi.hssf.util.SheetReferences;
|
|
||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
@ -775,6 +774,61 @@ public final class Workbook implements Model {
|
|||||||
return xf;
|
return xf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the StyleRecord for the given
|
||||||
|
* xfIndex, or null if that ExtendedFormat doesn't
|
||||||
|
* have a Style set.
|
||||||
|
*/
|
||||||
|
public StyleRecord getStyleRecord(int xfIndex) {
|
||||||
|
// Style records always follow after
|
||||||
|
// the ExtendedFormat records
|
||||||
|
boolean done = false;
|
||||||
|
for(int i=records.getXfpos(); i<records.size() &&
|
||||||
|
!done; i++) {
|
||||||
|
Record r = records.get(i);
|
||||||
|
if(r instanceof ExtendedFormatRecord) {
|
||||||
|
} else if(r instanceof StyleRecord) {
|
||||||
|
StyleRecord sr = (StyleRecord)r;
|
||||||
|
if(sr.getIndex() == xfIndex) {
|
||||||
|
return sr;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Creates a new StyleRecord, for the given Extended
|
||||||
|
* Format index, and adds it onto the end of the
|
||||||
|
* records collection
|
||||||
|
*/
|
||||||
|
public StyleRecord createStyleRecord(int xfIndex) {
|
||||||
|
// Style records always follow after
|
||||||
|
// the ExtendedFormat records
|
||||||
|
StyleRecord newSR = new StyleRecord();
|
||||||
|
newSR.setIndex((short)xfIndex);
|
||||||
|
|
||||||
|
// Find the spot
|
||||||
|
int addAt = -1;
|
||||||
|
for(int i=records.getXfpos(); i<records.size() &&
|
||||||
|
addAt == -1; i++) {
|
||||||
|
Record r = records.get(i);
|
||||||
|
if(r instanceof ExtendedFormatRecord ||
|
||||||
|
r instanceof StyleRecord) {
|
||||||
|
// Keep going
|
||||||
|
} else {
|
||||||
|
addAt = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(addAt == -1) {
|
||||||
|
throw new IllegalStateException("No XF Records found!");
|
||||||
|
}
|
||||||
|
records.add(addAt, newSR);
|
||||||
|
|
||||||
|
return newSR;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a string to the SST table and returns its index (if its a duplicate
|
* Adds a string to the SST table and returns its index (if its a duplicate
|
||||||
* just returns its index and update the counts) ASSUMES compressed unicode
|
* just returns its index and update the counts) ASSUMES compressed unicode
|
||||||
@ -1902,34 +1956,23 @@ public final class Workbook implements Model {
|
|||||||
return linkTable;
|
return linkTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SheetReferences getSheetReferences() {
|
|
||||||
SheetReferences refs = new SheetReferences();
|
|
||||||
|
|
||||||
if (linkTable != null) {
|
|
||||||
int numRefStructures = linkTable.getNumberOfREFStructures();
|
|
||||||
for (short k = 0; k < numRefStructures; k++) {
|
|
||||||
|
|
||||||
String sheetName = findSheetNameFromExternSheet(k);
|
|
||||||
refs.addSheetReference(sheetName, k);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return refs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** finds the sheet name by his extern sheet index
|
/** finds the sheet name by his extern sheet index
|
||||||
* @param num extern sheet index
|
* @param externSheetIndex extern sheet index
|
||||||
* @return sheet name
|
* @return sheet name.
|
||||||
*/
|
*/
|
||||||
public String findSheetNameFromExternSheet(short num){
|
public String findSheetNameFromExternSheet(int externSheetIndex){
|
||||||
|
|
||||||
int indexToSheet = linkTable.getIndexToSheet(num);
|
int indexToSheet = linkTable.getIndexToSheet(externSheetIndex);
|
||||||
|
|
||||||
if (indexToSheet < 0) {
|
if (indexToSheet < 0) {
|
||||||
// TODO - what does '-1' mean here?
|
// TODO - what does '-1' mean here?
|
||||||
//error check, bail out gracefully!
|
//error check, bail out gracefully!
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
if (indexToSheet >= boundsheets.size()) {
|
||||||
|
// Not sure if this can ever happen (See bug 45798)
|
||||||
|
return ""; // Seems to be what excel would do in this case
|
||||||
|
}
|
||||||
return getSheetName(indexToSheet);
|
return getSheetName(indexToSheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,7 +160,10 @@ public final class StyleRecord extends Record {
|
|||||||
public void setName(String name)
|
public void setName(String name)
|
||||||
{
|
{
|
||||||
field_4_name = name;
|
field_4_name = name;
|
||||||
//TODO set name length and string options
|
|
||||||
|
// Fix up the length
|
||||||
|
field_2_name_length = (short)name.length();
|
||||||
|
//TODO set name string options
|
||||||
}
|
}
|
||||||
|
|
||||||
// end user defined
|
// end user defined
|
||||||
|
@ -92,7 +92,7 @@ public final class Area3DPtg extends AreaPtgBase {
|
|||||||
public String toFormulaString(Workbook book) {
|
public String toFormulaString(Workbook book) {
|
||||||
// First do the sheet name
|
// First do the sheet name
|
||||||
StringBuffer retval = new StringBuffer();
|
StringBuffer retval = new StringBuffer();
|
||||||
String sheetName = Ref3DPtg.getSheetName(book, field_1_index_extern_sheet);
|
String sheetName = book.findSheetNameFromExternSheet(field_1_index_extern_sheet);
|
||||||
if(sheetName != null) {
|
if(sheetName != null) {
|
||||||
if(sheetName.length() == 0) {
|
if(sheetName.length() == 0) {
|
||||||
// What excel does if sheet has been deleted
|
// What excel does if sheet has been deleted
|
||||||
|
@ -160,20 +160,6 @@ public final class Ref3DPtg extends OperandPtg {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO - find a home for this method
|
|
||||||
// There is already a method on Workbook called getSheetName but it seems to do something different.
|
|
||||||
static String getSheetName(Workbook book, int externSheetIndex) {
|
|
||||||
// TODO - there are 3 ways this method can return null. Is each valid?
|
|
||||||
if (book == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
SheetReferences refs = book.getSheetReferences();
|
|
||||||
if (refs == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return refs.getSheetName(externSheetIndex);
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* @return text representation of this cell reference that can be used in text
|
* @return text representation of this cell reference that can be used in text
|
||||||
* formulas. The sheet name will get properly delimited if required.
|
* formulas. The sheet name will get properly delimited if required.
|
||||||
@ -181,7 +167,7 @@ public final class Ref3DPtg extends OperandPtg {
|
|||||||
public String toFormulaString(Workbook book)
|
public String toFormulaString(Workbook book)
|
||||||
{
|
{
|
||||||
StringBuffer retval = new StringBuffer();
|
StringBuffer retval = new StringBuffer();
|
||||||
String sheetName = getSheetName(book, field_1_index_extern_sheet);
|
String sheetName = book.findSheetNameFromExternSheet(field_1_index_extern_sheet);
|
||||||
if(sheetName != null) {
|
if(sheetName != null) {
|
||||||
SheetNameFormatter.appendFormat(retval, sheetName);
|
SheetNameFormatter.appendFormat(retval, sheetName);
|
||||||
retval.append( '!' );
|
retval.append( '!' );
|
||||||
|
@ -21,6 +21,7 @@ package org.apache.poi.hssf.usermodel;
|
|||||||
import org.apache.poi.hssf.model.Workbook;
|
import org.apache.poi.hssf.model.Workbook;
|
||||||
import org.apache.poi.hssf.record.ExtendedFormatRecord;
|
import org.apache.poi.hssf.record.ExtendedFormatRecord;
|
||||||
import org.apache.poi.hssf.record.FontRecord;
|
import org.apache.poi.hssf.record.FontRecord;
|
||||||
|
import org.apache.poi.hssf.record.StyleRecord;
|
||||||
import org.apache.poi.hssf.util.HSSFColor;
|
import org.apache.poi.hssf.util.HSSFColor;
|
||||||
import org.apache.poi.ss.usermodel.CellStyle;
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
import org.apache.poi.ss.usermodel.Font;
|
import org.apache.poi.ss.usermodel.Font;
|
||||||
@ -256,6 +257,22 @@ public class HSSFCellStyle implements CellStyle
|
|||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the parent style for this cell style.
|
||||||
|
* In most cases this will be null, but in a few
|
||||||
|
* cases there'll be a fully defined parent.
|
||||||
|
*/
|
||||||
|
public HSSFCellStyle getParentStyle() {
|
||||||
|
if(format.getParentIndex() == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new HSSFCellStyle(
|
||||||
|
format.getParentIndex(),
|
||||||
|
workbook.getExFormatAt(format.getParentIndex()),
|
||||||
|
workbook
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set the data format (must be a valid format)
|
* set the data format (must be a valid format)
|
||||||
* @see org.apache.poi.hssf.usermodel.HSSFDataFormat
|
* @see org.apache.poi.hssf.usermodel.HSSFDataFormat
|
||||||
@ -944,6 +961,37 @@ public class HSSFCellStyle implements CellStyle
|
|||||||
return format.getFillForeground();
|
return format.getFillForeground();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the name of the user defined style.
|
||||||
|
* Returns null for built in styles, and
|
||||||
|
* styles where no name has been defined
|
||||||
|
*/
|
||||||
|
public String getUserStyleName() {
|
||||||
|
StyleRecord sr = workbook.getStyleRecord(index);
|
||||||
|
if(sr == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if(sr.getType() == StyleRecord.STYLE_BUILT_IN) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return sr.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the name of the user defined style.
|
||||||
|
* Will complain if you try this on a built in style.
|
||||||
|
*/
|
||||||
|
public void setUserStyleName(String styleName) {
|
||||||
|
StyleRecord sr = workbook.getStyleRecord(index);
|
||||||
|
if(sr == null) {
|
||||||
|
sr = workbook.createStyleRecord(index);
|
||||||
|
}
|
||||||
|
if(sr.getType() == StyleRecord.STYLE_BUILT_IN) {
|
||||||
|
throw new IllegalArgumentException("Unable to set user specified style names for built in styles!");
|
||||||
|
}
|
||||||
|
sr.setName(styleName);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verifies that this style belongs to the supplied Workbook.
|
* Verifies that this style belongs to the supplied Workbook.
|
||||||
* Will throw an exception if it belongs to a different one.
|
* Will throw an exception if it belongs to a different one.
|
||||||
|
@ -35,7 +35,6 @@ import org.apache.poi.ddf.EscherBlipRecord;
|
|||||||
import org.apache.poi.ddf.EscherRecord;
|
import org.apache.poi.ddf.EscherRecord;
|
||||||
import org.apache.poi.hssf.model.Sheet;
|
import org.apache.poi.hssf.model.Sheet;
|
||||||
import org.apache.poi.hssf.model.Workbook;
|
import org.apache.poi.hssf.model.Workbook;
|
||||||
import org.apache.poi.hssf.model.DrawingManager2;
|
|
||||||
import org.apache.poi.hssf.record.AbstractEscherHolderRecord;
|
import org.apache.poi.hssf.record.AbstractEscherHolderRecord;
|
||||||
import org.apache.poi.hssf.record.BackupRecord;
|
import org.apache.poi.hssf.record.BackupRecord;
|
||||||
import org.apache.poi.hssf.record.DrawingGroupRecord;
|
import org.apache.poi.hssf.record.DrawingGroupRecord;
|
||||||
@ -59,7 +58,6 @@ import org.apache.poi.hssf.record.formula.Ptg;
|
|||||||
import org.apache.poi.hssf.record.formula.Ref3DPtg;
|
import org.apache.poi.hssf.record.formula.Ref3DPtg;
|
||||||
import org.apache.poi.hssf.record.formula.UnionPtg;
|
import org.apache.poi.hssf.record.formula.UnionPtg;
|
||||||
import org.apache.poi.hssf.util.CellReference;
|
import org.apache.poi.hssf.util.CellReference;
|
||||||
import org.apache.poi.hssf.util.SheetReferences;
|
|
||||||
import org.apache.poi.poifs.filesystem.DirectoryNode;
|
import org.apache.poi.poifs.filesystem.DirectoryNode;
|
||||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||||
import org.apache.poi.ss.usermodel.CreationHelper;
|
import org.apache.poi.ss.usermodel.CreationHelper;
|
||||||
@ -864,8 +862,13 @@ public class HSSFWorkbook extends POIDocument implements org.apache.poi.ss.userm
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SheetReferences getSheetReferences() {
|
/**
|
||||||
return workbook.getSheetReferences();
|
* @deprecated for POI internal use only (formula rendering). This method is likely to
|
||||||
|
* be removed in future versions of POI.
|
||||||
|
*/
|
||||||
|
public String findSheetNameFromExternSheet(int externSheetIndex){
|
||||||
|
// TODO - don't expose internal ugliness like externSheet indexes to the user model API
|
||||||
|
return workbook.findSheetNameFromExternSheet(externSheetIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1379,12 +1382,15 @@ public class HSSFWorkbook extends POIDocument implements org.apache.poi.ss.userm
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO - make this less cryptic / move elsewhere
|
* @deprecated for POI internal use only (formula rendering). This method is likely to
|
||||||
|
* be removed in future versions of POI.
|
||||||
|
*
|
||||||
* @param refIndex Index to REF entry in EXTERNSHEET record in the Link Table
|
* @param refIndex Index to REF entry in EXTERNSHEET record in the Link Table
|
||||||
* @param definedNameIndex zero-based to DEFINEDNAME or EXTERNALNAME record
|
* @param definedNameIndex zero-based to DEFINEDNAME or EXTERNALNAME record
|
||||||
* @return the string representation of the defined or external name
|
* @return the string representation of the defined or external name
|
||||||
*/
|
*/
|
||||||
public String resolveNameXText(int refIndex, int definedNameIndex) {
|
public String resolveNameXText(int refIndex, int definedNameIndex) {
|
||||||
|
// TODO - make this less cryptic / move elsewhere
|
||||||
return workbook.resolveNameXText(refIndex, definedNameIndex);
|
return workbook.resolveNameXText(refIndex, definedNameIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,29 +0,0 @@
|
|||||||
/* ====================================================================
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
contributor license agreements. See the NOTICE file distributed with
|
|
||||||
this work for additional information regarding copyright ownership.
|
|
||||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
||||||
(the "License"); you may not use this file except in compliance with
|
|
||||||
the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
==================================================================== */
|
|
||||||
|
|
||||||
package org.apache.poi.hssf.util;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds a collection of Sheet names and their associated
|
|
||||||
* reference numbers.
|
|
||||||
*
|
|
||||||
* @author Andrew C. Oliver (acoliver at apache dot org)
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class SheetReferences extends org.apache.poi.ss.util.SheetReferences
|
|
||||||
{
|
|
||||||
}
|
|
@ -19,7 +19,6 @@ package org.apache.poi.ss.usermodel;
|
|||||||
|
|
||||||
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
|
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
|
||||||
import org.apache.poi.hssf.usermodel.*;
|
import org.apache.poi.hssf.usermodel.*;
|
||||||
import org.apache.poi.hssf.util.SheetReferences;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a JDK 1.4 compatible interface for HSSFWorkbook.
|
* This is a JDK 1.4 compatible interface for HSSFWorkbook.
|
||||||
@ -39,7 +38,7 @@ public interface Workbook {
|
|||||||
|
|
||||||
String getSheetName(int sheet);
|
String getSheetName(int sheet);
|
||||||
HSSFSheet getSheetAt(int index);
|
HSSFSheet getSheetAt(int index);
|
||||||
SheetReferences getSheetReferences();
|
String findSheetNameFromExternSheet(int externSheetIndex);
|
||||||
int getSheetIndex(String name);
|
int getSheetIndex(String name);
|
||||||
int getSheetIndex(Sheet sheet);
|
int getSheetIndex(Sheet sheet);
|
||||||
int getSheetIndexFromExternSheetIndex(int externSheetNumber);
|
int getSheetIndexFromExternSheetIndex(int externSheetNumber);
|
||||||
|
@ -22,7 +22,6 @@ import java.io.OutputStream;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
|
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
|
||||||
import org.apache.poi.ss.util.SheetReferences;
|
|
||||||
|
|
||||||
public interface Workbook {
|
public interface Workbook {
|
||||||
|
|
||||||
@ -218,7 +217,7 @@ public interface Workbook {
|
|||||||
|
|
||||||
void removeSheetAt(int index);
|
void removeSheetAt(int index);
|
||||||
|
|
||||||
SheetReferences getSheetReferences();
|
String findSheetNameFromExternSheet(int externSheetIndex);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* determine whether the Excel GUI will backup the workbook when saving.
|
* determine whether the Excel GUI will backup the workbook when saving.
|
||||||
|
@ -39,7 +39,6 @@ import org.apache.poi.ss.usermodel.Sheet;
|
|||||||
import org.apache.poi.ss.usermodel.StylesSource;
|
import org.apache.poi.ss.usermodel.StylesSource;
|
||||||
import org.apache.poi.ss.usermodel.Workbook;
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
|
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
|
||||||
import org.apache.poi.ss.util.SheetReferences;
|
|
||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
import org.apache.poi.xssf.model.CommentsTable;
|
import org.apache.poi.xssf.model.CommentsTable;
|
||||||
@ -463,6 +462,14 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
|||||||
public int getSheetIndexFromExternSheetIndex(int externSheetNumber) {
|
public int getSheetIndexFromExternSheetIndex(int externSheetNumber) {
|
||||||
return externSheetNumber;
|
return externSheetNumber;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Doesn't do anything special - returns the same as getSheetName()
|
||||||
|
* TODO - figure out if this is a ole2 specific thing, or
|
||||||
|
* if we need to do something proper here too!
|
||||||
|
*/
|
||||||
|
public String findSheetNameFromExternSheet(int externSheetIndex) {
|
||||||
|
return getSheetName(externSheetIndex);
|
||||||
|
}
|
||||||
|
|
||||||
public Sheet getSheet(String name) {
|
public Sheet getSheet(String name) {
|
||||||
CTSheet[] sheets = this.workbook.getSheets().getSheetArray();
|
CTSheet[] sheets = this.workbook.getSheets().getSheetArray();
|
||||||
@ -509,14 +516,6 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
|||||||
return this.workbook.getSheets().getSheetArray(sheet).getName();
|
return this.workbook.getSheets().getSheetArray(sheet).getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
public SheetReferences getSheetReferences() {
|
|
||||||
SheetReferences sr = new SheetReferences();
|
|
||||||
for(int i=0; i<getNumberOfSheets(); i++) {
|
|
||||||
sr.addSheetReference(getSheetName(i), i);
|
|
||||||
}
|
|
||||||
return sr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Are we a normal workbook (.xlsx), or a
|
* Are we a normal workbook (.xlsx), or a
|
||||||
* macro enabled workbook (.xlsm)?
|
* macro enabled workbook (.xlsm)?
|
||||||
|
@ -23,14 +23,11 @@ import junit.framework.TestSuite;
|
|||||||
import org.apache.poi.hssf.eventmodel.TestEventRecordFactory;
|
import org.apache.poi.hssf.eventmodel.TestEventRecordFactory;
|
||||||
import org.apache.poi.hssf.eventmodel.TestModelFactory;
|
import org.apache.poi.hssf.eventmodel.TestModelFactory;
|
||||||
import org.apache.poi.hssf.eventusermodel.AllEventUserModelTests;
|
import org.apache.poi.hssf.eventusermodel.AllEventUserModelTests;
|
||||||
|
import org.apache.poi.hssf.extractor.TestExcelExtractor;
|
||||||
import org.apache.poi.hssf.model.AllModelTests;
|
import org.apache.poi.hssf.model.AllModelTests;
|
||||||
import org.apache.poi.hssf.record.AllRecordTests;
|
import org.apache.poi.hssf.record.AllRecordTests;
|
||||||
import org.apache.poi.hssf.usermodel.AllUserModelTests;
|
import org.apache.poi.hssf.usermodel.AllUserModelTests;
|
||||||
import org.apache.poi.hssf.util.TestAreaReference;
|
import org.apache.poi.hssf.util.AllHSSFUtilTests;
|
||||||
import org.apache.poi.hssf.util.TestCellReference;
|
|
||||||
import org.apache.poi.hssf.util.TestRKUtil;
|
|
||||||
import org.apache.poi.hssf.util.TestRangeAddress;
|
|
||||||
import org.apache.poi.hssf.util.TestSheetReferences;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test Suite for all sub-packages of org.apache.poi.hssf<br/>
|
* Test Suite for all sub-packages of org.apache.poi.hssf<br/>
|
||||||
@ -41,27 +38,20 @@ import org.apache.poi.hssf.util.TestSheetReferences;
|
|||||||
*/
|
*/
|
||||||
public final class HSSFTests {
|
public final class HSSFTests {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
junit.textui.TestRunner.run(suite());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Test suite() {
|
public static Test suite() {
|
||||||
TestSuite suite = new TestSuite("Tests for org.apache.poi.hssf");
|
TestSuite suite = new TestSuite(HSSFTests.class.getName());
|
||||||
// $JUnit-BEGIN$
|
|
||||||
|
|
||||||
suite.addTest(AllEventUserModelTests.suite());
|
suite.addTest(AllEventUserModelTests.suite());
|
||||||
suite.addTest(AllModelTests.suite());
|
suite.addTest(AllModelTests.suite());
|
||||||
suite.addTest(AllUserModelTests.suite());
|
suite.addTest(AllUserModelTests.suite());
|
||||||
suite.addTest(AllRecordTests.suite());
|
suite.addTest(AllRecordTests.suite());
|
||||||
|
suite.addTest(AllHSSFUtilTests.suite());
|
||||||
|
|
||||||
suite.addTest(new TestSuite(TestAreaReference.class));
|
if (false) { // TODO - hook this test up
|
||||||
suite.addTest(new TestSuite(TestCellReference.class));
|
suite.addTest(new TestSuite(TestExcelExtractor.class));
|
||||||
suite.addTest(new TestSuite(TestRangeAddress.class));
|
}
|
||||||
suite.addTest(new TestSuite(TestRKUtil.class));
|
|
||||||
suite.addTest(new TestSuite(TestSheetReferences.class));
|
|
||||||
suite.addTest(new TestSuite(TestEventRecordFactory.class));
|
suite.addTest(new TestSuite(TestEventRecordFactory.class));
|
||||||
suite.addTest(new TestSuite(TestModelFactory.class));
|
suite.addTest(new TestSuite(TestModelFactory.class));
|
||||||
// $JUnit-END$
|
|
||||||
return suite;
|
return suite;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
BIN
src/testcases/org/apache/poi/hssf/data/WithExtendedStyles.xls
Normal file
BIN
src/testcases/org/apache/poi/hssf/data/WithExtendedStyles.xls
Normal file
Binary file not shown.
Binary file not shown.
@ -16,6 +16,7 @@
|
|||||||
==================================================================== */
|
==================================================================== */
|
||||||
|
|
||||||
package org.apache.poi.hssf.eventusermodel;
|
package org.apache.poi.hssf.eventusermodel;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -32,7 +33,6 @@ import org.apache.poi.hssf.record.Record;
|
|||||||
import org.apache.poi.hssf.record.formula.Ptg;
|
import org.apache.poi.hssf.record.formula.Ptg;
|
||||||
import org.apache.poi.hssf.record.formula.Ref3DPtg;
|
import org.apache.poi.hssf.record.formula.Ref3DPtg;
|
||||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||||
import org.apache.poi.hssf.util.SheetReferences;
|
|
||||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||||
/**
|
/**
|
||||||
* Tests for {@link EventWorkbookBuilder}
|
* Tests for {@link EventWorkbookBuilder}
|
||||||
@ -66,9 +66,6 @@ public final class TestEventWorkbookBuilder extends TestCase {
|
|||||||
public void testGetStubWorkbooks() {
|
public void testGetStubWorkbooks() {
|
||||||
assertNotNull(listener.getStubWorkbook());
|
assertNotNull(listener.getStubWorkbook());
|
||||||
assertNotNull(listener.getStubHSSFWorkbook());
|
assertNotNull(listener.getStubHSSFWorkbook());
|
||||||
|
|
||||||
assertNotNull(listener.getStubWorkbook().getSheetReferences());
|
|
||||||
assertNotNull(listener.getStubHSSFWorkbook().getSheetReferences());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testContents() {
|
public void testContents() {
|
||||||
@ -78,10 +75,10 @@ public final class TestEventWorkbookBuilder extends TestCase {
|
|||||||
|
|
||||||
assertEquals(3, listener.getStubWorkbook().getNumSheets());
|
assertEquals(3, listener.getStubWorkbook().getNumSheets());
|
||||||
|
|
||||||
SheetReferences ref = listener.getStubWorkbook().getSheetReferences();
|
Workbook ref = listener.getStubWorkbook();
|
||||||
assertEquals("Sh3", ref.getSheetName(0));
|
assertEquals("Sh3", ref.findSheetNameFromExternSheet(0));
|
||||||
assertEquals("Sheet1", ref.getSheetName(1));
|
assertEquals("Sheet1", ref.findSheetNameFromExternSheet(1));
|
||||||
assertEquals("S2", ref.getSheetName(2));
|
assertEquals("S2", ref.findSheetNameFromExternSheet(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testFormulas() {
|
public void testFormulas() {
|
||||||
|
@ -29,6 +29,8 @@ import java.io.*;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import junit.framework.*;
|
import junit.framework.*;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.HSSFTestDataSamples;
|
||||||
import org.apache.poi.util.TempFile;
|
import org.apache.poi.util.TempFile;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -41,6 +43,10 @@ public class TestCellStyle
|
|||||||
extends TestCase
|
extends TestCase
|
||||||
{
|
{
|
||||||
|
|
||||||
|
private static HSSFWorkbook openSample(String sampleFileName) {
|
||||||
|
return HSSFTestDataSamples.openSampleWorkbook(sampleFileName);
|
||||||
|
}
|
||||||
|
|
||||||
/** Creates a new instance of TestCellStyle */
|
/** Creates a new instance of TestCellStyle */
|
||||||
|
|
||||||
public TestCellStyle(String name)
|
public TestCellStyle(String name)
|
||||||
@ -304,6 +310,54 @@ public class TestCellStyle
|
|||||||
assertEquals(5, wbClone.getNumberOfFonts());
|
assertEquals(5, wbClone.getNumberOfFonts());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testStyleNames() throws Exception {
|
||||||
|
HSSFWorkbook wb = openSample("WithExtendedStyles.xls");
|
||||||
|
HSSFSheet s = wb.getSheetAt(0);
|
||||||
|
HSSFCell c1 = s.getRow(0).getCell(0);
|
||||||
|
HSSFCell c2 = s.getRow(1).getCell(0);
|
||||||
|
HSSFCell c3 = s.getRow(2).getCell(0);
|
||||||
|
|
||||||
|
HSSFCellStyle cs1 = c1.getCellStyle();
|
||||||
|
HSSFCellStyle cs2 = c2.getCellStyle();
|
||||||
|
HSSFCellStyle cs3 = c3.getCellStyle();
|
||||||
|
|
||||||
|
assertNotNull(cs1);
|
||||||
|
assertNotNull(cs2);
|
||||||
|
assertNotNull(cs3);
|
||||||
|
|
||||||
|
// Check we got the styles we'd expect
|
||||||
|
assertEquals(10, cs1.getFont(wb).getFontHeightInPoints());
|
||||||
|
assertEquals(9, cs2.getFont(wb).getFontHeightInPoints());
|
||||||
|
assertEquals(12, cs3.getFont(wb).getFontHeightInPoints());
|
||||||
|
|
||||||
|
assertEquals(15, cs1.getIndex());
|
||||||
|
assertEquals(23, cs2.getIndex());
|
||||||
|
assertEquals(24, cs3.getIndex());
|
||||||
|
|
||||||
|
assertNull(cs1.getParentStyle());
|
||||||
|
assertNotNull(cs2.getParentStyle());
|
||||||
|
assertNotNull(cs3.getParentStyle());
|
||||||
|
|
||||||
|
assertEquals(21, cs2.getParentStyle().getIndex());
|
||||||
|
assertEquals(22, cs3.getParentStyle().getIndex());
|
||||||
|
|
||||||
|
// Now check we can get style records for
|
||||||
|
// the parent ones
|
||||||
|
assertNull(wb.getWorkbook().getStyleRecord(15));
|
||||||
|
assertNull(wb.getWorkbook().getStyleRecord(23));
|
||||||
|
assertNull(wb.getWorkbook().getStyleRecord(24));
|
||||||
|
|
||||||
|
assertNotNull(wb.getWorkbook().getStyleRecord(21));
|
||||||
|
assertNotNull(wb.getWorkbook().getStyleRecord(22));
|
||||||
|
|
||||||
|
// Now check the style names
|
||||||
|
assertEquals(null, cs1.getUserStyleName());
|
||||||
|
assertEquals(null, cs2.getUserStyleName());
|
||||||
|
assertEquals(null, cs3.getUserStyleName());
|
||||||
|
assertEquals("style1", cs2.getParentStyle().getUserStyleName());
|
||||||
|
assertEquals("style2", cs3.getParentStyle().getUserStyleName());
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String [] ignored_args)
|
public static void main(String [] ignored_args)
|
||||||
{
|
{
|
||||||
System.out
|
System.out
|
||||||
|
@ -56,4 +56,45 @@ public final class TestLinkTable extends TestCase {
|
|||||||
// some other sanity checks
|
// some other sanity checks
|
||||||
assertEquals(7, wb.getNumberOfSheets());
|
assertEquals(7, wb.getNumberOfSheets());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testExtraSheetRefs_bug45978() {
|
||||||
|
HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("ex45978-extraLinkTableSheets.xls");
|
||||||
|
/*
|
||||||
|
ex45978-extraLinkTableSheets.xls is a cut-down version of attachment 22561.
|
||||||
|
The original file produces the same error.
|
||||||
|
|
||||||
|
This bug was caused by a combination of invalid sheet indexes in the EXTERNSHEET
|
||||||
|
record, and eager initialisation of the extern sheet references. Note - the worbook
|
||||||
|
has 2 sheets, but the EXTERNSHEET record refers to sheet indexes 0, 1 and 2.
|
||||||
|
|
||||||
|
Offset 0x3954 (14676)
|
||||||
|
recordid = 0x17, size = 32
|
||||||
|
[EXTERNSHEET]
|
||||||
|
numOfRefs = 5
|
||||||
|
refrec #0: extBook=0 firstSheet=0 lastSheet=0
|
||||||
|
refrec #1: extBook=1 firstSheet=2 lastSheet=2
|
||||||
|
refrec #2: extBook=2 firstSheet=1 lastSheet=1
|
||||||
|
refrec #3: extBook=0 firstSheet=-1 lastSheet=-1
|
||||||
|
refrec #4: extBook=0 firstSheet=1 lastSheet=1
|
||||||
|
[/EXTERNSHEET]
|
||||||
|
|
||||||
|
As it turns out, the formula in question doesn't even use externSheetIndex #1 - it
|
||||||
|
uses #4, which resolves to sheetIndex 1 -> 'Data'.
|
||||||
|
|
||||||
|
It is not clear exactly what externSheetIndex #4 would refer to. Excel seems to
|
||||||
|
display such a formula as "''!$A2", but then complains of broken link errors.
|
||||||
|
*/
|
||||||
|
|
||||||
|
HSSFCell cell = wb.getSheetAt(0).getRow(1).getCell(1);
|
||||||
|
String cellFormula;
|
||||||
|
try {
|
||||||
|
cellFormula = cell.getCellFormula();
|
||||||
|
} catch (IndexOutOfBoundsException e) {
|
||||||
|
if (e.getMessage().equals("Index: 2, Size: 2")) {
|
||||||
|
throw new AssertionFailedError("Identified bug 45798");
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
assertEquals("Data!$A2", cellFormula);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,6 @@ public class AllHSSFUtilTests {
|
|||||||
result.addTestSuite(TestHSSFColor.class);
|
result.addTestSuite(TestHSSFColor.class);
|
||||||
result.addTestSuite(TestRangeAddress.class);
|
result.addTestSuite(TestRangeAddress.class);
|
||||||
result.addTestSuite(TestRKUtil.class);
|
result.addTestSuite(TestRKUtil.class);
|
||||||
result.addTestSuite(TestSheetReferences.class);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,51 +0,0 @@
|
|||||||
|
|
||||||
/* ====================================================================
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
contributor license agreements. See the NOTICE file distributed with
|
|
||||||
this work for additional information regarding copyright ownership.
|
|
||||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
||||||
(the "License"); you may not use this file except in compliance with
|
|
||||||
the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
==================================================================== */
|
|
||||||
|
|
||||||
|
|
||||||
package org.apache.poi.hssf.util;
|
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests the SheetReferences class.
|
|
||||||
* @author Andrew C. Oliver (acoliver at apache dot org)
|
|
||||||
*/
|
|
||||||
public class TestSheetReferences
|
|
||||||
extends TestCase
|
|
||||||
{
|
|
||||||
public TestSheetReferences(String s)
|
|
||||||
{
|
|
||||||
super(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test that the SheetReferences class can add references and give them
|
|
||||||
* out
|
|
||||||
*/
|
|
||||||
public void testSheetRefs()
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
SheetReferences refs = new SheetReferences();
|
|
||||||
refs.addSheetReference("A", 0);
|
|
||||||
refs.addSheetReference("B", 1);
|
|
||||||
refs.addSheetReference("C", 3);
|
|
||||||
assertTrue("ref 0 == A", refs.getSheetName(0).equals("A"));
|
|
||||||
assertTrue("ref 1 == B", refs.getSheetName(1).equals("B"));
|
|
||||||
assertTrue("ref 3 == C", refs.getSheetName(3).equals("C"));
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user