YobtRLhWHvHyWS4dKqiteeTwAqG2ZFOq98KCu1LXMKj42HqwOtB3L23HlhqVyA==
=8e4G
-----END PGP PUBLIC KEY BLOCK-----
+pub 4096R/8BABDD6C 2015-10-10 [expires: 2017-10-09]
+uid Javen O'Neal <javenoneal@gmail.com>
+uid Javen O'Neal <onealj@apache.org>
+sub 4096R/309424B4 2015-10-10 [expires: 2017-10-09]
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.22 (GNU/Linux)
+
+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
+2Nr+AmDDs6ZOEI5zhwxioePw/Cg=
+=9lKb
+-----END PGP PUBLIC KEY BLOCK-----
--- /dev/null
+/* ====================================================================
+ 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.
+==================================================================== */
+
+// For help converting an Ant build to a Gradle build, see
+// https://docs.gradle.org/current/userguide/ant.html
+
+ant.importBuild 'build.xml'
<description>The Apache POI project Ant build.</description>
- <property name="version.id" value="3.16-beta1"/>
+ <property name="version.id" value="3.15-beta4"/>
<property name="release.rc" value="RC1"/>
<property environment="env"/>
JVM system properties for running tests,
user.language and user.country are required as we have locale-sensitive formatters
-->
- <property name="testpattern" value="Test*"/>
+ <property name="testpattern" value="Test*"/> <!--note: this excludes BaseTest* -->
<property name="POI.testdata.path" value="test-data"/>
<property name="java.awt.headless" value="true"/>
<property name="additionaljar" value=""/>
<programming-language>Java</programming-language>
<category rdf:resource="http://projects.apache.org/category/content" />
<category rdf:resource="http://projects.apache.org/category/library" />
+ <release>
+ <Version>
+ <name>Apache POI 3.15</name>
+ <created>2016-09-21</created>
+ <revision>3.15</revision>
+ </Version>
+ </release>
<release>
<Version>
<name>Apache POI 3.14</name>
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
- <version>3.16-beta1-SNAPSHOT</version>
+ <version>3.15-beta4-SNAPSHOT</version>
</parent>
<artifactId>poi-examples</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
- <version>3.16-beta1-SNAPSHOT</version>
+ <version>3.15-beta4-SNAPSHOT</version>
</parent>
<artifactId>poi-excelant</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
- <version>3.16-beta1-SNAPSHOT</version>
+ <version>3.15-beta4-SNAPSHOT</version>
</parent>
<artifactId>poi-main</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
- <version>3.16-beta1-SNAPSHOT</version>
+ <version>3.15-beta4-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
<artifactId>poi-ooxml-schema-encryption</artifactId>
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
- <version>3.16-beta1-SNAPSHOT</version>
+ <version>3.15-beta4-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
<artifactId>poi-ooxml-schema-security</artifactId>
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
- <version>3.16-beta1-SNAPSHOT</version>
+ <version>3.15-beta4-SNAPSHOT</version>
<relativePath>..</relativePath>
</parent>
<artifactId>poi-ooxml-schema</artifactId>
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
- <version>3.16-beta1-SNAPSHOT</version>
+ <version>3.15-beta4-SNAPSHOT</version>
</parent>
<artifactId>poi-ooxml</artifactId>
<packaging>jar</packaging>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
<packaging>pom</packaging>
- <version>3.16-beta1-SNAPSHOT</version>
+ <version>3.15-beta4-SNAPSHOT</version>
<name>Apache POI - the Java API for Microsoft Documents</name>
<description>Maven build of Apache POI for Sonar checks</description>
<url>http://poi.apache.org/</url>
<parent>
<groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId>
- <version>3.16-beta1-SNAPSHOT</version>
+ <version>3.15-beta4-SNAPSHOT</version>
</parent>
<artifactId>poi-scratchpad</artifactId>
<packaging>jar</packaging>
* the Excel spreadsheet file this code will create.\r
*/\r
public void demonstrateMethodCalls(String outputFilename) throws IOException {\r
- HSSFWorkbook workbook = null;\r
- HSSFSheet sheet = null;\r
- HSSFRow row = null;\r
- HSSFCell cell = null;\r
- ArrayList<MultiLevelListItem> multiLevelListItems = null;\r
- ArrayList<String> listItems = null;\r
+ HSSFWorkbook workbook = new HSSFWorkbook();\r
try {\r
- workbook = new HSSFWorkbook();\r
- sheet = workbook.createSheet("In Cell Lists");\r
- row = sheet.createRow(0);\r
+ HSSFSheet sheet = workbook.createSheet("In Cell Lists");\r
+ HSSFRow row = sheet.createRow(0);\r
\r
// Create a cell at A1 and insert a single, bulleted, item into\r
// that cell.\r
- cell = row.createCell(0);\r
+ HSSFCell cell = row.createCell(0);\r
this.bulletedItemInCell(workbook, "List Item", cell);\r
\r
// Create a cell at A2 and insert a plain list - that is one\r
// whose items are neither bulleted or numbered - into that cell.\r
row = sheet.createRow(1);\r
cell = row.createCell(0);\r
- listItems = new ArrayList<String>();\r
+ ArrayList<String> listItems = new ArrayList<String>();\r
listItems.add("List Item One.");\r
listItems.add("List Item Two.");\r
listItems.add("List Item Three.");\r
// to preserve order.\r
row = sheet.createRow(4);\r
cell = row.createCell(0);\r
- multiLevelListItems = new ArrayList<MultiLevelListItem>();\r
+ ArrayList<MultiLevelListItem> multiLevelListItems = new ArrayList<MultiLevelListItem>();\r
listItems = new ArrayList<String>();\r
listItems.add("ML List Item One - Sub Item One.");\r
listItems.add("ML List Item One - Sub Item Two.");\r
ioEx.printStackTrace(System.out);\r
}\r
finally {\r
- if (workbook != null) {\r
- workbook.close();\r
- }\r
+ workbook.close();\r
}\r
}\r
\r
* will be written.\r
*/\r
public void listInCell(HSSFWorkbook workbook, ArrayList<String> listItems, HSSFCell cell) {\r
- StringBuffer buffer = new StringBuffer();\r
+ StringBuilder buffer = new StringBuilder();\r
HSSFCellStyle wrapStyle = workbook.createCellStyle();\r
wrapStyle.setWrapText(true);\r
for(String listItem : listItems) {\r
HSSFCell cell,\r
int startingValue,\r
int increment) {\r
- StringBuffer buffer = new StringBuffer();\r
+ StringBuilder buffer = new StringBuilder();\r
int itemNumber = startingValue;\r
// Note that again, an HSSFCellStye object is required and that\r
// it's wrap text property should be set to 'true'\r
// Note that the basic method is identical to the listInCell() method\r
// with one difference; a number prefixed to the items text.\r
for(String listItem : listItems) {\r
- buffer.append(String.valueOf(itemNumber) + ". ");\r
+ buffer.append(itemNumber).append(". ");\r
buffer.append(listItem);\r
buffer.append("\n");\r
itemNumber += increment;\r
public void bulletedListInCell(HSSFWorkbook workbook,\r
ArrayList<String> listItems,\r
HSSFCell cell) {\r
- StringBuffer buffer = new StringBuffer();\r
+ StringBuilder buffer = new StringBuilder();\r
// Note that again, an HSSFCellStye object is required and that\r
// it's wrap text property should be set to 'true'\r
HSSFCellStyle wrapStyle = workbook.createCellStyle();\r
public void multiLevelListInCell(HSSFWorkbook workbook,\r
ArrayList<MultiLevelListItem> multiLevelListItems,\r
HSSFCell cell) {\r
- StringBuffer buffer = new StringBuffer();\r
- ArrayList<String> lowerLevelItems = null;\r
+ StringBuilder buffer = new StringBuilder();\r
// Note that again, an HSSFCellStye object is required and that\r
// it's wrap text property should be set to 'true'\r
HSSFCellStyle wrapStyle = workbook.createCellStyle();\r
buffer.append("\n");\r
// and then an ArrayList whose elements encapsulate the text\r
// for the lower level list items.\r
- lowerLevelItems = multiLevelListItem.getLowerLevelItems();\r
+ ArrayList<String> lowerLevelItems = multiLevelListItem.getLowerLevelItems();\r
if(!(lowerLevelItems == null) && !(lowerLevelItems.isEmpty())) {\r
for(String item : lowerLevelItems) {\r
buffer.append(InCellLists.TAB);\r
int highLevelIncrement,\r
int lowLevelStartingValue,\r
int lowLevelIncrement) {\r
- StringBuffer buffer = new StringBuffer();\r
+ StringBuilder buffer = new StringBuilder();\r
int highLevelItemNumber = highLevelStartingValue;\r
- int lowLevelItemNumber = 0;\r
- ArrayList<String> lowerLevelItems = null;\r
// Note that again, an HSSFCellStye object is required and that\r
// it's wrap text property should be set to 'true'\r
HSSFCellStyle wrapStyle = workbook.createCellStyle();\r
for(MultiLevelListItem multiLevelListItem : multiLevelListItems) {\r
// For each element in the ArrayList, get the text for the high\r
// level list item......\r
- buffer.append(String.valueOf(highLevelItemNumber));\r
+ buffer.append(highLevelItemNumber);\r
buffer.append(". ");\r
buffer.append(multiLevelListItem.getItemText());\r
buffer.append("\n");\r
// and then an ArrayList whose elements encapsulate the text\r
// for the lower level list items.\r
- lowerLevelItems = multiLevelListItem.getLowerLevelItems();\r
+ ArrayList<String> lowerLevelItems = multiLevelListItem.getLowerLevelItems();\r
if(!(lowerLevelItems == null) && !(lowerLevelItems.isEmpty())) {\r
- lowLevelItemNumber = lowLevelStartingValue;\r
+ int lowLevelItemNumber = lowLevelStartingValue;\r
for(String item : lowerLevelItems) {\r
buffer.append(InCellLists.TAB);\r
- buffer.append(String.valueOf(highLevelItemNumber));\r
+ buffer.append(highLevelItemNumber);\r
buffer.append(".");\r
- buffer.append(String.valueOf(lowLevelItemNumber));\r
+ buffer.append(lowLevelItemNumber);\r
buffer.append(" ");\r
buffer.append(item);\r
buffer.append("\n");\r
public void multiLevelBulletedListInCell(HSSFWorkbook workbook,\r
ArrayList<MultiLevelListItem> multiLevelListItems,\r
HSSFCell cell) {\r
- StringBuffer buffer = new StringBuffer();\r
- ArrayList<String> lowerLevelItems = null;\r
+ StringBuilder buffer = new StringBuilder();\r
// Note that again, an HSSFCellStye object is required and that\r
// it's wrap text property should be set to 'true'\r
HSSFCellStyle wrapStyle = workbook.createCellStyle();\r
buffer.append("\n");\r
// and then an ArrayList whose elements encapsulate the text\r
// for the lower level list items.\r
- lowerLevelItems = multiLevelListItem.getLowerLevelItems();\r
+ ArrayList<String> lowerLevelItems = multiLevelListItem.getLowerLevelItems();\r
if(!(lowerLevelItems == null) && !(lowerLevelItems.isEmpty())) {\r
for(String item : lowerLevelItems) {\r
buffer.append(InCellLists.TAB);\r
EXPECTED_FAILURES.add("spreadsheet/43493.xls");
EXPECTED_FAILURES.add("spreadsheet/46904.xls");
EXPECTED_FAILURES.add("document/Bug50955.doc");
+ EXPECTED_FAILURES.add("document/57843.doc");
EXPECTED_FAILURES.add("slideshow/PPT95.ppt");
EXPECTED_FAILURES.add("openxml4j/OPCCompliance_CoreProperties_DCTermsNamespaceLimitedUseFAIL.docx");
EXPECTED_FAILURES.add("openxml4j/OPCCompliance_CoreProperties_DoNotUseCompatibilityMarkupFAIL.docx");
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
-import java.util.Locale;
import java.util.Vector;
import org.apache.poi.hssf.model.InternalWorkbook;
public short getFormat(String pFormat) {
// Normalise the format string
String format;
- if (pFormat.toUpperCase(Locale.ROOT).equals("TEXT")) {
+ if (pFormat.equalsIgnoreCase("TEXT")) {
format = "@";
} else {
format = pFormat;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
-import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.Workbook;
/**
public static HSSFFormulaEvaluator create(HSSFWorkbook workbook, IStabilityClassifier stabilityClassifier, UDFFinder udfFinder) {
return new HSSFFormulaEvaluator(workbook, stabilityClassifier, udfFinder);
}
-
- @Override
- protected RichTextString createRichTextString(String str) {
- return new HSSFRichTextString(str);
- }
/**
public void notifySetFormula(Cell cell) {
_bookEvaluator.notifyUpdateCell(new HSSFEvaluationCell((HSSFCell)cell));
}
-
+
+ /**
+ * If cell contains formula, it evaluates the formula, and saves the result of the formula. The
+ * cell remains as a formula cell. If the cell does not contain formula, rather than throwing an
+ * exception, this method returns {@link CellType#_NONE} and leaves the cell unchanged.
+ *
+ * Note that the type of the <em>formula result</em> is returned, so you know what kind of
+ * cached formula result is also stored with the formula.
+ * <pre>
+ * CellType evaluatedCellType = evaluator.evaluateFormulaCell(cell);
+ * </pre>
+ * Be aware that your cell will hold both the formula, and the result. If you want the cell
+ * replaced with the result of the formula, use {@link #evaluateInCell(org.apache.poi.ss.usermodel.Cell)}
+ * @param cell The cell to evaluate
+ * @return {@link CellType#_NONE} for non-formula cells, or the type of the <em>formula result</em>
+ * @since POI 3.15 beta 3
+ * @deprecated POI 3.15 beta 3. Will be deleted when we make the CellType enum transition. See bug 59791.
+ */
+ @Internal
+ @Override
+ public CellType evaluateFormulaCellEnum(Cell cell) {
+ if (cell == null || cell.getCellTypeEnum() != CellType.FORMULA) {
+ return CellType._NONE;
+ }
+ CellValue cv = evaluateFormulaCellValue(cell);
+ // cell remains a formula cell, but the cached value is changed
+ setCellValue(cell, cv);
+ return cv.getCellType();
+ }
+
+ /**
+ * If cell contains formula, it evaluates the formula, and
+ * puts the formula result back into the cell, in place
+ * of the old formula.
+ * Else if cell does not contain formula, this method leaves
+ * the cell unchanged.
+ * Note that the same instance of HSSFCell is returned to
+ * allow chained calls like:
+ * <pre>
+ * int evaluatedCellType = evaluator.evaluateInCell(cell).getCellType();
+ * </pre>
+ * Be aware that your cell value will be changed to hold the
+ * result of the formula. If you simply want the formula
+ * value computed for you, use {@link #evaluateFormulaCellEnum(Cell)}}
+ */
@Override
public HSSFCell evaluateInCell(Cell cell) {
- return (HSSFCell) super.evaluateInCell(cell);
+ if (cell == null) {
+ return null;
+ }
+ HSSFCell result = (HSSFCell) cell;
+ if (cell.getCellTypeEnum() == CellType.FORMULA) {
+ CellValue cv = evaluateFormulaCellValue(cell);
+ setCellValue(cell, cv);
+ setCellType(cell, cv); // cell will no longer be a formula cell
+ }
+ return result;
+ }
+
+ private static void setCellValue(Cell cell, CellValue cv) {
+ CellType cellType = cv.getCellType();
+ switch (cellType) {
+ case BOOLEAN:
+ cell.setCellValue(cv.getBooleanValue());
+ break;
+ case ERROR:
+ cell.setCellErrorValue(cv.getErrorValue());
+ break;
+ case NUMERIC:
+ cell.setCellValue(cv.getNumberValue());
+ break;
+ case STRING:
+ cell.setCellValue(new HSSFRichTextString(cv.getStringValue()));
+ break;
+ case BLANK:
+ // never happens - blanks eventually get translated to zero
+ case FORMULA:
+ // this will never happen, we have already evaluated the formula
+ default:
+ throw new IllegalStateException("Unexpected cell value type (" + cellType + ")");
+ }
}
/**
* Get the HSSFSheet object at the given index.
* @param index of the sheet number (0-based physical & logical)
* @return HSSFSheet at the provided index
+ * @throws IllegalArgumentException if the index is out of range (index
+ * < 0 || index >= getNumberOfSheets()).
*/
-
@Override
public HSSFSheet getSheetAt(int index)
{
throw new IndexOutOfBoundsException("Position " + position + " past the end of the file");
}
- // Do we read or map (for read/write?
+ // Do we read or map (for read/write)?
ByteBuffer dst;
- int worked = -1;
if (writable) {
dst = channel.map(FileChannel.MapMode.READ_WRITE, position, length);
- worked = 0;
- // remember the buffer for cleanup if necessary
- buffersToClean.add(dst);
+
+ // remember this buffer for cleanup
+ buffersToClean.add(dst);
} else {
- // Read
+ // allocate the buffer on the heap if we cannot map the data in directly
channel.position(position);
dst = ByteBuffer.allocate(length);
- worked = IOUtils.readFully(channel, dst);
- }
- // Check
- if(worked == -1) {
- throw new IndexOutOfBoundsException("Position " + position + " past the end of the file");
+ // Read the contents and check that we could read some data
+ int worked = IOUtils.readFully(channel, dst);
+ if(worked == -1) {
+ throw new IndexOutOfBoundsException("Position " + position + " past the end of the file");
+ }
}
- // Ready it for reading
+ // make it ready for reading
dst.position(0);
// All done
//Add 1 to obtained number\r
sum++;\r
\r
- value = "-" + String.valueOf(sum);\r
+ value = "-" + sum;\r
}\r
} catch (NumberFormatException e) {\r
return ErrorEval.NUM_ERROR;\r
* @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#GENERAL} instead.
*/
@Removal(version="3.17")
- static final short ALIGN_GENERAL = 0x0; //HorizontalAlignment.GENERAL.getCode();
+ short ALIGN_GENERAL = 0x0; //HorizontalAlignment.GENERAL.getCode();
/**
* left-justified horizontal alignment
* @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#LEFT} instead.
*/
@Removal(version="3.17")
- static final short ALIGN_LEFT = 0x1; //HorizontalAlignment.LEFT.getCode();
+ short ALIGN_LEFT = 0x1; //HorizontalAlignment.LEFT.getCode();
/**
* center horizontal alignment
* @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#CENTER} instead.
*/
@Removal(version="3.17")
- static final short ALIGN_CENTER = 0x2; //HorizontalAlignment.CENTER.getCode();
+ short ALIGN_CENTER = 0x2; //HorizontalAlignment.CENTER.getCode();
/**
* right-justified horizontal alignment
* @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#RIGHT} instead.
*/
@Removal(version="3.17")
- static final short ALIGN_RIGHT = 0x3; //HorizontalAlignment.RIGHT.getCode();
+ short ALIGN_RIGHT = 0x3; //HorizontalAlignment.RIGHT.getCode();
/**
* fill? horizontal alignment
* @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#FILL} instead.
*/
@Removal(version="3.17")
- static final short ALIGN_FILL = 0x4; //HorizontalAlignment.FILL.getCode();
+ short ALIGN_FILL = 0x4; //HorizontalAlignment.FILL.getCode();
/**
* justified horizontal alignment
* @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#JUSTIFY} instead.
*/
@Removal(version="3.17")
- static final short ALIGN_JUSTIFY = 0x5; //HorizontalAlignment.JUSTIFY.getCode();
+ short ALIGN_JUSTIFY = 0x5; //HorizontalAlignment.JUSTIFY.getCode();
/**
* center-selection? horizontal alignment
* @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#CENTER_SELECTION} instead.
*/
@Removal(version="3.17")
- static final short ALIGN_CENTER_SELECTION = 0x6; //HorizontalAlignment.CENTER_SELECTION.getCode();
+ short ALIGN_CENTER_SELECTION = 0x6; //HorizontalAlignment.CENTER_SELECTION.getCode();
/**
* top-aligned vertical alignment
* @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#TOP} instead.
*/
@Removal(version="3.17")
- static final short VERTICAL_TOP = 0x0; //VerticalAlignment.TOP.getCode();
+ short VERTICAL_TOP = 0x0; //VerticalAlignment.TOP.getCode();
/**
* center-aligned vertical alignment
* @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#CENTER} instead.
*/
@Removal(version="3.17")
- static final short VERTICAL_CENTER = 0x1; //VerticalAlignment.CENTER.getCode();
+ short VERTICAL_CENTER = 0x1; //VerticalAlignment.CENTER.getCode();
/**
* bottom-aligned vertical alignment
* @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#BOTTOM} instead.
*/
@Removal(version="3.17")
- static final short VERTICAL_BOTTOM = 0x2; //VerticalAlignment.BOTTOM.getCode();
+ short VERTICAL_BOTTOM = 0x2; //VerticalAlignment.BOTTOM.getCode();
/**
* vertically justified vertical alignment
* @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#JUSTIFY} instead.
*/
@Removal(version="3.17")
- static final short VERTICAL_JUSTIFY = 0x3; //VerticalAlignment.JUSTIFY.getCode();
+ short VERTICAL_JUSTIFY = 0x3; //VerticalAlignment.JUSTIFY.getCode();
/**
* No border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#NONE} instead.
*/
@Removal(version="3.17")
- static final short BORDER_NONE = 0x0; //BorderStyle.NONE.getCode();
+ short BORDER_NONE = 0x0; //BorderStyle.NONE.getCode();
/**
* Thin border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#THIN} instead.
*/
@Removal(version="3.17")
- static final short BORDER_THIN = 0x1; //BorderStyle.THIN.getCode();
+ short BORDER_THIN = 0x1; //BorderStyle.THIN.getCode();
/**
* Medium border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM} instead.
*/
@Removal(version="3.17")
- static final short BORDER_MEDIUM = 0x2; //BorderStyle.MEDIUM.getCode();
+ short BORDER_MEDIUM = 0x2; //BorderStyle.MEDIUM.getCode();
/**
* dash border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#DASHED} instead.
*/
@Removal(version="3.17")
- static final short BORDER_DASHED = 0x3; //BorderStyle.DASHED.getCode();
+ short BORDER_DASHED = 0x3; //BorderStyle.DASHED.getCode();
/**
* dot border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#DOTTED} instead.
*/
@Removal(version="3.17")
- static final short BORDER_DOTTED = 0x4; //BorderStyle.DOTTED.getCode();
+ short BORDER_DOTTED = 0x4; //BorderStyle.DOTTED.getCode();
/**
* Thick border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#THICK} instead.
*/
@Removal(version="3.17")
- static final short BORDER_THICK = 0x5; //BorderStyle.THICK.getCode();
+ short BORDER_THICK = 0x5; //BorderStyle.THICK.getCode();
/**
* double-line border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#DOUBLE} instead.
*/
@Removal(version="3.17")
- static final short BORDER_DOUBLE = 0x6; //BorderStyle.DOUBLE.getCode();
+ short BORDER_DOUBLE = 0x6; //BorderStyle.DOUBLE.getCode();
/**
* hair-line border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#HAIR} instead.
*/
@Removal(version="3.17")
- static final short BORDER_HAIR = 0x7; //BorderStyle.HAIR.getCode();
+ short BORDER_HAIR = 0x7; //BorderStyle.HAIR.getCode();
/**
* Medium dashed border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM_DASHED} instead.
*/
@Removal(version="3.17")
- static final short BORDER_MEDIUM_DASHED = 0x8; //BorderStyle.MEDIUM_DASHED.getCode();
+ short BORDER_MEDIUM_DASHED = 0x8; //BorderStyle.MEDIUM_DASHED.getCode();
/**
* dash-dot border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#DASH_DOT} instead.
*/
@Removal(version="3.17")
- static final short BORDER_DASH_DOT = 0x9; //BorderStyle.DASH_DOT.getCode();
+ short BORDER_DASH_DOT = 0x9; //BorderStyle.DASH_DOT.getCode();
/**
* medium dash-dot border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM_DASH_DOT} instead.
*/
@Removal(version="3.17")
- static final short BORDER_MEDIUM_DASH_DOT = 0xA; //BorderStyle.MEDIUM_DASH_DOT.getCode();
+ short BORDER_MEDIUM_DASH_DOT = 0xA; //BorderStyle.MEDIUM_DASH_DOT.getCode();
/**
* dash-dot-dot border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#DASH_DOT_DOT} instead.
*/
@Removal(version="3.17")
- static final short BORDER_DASH_DOT_DOT = 0xB; //BorderStyle.DASH_DOT_DOT.getCode();
+ short BORDER_DASH_DOT_DOT = 0xB; //BorderStyle.DASH_DOT_DOT.getCode();
/**
* medium dash-dot-dot border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM_DASH_DOT_DOT} instead.
*/
@Removal(version="3.17")
- static final short BORDER_MEDIUM_DASH_DOT_DOT = 0xC; //BorderStyle.MEDIUM_DASH_DOT_DOT.getCode();
+ short BORDER_MEDIUM_DASH_DOT_DOT = 0xC; //BorderStyle.MEDIUM_DASH_DOT_DOT.getCode();
/**
* slanted dash-dot border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#SLANTED_DASH_DOT} instead.
*/
@Removal(version="3.17")
- static final short BORDER_SLANTED_DASH_DOT = 0xD; //BorderStyle.SLANTED_DASH_DOT.getCode();
+ short BORDER_SLANTED_DASH_DOT = 0xD; //BorderStyle.SLANTED_DASH_DOT.getCode();
/**
* Fill Pattern: No background
* @deprecated 3.15 beta 3. Use {@link FillPatternType#NO_FILL} instead.
*/
@Removal(version="3.17")
- static final short NO_FILL = 0; //FillPatternType.NO_FILL.getCode();
+ short NO_FILL = 0; //FillPatternType.NO_FILL.getCode();
/**
* Fill Pattern: Solidly filled
* @deprecated 3.15 beta 3. Use {@link FillPatternType#SOLID_FOREGROUND} instead.
*/
@Removal(version="3.17")
- static final short SOLID_FOREGROUND = 1; //FillPatternType.SOLID_FOREGROUND.getCode();
+ short SOLID_FOREGROUND = 1; //FillPatternType.SOLID_FOREGROUND.getCode();
/**
* Fill Pattern: Small fine dots
* @deprecated 3.15 beta 3. Use {@link FillPatternType#FINE_DOTS} instead.
*/
@Removal(version="3.17")
- static final short FINE_DOTS = 2; //FillPatternType.FINE_DOTS.getCode();
+ short FINE_DOTS = 2; //FillPatternType.FINE_DOTS.getCode();
/**
* Fill Pattern: Wide dots
* @deprecated 3.15 beta 3. Use {@link FillPatternType#ALT_BARS} instead.
*/
@Removal(version="3.17")
- static final short ALT_BARS = 3; //FillPatternType.ALT_BARS.getCode();
+ short ALT_BARS = 3; //FillPatternType.ALT_BARS.getCode();
/**
* Fill Pattern: Sparse dots
* @deprecated 3.15 beta 3. Use {@link FillPatternType#SPARSE_DOTS} instead.
*/
@Removal(version="3.17")
- static final short SPARSE_DOTS = 4; //FillPatternType.SPARSE_DOTS.getCode();
+ short SPARSE_DOTS = 4; //FillPatternType.SPARSE_DOTS.getCode();
/**
* Fill Pattern: Thick horizontal bands
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_HORZ_BANDS} instead.
*/
@Removal(version="3.17")
- static final short THICK_HORZ_BANDS = 5; //FillPatternType.THICK_HORZ_BANDS.getCode();
+ short THICK_HORZ_BANDS = 5; //FillPatternType.THICK_HORZ_BANDS.getCode();
/**
* Fill Pattern: Thick vertical bands
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_VERT_BANDS} instead.
*/
@Removal(version="3.17")
- static final short THICK_VERT_BANDS = 6; //FillPatternType.THICK_VERT_BANDS.getCode();
+ short THICK_VERT_BANDS = 6; //FillPatternType.THICK_VERT_BANDS.getCode();
/**
* Fill Pattern: Thick backward facing diagonals
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_BACKWARD_DIAG} instead.
*/
@Removal(version="3.17")
- static final short THICK_BACKWARD_DIAG = 7; //FillPatternType.THICK_BACKWARD_DIAG.getCode();
+ short THICK_BACKWARD_DIAG = 7; //FillPatternType.THICK_BACKWARD_DIAG.getCode();
/**
* Fill Pattern: Thick forward facing diagonals
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_FORWARD_DIAG} instead.
*/
@Removal(version="3.17")
- static final short THICK_FORWARD_DIAG = 8; //FillPatternType.THICK_FORWARD_DIAG.getCode();
+ short THICK_FORWARD_DIAG = 8; //FillPatternType.THICK_FORWARD_DIAG.getCode();
/**
* Fill Pattern: Large spots
* @deprecated 3.15 beta 3. Use {@link FillPatternType#BIG_SPOTS} instead.
*/
@Removal(version="3.17")
- static final short BIG_SPOTS = 9; //FillPatternType.BIG_SPOTS.getCode();
+ short BIG_SPOTS = 9; //FillPatternType.BIG_SPOTS.getCode();
/**
* Fill Pattern: Brick-like layout
* @deprecated 3.15 beta 3. Use {@link FillPatternType#BRICKS} instead.
*/
@Removal(version="3.17")
- static final short BRICKS = 10; //FillPatternType.BRICKS.getCode();
+ short BRICKS = 10; //FillPatternType.BRICKS.getCode();
/**
* Fill Pattern: Thin horizontal bands
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_HORZ_BANDS} instead.
*/
@Removal(version="3.17")
- static final short THIN_HORZ_BANDS = 11; //FillPatternType.THIN_HORZ_BANDS.getCode();
+ short THIN_HORZ_BANDS = 11; //FillPatternType.THIN_HORZ_BANDS.getCode();
/**
* Fill Pattern: Thin vertical bands
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_VERT_BANDS} instead.
*/
@Removal(version="3.17")
- static final short THIN_VERT_BANDS = 12; //FillPatternType.THIN_VERT_BANDS.getCode();
+ short THIN_VERT_BANDS = 12; //FillPatternType.THIN_VERT_BANDS.getCode();
/**
* Fill Pattern: Thin backward diagonal
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_BACKWARD_DIAG} instead.
*/
@Removal(version="3.17")
- static final short THIN_BACKWARD_DIAG = 13; //FillPatternType.THIN_BACKWARD_DIAG.getCode();
+ short THIN_BACKWARD_DIAG = 13; //FillPatternType.THIN_BACKWARD_DIAG.getCode();
/**
* Fill Pattern: Thin forward diagonal
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_FORWARD_DIAG} instead.
*/
@Removal(version="3.17")
- static final short THIN_FORWARD_DIAG = 14; //FillPatternType.THIN_FORWARD_DIAG.getCode();
+ short THIN_FORWARD_DIAG = 14; //FillPatternType.THIN_FORWARD_DIAG.getCode();
/**
* Fill Pattern: Squares
* @deprecated 3.15 beta 3. Use {@link FillPatternType#SQUARES} instead.
*/
@Removal(version="3.17")
- static final short SQUARES = 15; //FillPatternType.SQUARES.getCode();
+ short SQUARES = 15; //FillPatternType.SQUARES.getCode();
/**
* Fill Pattern: Diamonds
* @deprecated 3.15 beta 3. Use {@link FillPatternType#DIAMONDS} instead.
*/
@Removal(version="3.17")
- static final short DIAMONDS = 16; //FillPatternType.DIAMONDS.getCode();
+ short DIAMONDS = 16; //FillPatternType.DIAMONDS.getCode();
/**
* Fill Pattern: Less Dots
* @deprecated 3.15 beta 3. Use {@link FillPatternType#LESS_DOTS} instead.
*/
@Removal(version="3.17")
- static final short LESS_DOTS = 17; //FillPatternType.LESS_DOTS.getCode();
+ short LESS_DOTS = 17; //FillPatternType.LESS_DOTS.getCode();
/**
* Fill Pattern: Least Dots
* @deprecated 3.15 beta 3. Use {@link FillPatternType#LEAST_DOTS} instead.
*/
@Removal(version="3.17")
- static final short LEAST_DOTS = 18; //FillPatternType.LEAST_DOTS.getCode();
+ short LEAST_DOTS = 18; //FillPatternType.LEAST_DOTS.getCode();
/**
* get the index within the Workbook (sequence within the collection of ExtnededFormat objects)
/**
* Get the format string
*/
- public String getDataFormatString();
+ String getDataFormatString();
/**
* set the font for this style
* to be of the same type (HSSFCellStyle or
* XSSFCellStyle)
*/
- public void cloneStyleFrom(CellStyle source);
+ void cloneStyleFrom(CellStyle source);
/**
* Controls if the Cell should be auto-sized
* to shrink to fit if the text is too long
*/
- public void setShrinkToFit(boolean shrinkToFit);
+ void setShrinkToFit(boolean shrinkToFit);
/**
* Should the Cell be auto-sized by Excel to shrink
* it to fit if this text is too long?
*/
- public boolean getShrinkToFit();
+ boolean getShrinkToFit();
}
package org.apache.poi.ss.usermodel;
import org.apache.poi.ss.formula.eval.ErrorEval;
+import org.apache.poi.util.Internal;
+import org.apache.poi.util.Removal;
/**
* Mimics the 'data view' of a cell. This allows formula evaluator
public CellValue(double numberValue) {
this(CellType.NUMERIC, numberValue, false, null, 0);
}
+
public static CellValue valueOf(boolean booleanValue) {
return booleanValue ? TRUE : FALSE;
}
+
public CellValue(String stringValue) {
this(CellType.STRING, 0.0, false, stringValue, 0);
}
+
public static CellValue getError(int errorCode) {
return new CellValue(CellType.ERROR, 0.0, false, null, errorCode);
}
public boolean getBooleanValue() {
return _booleanValue;
}
+
/**
* @return Returns the numberValue.
*/
public double getNumberValue() {
return _numberValue;
}
+
/**
* @return Returns the stringValue.
*/
public String getStringValue() {
return _textValue;
}
+
+ /**
+ * Return the cell type.
+ *
+ * @return the cell type
+ * @since POI 3.15
+ * @deprecated POI 3.15
+ * Will be renamed to <code>getCellTypeEnum()</code> when we make the CellType enum transition in POI 4.0. See bug 59791.
+ */
+ @Internal(since="POI 3.15 beta 3")
+ @Removal(version="4.2")
+ public CellType getCellTypeEnum() {
+ return _cellType;
+ }
+
/**
- * @return Returns the cellType.
- * @since POI 3.15
- */
- public CellType getCellTypeEnum() {
- return _cellType;
- }
- /**
- * @return Returns the cellType.
+ * Return the cell type.
+ *
+ * Will return {@link CellType} in version 4.0 of POI.
+ * For forwards compatibility, do not hard-code cell type literals in your code.
+ *
+ * @return the cell type
+ *
* @deprecated POI 3.15. Use {@link #getCellTypeEnum()} instead.
- * In the future, the signature of this method will be changed to return a
- * {@link CellType}.
*/
@Deprecated
public int getCellType() {
public byte getErrorValue() {
return (byte) _errorCode;
}
+
public String toString() {
StringBuffer sb = new StringBuffer(64);
sb.append(getClass().getName()).append(" [");
public interface Workbook extends Closeable, Iterable<Sheet> {
/** Extended windows meta file */
- public static final int PICTURE_TYPE_EMF = 2;
+ int PICTURE_TYPE_EMF = 2;
/** Windows Meta File */
- public static final int PICTURE_TYPE_WMF = 3;
+ int PICTURE_TYPE_WMF = 3;
/** Mac PICT format */
- public static final int PICTURE_TYPE_PICT = 4;
+ int PICTURE_TYPE_PICT = 4;
/** JPEG format */
- public static final int PICTURE_TYPE_JPEG = 5;
+ int PICTURE_TYPE_JPEG = 5;
/** PNG format */
- public static final int PICTURE_TYPE_PNG = 6;
+ int PICTURE_TYPE_PNG = 6;
/** Device independent bitmap */
- public static final int PICTURE_TYPE_DIB = 7;
+ int PICTURE_TYPE_DIB = 7;
/**
*
* @see #setSheetHidden(int, int)
*/
- public static final int SHEET_STATE_VISIBLE = 0;
+ int SHEET_STATE_VISIBLE = 0;
/**
* Indicates the book window is hidden, but can be shown by the user via the user interface.
*
* @see #setSheetHidden(int, int)
*/
- public static final int SHEET_STATE_HIDDEN = 1;
+ int SHEET_STATE_HIDDEN = 1;
/**
* Indicates the sheet is hidden and cannot be shown in the user interface (UI).
*
* @see #setSheetHidden(int, int)
*/
- public static final int SHEET_STATE_VERY_HIDDEN = 2;
+ int SHEET_STATE_VERY_HIDDEN = 2;
/**
* Convenience method to get the active sheet. The active sheet is is the sheet
int getSheetIndex(Sheet sheet);
/**
- * Sreate an Sheet for this Workbook, adds it to the sheets and returns
+ * Create a Sheet for this Workbook, adds it to the sheets and returns
* the high level representation. Use this to create new sheets.
*
* @return Sheet representing the new sheet.
* See {@link org.apache.poi.ss.util.WorkbookUtil#createSafeSheetName(String nameProposal)}
* for a safe way to create valid names
* </p>
- * @param sheetname sheetname to set for the sheet.
+ * @param sheetname The name to set for the sheet.
* @return Sheet representing the new sheet.
* @throws IllegalArgumentException if the name is null or invalid
* or workbook already contains a sheet with this name
*
* @param index of the sheet number (0-based physical & logical)
* @return Sheet at the provided index
+ * @throws IllegalArgumentException if the index is out of range (index
+ * < 0 || index >= getNumberOfSheets()).
*/
Sheet getSheetAt(int index);
* workbook values when the workbook is opened
* @since 3.8
*/
- public void setForceFormulaRecalculation(boolean value);
+ void setForceFormulaRecalculation(boolean value);
/**
* Whether Excel will be asked to recalculate all formulas when the workbook is opened.
* @return SpreadsheetVersion enum
* @since 3.14 beta 2
*/
- public SpreadsheetVersion getSpreadsheetVersion();
-
+ SpreadsheetVersion getSpreadsheetVersion();
}
// We should only be checking merged regions if useMergedCells is true. Why are we doing this for-loop?
int colspan = 1;
for (CellRangeAddress region : sheet.getMergedRegions()) {
- if (containsCell(region, row.getRowNum(), column)) {
+ if (region.isInRange(row.getRowNum(), column)) {
if (!useMergedCells) {
// If we're not using merged cells, skip this one and move on to the next.
return -1;
if (cellType == CellType.STRING) {
RichTextString rt = cell.getRichStringCellValue();
String[] lines = rt.getString().split("\\n");
- for (int i = 0; i < lines.length; i++) {
- String txt = lines[i] + defaultChar;
+ for (String line : lines) {
+ String txt = line + defaultChar;
AttributedString str = new AttributedString(txt);
copyAttributes(font, str, 0, txt.length());
* @param defaultCharWidth the width of a character using the default font in a workbook
* @param colspan the number of columns that is spanned by the cell (1 if the cell is not part of a merged region)
* @param style the cell style, which contains text rotation and indention information needed to compute the cell width
- * @param width the minimum best-fit width. This algorithm will only return values greater than or equal to the minimum width.
+ * @param minWidth the minimum best-fit width. This algorithm will only return values greater than or equal to the minimum width.
* @param str the text contained in the cell
* @return the best fit cell width
*/
}
// frameWidth accounts for leading spaces which is excluded from bounds.getWidth()
final double frameWidth = bounds.getX() + bounds.getWidth();
- final double width = Math.max(minWidth, ((frameWidth / colspan) / defaultCharWidth) + style.getIndention());
- return width;
+ return Math.max(minWidth, ((frameWidth / colspan) / defaultCharWidth) + style.getIndention());
}
/**
AttributedString str = new AttributedString(String.valueOf(defaultChar));
copyAttributes(defaultFont, str, 0, 1);
TextLayout layout = new TextLayout(str.getIterator(), fontRenderContext);
- int defaultCharWidth = (int) layout.getAdvance();
- return defaultCharWidth;
+ return (int) layout.getAdvance();
}
/**
* Compute width of a single cell in a row
- * Convenience method for {@link getCellWidth}
+ * Convenience method for {@link #getCellWidth}
*
* @param row the row that contains the cell of interest
* @param column the column number of the cell whose width is to be calculated
private static void copyAttributes(Font font, AttributedString str, int startIdx, int endIdx) {
str.addAttribute(TextAttribute.FAMILY, font.getFontName(), startIdx, endIdx);
str.addAttribute(TextAttribute.SIZE, (float)font.getFontHeightInPoints());
- if (font.getBoldweight() == Font.BOLDWEIGHT_BOLD) str.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, startIdx, endIdx);
+ if (font.getBold()) str.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, startIdx, endIdx);
if (font.getItalic() ) str.addAttribute(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE, startIdx, endIdx);
if (font.getUnderline() == Font.U_SINGLE ) str.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, startIdx, endIdx);
}
* @return true if the range contains the cell [rowIx, colIx]
* @deprecated 3.15 beta 2. Use {@link CellRangeAddressBase#isInRange(int, int)}.
*/
+ @Deprecated
public static boolean containsCell(CellRangeAddress cr, int rowIx, int colIx) {
return cr.isInRange(rowIx, colIx);
}
*/
public class CommonsLogger extends POILogger
{
- private static LogFactory _creator = LogFactory.getFactory();
+ private static final LogFactory _creator = LogFactory.getFactory();
private Log log = null;
@Override
* @param obj1 The object to log.
*/
@Override
- public void log(final int level, final Object obj1)
+ protected void _log(final int level, final Object obj1)
{
+ // FIXME: What happens if level is in between two levels (an even number)?
+ // Should this be `if (level >= FATAL) ...`?
if(level==FATAL)
{
if(log.isFatalEnabled())
* @param exception An exception to be logged
*/
@Override
- public void log(final int level, final Object obj1,
+ protected void _log(final int level, final Object obj1,
final Throwable exception)
{
+ // FIXME: What happens if level is in between two levels (an even number)?
+ // Should this be `if (level >= FATAL) ...`?
if(level==FATAL)
{
if(log.isFatalEnabled())
@Override
public boolean check(final int level)
{
+ // FIXME: What happens if level is in between two levels (an even number)?
+ // Should this be `if (level >= FATAL) ...`?
if(level==FATAL)
{
if(log.isFatalEnabled())
}
/**
- * Attempt to create a directory
+ * Attempt to create a directory, including any necessary parent directories.
+ * Does nothing if directory already exists.
*
- * @param directory
- * @throws IOException
+ * @param directory the directory to create
+ * @throws IOException if unable to create temporary directory or it is not a directory
*/
private void createTempDirectory(File directory) throws IOException {
- if (!(directory.exists() || directory.mkdirs()) || !directory.isDirectory()) {
+ // create directory if it doesn't exist
+ final boolean dirExists = (directory.exists() || directory.mkdirs());
+
+ if (!dirExists) {
throw new IOException("Could not create temporary directory '" + directory + "'");
}
+ else if (!directory.isDirectory()) {
+ throw new IOException("Could not create temporary directory. '" + directory + "' exists but is not a directory.");
+ }
}
@Override
* calls as cheap as possible by performing lazy evaluation of the log
* message.<p>
*/
+@Internal
public class NullLogger extends POILogger {
@Override
public void initialize(final String cat) {
*/
@Override
- public void log(final int level, final Object obj1) {
+ protected void _log(final int level, final Object obj1) {
// do nothing
}
* @param exception An exception to be logged
*/
@Override
- public void log(int level, Object obj1, final Throwable exception) {
+ protected void _log(int level, Object obj1, final Throwable exception) {
+ // do nothing
+ }
+
+ /**
+ * Log a message. Lazily appends Object parameters together.
+ * If the last parameter is a {@link Throwable} it is logged specially.
+ *
+ * @param level One of DEBUG, INFO, WARN, ERROR, FATAL
+ * @param objs the objects to place in the message
+ */
+ @Override
+ public void log(int level, Object... objs) {
// do nothing
}
/**
* Map of POILogger instances, with classes as keys
*/
- private static Map<String,POILogger> _loggers = new HashMap<String,POILogger>();
+ private static final Map<String,POILogger> _loggers = new HashMap<String,POILogger>();
/**
* A common instance of NullLogger, as it does nothing
* @param level One of DEBUG, INFO, WARN, ERROR, FATAL
* @param obj1 The object to log. This is converted to a string.
*/
- abstract protected void log(int level, Object obj1);
+ abstract protected void _log(int level, Object obj1);
/**
* Log a message
* @param obj1 The object to log. This is converted to a string.
* @param exception An exception to be logged
*/
- abstract protected void log(int level, Object obj1, final Throwable exception);
+ abstract protected void _log(int level, Object obj1, final Throwable exception);
/**
* Check if a logger is enabled to log at the specified level
+ * This allows code to avoid building strings or evaluating functions in
+ * the arguments to log.
+ *
+ * An example:
+ * <code><pre>
+ * if (logger.check(POILogger.INFO)) {
+ * logger.log(POILogger.INFO, "Avoid concatenating " + " strings and evaluating " + functions());
+ * }
+ * </pre></code>
*
* @param level One of DEBUG, INFO, WARN, ERROR, FATAL
*/
// somehow this ambiguity works and doesn't lead to a loop,
// but it's confusing ...
if (lastEx == null) {
- log(level, msg);
+ _log(level, msg);
} else {
- log(level, msg, lastEx);
+ _log(level, msg, lastEx);
}
}
}
* @param obj1 The object to log.
*/
@Override
- public void log(final int level, final Object obj1)
+ protected void _log(final int level, final Object obj1)
{
- log(level, obj1, null);
+ _log(level, obj1, null);
}
/**
*/
@Override
@SuppressForbidden("uses printStackTrace")
- public void log(final int level, final Object obj1,
+ protected void _log(final int level, final Object obj1,
final Throwable exception) {
if (check(level)) {
System.out.println("[" + _cat + "]" + LEVEL_STRINGS_SHORT[Math.min(LEVEL_STRINGS_SHORT.length-1, level)] + " " + obj1);
import org.apache.poi.hsmf.extractor.OutlookTextExtactor;
import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hwpf.extractor.WordExtractor;
-import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
return OLE2ExtractorFactory.getPreferEventExtractor();
}
- public static POITextExtractor createExtractor(File f) throws IOException, InvalidFormatException, OpenXML4JException, XmlException {
+ public static POITextExtractor createExtractor(File f) throws IOException, OpenXML4JException, XmlException {
NPOIFSFileSystem fs = null;
try {
fs = new NPOIFSFileSystem(f);
}
}
- public static POITextExtractor createExtractor(InputStream inp) throws IOException, InvalidFormatException, OpenXML4JException, XmlException {
+ public static POITextExtractor createExtractor(InputStream inp) throws IOException, OpenXML4JException, XmlException {
// Figure out the kind of stream
// If clearly doesn't do mark/reset, wrap up
if (! inp.markSupported()) {
\r
private static final POILogger LOG = POILogFactory.getLogger(SignatureConfig.class);\r
\r
- public static interface SignatureConfigurable {\r
+ public interface SignatureConfigurable {\r
void setSignatureConfig(SignatureConfig signatureConfig); \r
}\r
\r
"BaseTestXSheet",
"BaseTestXRow",
"BaseTestXCell",
+ "BaseTestXSSFPivotTable",
"TestSXSSFWorkbook\\$\\d",
"TestSXSSFWorkbook\\$NullOutputStream",
"TestUnfixedBugs",
\r
if (this instanceof PlaceableShape) {\r
PlaceableShape<?,?> ps = (PlaceableShape<?,?>)this;\r
- ps.setAnchor(((PlaceableShape<?,?>)sh).getAnchor());\r
+ ps.setAnchor(sh.getAnchor());\r
}\r
\r
\r
* Different types of placeholders are allowed and can be specified by using the placeholder\r
* type attribute for this element\r
*\r
- * @param placeholder\r
+ * @param placeholder The shape to use as placeholder or null if no placeholder should be set.\r
*/\r
protected void setPlaceholder(Placeholder placeholder) {\r
String xquery = "declare namespace p='"+PML_NS+"' .//*/p:nvPr";\r
int idx = (int)fillRef.getIdx();\r
CTSchemeColor phClr = fillRef.getSchemeClr();\r
CTStyleMatrix matrix = theme.getXmlObject().getThemeElements().getFmtScheme();\r
- XmlObject styleLst = null;\r
+ final XmlObject styleLst;\r
int childIdx;\r
if (idx >= 1 && idx <= 999) {\r
childIdx = idx-1;\r
try {
sheet.getSheetDataWriter().close();
} catch (IOException e) {
- // ignore exception here
+ logger.log(POILogger.WARN,
+ "An exception occurred while closing sheet data writer for sheet "
+ + sheet.getSheetName() + ".", e);
}
}
@Override
public void write(OutputStream stream) throws IOException
{
- for (SXSSFSheet sheet : _xFromSxHash.values())
- {
- sheet.flushRows();
- }
-
+ flushSheets();
+
//Save the template
File tmplFile = TempFile.createTempFile("poi-sxssf-template", ".xlsx");
try
}
}
+ protected void flushSheets() throws IOException {
+ for (SXSSFSheet sheet : _xFromSxHash.values())
+ {
+ sheet.flushRows();
+ }
+ }
+
/**
* Dispose of temporary files backing this workbook on disk.
* Calling this method will render the workbook unusable.
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.CellValue;
-import org.apache.poi.ss.usermodel.RichTextString;
+import org.apache.poi.util.Internal;
/**
* Internal POI use only - parent of XSSF and SXSSF formula evaluators
_bookEvaluator.notifyUpdateCell(new XSSFEvaluationCell((XSSFCell)cell));
}
+ /**
+ * If cell contains formula, it evaluates the formula,
+ * and saves the result of the formula. The cell
+ * remains as a formula cell.
+ * Else if cell does not contain formula, this method leaves
+ * the cell unchanged.
+ * Note that the type of the formula result is returned,
+ * so you know what kind of value is also stored with
+ * the formula.
+ * <pre>
+ * CellType evaluatedCellType = evaluator.evaluateFormulaCellEnum(cell);
+ * </pre>
+ * Be aware that your cell will hold both the formula,
+ * and the result. If you want the cell replaced with
+ * the result of the formula, use {@link #evaluate(org.apache.poi.ss.usermodel.Cell)} }
+ * @param cell The cell to evaluate
+ * @return The type of the formula result (the cell's type remains as CellType.FORMULA however)
+ * If cell is not a formula cell, returns {@link CellType#_NONE} rather than throwing an exception.
+ * @since POI 3.15 beta 3
+ * @deprecated POI 3.15 beta 3. Will be deleted when we make the CellType enum transition. See bug 59791.
+ */
+ @Internal(since="POI 3.15 beta 3")
+ public CellType evaluateFormulaCellEnum(Cell cell) {
+ if (cell == null || cell.getCellTypeEnum() != CellType.FORMULA) {
+ return CellType._NONE;
+ }
+ CellValue cv = evaluateFormulaCellValue(cell);
+ // cell remains a formula cell, but the cached value is changed
+ setCellValue(cell, cv);
+ return cv.getCellType();
+ }
+
+ /**
+ * If cell contains formula, it evaluates the formula, and
+ * puts the formula result back into the cell, in place
+ * of the old formula.
+ * Else if cell does not contain formula, this method leaves
+ * the cell unchanged.
+ */
+ protected void doEvaluateInCell(Cell cell) {
+ if (cell == null) return;
+ if (cell.getCellTypeEnum() == CellType.FORMULA) {
+ CellValue cv = evaluateFormulaCellValue(cell);
+ setCellType(cell, cv); // cell will no longer be a formula cell
+ setCellValue(cell, cv);
+ }
+ }
+
+ private static void setCellValue(Cell cell, CellValue cv) {
+ CellType cellType = cv.getCellType();
+ switch (cellType) {
+ case BOOLEAN:
+ cell.setCellValue(cv.getBooleanValue());
+ break;
+ case ERROR:
+ cell.setCellErrorValue(cv.getErrorValue());
+ break;
+ case NUMERIC:
+ cell.setCellValue(cv.getNumberValue());
+ break;
+ case STRING:
+ cell.setCellValue(new XSSFRichTextString(cv.getStringValue()));
+ break;
+ case BLANK:
+ // never happens - blanks eventually get translated to zero
+ case FORMULA:
+ // this will never happen, we have already evaluated the formula
+ default:
+ throw new IllegalStateException("Unexpected cell value type (" + cellType + ")");
+ }
+ }
+
/**
* Turns a XSSFCell / SXSSFCell into a XSSFEvaluationCell
*/
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.Beta;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCacheField;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCacheFields;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotCacheDefinition;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheetSource;
public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{
out.close();
}
+ /**
+ * Find the 2D base data area for the pivot table, either from its direct reference or named table/range.
+ * @return AreaReference representing the current area defined by the pivot table
+ * @throws IllegalArgumentException if the ref attribute is not contiguous or the name attribute is not found.
+ */
+ @Beta
+ public AreaReference getPivotArea(Workbook wb) throws IllegalArgumentException {
+ final CTWorksheetSource wsSource = ctPivotCacheDefinition.getCacheSource().getWorksheetSource();
+
+ final String ref = wsSource.getRef();
+ final String name = wsSource.getName();
+
+ if (ref == null && name == null) throw new IllegalArgumentException("Pivot cache must reference an area, named range, or table.");
+
+ // this is the XML format, so tell the reference that.
+ if (ref != null) return new AreaReference(ref, SpreadsheetVersion.EXCEL2007);
+
+ if (name != null) {
+ // named range or table?
+ final Name range = wb.getName(name);
+ if (range != null) return new AreaReference(range.getRefersToFormula(), SpreadsheetVersion.EXCEL2007);
+ // not a named range, check for a table.
+ // do this second, as tables are sheet-specific, but named ranges are not, and may not have a sheet name given.
+ final XSSFSheet sheet = (XSSFSheet) wb.getSheet(wsSource.getSheet());
+ for (XSSFTable table : sheet.getTables()) {
+ if (table.getName().equals(name)) { //case-sensitive?
+ return new AreaReference(table.getStartCellReference(), table.getEndCellReference());
+ }
+ }
+ }
+
+ throw new IllegalArgumentException("Name '" + name + "' was not found.");
+ }
+
/**
* Generates a cache field for each column in the reference area for the pivot table.
* @param sheet The sheet where the data i collected from
@Beta
protected void createCacheFields(Sheet sheet) {
//Get values for start row, start and end column
- AreaReference ar = new AreaReference(ctPivotCacheDefinition.getCacheSource().getWorksheetSource().getRef());
+ AreaReference ar = getPivotArea(sheet.getWorkbook());
CellReference firstCell = ar.getFirstCell();
CellReference lastCell = ar.getLastCell();
int columnStart = firstCell.getCol();
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship;
-import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataConsolidateFunction;
import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.Beta;
}
protected AreaReference getPivotArea() {
- AreaReference pivotArea = new AreaReference(
- getPivotCacheDefinition()
- .getCTPivotCacheDefinition()
- .getCacheSource()
- .getWorksheetSource()
- .getRef(),
- SpreadsheetVersion.EXCEL2007);
+ final Workbook wb = getDataSheet().getWorkbook();
+ AreaReference pivotArea = getPivotCacheDefinition().getPivotArea(wb);
return pivotArea;
}
/**
* Creates cacheSource and workSheetSource for pivot table and sets the source reference as well assets the location of the pivot table
- * @param source Source for data for pivot table
* @param position Position for pivot table in sheet
* @param sourceSheet Sheet where the source will be collected from
+ * @param refConfig an configurator that knows how to configure pivot table references
*/
@Beta
- protected void createSourceReferences(AreaReference source, CellReference position, Sheet sourceSheet){
+ protected void createSourceReferences(CellReference position, Sheet sourceSheet, PivotTableReferenceConfigurator refConfig){
+
//Get cell one to the right and one down from position, add both to AreaReference and set pivot table location.
AreaReference destination = new AreaReference(position, new CellReference(position.getRow()+1, position.getCol()+1));
worksheetSource.setSheet(sourceSheet.getSheetName());
setDataSheet(sourceSheet);
- String[] firstCell = source.getFirstCell().getCellRefParts();
- String[] lastCell = source.getLastCell().getCellRefParts();
- worksheetSource.setRef(firstCell[2]+firstCell[1]+':'+lastCell[2]+lastCell[1]);
+ refConfig.configureReference(worksheetSource);
+ if (worksheetSource.getName() == null && worksheetSource.getRef() == null) throw new IllegalArgumentException("Pivot table source area reference or name must be specified.");
}
@Beta
int firstColumn = sourceArea.getFirstCell().getCol();
int lastColumn = sourceArea.getLastCell().getCol();
CTPivotField pivotField;
- for(int i = 0; i<=lastColumn-firstColumn; i++) {
+ for(int i = firstColumn; i<=lastColumn; i++) {
pivotField = pivotFields.addNewPivotField();
pivotField.setDataField(false);
pivotField.setShowAll(false);
}
pivotFields.setCount(pivotFields.sizeOfPivotFieldArray());
}
+
+ protected static interface PivotTableReferenceConfigurator {
+
+ /**
+ * Configure the name or area reference for the pivot table
+ * @param wsSource CTWorksheetSource that needs the pivot source reference assignment
+ */
+ public void configureReference(CTWorksheetSource wsSource);
+ }
}
import org.apache.poi.ss.usermodel.Header;
import org.apache.poi.ss.usermodel.IgnoredErrorType;
import org.apache.poi.ss.usermodel.IndexedColors;
+import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Table;
import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellAddress;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.util.POILogger;
import org.apache.poi.util.Removal;
import org.apache.poi.xssf.model.CommentsTable;
+import org.apache.poi.xssf.usermodel.XSSFPivotTable.PivotTableReferenceConfigurator;
import org.apache.poi.xssf.usermodel.helpers.ColumnHelper;
import org.apache.poi.xssf.usermodel.helpers.XSSFIgnoredErrorHelper;
import org.apache.poi.xssf.usermodel.helpers.XSSFRowShifter;
}
// Performance optimization: explicit boxing is slightly faster than auto-unboxing, though may use more memory
- final Integer rownumI = new Integer(row.getRowNum()); // NOSONAR
- int idx = _rows.headMap(rownumI).size();
- _rows.remove(rownumI);
+ final int rowNum = row.getRowNum();
+ final Integer rowNumI = new Integer(rowNum); // NOSONAR
+ // this is not the physical row number!
+ final int idx = _rows.headMap(rowNumI).size();
+ _rows.remove(rowNumI);
worksheet.getSheetData().removeRow(idx);
// also remove any comment located in that row
if(sheetComments != null) {
for (CellAddress ref : getCellComments().keySet()) {
- if (ref.getRow() == idx) {
+ if (ref.getRow() == rowNum) {
sheetComments.removeComment(ref);
}
}
}
/**
- * Create a pivot table and set area of source, source sheet and a position for pivot table
- * @param source Area from where data will be collected
- * @param position A reference to the cell where the table will start
- * @param sourceSheet The sheet where source will be collected from
+ * Create a pivot table using the AreaReference range on sourceSheet, at the given position.
+ * If the source reference contains a sheet name, it must match the sourceSheet
+ * @param source location of pivot data
+ * @param position A reference to the top left cell where the pivot table will start
+ * @param sourceSheet The sheet containing the source data, if the source reference doesn't contain a sheet name
+ * @throws IllegalArgumentException if source references a sheet different than sourceSheet
* @return The pivot table
*/
@Beta
- public XSSFPivotTable createPivotTable(AreaReference source, CellReference position, Sheet sourceSheet) {
+ public XSSFPivotTable createPivotTable(final AreaReference source, CellReference position, Sheet sourceSheet) {
final String sourceSheetName = source.getFirstCell().getSheetName();
if(sourceSheetName != null && !sourceSheetName.equalsIgnoreCase(sourceSheet.getSheetName())) {
throw new IllegalArgumentException("The area is referenced in another sheet than the "
+ "defined source sheet " + sourceSheet.getSheetName() + ".");
}
+
+ return createPivotTable(position, sourceSheet, new PivotTableReferenceConfigurator() {
+ public void configureReference(CTWorksheetSource wsSource) {
+ final String[] firstCell = source.getFirstCell().getCellRefParts();
+ final String firstRow = firstCell[1];
+ final String firstCol = firstCell[2];
+ final String[] lastCell = source.getLastCell().getCellRefParts();
+ final String lastRow = lastCell[1];
+ final String lastCol = lastCell[2];
+ final String ref = firstCol+firstRow+':'+lastCol+lastRow; //or just source.formatAsString()
+ wsSource.setRef(ref);
+ }
+ });
+ }
+
+ /**
+ * Create a pivot table using the AreaReference or named/table range on sourceSheet, at the given position.
+ * If the source reference contains a sheet name, it must match the sourceSheet.
+ * @param sourceRef location of pivot data - mutually exclusive with SourceName
+ * @param sourceName range or table name for pivot data - mutually exclusive with SourceRef
+ * @param position A reference to the top left cell where the pivot table will start
+ * @param sourceSheet The sheet containing the source data, if the source reference doesn't contain a sheet name
+ * @throws IllegalArgumentException if source references a sheet different than sourceSheet
+ * @return The pivot table
+ */
+ private XSSFPivotTable createPivotTable(CellReference position, Sheet sourceSheet, PivotTableReferenceConfigurator refConfig) {
+
XSSFPivotTable pivotTable = createPivotTable();
//Creates default settings for the pivot table
pivotTable.setDefaultPivotTableDefinition();
//Set sources and references
- pivotTable.createSourceReferences(source, position, sourceSheet);
+ pivotTable.createSourceReferences(position, sourceSheet, refConfig);
- //Create cachefield/s and empty SharedItems
+ //Create cachefield/s and empty SharedItems - must be after creating references
pivotTable.getPivotCacheDefinition().createCacheFields(sourceSheet);
pivotTable.createDefaultDataColumns();
}
/**
- * Create a pivot table and set area of source and a position for pivot table
- * @param source Area from where data will be collected
- * @param position A reference to the cell where the table will start
+ * Create a pivot table using the AreaReference range, at the given position.
+ * If the source reference contains a sheet name, that sheet is used, otherwise this sheet is assumed as the source sheet.
+ * @param source location of pivot data
+ * @param position A reference to the top left cell where the pivot table will start
* @return The pivot table
*/
@Beta
return createPivotTable(source, position, this);
}
+ /**
+ * Create a pivot table using the Name range reference on sourceSheet, at the given position.
+ * If the source reference contains a sheet name, it must match the sourceSheet
+ * @param source location of pivot data
+ * @param position A reference to the top left cell where the pivot table will start
+ * @param sourceSheet The sheet containing the source data, if the source reference doesn't contain a sheet name
+ * @throws IllegalArgumentException if source references a sheet different than sourceSheet
+ * @return The pivot table
+ */
+ @Beta
+ public XSSFPivotTable createPivotTable(final Name source, CellReference position, Sheet sourceSheet) {
+ if(source.getSheetName() != null && !source.getSheetName().equals(sourceSheet.getSheetName())) {
+ throw new IllegalArgumentException("The named range references another sheet than the "
+ + "defined source sheet " + sourceSheet.getSheetName() + ".");
+ }
+
+ return createPivotTable(position, sourceSheet, new PivotTableReferenceConfigurator() {
+ public void configureReference(CTWorksheetSource wsSource) {
+ wsSource.setName(source.getNameName());
+ }
+ });
+ }
+
+ /**
+ * Create a pivot table using the Name range, at the given position.
+ * If the source reference contains a sheet name, that sheet is used, otherwise this sheet is assumed as the source sheet.
+ * @param source location of pivot data
+ * @param position A reference to the top left cell where the pivot table will start
+ * @return The pivot table
+ */
+ @Beta
+ public XSSFPivotTable createPivotTable(Name source, CellReference position) {
+ return createPivotTable(source, position, getWorkbook().getSheet(source.getSheetName()));
+ }
+
+ /**
+ * Create a pivot table using the Table, at the given position.
+ * Tables are required to have a sheet reference, so no additional logic around reference sheet is needed.
+ * @param source location of pivot data
+ * @param position A reference to the top left cell where the pivot table will start
+ * @return The pivot table
+ */
+ @Beta
+ public XSSFPivotTable createPivotTable(final Table source, CellReference position) {
+ return createPivotTable(position, getWorkbook().getSheet(source.getSheetName()), new PivotTableReferenceConfigurator() {
+ public void configureReference(CTWorksheetSource wsSource) {
+ wsSource.setName(source.getName());
+ }
+ });
+ }
+
/**
* Returns all the pivot tables for this Sheet
*/
}
public int getIndexOfColumn(CTCols cols, CTCol searchCol) {
+ if (cols == null || searchCol == null) return -1;
int i = 0;
for (CTCol col : cols.getColArray()) {
if (col.getMin() == searchCol.getMin() && col.getMax() == searchCol.getMax()) {
}
- if (f.isSetRef()) { //Range of cells which the formula applies to.
+ //Range of cells which the formula applies to.
+ if (f.isSetRef()) {
String ref = f.getRef();
String shiftedRef = shiftFormula(row, ref, shifter);
if (shiftedRef != null) f.setRef(shiftedRef);
==================================================================== */
package org.apache.poi.extractor;
+import static org.apache.poi.POITestCase.assertContains;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import org.apache.poi.hpbf.extractor.PublisherTextExtractor;
import org.apache.poi.hslf.extractor.PowerPointExtractor;
import org.apache.poi.hsmf.extractor.OutlookTextExtactor;
+import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.OldExcelFormatException;
import org.apache.poi.hssf.extractor.EventBasedExcelExtractor;
import org.apache.poi.hssf.extractor.ExcelExtractor;
// expected here
}
}
+
+ // This bug is currently open. This test will fail with "expected error not thrown" when the bug has been fixed.
+ // When this happens, change this from @Test(expected=...) to @Test
+ // bug 45565: text within TextBoxes is extracted by ExcelExtractor and WordExtractor
+ @Test(expected=AssertionError.class)
+ public void test45565() throws Exception {
+ POITextExtractor extractor = ExtractorFactory.createExtractor(HSSFTestDataSamples.getSampleFile("45565.xls"));
+ String text = extractor.getText();
+ assertContains(text, "testdoc");
+ assertContains(text, "test phrase");
+ extractor.close();
+ }
}
import org.apache.poi.POITestCase;\r
import org.apache.poi.openxml4j.opc.OPCPackage;\r
import org.apache.poi.openxml4j.opc.PackageAccess;\r
+import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;\r
import org.apache.poi.poifs.crypt.dsig.DigestInfo;\r
import org.apache.poi.poifs.crypt.dsig.SignatureConfig;\r
import org.apache.poi.poifs.crypt.dsig.SignatureInfo;\r
public static void initBouncy() throws IOException {\r
CryptoFunctions.registerBouncyCastle();\r
\r
- /*** TODO : set cal to now ... only set to fixed date for debugging ... */ \r
+ // Set cal to now ... only set to fixed date for debugging ...\r
cal = LocaleUtil.getLocaleCalendar(LocaleUtil.TIMEZONE_UTC);\r
assertNotNull(cal);\r
// cal.set(2014, 7, 6, 21, 42, 12);\r
\r
// verify\r
Iterator<SignaturePart> spIter = si.getSignatureParts().iterator();\r
- assertTrue(spIter.hasNext());\r
+ assertTrue("Had: " + si.getSignatureConfig().getOpcPackage().\r
+ getRelationshipsByType(PackageRelationshipTypes.DIGITAL_SIGNATURE_ORIGIN),\r
+ spIter.hasNext());\r
SignaturePart sp = spIter.next();\r
boolean valid = sp.validate();\r
assertTrue(valid);\r
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import junit.framework.AssertionFailedError;
-import junit.framework.TestCase;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
--- /dev/null
+/* ====================================================================
+ 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.xssf.usermodel;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.DataConsolidateFunction;
+import org.apache.poi.ss.util.AreaReference;
+import org.apache.poi.ss.util.CellReference;
+import org.apache.poi.xssf.XSSFITestDataProvider;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageField;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageFields;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotFields;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotTableDefinition;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataConsolidateFunction;
+
+public abstract class BaseTestXSSFPivotTable {
+ private static final XSSFITestDataProvider _testDataProvider = XSSFITestDataProvider.instance;
+ protected XSSFWorkbook wb;
+ protected XSSFPivotTable pivotTable;
+ protected XSSFPivotTable offsetPivotTable;
+ protected Cell offsetOuterCell;
+
+ /**
+ * required to set up the test pivot tables and cell reference, either by name or reference.
+ * @see junit.framework.TestCase#setUp()
+ */
+ @Before
+ public abstract void setUp();
+
+ @After
+ public void tearDown() throws IOException {
+ if (wb != null) {
+ XSSFWorkbook wb2 = _testDataProvider.writeOutAndReadBack(wb);
+ wb.close();
+ wb2.close();
+ }
+ }
+
+ /**
+ * Verify that when creating a row label it's created on the correct row
+ * and the count is increased by one.
+ */
+ @Test
+ public void testAddRowLabelToPivotTable() {
+ int columnIndex = 0;
+
+ assertEquals(0, pivotTable.getRowLabelColumns().size());
+
+ pivotTable.addRowLabel(columnIndex);
+ CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
+
+ assertEquals(defintion.getRowFields().getFieldArray(0).getX(), columnIndex);
+ assertEquals(defintion.getRowFields().getCount(), 1);
+ assertEquals(1, pivotTable.getRowLabelColumns().size());
+
+ columnIndex = 1;
+ pivotTable.addRowLabel(columnIndex);
+ assertEquals(2, pivotTable.getRowLabelColumns().size());
+
+ assertEquals(0, (int)pivotTable.getRowLabelColumns().get(0));
+ assertEquals(1, (int)pivotTable.getRowLabelColumns().get(1));
+ }
+
+ /**
+ * Verify that it's not possible to create a row label outside of the referenced area.
+ */
+ @Test
+ public void testAddRowLabelOutOfRangeThrowsException() {
+ int columnIndex = 5;
+
+ try {
+ pivotTable.addRowLabel(columnIndex);
+ } catch(IndexOutOfBoundsException e) {
+ return;
+ }
+ fail();
+ }
+
+ /**
+ * Verify that when creating one column label, no col fields are being created.
+ */
+ @Test
+ public void testAddOneColumnLabelToPivotTableDoesNotCreateColField() {
+ int columnIndex = 0;
+
+ pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex);
+ CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
+
+ assertEquals(defintion.getColFields(), null);
+ }
+
+ /**
+ * Verify that it's possible to create three column labels with different DataConsolidateFunction
+ */
+ @Test
+ public void testAddThreeDifferentColumnLabelsToPivotTable() {
+ int columnOne = 0;
+ int columnTwo = 1;
+ int columnThree = 2;
+
+ pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnOne);
+ pivotTable.addColumnLabel(DataConsolidateFunction.MAX, columnTwo);
+ pivotTable.addColumnLabel(DataConsolidateFunction.MIN, columnThree);
+ CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
+
+ assertEquals(defintion.getDataFields().getDataFieldList().size(), 3);
+ }
+
+
+ /**
+ * Verify that it's possible to create three column labels with the same DataConsolidateFunction
+ */
+ @Test
+ public void testAddThreeSametColumnLabelsToPivotTable() {
+ int columnOne = 0;
+ int columnTwo = 1;
+ int columnThree = 2;
+
+ pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnOne);
+ pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnTwo);
+ pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnThree);
+ CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
+
+ assertEquals(defintion.getDataFields().getDataFieldList().size(), 3);
+ }
+
+ /**
+ * Verify that when creating two column labels, a col field is being created and X is set to -2.
+ */
+ @Test
+ public void testAddTwoColumnLabelsToPivotTable() {
+ int columnOne = 0;
+ int columnTwo = 1;
+
+ pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnOne);
+ pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnTwo);
+ CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
+
+ assertEquals(defintion.getColFields().getFieldArray(0).getX(), -2);
+ }
+
+ /**
+ * Verify that a data field is created when creating a data column
+ */
+ @Test
+ public void testColumnLabelCreatesDataField() {
+ int columnIndex = 0;
+
+ pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex);
+
+ CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
+
+ assertEquals(defintion.getDataFields().getDataFieldArray(0).getFld(), columnIndex);
+ assertEquals(defintion.getDataFields().getDataFieldArray(0).getSubtotal(),
+ STDataConsolidateFunction.Enum.forInt(DataConsolidateFunction.SUM.getValue()));
+ }
+
+ /**
+ * Verify that it's possible to set a custom name when creating a data column
+ */
+ @Test
+ public void testColumnLabelSetCustomName() {
+ int columnIndex = 0;
+
+ String customName = "Custom Name";
+
+ pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex, customName);
+
+ CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
+
+ assertEquals(defintion.getDataFields().getDataFieldArray(0).getFld(), columnIndex);
+ assertEquals(defintion.getDataFields().getDataFieldArray(0).getName(), customName);
+ }
+
+ /**
+ * Verify that it's not possible to create a column label outside of the referenced area.
+ */
+ @Test
+ public void testAddColumnLabelOutOfRangeThrowsException() {
+ int columnIndex = 5;
+
+ try {
+ pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex);
+ } catch(IndexOutOfBoundsException e) {
+ return;
+ }
+ fail();
+ }
+
+ /**
+ * Verify when creating a data column set to a data field, the data field with the corresponding
+ * column index will be set to true.
+ */
+ @Test
+ public void testAddDataColumn() {
+ int columnIndex = 0;
+ boolean isDataField = true;
+
+ pivotTable.addDataColumn(columnIndex, isDataField);
+ CTPivotFields pivotFields = pivotTable.getCTPivotTableDefinition().getPivotFields();
+ assertEquals(pivotFields.getPivotFieldArray(columnIndex).getDataField(), isDataField);
+ }
+
+ /**
+ * Verify that it's not possible to create a data column outside of the referenced area.
+ */
+ @Test
+ public void testAddDataColumnOutOfRangeThrowsException() {
+ int columnIndex = 5;
+ boolean isDataField = true;
+
+ try {
+ pivotTable.addDataColumn(columnIndex, isDataField);
+ } catch(IndexOutOfBoundsException e) {
+ return;
+ }
+ fail();
+ }
+
+ /**
+ * Verify that it's possible to create a new filter
+ */
+ @Test
+ public void testAddReportFilter() {
+ int columnIndex = 0;
+
+ pivotTable.addReportFilter(columnIndex);
+ CTPageFields fields = pivotTable.getCTPivotTableDefinition().getPageFields();
+ CTPageField field = fields.getPageFieldArray(0);
+ assertEquals(field.getFld(), columnIndex);
+ assertEquals(field.getHier(), -1);
+ assertEquals(fields.getCount(), 1);
+ }
+
+ /**
+ * Verify that it's not possible to create a new filter outside of the referenced area.
+ */
+ @Test
+ public void testAddReportFilterOutOfRangeThrowsException() {
+ int columnIndex = 5;
+ try {
+ pivotTable.addReportFilter(columnIndex);
+ } catch(IndexOutOfBoundsException e) {
+ return;
+ }
+ fail();
+ }
+
+ /**
+ * Verify that the Pivot Table operates only within the referenced area, even when the
+ * first column of the referenced area is not index 0.
+ */
+ @Test
+ public void testAddDataColumnWithOffsetData() {
+ offsetPivotTable.addColumnLabel(DataConsolidateFunction.SUM, 1);
+ assertEquals(CellType.NUMERIC, offsetOuterCell.getCellTypeEnum());
+
+ offsetPivotTable.addColumnLabel(DataConsolidateFunction.SUM, 0);
+ }
+
+ @Test
+ public void testPivotTableSheetNamesAreCaseInsensitive() {
+ wb.setSheetName(0, "original");
+ wb.setSheetName(1, "offset");
+ XSSFSheet original = wb.getSheet("OriginaL");
+ XSSFSheet offset = wb.getSheet("OffseT");
+ // assume sheets are accessible via case-insensitive name
+ assertNotNull(original);
+ assertNotNull(offset);
+
+ AreaReference source = new AreaReference("ORIGinal!A1:C2", _testDataProvider.getSpreadsheetVersion());
+ // create a pivot table on the same sheet, case insensitive
+ original.createPivotTable(source, new CellReference("W1"));
+ // create a pivot table on a different sheet, case insensitive
+ offset.createPivotTable(source, new CellReference("W1"));
+ }
+}
assertEquals("09 Mar 2016", result);
}
+
+ // This bug is currently open. When this bug is fixed, it should not throw an AssertionError
+ @Test(expected=AssertionError.class)
+ public void test55076_collapseColumnGroups() throws Exception {
+ Workbook wb = new XSSFWorkbook();
+ Sheet sheet = wb.createSheet();
+
+ // this column collapsing bug only occurs when the grouped columns are different widths
+ sheet.setColumnWidth(1, 400);
+ sheet.setColumnWidth(2, 600);
+ sheet.setColumnWidth(3, 800);
+
+ assertEquals(400, sheet.getColumnWidth(1));
+ assertEquals(600, sheet.getColumnWidth(2));
+ assertEquals(800, sheet.getColumnWidth(3));
+
+ sheet.groupColumn(1, 3);
+ sheet.setColumnGroupCollapsed(1, true);
+
+ assertEquals(0, sheet.getColumnOutlineLevel(0));
+ assertEquals(1, sheet.getColumnOutlineLevel(1));
+ assertEquals(1, sheet.getColumnOutlineLevel(2));
+ assertEquals(1, sheet.getColumnOutlineLevel(3));
+ assertEquals(0, sheet.getColumnOutlineLevel(4));
+
+ // none of the columns should be hidden
+ // column group collapsing is a different concept
+ for (int c=0; c<5; c++) {
+ assertFalse("Column " + c, sheet.isColumnHidden(c));
+ }
+
+ assertEquals(400, sheet.getColumnWidth(1));
+ assertEquals(600, sheet.getColumnWidth(2));
+ assertEquals(800, sheet.getColumnWidth(3));
+
+ wb.close();
+ }
}
value = evaluator.evaluate(cell);
assertEquals(1, value.getNumberValue(), 0.001);
}
-
- @Test
- public void evaluateInCellReturnsSameDataType() throws IOException {
- XSSFWorkbook wb = new XSSFWorkbook();
- wb.createSheet().createRow(0).createCell(0);
- XSSFFormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
- XSSFCell cell = wb.getSheetAt(0).getRow(0).getCell(0);
- XSSFCell same = evaluator.evaluateInCell(cell);
- assertSame(cell, same);
- wb.close();
- }
}
+++ /dev/null
-/* ====================================================================
- 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.xssf.usermodel;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-import java.io.IOException;
-
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellType;
-import org.apache.poi.ss.usermodel.DataConsolidateFunction;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.util.AreaReference;
-import org.apache.poi.ss.util.CellReference;
-import org.apache.poi.xssf.XSSFITestDataProvider;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageField;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageFields;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotFields;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotTableDefinition;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataConsolidateFunction;
-
-public class TestXSSFPivotTable {
- private static final XSSFITestDataProvider _testDataProvider = XSSFITestDataProvider.instance;
- private XSSFWorkbook wb;
- private XSSFPivotTable pivotTable;
- private XSSFPivotTable offsetPivotTable;
- private Cell offsetOuterCell;
-
- @Before
- public void setUp(){
- wb = new XSSFWorkbook();
- XSSFSheet sheet = wb.createSheet();
-
- Row row1 = sheet.createRow(0);
- // Create a cell and put a value in it.
- Cell cell = row1.createCell(0);
- cell.setCellValue("Names");
- Cell cell2 = row1.createCell(1);
- cell2.setCellValue("#");
- Cell cell7 = row1.createCell(2);
- cell7.setCellValue("Data");
- Cell cell10 = row1.createCell(3);
- cell10.setCellValue("Value");
-
- Row row2 = sheet.createRow(1);
- Cell cell3 = row2.createCell(0);
- cell3.setCellValue("Jan");
- Cell cell4 = row2.createCell(1);
- cell4.setCellValue(10);
- Cell cell8 = row2.createCell(2);
- cell8.setCellValue("Apa");
- Cell cell11 = row1.createCell(3);
- cell11.setCellValue(11.11);
-
- Row row3 = sheet.createRow(2);
- Cell cell5 = row3.createCell(0);
- cell5.setCellValue("Ben");
- Cell cell6 = row3.createCell(1);
- cell6.setCellValue(9);
- Cell cell9 = row3.createCell(2);
- cell9.setCellValue("Bepa");
- Cell cell12 = row1.createCell(3);
- cell12.setCellValue(12.12);
-
- AreaReference source = new AreaReference("A1:C2", _testDataProvider.getSpreadsheetVersion());
- pivotTable = sheet.createPivotTable(source, new CellReference("H5"));
-
- XSSFSheet offsetSheet = wb.createSheet();
-
- Row tableRow_1 = offsetSheet.createRow(1);
- offsetOuterCell = tableRow_1.createCell(1);
- offsetOuterCell.setCellValue(-1);
- Cell tableCell_1_1 = tableRow_1.createCell(2);
- tableCell_1_1.setCellValue("Row #");
- Cell tableCell_1_2 = tableRow_1.createCell(3);
- tableCell_1_2.setCellValue("Exponent");
- Cell tableCell_1_3 = tableRow_1.createCell(4);
- tableCell_1_3.setCellValue("10^Exponent");
-
- Row tableRow_2 = offsetSheet.createRow(2);
- Cell tableCell_2_1 = tableRow_2.createCell(2);
- tableCell_2_1.setCellValue(0);
- Cell tableCell_2_2 = tableRow_2.createCell(3);
- tableCell_2_2.setCellValue(0);
- Cell tableCell_2_3 = tableRow_2.createCell(4);
- tableCell_2_3.setCellValue(1);
-
- Row tableRow_3= offsetSheet.createRow(3);
- Cell tableCell_3_1 = tableRow_3.createCell(2);
- tableCell_3_1.setCellValue(1);
- Cell tableCell_3_2 = tableRow_3.createCell(3);
- tableCell_3_2.setCellValue(1);
- Cell tableCell_3_3 = tableRow_3.createCell(4);
- tableCell_3_3.setCellValue(10);
-
- Row tableRow_4 = offsetSheet.createRow(4);
- Cell tableCell_4_1 = tableRow_4.createCell(2);
- tableCell_4_1.setCellValue(2);
- Cell tableCell_4_2 = tableRow_4.createCell(3);
- tableCell_4_2.setCellValue(2);
- Cell tableCell_4_3 = tableRow_4.createCell(4);
- tableCell_4_3.setCellValue(100);
-
- AreaReference offsetSource = new AreaReference(new CellReference("C2"), new CellReference("E4"));
- offsetPivotTable = offsetSheet.createPivotTable(offsetSource, new CellReference("C6"));
- }
-
- @After
- public void tearDown() throws IOException {
- XSSFWorkbook wb2 = _testDataProvider.writeOutAndReadBack(wb);
- wb.close();
- wb2.close();
- }
-
- /**
- * Verify that when creating a row label it's created on the correct row
- * and the count is increased by one.
- */
- @Test
- public void testAddRowLabelToPivotTable() {
- int columnIndex = 0;
-
- assertEquals(0, pivotTable.getRowLabelColumns().size());
-
- pivotTable.addRowLabel(columnIndex);
- CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
-
- assertEquals(defintion.getRowFields().getFieldArray(0).getX(), columnIndex);
- assertEquals(defintion.getRowFields().getCount(), 1);
- assertEquals(1, pivotTable.getRowLabelColumns().size());
-
- columnIndex = 1;
- pivotTable.addRowLabel(columnIndex);
- assertEquals(2, pivotTable.getRowLabelColumns().size());
-
- assertEquals(0, (int)pivotTable.getRowLabelColumns().get(0));
- assertEquals(1, (int)pivotTable.getRowLabelColumns().get(1));
- }
- /**
- * Verify that it's not possible to create a row label outside of the referenced area.
- */
- @Test
- public void testAddRowLabelOutOfRangeThrowsException() {
- int columnIndex = 5;
-
- try {
- pivotTable.addRowLabel(columnIndex);
- } catch(IndexOutOfBoundsException e) {
- return;
- }
- fail();
- }
-
- /**
- * Verify that when creating one column label, no col fields are being created.
- */
- @Test
- public void testAddOneColumnLabelToPivotTableDoesNotCreateColField() {
- int columnIndex = 0;
-
- pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex);
- CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
-
- assertEquals(defintion.getColFields(), null);
- }
-
- /**
- * Verify that it's possible to create three column labels with different DataConsolidateFunction
- */
- @Test
- public void testAddThreeDifferentColumnLabelsToPivotTable() {
- int columnOne = 0;
- int columnTwo = 1;
- int columnThree = 2;
-
- pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnOne);
- pivotTable.addColumnLabel(DataConsolidateFunction.MAX, columnTwo);
- pivotTable.addColumnLabel(DataConsolidateFunction.MIN, columnThree);
- CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
-
- assertEquals(defintion.getDataFields().getDataFieldList().size(), 3);
- }
-
-
- /**
- * Verify that it's possible to create three column labels with the same DataConsolidateFunction
- */
- @Test
- public void testAddThreeSametColumnLabelsToPivotTable() {
- int columnOne = 0;
- int columnTwo = 1;
- int columnThree = 2;
-
- pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnOne);
- pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnTwo);
- pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnThree);
- CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
-
- assertEquals(defintion.getDataFields().getDataFieldList().size(), 3);
- }
-
- /**
- * Verify that when creating two column labels, a col field is being created and X is set to -2.
- */
- @Test
- public void testAddTwoColumnLabelsToPivotTable() {
- int columnOne = 0;
- int columnTwo = 1;
-
- pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnOne);
- pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnTwo);
- CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
-
- assertEquals(defintion.getColFields().getFieldArray(0).getX(), -2);
- }
-
- /**
- * Verify that a data field is created when creating a data column
- */
- @Test
- public void testColumnLabelCreatesDataField() {
- int columnIndex = 0;
-
- pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex);
-
- CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
-
- assertEquals(defintion.getDataFields().getDataFieldArray(0).getFld(), columnIndex);
- assertEquals(defintion.getDataFields().getDataFieldArray(0).getSubtotal(),
- STDataConsolidateFunction.Enum.forInt(DataConsolidateFunction.SUM.getValue()));
- }
-
- /**
- * Verify that it's possible to set a custom name when creating a data column
- */
- @Test
- public void testColumnLabelSetCustomName() {
- int columnIndex = 0;
-
- String customName = "Custom Name";
-
- pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex, customName);
-
- CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
-
- assertEquals(defintion.getDataFields().getDataFieldArray(0).getFld(), columnIndex);
- assertEquals(defintion.getDataFields().getDataFieldArray(0).getName(), customName);
- }
-
- /**
- * Verify that it's not possible to create a column label outside of the referenced area.
- */
- @Test
- public void testAddColumnLabelOutOfRangeThrowsException() {
- int columnIndex = 5;
-
- try {
- pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex);
- } catch(IndexOutOfBoundsException e) {
- return;
- }
- fail();
- }
-
- /**
- * Verify when creating a data column set to a data field, the data field with the corresponding
- * column index will be set to true.
- */
- @Test
- public void testAddDataColumn() {
- int columnIndex = 0;
- boolean isDataField = true;
-
- pivotTable.addDataColumn(columnIndex, isDataField);
- CTPivotFields pivotFields = pivotTable.getCTPivotTableDefinition().getPivotFields();
- assertEquals(pivotFields.getPivotFieldArray(columnIndex).getDataField(), isDataField);
- }
-
- /**
- * Verify that it's not possible to create a data column outside of the referenced area.
- */
- @Test
- public void testAddDataColumnOutOfRangeThrowsException() {
- int columnIndex = 5;
- boolean isDataField = true;
-
- try {
- pivotTable.addDataColumn(columnIndex, isDataField);
- } catch(IndexOutOfBoundsException e) {
- return;
- }
- fail();
- }
-
- /**
- * Verify that it's possible to create a new filter
- */
- public void testAddReportFilter() {
- int columnIndex = 0;
-
- pivotTable.addReportFilter(columnIndex);
- CTPageFields fields = pivotTable.getCTPivotTableDefinition().getPageFields();
- CTPageField field = fields.getPageFieldArray(0);
- assertEquals(field.getFld(), columnIndex);
- assertEquals(field.getHier(), -1);
- assertEquals(fields.getCount(), 1);
- }
-
- /**
- * Verify that it's not possible to create a new filter outside of the referenced area.
- */
- @Test
- public void testAddReportFilterOutOfRangeThrowsException() {
- int columnIndex = 5;
- try {
- pivotTable.addReportFilter(columnIndex);
- } catch(IndexOutOfBoundsException e) {
- return;
- }
- fail();
- }
-
- /**
- * Verify that the Pivot Table operates only within the referenced area, even when the
- * first column of the referenced area is not index 0.
- */
- @Test
- public void testAddDataColumnWithOffsetData() {
- offsetPivotTable.addColumnLabel(DataConsolidateFunction.SUM, 1);
- assertEquals(CellType.NUMERIC, offsetOuterCell.getCellTypeEnum());
-
- offsetPivotTable.addColumnLabel(DataConsolidateFunction.SUM, 0);
- }
-
- @Test
- public void testPivotTableSheetNamesAreCaseInsensitive() {
- wb.setSheetName(0, "original");
- wb.setSheetName(1, "offset");
- XSSFSheet original = wb.getSheet("OriginaL");
- XSSFSheet offset = wb.getSheet("OffseT");
- // assume sheets are accessible via case-insensitive name
- assertNotNull(original);
- assertNotNull(offset);
-
- AreaReference source = new AreaReference("ORIGinal!A1:C2", _testDataProvider.getSpreadsheetVersion());
- // create a pivot table on the same sheet, case insensitive
- original.createPivotTable(source, new CellReference("W1"));
- // create a pivot table on a different sheet, case insensitive
- offset.createPivotTable(source, new CellReference("W1"));
- }
-}
--- /dev/null
+/* ====================================================================
+ 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.xssf.usermodel;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.util.CellReference;
+import org.junit.Before;
+
+/**
+ * Test pivot tables created by named range
+ */
+public class TestXSSFPivotTableName extends BaseTestXSSFPivotTable {
+
+ @Override
+ @Before
+ public void setUp(){
+ wb = new XSSFWorkbook();
+ XSSFSheet sheet = wb.createSheet();
+
+ Row row1 = sheet.createRow(0);
+ // Create a cell and put a value in it.
+ Cell cell = row1.createCell(0);
+ cell.setCellValue("Names");
+ Cell cell2 = row1.createCell(1);
+ cell2.setCellValue("#");
+ Cell cell7 = row1.createCell(2);
+ cell7.setCellValue("Data");
+ Cell cell10 = row1.createCell(3);
+ cell10.setCellValue("Value");
+
+ Row row2 = sheet.createRow(1);
+ Cell cell3 = row2.createCell(0);
+ cell3.setCellValue("Jan");
+ Cell cell4 = row2.createCell(1);
+ cell4.setCellValue(10);
+ Cell cell8 = row2.createCell(2);
+ cell8.setCellValue("Apa");
+ Cell cell11 = row1.createCell(3);
+ cell11.setCellValue(11.11);
+
+ Row row3 = sheet.createRow(2);
+ Cell cell5 = row3.createCell(0);
+ cell5.setCellValue("Ben");
+ Cell cell6 = row3.createCell(1);
+ cell6.setCellValue(9);
+ Cell cell9 = row3.createCell(2);
+ cell9.setCellValue("Bepa");
+ Cell cell12 = row1.createCell(3);
+ cell12.setCellValue(12.12);
+
+ XSSFName namedRange = sheet.getWorkbook().createName();
+ namedRange.setRefersToFormula(sheet.getSheetName() + "!" + "A1:C2");
+ pivotTable = sheet.createPivotTable(namedRange, new CellReference("H5"));
+
+ XSSFSheet offsetSheet = wb.createSheet();
+
+ Row tableRow_1 = offsetSheet.createRow(1);
+ offsetOuterCell = tableRow_1.createCell(1);
+ offsetOuterCell.setCellValue(-1);
+ Cell tableCell_1_1 = tableRow_1.createCell(2);
+ tableCell_1_1.setCellValue("Row #");
+ Cell tableCell_1_2 = tableRow_1.createCell(3);
+ tableCell_1_2.setCellValue("Exponent");
+ Cell tableCell_1_3 = tableRow_1.createCell(4);
+ tableCell_1_3.setCellValue("10^Exponent");
+
+ Row tableRow_2 = offsetSheet.createRow(2);
+ Cell tableCell_2_1 = tableRow_2.createCell(2);
+ tableCell_2_1.setCellValue(0);
+ Cell tableCell_2_2 = tableRow_2.createCell(3);
+ tableCell_2_2.setCellValue(0);
+ Cell tableCell_2_3 = tableRow_2.createCell(4);
+ tableCell_2_3.setCellValue(1);
+
+ Row tableRow_3= offsetSheet.createRow(3);
+ Cell tableCell_3_1 = tableRow_3.createCell(2);
+ tableCell_3_1.setCellValue(1);
+ Cell tableCell_3_2 = tableRow_3.createCell(3);
+ tableCell_3_2.setCellValue(1);
+ Cell tableCell_3_3 = tableRow_3.createCell(4);
+ tableCell_3_3.setCellValue(10);
+
+ Row tableRow_4 = offsetSheet.createRow(4);
+ Cell tableCell_4_1 = tableRow_4.createCell(2);
+ tableCell_4_1.setCellValue(2);
+ Cell tableCell_4_2 = tableRow_4.createCell(3);
+ tableCell_4_2.setCellValue(2);
+ Cell tableCell_4_3 = tableRow_4.createCell(4);
+ tableCell_4_3.setCellValue(100);
+
+ namedRange = sheet.getWorkbook().createName();
+ namedRange.setRefersToFormula("C2:E4");
+ namedRange.setSheetIndex(sheet.getWorkbook().getSheetIndex(sheet));
+ offsetPivotTable = offsetSheet.createPivotTable(namedRange, new CellReference("C6"));
+ }
+}
--- /dev/null
+/* ====================================================================
+ 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.xssf.usermodel;
+
+import org.apache.poi.ss.SpreadsheetVersion;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.util.AreaReference;
+import org.apache.poi.ss.util.CellReference;
+import org.junit.Before;
+
+/**
+ * Test pivot tables created by area reference
+ */
+public class TestXSSFPivotTableRef extends BaseTestXSSFPivotTable {
+
+ @Override
+ @Before
+ public void setUp(){
+ wb = new XSSFWorkbook();
+ XSSFSheet sheet = wb.createSheet();
+
+ Row row1 = sheet.createRow(0);
+ // Create a cell and put a value in it.
+ Cell cell = row1.createCell(0);
+ cell.setCellValue("Names");
+ Cell cell2 = row1.createCell(1);
+ cell2.setCellValue("#");
+ Cell cell7 = row1.createCell(2);
+ cell7.setCellValue("Data");
+ Cell cell10 = row1.createCell(3);
+ cell10.setCellValue("Value");
+
+ Row row2 = sheet.createRow(1);
+ Cell cell3 = row2.createCell(0);
+ cell3.setCellValue("Jan");
+ Cell cell4 = row2.createCell(1);
+ cell4.setCellValue(10);
+ Cell cell8 = row2.createCell(2);
+ cell8.setCellValue("Apa");
+ Cell cell11 = row1.createCell(3);
+ cell11.setCellValue(11.11);
+
+ Row row3 = sheet.createRow(2);
+ Cell cell5 = row3.createCell(0);
+ cell5.setCellValue("Ben");
+ Cell cell6 = row3.createCell(1);
+ cell6.setCellValue(9);
+ Cell cell9 = row3.createCell(2);
+ cell9.setCellValue("Bepa");
+ Cell cell12 = row1.createCell(3);
+ cell12.setCellValue(12.12);
+
+ AreaReference source = new AreaReference("A1:C2", SpreadsheetVersion.EXCEL2007);
+ pivotTable = sheet.createPivotTable(source, new CellReference("H5"));
+
+ XSSFSheet offsetSheet = wb.createSheet();
+
+ Row tableRow_1 = offsetSheet.createRow(1);
+ offsetOuterCell = tableRow_1.createCell(1);
+ offsetOuterCell.setCellValue(-1);
+ Cell tableCell_1_1 = tableRow_1.createCell(2);
+ tableCell_1_1.setCellValue("Row #");
+ Cell tableCell_1_2 = tableRow_1.createCell(3);
+ tableCell_1_2.setCellValue("Exponent");
+ Cell tableCell_1_3 = tableRow_1.createCell(4);
+ tableCell_1_3.setCellValue("10^Exponent");
+
+ Row tableRow_2 = offsetSheet.createRow(2);
+ Cell tableCell_2_1 = tableRow_2.createCell(2);
+ tableCell_2_1.setCellValue(0);
+ Cell tableCell_2_2 = tableRow_2.createCell(3);
+ tableCell_2_2.setCellValue(0);
+ Cell tableCell_2_3 = tableRow_2.createCell(4);
+ tableCell_2_3.setCellValue(1);
+
+ Row tableRow_3= offsetSheet.createRow(3);
+ Cell tableCell_3_1 = tableRow_3.createCell(2);
+ tableCell_3_1.setCellValue(1);
+ Cell tableCell_3_2 = tableRow_3.createCell(3);
+ tableCell_3_2.setCellValue(1);
+ Cell tableCell_3_3 = tableRow_3.createCell(4);
+ tableCell_3_3.setCellValue(10);
+
+ Row tableRow_4 = offsetSheet.createRow(4);
+ Cell tableCell_4_1 = tableRow_4.createCell(2);
+ tableCell_4_1.setCellValue(2);
+ Cell tableCell_4_2 = tableRow_4.createCell(3);
+ tableCell_4_2.setCellValue(2);
+ Cell tableCell_4_3 = tableRow_4.createCell(4);
+ tableCell_4_3.setCellValue(100);
+
+ AreaReference offsetSource = new AreaReference(new CellReference("C2"), new CellReference("E4"));
+ offsetPivotTable = offsetSheet.createPivotTable(offsetSource, new CellReference("C6"));
+ }
+}
System.out.println("Array formulas currently unsupported");
// FIXME: Array Formula set with Sheet.setArrayFormula() instead of cell.setFormula()
/*
- assertEquals("[Array Formula] N7 cell type", CellType.FORMULA, cell.getCellType());
+ assertEquals("[Array Formula] N7 cell type", CellType.FORMULA, cell.getCellTypeEnum());
assertEquals("[Array Formula] N7 cell formula", "{SUM(H7:J7*{1,2,3})}", cell.getCellFormula());
*/
// System.out.println("Array formulas currently unsupported");
/*
// FIXME: Array Formula set with Sheet.setArrayFormula() instead of cell.setFormula()
- assertEquals("[Array Formula] N10 cell type", CellType.FORMULA, cell.getCellType());
+ assertEquals("[Array Formula] N10 cell type", CellType.FORMULA, cell.getCellTypeEnum());
assertEquals("[Array Formula] N10 cell formula", "{SUM(H10:J10*{1,2,3})}", cell.getCellFormula());
cell = CellUtil.getCell(destRow2, col);
// FIXME: Array Formula set with Sheet.setArrayFormula() instead of cell.setFormula()
- assertEquals("[Array Formula] N11 cell type", CellType.FORMULA, cell.getCellType());
+ assertEquals("[Array Formula] N11 cell type", CellType.FORMULA, cell.getCellTypeEnum());
assertEquals("[Array Formula] N11 cell formula", "{SUM(H11:J11*{1,2,3})}", cell.getCellFormula());
*/
}
}
+
+ // bug 59687: XSSFSheet.RemoveRow doesn't handle row gaps properly when removing row comments
+ @Test
+ public void testRemoveRowWithCommentAndGapAbove() throws IOException {
+ final Workbook wb = _testDataProvider.openSampleWorkbook("59687.xlsx");
+ final Sheet sheet = wb.getSheetAt(0);
+
+ // comment exists
+ CellAddress commentCellAddress = new CellAddress("A4");
+ assertNotNull(sheet.getCellComment(commentCellAddress));
+
+ assertEquals("Wrong starting # of comments", 1, sheet.getCellComments().size());
+
+ sheet.removeRow(sheet.getRow(commentCellAddress.getRow()));
+
+ assertEquals("There should not be any comments left!", 0, sheet.getCellComments().size());
+ }
}
package org.apache.poi.xssf.usermodel;
+import static org.apache.poi.POITestCase.skipTest;
+import static org.apache.poi.POITestCase.testPassesNow;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import org.apache.poi.ss.util.CellUtil;
import org.apache.poi.xssf.XSSFITestDataProvider;
import org.apache.poi.xssf.XSSFTestDataSamples;
-import org.junit.Ignore;
+import org.apache.xmlbeans.impl.values.XmlValueDisconnectedException;
import org.junit.Test;
public final class TestXSSFSheetShiftRows extends BaseTestSheetShiftRows {
wb.close();
}
- @Ignore("Bug 59733 - shiftRows() causes org.apache.xmlbeans.impl.values.XmlValueDisconnectedException")
+ // This test is written as expected-to-fail and should be rewritten
+ // as expected-to-pass when the bug is fixed.
+ //@Ignore("Bug 59733 - shiftRows() causes org.apache.xmlbeans.impl.values.XmlValueDisconnectedException")
@Test
public void bug59733() throws IOException {
Workbook workbook = new XSSFWorkbook();
at org.apache.poi.xssf.usermodel.XSSFRow.getRowNum(XSSFRow.java:363)
at org.apache.poi.xssf.usermodel.TestXSSFSheetShiftRows.bug59733(TestXSSFSheetShiftRows.java:393)
*/
- sheet.removeRow(sheet.getRow(0));
- assertEquals(1, sheet.getRow(1).getRowNum());
+ // FIXME: remove try, catch, and testPassesNow, skipTest when test passes
+ try {
+ sheet.removeRow(sheet.getRow(0));
+ assertEquals(1, sheet.getRow(1).getRowNum());
+ testPassesNow(59733);
+ } catch (XmlValueDisconnectedException e) {
+ skipTest(e);
+ }
+
workbook.close();
+ }\r
+\r
+ private static String getCellFormula(Sheet sheet, String address) {\r
+ CellAddress cellAddress = new CellAddress(address);\r
+ Row row = sheet.getRow(cellAddress.getRow());\r
+ assertNotNull(row);\r
+ Cell cell = row.getCell(cellAddress.getColumn());\r
+ assertNotNull(cell);\r
+ assertEquals(CellType.FORMULA, cell.getCellTypeEnum());\r
+ return cell.getCellFormula();\r
+ }\r
+
+ // This test is written as expected-to-fail and should be rewritten
+ // as expected-to-pass when the bug is fixed.
+ @Test\r
+ public void testSharedFormulas() throws Exception {\r
+ XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("TestShiftRowSharedFormula.xlsx");\r
+ XSSFSheet sheet = wb.getSheetAt(0);\r
+ assertEquals("SUM(C2:C4)", getCellFormula(sheet, "C5"));\r
+ assertEquals("SUM(D2:D4)", getCellFormula(sheet, "D5"));\r
+ assertEquals("SUM(E2:E4)", getCellFormula(sheet, "E5"));\r
+\r
+ sheet.shiftRows(3, sheet.getLastRowNum(), 1);
+ // FIXME: remove try, catch, and testPassesNow, skipTest when test passes\r
+ try {\r
+ assertEquals("SUM(C2:C5)", getCellFormula(sheet, "C6"));\r
+ assertEquals("SUM(D2:D5)", getCellFormula(sheet, "D6"));\r
+ assertEquals("SUM(E2:E5)", getCellFormula(sheet, "E6"));
+ testPassesNow(59983);
+ } catch (AssertionError e) {
+ skipTest(e);
+ }
+
+ wb.close();\r
}
}
/**
* Returns the contents of the attachment.
+ *
+ * @throws IllegalArgumentException if there is no AttachmentData available in this Attachment
*/
public byte[] getContents() {
TNEFAttribute contents = getAttribute(TNEFProperty.ID_ATTACHDATA);
{
block.setAttribute(
"text-indent",
- String.valueOf( paragraph.getFirstLineIndent()
- / TWIPS_PER_PT )
+ paragraph.getFirstLineIndent()
+ / TWIPS_PER_PT
+ "pt" );
}
if ( paragraph.getIndentFromLeft() != 0 )
{
block.setAttribute(
"start-indent",
- String.valueOf( paragraph.getIndentFromLeft()
- / TWIPS_PER_PT )
+ paragraph.getIndentFromLeft()
+ / TWIPS_PER_PT
+ "pt" );
}
if ( paragraph.getIndentFromRight() != 0 )
{
block.setAttribute(
"end-indent",
- String.valueOf( paragraph.getIndentFromRight()
- / TWIPS_PER_PT )
+ paragraph.getIndentFromRight()
+ / TWIPS_PER_PT
+ "pt" );
}
if ( paragraph.getSpacingBefore() != 0 )
{
block.setAttribute(
"space-before",
- String.valueOf( paragraph.getSpacingBefore() / TWIPS_PER_PT )
+ paragraph.getSpacingBefore() / TWIPS_PER_PT
+ "pt" );
}
if ( paragraph.getSpacingAfter() != 0 )
{
block.setAttribute( "space-after",
- String.valueOf( paragraph.getSpacingAfter() / TWIPS_PER_PT )
+ paragraph.getSpacingAfter() / TWIPS_PER_PT
+ "pt" );
}
}
import org.apache.poi.hwpf.model.SubdocumentType;
import org.apache.poi.hwpf.model.io.HWPFOutputStream;
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.util.IOUtils;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
import java.io.ByteArrayOutputStream;
+import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
HWPFDocument hwpfDocument2 = HWPFTestDataSamples.writeOutAndReadBack(hwpfDocument);
assertNotNull(hwpfDocument2);
}
+
+ public void test57843() throws IOException {
+ try {
+ File f = POIDataSamples.getDocumentInstance().getFile("57843.doc");
+ boolean readOnly = true;
+ POIFSFileSystem fs = new POIFSFileSystem(f, readOnly);
+ HWPFOldDocument doc = new HWPFOldDocument(fs);
+ assertNotNull(doc);
+ doc.close();
+ fs.close();
+ fixed("57843");
+ } catch (ArrayIndexOutOfBoundsException e) {
+ // expected until this bug is fixed
+ }
+ }
}
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
}
}
}
+
+ /**
+ * Rather than adding {@literal @}Ignore to known-failing tests,
+ * write the test so that it notifies us if it starts passing.
+ * This is useful for closing related or forgotten bugs.
+ *
+ * An Example:
+ * <code><pre>
+ * public static int add(int a, int b) {
+ * // a known bug in behavior that has not been fixed yet
+ * raise UnsupportedOperationException("add");
+ * }
+ *
+ * {@literal @}Test
+ * public void knownFailingUnitTest() {
+ * try {
+ * assertEquals(2, add(1,1));
+ * // this test fails because the assumption that this bug had not been fixed is false
+ * testPassesNow(12345);
+ * } catch (UnsupportedOperationException e) {
+ * // test is skipped because the assumption that this bug had not been fixed is true
+ * skipTest(e);
+ * }
+ * }
+ *
+ * Once passing, this unit test can be rewritten as:
+ * {@literal @}Test
+ * public void knownPassingUnitTest() {
+ * assertEquals(2, add(1,1));
+ * }
+ *
+ * If you have a better idea how to simplify test code while still notifying
+ * us when a previous known-failing test now passes, please improve these.
+ * As a bonus, a known-failing test that fails should not be counted as a
+ * passing test.
+ *
+ * One possible alternative is to expect the known exception, but without
+ * a clear message that it is a good thing to no longer get the expected
+ * exception once the test passes.
+ * {@literal @}Test(expected=UnsupportedOperationException.class)
+ * public void knownFailingUnitTest() {
+ * assertEquals(2, add(1,1));
+ * }
+ *
+ * @param e the exception that was caught that will no longer
+ * be raised when the bug is fixed
+ */
+ public static void skipTest(Throwable e) {
+ assumeTrue("This test currently fails with " + e, false);
+ }
+ /**
+ * @see #skipTest(Throwable)
+ *
+ * @param bug the bug number corresponding to a known bug in bugzilla
+ */
+ public static void testPassesNow(int bug) {
+ fail("This test passes now. Please update the unit test and bug " + bug + ".");
+ }
}
// TODO - Fix these so they work...
/*row = s.getRow(4);
- assertEquals(CellType.FORMULA, row.getCell(1).getCellType());
+ assertEquals(CellType.FORMULA, row.getCell(1).getCellTypeEnum());
assertEquals("'[$http://gagravarr.org/FormulaRefs2.xls]Sheet1'!B2", row.getCell(1).getCellFormula());
assertEquals(123.0, row.getCell(1).getNumericCellValue(), 0);
row = s.getRow(5);
- assertEquals(CellType.FORMULA, row.getCell(1).getCellType());
+ assertEquals(CellType.FORMULA, row.getCell(1).getCellTypeEnum());
assertEquals("'[$http://example.com/FormulaRefs.xls]Sheet1'!B1", row.getCell(1).getCellFormula());
assertEquals(234.0, row.getCell(1).getNumericCellValue(), 0);*/
{
for (int k = 0; k < paths.length; k++)
{
- assertEquals(String.valueOf(j) + "<>" + String.valueOf(k),
+ assertEquals(j + "<>" + k,
paths[ j ], paths[ k ]);
}
}
{
if (k == j)
{
- assertEquals(String.valueOf(j) + "<>"
- + String.valueOf(k), fullPaths[ j ],
+ assertEquals(j + "<>"
+ + k, fullPaths[ j ],
builtUpPaths[ k ]);
}
else
{
- assertTrue(String.valueOf(j) + "<>" + String.valueOf(k),
+ assertTrue(j + "<>" + k,
!(fullPaths[ j ].equals(builtUpPaths[ k ])));
}
}
{
for (int j = 0; j < badPaths.length; j++)
{
- assertTrue(String.valueOf(j) + "<>" + String.valueOf(k),
+ assertTrue(j + "<>" + k,
!(fullPaths[ k ].equals(badPaths[ j ])));
}
}
package org.apache.poi.poifs.macros;
import static org.apache.poi.POITestCase.assertContains;
+import static org.apache.poi.POITestCase.skipTest;
+import static org.apache.poi.POITestCase.testPassesNow;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
import java.io.File;
import java.io.FileInputStream;
public void bug59858() throws IOException {
try {
fromFile(POIDataSamples.getSpreadSheetInstance(), "59858.xls");
- fail("This test passes now. Please update the unit test and bug 59858.");
+ testPassesNow(59858);
} catch (IOException e) {
if (e.getMessage().matches("Module offset for '.+' was never read.")) {
//e.printStackTrace();
// NPE when reading module.offset in VBAMacroReader.readMacros (approx line 258)
- assumeTrue("This test currently fails. See stdout.", false);
+ skipTest(e);
} else {
// something unexpected failed
throw e;
}
}
}
+
+ // This test is written as expected-to-fail and should be rewritten
+ // as expected-to-pass when the bug is fixed.
+ @Test
+ public void bug60158() throws IOException {
+ try {
+ fromFile(POIDataSamples.getDocumentInstance(), "60158.docm");
+ testPassesNow(60158);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ skipTest(e);
+ }
+ }
}
assertEquals("Checks that the cell is numeric",
- CellType.STRING, evaluator.evaluate(cell2).getCellTypeEnum());
+ CellType.STRING, evaluator.evaluate(cell2).getCellTypeEnum());
assertEquals("Rounds -10 to a nearest multiple of -3 (-9)",
"Error in calculation", evaluator.evaluate(cell2).getStringValue());
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.awt.geom.Rectangle2D;
-import java.io.FileInputStream;
import java.io.IOException;
import java.text.AttributedString;
-import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import static org.junit.Assert.*;
package org.apache.poi.ss.usermodel;
+import static org.apache.poi.POITestCase.skipTest;
+import static org.apache.poi.POITestCase.testPassesNow;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
wb.close();
}
- @Ignore("bug 56454: Incorrectly handles merged regions that do not contain column 0")
+ //@Ignore("bug 56454: Incorrectly handles merged regions that do not contain column 0")
@Test
public final void shiftWithMergedRegions_bug56454() throws IOException {
Workbook wb = _testDataProvider.createWorkbook();
expectedMergedRegions.add(A4_B8);
expectedMergedRegions.add(C4_D8);
- assertEquals(expectedMergedRegions, sheet.getMergedRegions());
+ // This test is written as expected-to-fail and should be rewritten
+ // as expected-to-pass when the bug is fixed.
+ // FIXME: remove try, catch, and testPassesNow, skipTest when test passes
+ try {
+ assertEquals(expectedMergedRegions, sheet.getMergedRegions());
+ testPassesNow(56454);
+ } catch (AssertionError e) {
+ skipTest(e);
+ }
wb.close();
}
read.close();
}
- @Ignore("bug 56454: Incorrectly handles merged regions that do not contain column 0")
+ //@Ignore("bug 56454: Incorrectly handles merged regions that do not contain column 0")
@Test
public void shiftRowsWithMergedRegionsThatDoNotContainColumnZero() throws IOException {
Workbook wb = _testDataProvider.createWorkbook();
// C5:D7 will be shifted down with same size
sheet.shiftRows(4, sheet.getLastRowNum(), 1);
- assertEquals(2, sheet.getNumMergedRegions());
- assertEquals(CellRangeAddress.valueOf("A4:B8"), sheet.getMergedRegion(0));
- assertEquals(CellRangeAddress.valueOf("C5:D8"), sheet.getMergedRegion(1));
+ // This test is written as expected-to-fail and should be rewritten
+ // as expected-to-pass when the bug is fixed.
+ // FIXME: remove try, catch, and testPassesNow, skipTest when test passes
+ try {
+ assertEquals(2, sheet.getNumMergedRegions());
+ assertEquals(CellRangeAddress.valueOf("A4:B8"), sheet.getMergedRegion(0));
+ assertEquals(CellRangeAddress.valueOf("C5:D8"), sheet.getMergedRegion(1));
+ testPassesNow(56454);
+ } catch (AssertionError e) {
+ skipTest(e);
+ }
wb.close();
}
assertEquals(cra.formatAsString(), mcell.getArrayFormulaRange().formatAsString());
assertEquals("A2:A4*B2:B4", mcell.getCellFormula());
assertTrue(mcell.isPartOfArrayFormulaGroup());
- assertEquals(CellType.FORMULA, mcell.getCellType());
+ assertEquals(CellType.FORMULA, mcell.getCellTypeEnum());
}
*/
* POILogger which logs into an ArrayList, so that
* tests can see what got logged
*/
+@Internal
public class DummyPOILogger extends POILogger {
public List<String>logged = new ArrayList<String>();
public void initialize(String cat) {}
@Override
- public void log(int level, Object obj1) {
+ protected void _log(int level, Object obj1) {
logged.add(level + " - " + obj1);
}
@Override
- public void log(int level, Object obj1, Throwable exception) {
+ protected void _log(int level, Object obj1, Throwable exception) {
logged.add(level + " - " + obj1 + " - " + exception);
}
}
}
@Override
- public void log(int level, Object obj1) {
+ protected void _log(int level, Object obj1) {
lastLog = (obj1 == null) ? "" : obj1.toString();
lastEx = null;
}
@Override
- public void log(int level, Object obj1, Throwable exception) {
+ protected void _log(int level, Object obj1, Throwable exception) {
lastLog = (obj1 == null) ? "" : obj1.toString();
lastEx = exception;
}