merge trunk to branch
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/hssf_cryptoapi@1762709 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
cda4f20482
commit
0a7cd3b68b
99
KEYS
99
KEYS
@ -2386,3 +2386,102 @@ cCRRHYCeAZDU5UMxi0nonfT+060i2rLPSd7o0bstG7gb1pD99rKxL57M7uy+WBnk
|
||||
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-----
|
||||
|
21
build.gradle
Normal file
21
build.gradle
Normal file
@ -0,0 +1,21 @@
|
||||
/* ====================================================================
|
||||
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'
|
@ -40,7 +40,7 @@ under the License.
|
||||
|
||||
<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"/>
|
||||
@ -78,7 +78,7 @@ under the License.
|
||||
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=""/>
|
||||
|
@ -35,6 +35,13 @@
|
||||
<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>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<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>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<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>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<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>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<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>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<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>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<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>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<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>
|
||||
|
@ -3,7 +3,7 @@
|
||||
<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>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<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>
|
||||
|
@ -67,27 +67,21 @@ public class InCellLists {
|
||||
* the Excel spreadsheet file this code will create.
|
||||
*/
|
||||
public void demonstrateMethodCalls(String outputFilename) throws IOException {
|
||||
HSSFWorkbook workbook = null;
|
||||
HSSFSheet sheet = null;
|
||||
HSSFRow row = null;
|
||||
HSSFCell cell = null;
|
||||
ArrayList<MultiLevelListItem> multiLevelListItems = null;
|
||||
ArrayList<String> listItems = null;
|
||||
HSSFWorkbook workbook = new HSSFWorkbook();
|
||||
try {
|
||||
workbook = new HSSFWorkbook();
|
||||
sheet = workbook.createSheet("In Cell Lists");
|
||||
row = sheet.createRow(0);
|
||||
HSSFSheet sheet = workbook.createSheet("In Cell Lists");
|
||||
HSSFRow row = sheet.createRow(0);
|
||||
|
||||
// Create a cell at A1 and insert a single, bulleted, item into
|
||||
// that cell.
|
||||
cell = row.createCell(0);
|
||||
HSSFCell cell = row.createCell(0);
|
||||
this.bulletedItemInCell(workbook, "List Item", cell);
|
||||
|
||||
// Create a cell at A2 and insert a plain list - that is one
|
||||
// whose items are neither bulleted or numbered - into that cell.
|
||||
row = sheet.createRow(1);
|
||||
cell = row.createCell(0);
|
||||
listItems = new ArrayList<String>();
|
||||
ArrayList<String> listItems = new ArrayList<String>();
|
||||
listItems.add("List Item One.");
|
||||
listItems.add("List Item Two.");
|
||||
listItems.add("List Item Three.");
|
||||
@ -131,7 +125,7 @@ public class InCellLists {
|
||||
// to preserve order.
|
||||
row = sheet.createRow(4);
|
||||
cell = row.createCell(0);
|
||||
multiLevelListItems = new ArrayList<MultiLevelListItem>();
|
||||
ArrayList<MultiLevelListItem> multiLevelListItems = new ArrayList<MultiLevelListItem>();
|
||||
listItems = new ArrayList<String>();
|
||||
listItems.add("ML List Item One - Sub Item One.");
|
||||
listItems.add("ML List Item One - Sub Item Two.");
|
||||
@ -189,9 +183,7 @@ public class InCellLists {
|
||||
ioEx.printStackTrace(System.out);
|
||||
}
|
||||
finally {
|
||||
if (workbook != null) {
|
||||
workbook.close();
|
||||
}
|
||||
workbook.close();
|
||||
}
|
||||
}
|
||||
|
||||
@ -236,7 +228,7 @@ public class InCellLists {
|
||||
* will be written.
|
||||
*/
|
||||
public void listInCell(HSSFWorkbook workbook, ArrayList<String> listItems, HSSFCell cell) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
HSSFCellStyle wrapStyle = workbook.createCellStyle();
|
||||
wrapStyle.setWrapText(true);
|
||||
for(String listItem : listItems) {
|
||||
@ -269,7 +261,7 @@ public class InCellLists {
|
||||
HSSFCell cell,
|
||||
int startingValue,
|
||||
int increment) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
int itemNumber = startingValue;
|
||||
// Note that again, an HSSFCellStye object is required and that
|
||||
// it's wrap text property should be set to 'true'
|
||||
@ -278,7 +270,7 @@ public class InCellLists {
|
||||
// Note that the basic method is identical to the listInCell() method
|
||||
// with one difference; a number prefixed to the items text.
|
||||
for(String listItem : listItems) {
|
||||
buffer.append(String.valueOf(itemNumber) + ". ");
|
||||
buffer.append(itemNumber).append(". ");
|
||||
buffer.append(listItem);
|
||||
buffer.append("\n");
|
||||
itemNumber += increment;
|
||||
@ -303,7 +295,7 @@ public class InCellLists {
|
||||
public void bulletedListInCell(HSSFWorkbook workbook,
|
||||
ArrayList<String> listItems,
|
||||
HSSFCell cell) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
// Note that again, an HSSFCellStye object is required and that
|
||||
// it's wrap text property should be set to 'true'
|
||||
HSSFCellStyle wrapStyle = workbook.createCellStyle();
|
||||
@ -339,8 +331,7 @@ public class InCellLists {
|
||||
public void multiLevelListInCell(HSSFWorkbook workbook,
|
||||
ArrayList<MultiLevelListItem> multiLevelListItems,
|
||||
HSSFCell cell) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
ArrayList<String> lowerLevelItems = null;
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
// Note that again, an HSSFCellStye object is required and that
|
||||
// it's wrap text property should be set to 'true'
|
||||
HSSFCellStyle wrapStyle = workbook.createCellStyle();
|
||||
@ -353,7 +344,7 @@ public class InCellLists {
|
||||
buffer.append("\n");
|
||||
// and then an ArrayList whose elements encapsulate the text
|
||||
// for the lower level list items.
|
||||
lowerLevelItems = multiLevelListItem.getLowerLevelItems();
|
||||
ArrayList<String> lowerLevelItems = multiLevelListItem.getLowerLevelItems();
|
||||
if(!(lowerLevelItems == null) && !(lowerLevelItems.isEmpty())) {
|
||||
for(String item : lowerLevelItems) {
|
||||
buffer.append(InCellLists.TAB);
|
||||
@ -401,10 +392,8 @@ public class InCellLists {
|
||||
int highLevelIncrement,
|
||||
int lowLevelStartingValue,
|
||||
int lowLevelIncrement) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
int highLevelItemNumber = highLevelStartingValue;
|
||||
int lowLevelItemNumber = 0;
|
||||
ArrayList<String> lowerLevelItems = null;
|
||||
// Note that again, an HSSFCellStye object is required and that
|
||||
// it's wrap text property should be set to 'true'
|
||||
HSSFCellStyle wrapStyle = workbook.createCellStyle();
|
||||
@ -413,20 +402,20 @@ public class InCellLists {
|
||||
for(MultiLevelListItem multiLevelListItem : multiLevelListItems) {
|
||||
// For each element in the ArrayList, get the text for the high
|
||||
// level list item......
|
||||
buffer.append(String.valueOf(highLevelItemNumber));
|
||||
buffer.append(highLevelItemNumber);
|
||||
buffer.append(". ");
|
||||
buffer.append(multiLevelListItem.getItemText());
|
||||
buffer.append("\n");
|
||||
// and then an ArrayList whose elements encapsulate the text
|
||||
// for the lower level list items.
|
||||
lowerLevelItems = multiLevelListItem.getLowerLevelItems();
|
||||
ArrayList<String> lowerLevelItems = multiLevelListItem.getLowerLevelItems();
|
||||
if(!(lowerLevelItems == null) && !(lowerLevelItems.isEmpty())) {
|
||||
lowLevelItemNumber = lowLevelStartingValue;
|
||||
int lowLevelItemNumber = lowLevelStartingValue;
|
||||
for(String item : lowerLevelItems) {
|
||||
buffer.append(InCellLists.TAB);
|
||||
buffer.append(String.valueOf(highLevelItemNumber));
|
||||
buffer.append(highLevelItemNumber);
|
||||
buffer.append(".");
|
||||
buffer.append(String.valueOf(lowLevelItemNumber));
|
||||
buffer.append(lowLevelItemNumber);
|
||||
buffer.append(" ");
|
||||
buffer.append(item);
|
||||
buffer.append("\n");
|
||||
@ -459,8 +448,7 @@ public class InCellLists {
|
||||
public void multiLevelBulletedListInCell(HSSFWorkbook workbook,
|
||||
ArrayList<MultiLevelListItem> multiLevelListItems,
|
||||
HSSFCell cell) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
ArrayList<String> lowerLevelItems = null;
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
// Note that again, an HSSFCellStye object is required and that
|
||||
// it's wrap text property should be set to 'true'
|
||||
HSSFCellStyle wrapStyle = workbook.createCellStyle();
|
||||
@ -475,7 +463,7 @@ public class InCellLists {
|
||||
buffer.append("\n");
|
||||
// and then an ArrayList whose elements encapsulate the text
|
||||
// for the lower level list items.
|
||||
lowerLevelItems = multiLevelListItem.getLowerLevelItems();
|
||||
ArrayList<String> lowerLevelItems = multiLevelListItem.getLowerLevelItems();
|
||||
if(!(lowerLevelItems == null) && !(lowerLevelItems.isEmpty())) {
|
||||
for(String item : lowerLevelItems) {
|
||||
buffer.append(InCellLists.TAB);
|
||||
|
@ -232,6 +232,7 @@ public class TestAllFiles {
|
||||
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");
|
||||
|
@ -20,7 +20,6 @@ package org.apache.poi.hssf.usermodel;
|
||||
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;
|
||||
@ -90,7 +89,7 @@ public final class HSSFDataFormat implements DataFormat {
|
||||
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;
|
||||
|
@ -32,7 +32,6 @@ import org.apache.poi.ss.formula.udf.UDFFinder;
|
||||
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;
|
||||
|
||||
/**
|
||||
@ -80,11 +79,6 @@ public class HSSFFormulaEvaluator extends BaseFormulaEvaluator {
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@ -140,10 +134,87 @@ public class HSSFFormulaEvaluator extends BaseFormulaEvaluator {
|
||||
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 + ")");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -963,8 +963,9 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss
|
||||
* 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)
|
||||
{
|
||||
|
@ -88,27 +88,26 @@ public class FileBackedDataSource extends DataSource {
|
||||
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);
|
||||
|
||||
// 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");
|
||||
}
|
||||
}
|
||||
|
||||
// Check
|
||||
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
|
||||
|
@ -84,7 +84,7 @@ public class Bin2Dec extends Fixed1ArgFunction implements FreeRefFunction {
|
||||
//Add 1 to obtained number
|
||||
sum++;
|
||||
|
||||
value = "-" + String.valueOf(sum);
|
||||
value = "-" + sum;
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
return ErrorEval.NUM_ERROR;
|
||||
|
@ -26,308 +26,308 @@ public interface CellStyle {
|
||||
* @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)
|
||||
@ -353,7 +353,7 @@ public interface CellStyle {
|
||||
/**
|
||||
* Get the format string
|
||||
*/
|
||||
public String getDataFormatString();
|
||||
String getDataFormatString();
|
||||
|
||||
/**
|
||||
* set the font for this style
|
||||
@ -870,17 +870,17 @@ public interface CellStyle {
|
||||
* 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();
|
||||
}
|
||||
|
@ -18,6 +18,8 @@
|
||||
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
|
||||
@ -47,12 +49,15 @@ public final class CellValue {
|
||||
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);
|
||||
}
|
||||
@ -64,30 +69,44 @@ public final class CellValue {
|
||||
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() {
|
||||
@ -100,6 +119,7 @@ public final class CellValue {
|
||||
public byte getErrorValue() {
|
||||
return (byte) _errorCode;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuffer sb = new StringBuffer(64);
|
||||
sb.append(getClass().getName()).append(" [");
|
||||
|
@ -35,22 +35,22 @@ import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
|
||||
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;
|
||||
|
||||
|
||||
/**
|
||||
@ -58,14 +58,14 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
|
||||
*
|
||||
* @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).
|
||||
@ -77,7 +77,7 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
|
||||
*
|
||||
* @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
|
||||
@ -169,7 +169,7 @@ public interface Workbook extends Closeable, Iterable<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.
|
||||
@ -217,7 +217,7 @@ public interface Workbook extends Closeable, Iterable<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
|
||||
@ -253,6 +253,8 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
|
||||
*
|
||||
* @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);
|
||||
|
||||
@ -617,7 +619,7 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
|
||||
* 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.
|
||||
@ -632,6 +634,5 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
|
||||
* @return SpreadsheetVersion enum
|
||||
* @since 3.14 beta 2
|
||||
*/
|
||||
public SpreadsheetVersion getSpreadsheetVersion();
|
||||
|
||||
SpreadsheetVersion getSpreadsheetVersion();
|
||||
}
|
||||
|
@ -128,7 +128,7 @@ public class SheetUtil {
|
||||
// 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;
|
||||
@ -151,8 +151,8 @@ public class SheetUtil {
|
||||
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());
|
||||
@ -193,7 +193,7 @@ public class SheetUtil {
|
||||
* @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
|
||||
*/
|
||||
@ -219,8 +219,7 @@ public class SheetUtil {
|
||||
}
|
||||
// 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());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -273,13 +272,12 @@ public class SheetUtil {
|
||||
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
|
||||
@ -334,7 +332,7 @@ public class SheetUtil {
|
||||
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);
|
||||
}
|
||||
@ -348,6 +346,7 @@ public class SheetUtil {
|
||||
* @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);
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ import org.apache.commons.logging.LogFactory;
|
||||
*/
|
||||
public class CommonsLogger extends POILogger
|
||||
{
|
||||
private static LogFactory _creator = LogFactory.getFactory();
|
||||
private static final LogFactory _creator = LogFactory.getFactory();
|
||||
private Log log = null;
|
||||
|
||||
@Override
|
||||
@ -46,8 +46,10 @@ public class CommonsLogger extends POILogger
|
||||
* @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())
|
||||
@ -100,9 +102,11 @@ public class CommonsLogger extends POILogger
|
||||
* @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())
|
||||
@ -174,6 +178,8 @@ public class CommonsLogger extends POILogger
|
||||
@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())
|
||||
|
@ -83,15 +83,22 @@ public class DefaultTempFileCreationStrategy implements TempFileCreationStrategy
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
|
@ -23,6 +23,7 @@ package org.apache.poi.util;
|
||||
* 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) {
|
||||
@ -37,7 +38,7 @@ public class NullLogger extends POILogger {
|
||||
*/
|
||||
|
||||
@Override
|
||||
public void log(final int level, final Object obj1) {
|
||||
protected void _log(final int level, final Object obj1) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
@ -49,7 +50,19 @@ public class NullLogger extends POILogger {
|
||||
* @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
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,7 @@ public final class POILogFactory {
|
||||
/**
|
||||
* 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
|
||||
|
@ -54,7 +54,7 @@ public abstract class POILogger {
|
||||
* @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
|
||||
@ -63,11 +63,20 @@ public abstract class POILogger {
|
||||
* @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
|
||||
*/
|
||||
@ -98,9 +107,9 @@ public abstract class POILogger {
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -42,9 +42,9 @@ public class SystemOutLogger extends POILogger
|
||||
* @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);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -56,7 +56,7 @@ public class SystemOutLogger extends POILogger
|
||||
*/
|
||||
@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);
|
||||
|
@ -33,7 +33,6 @@ import org.apache.poi.hsmf.datatypes.AttachmentChunks;
|
||||
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;
|
||||
@ -123,7 +122,7 @@ public class ExtractorFactory {
|
||||
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);
|
||||
@ -163,7 +162,7 @@ public class ExtractorFactory {
|
||||
}
|
||||
}
|
||||
|
||||
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()) {
|
||||
|
@ -64,7 +64,7 @@ public class SignatureConfig {
|
||||
|
||||
private static final POILogger LOG = POILogFactory.getLogger(SignatureConfig.class);
|
||||
|
||||
public static interface SignatureConfigurable {
|
||||
public interface SignatureConfigurable {
|
||||
void setSignatureConfig(SignatureConfig signatureConfig);
|
||||
}
|
||||
|
||||
|
@ -96,6 +96,7 @@ public final class OOXMLLite {
|
||||
"BaseTestXSheet",
|
||||
"BaseTestXRow",
|
||||
"BaseTestXCell",
|
||||
"BaseTestXSSFPivotTable",
|
||||
"TestSXSSFWorkbook\\$\\d",
|
||||
"TestSXSSFWorkbook\\$NullOutputStream",
|
||||
"TestUnfixedBugs",
|
||||
|
@ -134,7 +134,7 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
|
||||
|
||||
if (this instanceof PlaceableShape) {
|
||||
PlaceableShape<?,?> ps = (PlaceableShape<?,?>)this;
|
||||
ps.setAnchor(((PlaceableShape<?,?>)sh).getAnchor());
|
||||
ps.setAnchor(sh.getAnchor());
|
||||
}
|
||||
|
||||
|
||||
@ -257,7 +257,7 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
|
||||
* Different types of placeholders are allowed and can be specified by using the placeholder
|
||||
* type attribute for this element
|
||||
*
|
||||
* @param placeholder
|
||||
* @param placeholder The shape to use as placeholder or null if no placeholder should be set.
|
||||
*/
|
||||
protected void setPlaceholder(Placeholder placeholder) {
|
||||
String xquery = "declare namespace p='"+PML_NS+"' .//*/p:nvPr";
|
||||
@ -494,7 +494,7 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
|
||||
int idx = (int)fillRef.getIdx();
|
||||
CTSchemeColor phClr = fillRef.getSchemeClr();
|
||||
CTStyleMatrix matrix = theme.getXmlObject().getThemeElements().getFmtScheme();
|
||||
XmlObject styleLst = null;
|
||||
final XmlObject styleLst;
|
||||
int childIdx;
|
||||
if (idx >= 1 && idx <= 999) {
|
||||
childIdx = idx-1;
|
||||
|
@ -907,7 +907,9 @@ public class SXSSFWorkbook implements Workbook {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -926,11 +928,8 @@ public class SXSSFWorkbook implements Workbook {
|
||||
@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
|
||||
@ -956,6 +955,13 @@ public class SXSSFWorkbook implements Workbook {
|
||||
}
|
||||
}
|
||||
|
||||
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.
|
||||
|
@ -28,7 +28,7 @@ import org.apache.poi.ss.formula.eval.ValueEval;
|
||||
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
|
||||
@ -52,6 +52,78 @@ public abstract class BaseXSSFFormulaEvaluator extends BaseFormulaEvaluator {
|
||||
_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
|
||||
*/
|
||||
|
@ -28,10 +28,13 @@ import javax.xml.namespace.QName;
|
||||
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;
|
||||
@ -41,6 +44,7 @@ import org.apache.xmlbeans.XmlOptions;
|
||||
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{
|
||||
|
||||
@ -116,6 +120,40 @@ 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
|
||||
@ -123,7 +161,7 @@ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{
|
||||
@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();
|
||||
|
@ -30,11 +30,11 @@ import javax.xml.namespace.QName;
|
||||
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;
|
||||
@ -214,13 +214,8 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -419,12 +414,13 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
|
||||
|
||||
/**
|
||||
* 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));
|
||||
|
||||
@ -448,9 +444,8 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
|
||||
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
|
||||
@ -465,11 +460,20 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -64,8 +64,10 @@ import org.apache.poi.ss.usermodel.Footer;
|
||||
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;
|
||||
@ -80,6 +82,7 @@ import org.apache.poi.util.POILogFactory;
|
||||
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;
|
||||
@ -1925,15 +1928,17 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
@ -4158,27 +4163,56 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
||||
}
|
||||
|
||||
/**
|
||||
* 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();
|
||||
|
||||
@ -4186,9 +4220,10 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
@ -4201,6 +4236,57 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
||||
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
|
||||
*/
|
||||
|
@ -319,6 +319,7 @@ public class ColumnHelper {
|
||||
}
|
||||
|
||||
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()) {
|
||||
|
@ -147,7 +147,8 @@ public final class XSSFRowShifter extends RowShifter {
|
||||
|
||||
}
|
||||
|
||||
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);
|
||||
|
@ -16,6 +16,7 @@
|
||||
==================================================================== */
|
||||
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;
|
||||
@ -37,6 +38,7 @@ import org.apache.poi.hdgf.extractor.VisioTextExtractor;
|
||||
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;
|
||||
@ -1019,4 +1021,16 @@ public class TestExtractorFactory {
|
||||
// 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();
|
||||
}
|
||||
}
|
||||
|
@ -55,6 +55,7 @@ import org.apache.poi.POIDataSamples;
|
||||
import org.apache.poi.POITestCase;
|
||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||
import org.apache.poi.openxml4j.opc.PackageAccess;
|
||||
import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;
|
||||
import org.apache.poi.poifs.crypt.dsig.DigestInfo;
|
||||
import org.apache.poi.poifs.crypt.dsig.SignatureConfig;
|
||||
import org.apache.poi.poifs.crypt.dsig.SignatureInfo;
|
||||
@ -99,7 +100,7 @@ public class TestSignatureInfo {
|
||||
public static void initBouncy() throws IOException {
|
||||
CryptoFunctions.registerBouncyCastle();
|
||||
|
||||
/*** TODO : set cal to now ... only set to fixed date for debugging ... */
|
||||
// Set cal to now ... only set to fixed date for debugging ...
|
||||
cal = LocaleUtil.getLocaleCalendar(LocaleUtil.TIMEZONE_UTC);
|
||||
assertNotNull(cal);
|
||||
// cal.set(2014, 7, 6, 21, 42, 12);
|
||||
@ -403,7 +404,9 @@ public class TestSignatureInfo {
|
||||
|
||||
// verify
|
||||
Iterator<SignaturePart> spIter = si.getSignatureParts().iterator();
|
||||
assertTrue(spIter.hasNext());
|
||||
assertTrue("Had: " + si.getSignatureConfig().getOpcPackage().
|
||||
getRelationshipsByType(PackageRelationshipTypes.DIGITAL_SIGNATURE_ORIGIN),
|
||||
spIter.hasNext());
|
||||
SignaturePart sp = spIter.next();
|
||||
boolean valid = sp.validate();
|
||||
assertTrue(valid);
|
||||
|
@ -31,7 +31,6 @@ import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
|
||||
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;
|
||||
|
@ -16,16 +16,13 @@
|
||||
==================================================================== */
|
||||
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 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.usermodel.Row;
|
||||
import org.apache.poi.ss.util.AreaReference;
|
||||
import org.apache.poi.ss.util.CellReference;
|
||||
import org.apache.poi.xssf.XSSFITestDataProvider;
|
||||
@ -38,97 +35,27 @@ 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 {
|
||||
public abstract class BaseTestXSSFPivotTable {
|
||||
private static final XSSFITestDataProvider _testDataProvider = XSSFITestDataProvider.instance;
|
||||
private XSSFWorkbook wb;
|
||||
private XSSFPivotTable pivotTable;
|
||||
private XSSFPivotTable offsetPivotTable;
|
||||
private Cell offsetOuterCell;
|
||||
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 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"));
|
||||
}
|
||||
public abstract void setUp();
|
||||
|
||||
@After
|
||||
public void tearDown() throws IOException {
|
||||
XSSFWorkbook wb2 = _testDataProvider.writeOutAndReadBack(wb);
|
||||
wb.close();
|
||||
wb2.close();
|
||||
if (wb != null) {
|
||||
XSSFWorkbook wb2 = _testDataProvider.writeOutAndReadBack(wb);
|
||||
wb.close();
|
||||
wb2.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -155,6 +82,7 @@ public class TestXSSFPivotTable {
|
||||
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.
|
||||
*/
|
||||
@ -314,6 +242,7 @@ public class TestXSSFPivotTable {
|
||||
/**
|
||||
* Verify that it's possible to create a new filter
|
||||
*/
|
||||
@Test
|
||||
public void testAddReportFilter() {
|
||||
int columnIndex = 0;
|
||||
|
@ -3091,4 +3091,41 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
@ -682,15 +682,4 @@ public final class TestXSSFFormulaEvaluation extends BaseTestFormulaEvaluator {
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,112 @@
|
||||
/* ====================================================================
|
||||
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"));
|
||||
}
|
||||
}
|
@ -0,0 +1,111 @@
|
||||
/* ====================================================================
|
||||
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"));
|
||||
}
|
||||
}
|
@ -1581,7 +1581,7 @@ public final class TestXSSFSheet extends BaseTestXSheet {
|
||||
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());
|
||||
*/
|
||||
|
||||
@ -1792,12 +1792,12 @@ public final class TestXSSFSheet extends BaseTestXSheet {
|
||||
// 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());
|
||||
*/
|
||||
|
||||
@ -2020,4 +2020,21 @@ public final class TestXSSFSheet extends BaseTestXSheet {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 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());
|
||||
}
|
||||
}
|
||||
|
@ -17,6 +17,8 @@
|
||||
|
||||
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;
|
||||
@ -35,7 +37,7 @@ import org.apache.poi.ss.util.CellAddress;
|
||||
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 {
|
||||
@ -377,7 +379,9 @@ 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();
|
||||
@ -399,9 +403,50 @@ public final class TestXSSFSheetShiftRows extends BaseTestSheetShiftRows {
|
||||
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();
|
||||
}
|
||||
|
||||
private static String getCellFormula(Sheet sheet, String address) {
|
||||
CellAddress cellAddress = new CellAddress(address);
|
||||
Row row = sheet.getRow(cellAddress.getRow());
|
||||
assertNotNull(row);
|
||||
Cell cell = row.getCell(cellAddress.getColumn());
|
||||
assertNotNull(cell);
|
||||
assertEquals(CellType.FORMULA, cell.getCellTypeEnum());
|
||||
return cell.getCellFormula();
|
||||
}
|
||||
|
||||
// This test is written as expected-to-fail and should be rewritten
|
||||
// as expected-to-pass when the bug is fixed.
|
||||
@Test
|
||||
public void testSharedFormulas() throws Exception {
|
||||
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("TestShiftRowSharedFormula.xlsx");
|
||||
XSSFSheet sheet = wb.getSheetAt(0);
|
||||
assertEquals("SUM(C2:C4)", getCellFormula(sheet, "C5"));
|
||||
assertEquals("SUM(D2:D4)", getCellFormula(sheet, "D5"));
|
||||
assertEquals("SUM(E2:E4)", getCellFormula(sheet, "E5"));
|
||||
|
||||
sheet.shiftRows(3, sheet.getLastRowNum(), 1);
|
||||
// FIXME: remove try, catch, and testPassesNow, skipTest when test passes
|
||||
try {
|
||||
assertEquals("SUM(C2:C5)", getCellFormula(sheet, "C6"));
|
||||
assertEquals("SUM(D2:D5)", getCellFormula(sheet, "D6"));
|
||||
assertEquals("SUM(E2:E5)", getCellFormula(sheet, "E6"));
|
||||
testPassesNow(59983);
|
||||
} catch (AssertionError e) {
|
||||
skipTest(e);
|
||||
}
|
||||
|
||||
wb.close();
|
||||
}
|
||||
}
|
||||
|
@ -137,6 +137,8 @@ public final class Attachment {
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
@ -154,37 +154,37 @@ public class WordToFoUtils extends AbstractWordUtils
|
||||
{
|
||||
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" );
|
||||
}
|
||||
}
|
||||
|
@ -32,11 +32,13 @@ import org.apache.poi.hwpf.model.PlexOfField;
|
||||
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;
|
||||
@ -901,4 +903,19 @@ public class TestBugs extends TestCase
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -23,6 +23,7 @@ import static org.junit.Assert.assertFalse;
|
||||
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;
|
||||
@ -174,4 +175,62 @@ public final class POITestCase {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 + ".");
|
||||
}
|
||||
}
|
||||
|
@ -1885,12 +1885,12 @@ public final class TestBugs extends BaseTestBugzillaIssues {
|
||||
|
||||
// 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);*/
|
||||
|
||||
|
@ -227,7 +227,7 @@ public final class TestPOIFSDocumentPath extends TestCase {
|
||||
{
|
||||
for (int k = 0; k < paths.length; k++)
|
||||
{
|
||||
assertEquals(String.valueOf(j) + "<>" + String.valueOf(k),
|
||||
assertEquals(j + "<>" + k,
|
||||
paths[ j ], paths[ k ]);
|
||||
}
|
||||
}
|
||||
@ -274,13 +274,13 @@ public final class TestPOIFSDocumentPath extends TestCase {
|
||||
{
|
||||
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 ])));
|
||||
}
|
||||
}
|
||||
@ -306,7 +306,7 @@ public final class TestPOIFSDocumentPath extends TestCase {
|
||||
{
|
||||
for (int j = 0; j < badPaths.length; j++)
|
||||
{
|
||||
assertTrue(String.valueOf(j) + "<>" + String.valueOf(k),
|
||||
assertTrue(j + "<>" + k,
|
||||
!(fullPaths[ k ].equals(badPaths[ j ])));
|
||||
}
|
||||
}
|
||||
|
@ -18,10 +18,10 @@
|
||||
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;
|
||||
@ -268,16 +268,28 @@ public class TestVBAMacroReader {
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -84,7 +84,7 @@ public class TestIfError extends TestCase {
|
||||
|
||||
|
||||
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());
|
||||
|
||||
|
@ -33,12 +33,9 @@ import java.awt.font.FontRenderContext;
|
||||
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.*;
|
||||
|
@ -17,6 +17,8 @@
|
||||
|
||||
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;
|
||||
@ -295,7 +297,7 @@ public abstract class BaseTestSheetShiftRows {
|
||||
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();
|
||||
@ -328,7 +330,15 @@ public abstract class BaseTestSheetShiftRows {
|
||||
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();
|
||||
}
|
||||
|
||||
@ -589,7 +599,7 @@ public abstract class BaseTestSheetShiftRows {
|
||||
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();
|
||||
@ -614,9 +624,17 @@ public abstract class BaseTestSheetShiftRows {
|
||||
// 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();
|
||||
}
|
||||
|
@ -570,7 +570,7 @@ public abstract class BaseTestSheetUpdateArrayFormulas {
|
||||
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());
|
||||
}
|
||||
|
||||
*/
|
||||
|
@ -23,6 +23,7 @@ import java.util.List;
|
||||
* 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>();
|
||||
|
||||
@ -39,12 +40,12 @@ public class DummyPOILogger extends POILogger {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -65,13 +65,13 @@ public final class TestPOILogger extends POILogger {
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
|
0
test-data/diagram/44501a.vsd
Executable file → Normal file
0
test-data/diagram/44501a.vsd
Executable file → Normal file
0
test-data/diagram/44501b.vsd
Executable file → Normal file
0
test-data/diagram/44501b.vsd
Executable file → Normal file
0
test-data/diagram/44501d.vsd
Executable file → Normal file
0
test-data/diagram/44501d.vsd
Executable file → Normal file
BIN
test-data/document/57843.doc
Normal file
BIN
test-data/document/57843.doc
Normal file
Binary file not shown.
BIN
test-data/document/60158.docm
Normal file
BIN
test-data/document/60158.docm
Normal file
Binary file not shown.
0
test-data/hsmf/logsat.com_signatures_valid.msg
Executable file → Normal file
0
test-data/hsmf/logsat.com_signatures_valid.msg
Executable file → Normal file
0
test-data/slideshow/aascu.org_workarea_downloadasset.aspx_id=5864.pptx
Executable file → Normal file
0
test-data/slideshow/aascu.org_workarea_downloadasset.aspx_id=5864.pptx
Executable file → Normal file
0
test-data/slideshow/br.com.tvcamboriu.www_pps_Pensar_5b1_5d.ppt
Executable file → Normal file
0
test-data/slideshow/br.com.tvcamboriu.www_pps_Pensar_5b1_5d.ppt
Executable file → Normal file
BIN
test-data/spreadsheet/45565.xls
Normal file
BIN
test-data/spreadsheet/45565.xls
Normal file
Binary file not shown.
BIN
test-data/spreadsheet/59687.xlsx
Normal file
BIN
test-data/spreadsheet/59687.xlsx
Normal file
Binary file not shown.
BIN
test-data/spreadsheet/TestShiftRowSharedFormula.xlsx
Normal file
BIN
test-data/spreadsheet/TestShiftRowSharedFormula.xlsx
Normal file
Binary file not shown.
0
test-data/spreadsheet/Themes2.xls
Executable file → Normal file
0
test-data/spreadsheet/Themes2.xls
Executable file → Normal file
0
test-data/spreadsheet/at.gv.land-oberoesterreich.www_cps_rde_xbcr_SID-4A1B954F-5C07F98E_ooe_stat_download_bp10.xls
Executable file → Normal file
0
test-data/spreadsheet/at.gv.land-oberoesterreich.www_cps_rde_xbcr_SID-4A1B954F-5C07F98E_ooe_stat_download_bp10.xls
Executable file → Normal file
0
test-data/spreadsheet/craftonhills.edu_programreview_report.aspx_goalpriorityreport_0011d159-1eeb-4b63-8833-867b0926e5f3.xlsx
Executable file → Normal file
0
test-data/spreadsheet/craftonhills.edu_programreview_report.aspx_goalpriorityreport_0011d159-1eeb-4b63-8833-867b0926e5f3.xlsx
Executable file → Normal file
0
test-data/spreadsheet/noSharedStringTable.xlsx
Executable file → Normal file
0
test-data/spreadsheet/noSharedStringTable.xlsx
Executable file → Normal file
Loading…
Reference in New Issue
Block a user