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:
Andreas Beeker 2016-09-28 21:01:40 +00:00
parent cda4f20482
commit 0a7cd3b68b
80 changed files with 1167 additions and 356 deletions

99
KEYS
View File

@ -2386,3 +2386,102 @@ cCRRHYCeAZDU5UMxi0nonfT+060i2rLPSd7o0bstG7gb1pD99rKxL57M7uy+WBnk
YobtRLhWHvHyWS4dKqiteeTwAqG2ZFOq98KCu1LXMKj42HqwOtB3L23HlhqVyA== YobtRLhWHvHyWS4dKqiteeTwAqG2ZFOq98KCu1LXMKj42HqwOtB3L23HlhqVyA==
=8e4G =8e4G
-----END PGP PUBLIC KEY BLOCK----- -----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)
mQINBFYZkgYBEAC28IT8XHE4bm5iXgL7COy7hmh8FS67hwfnEV08rm3f8tflYxe+
tYdRUI8y5UIFJyX2138GsV7sjV+pBiEq02xEU5pl2/AfXF+GmtW7ErS2Tk4iQ0id
SEcnyvim5LtaFYyMjYC1mzr0MaiJqWHjw6Lxjjep3s40coAkauRIcnJQ0s1YQIqk
BPlAl0rDILE8Lix+IVokUxTizh9popwDW0T/z6gzdKDeE5FPeKYWPvs34bKwe2vm
KqL2qmBh3Tk7MbtKYD79pGzYkNSyVmfWIDTjc++lNmDWYt0QN6YlaXoV4ZCAbLk+
raHU+5aKduZNnP25FnwTyt/Xm4Pl8RdROBzsmese2UuYrfsPaZrZkhhekE7Ttjk1
EqTob/LmgR7KSwWGT6Y9PAyROIs50yw5T7wMjdz0+C9SUZHK5lhPnFawyamWM1de
Y/f5vEvbI2Xap614bg6EPObPSQh/1r6J+7EmrbSqRE0W8FlSK2cWmB8l724lBG9f
Y5bma/F5g8eL4xcOGkaw2VCBu3i/IRUoHBP1ndkAQfIHmlGlWFc9u6PtmFyZHJJ7
Boks8g8M9aOcUvO+K/+gBWzGXO8n/NG10iItX9ubSFbvXCKJgK7cFXDdC8F/uHXO
vfDSTrwBffm7Czyxx8AgDHxGMysNCe5Pet7bU6bZL4ANnCPfMhgN7pp5bQARAQAB
tCBKYXZlbiBPJ05lYWwgPG9uZWFsakBhcGFjaGUub3JnPokCPwQTAQIAKQUCV+cS
OwIbAwUJA8GMagcLCQgHAwIBBhUIAgkKCwQWAgMBAh4BAheAAAoJEOZnesaLq91s
DN4P/36DX8zeM8PK9x9lb3DogipXefiMyWOZb+p64Ah6iFIxDoTNP+meG3eiQP11
T02TeI8tZKG6kuFM6fQb3GE6g/2TgHeWnrhek2KfHbOh6/nWvrAnsaEiu+vIBIFL
kiO0ydtu1DdNjWB0PR3bcnxF1GOX38cx37SjMR3n/eaIFnHqENzHNZgZ0sv38pYt
c0FDeoqpO89aAiCi+IWuLAhYFzU+GFdHxteFMtYGYDe5iI4EHjciIO4/Mq9MyQce
rYS/ADCJV0SWS+mPk3czKRdpklZiRoOqSiZcyTUJ7H2NFcdQuYjpLlmNvt0c95bR
fxaOhFWSSvZzkcZXr4u82VDc0rSvXW1q2vFZpbYJq7uDQZpBlkLBwlZ9gDaXHa6Y
5JB7RGWMmA+mfwSmfKxfCR0HdTldNsSic20bUlJjVjKkZR+Mco5SmAW0nb1OkpD7
lDCx6x8aunuFbf2SGnIZxtGxm31rXE7bTib4wE5X9EECLfg9hTJxPdDqvKfRBVBQ
ZVtPdq3jzyh6CxM/bygfmUjqdP91hS+wfXYq1W7d4e8EphkCiqdMXgclFEbdGp8e
+8BDvbCIchLzZ5wOxL4Ntwo4bL2Zn0IJ/K6K1WoOnMzq+6xWZOGRJ28v8go2VqO/
o0zWgSm6zEz2kAE9s9Y1by0xL40byg0AdJzG4h1cRPOsYeB0tCNKYXZlbiBPJ05l
YWwgPGphdmVub25lYWxAZ21haWwuY29tPokCQQQTAQIAKwIbAwUJA8GMagYLCQgH
AwIGFQgCCQoLBBYCAwECHgECF4AFAlfnEmUCGQEACgkQ5md6xour3WzZxBAAjLkr
z4Roxig47WGax6ppGqIGLTNEPPvNluIgtwZYfTW6MrzQIquju4o0QEIb8mOW9uke
LnR284t/5CU36EuVan0wWYwrwIJWtbZGz14GgtHsRyErllmYWKa0aYJ3kgY8JuNT
bK40g9RlrdLsYntwFlWQB9rL4nBPoWVWRllWOMcbhdF6/p9r2EmKO/CsTYdfolEh
dKdEtSgshQgvZxfgalanqb69/zc81RLpUQ0q1uiedrN0ghNd1+XCXeopKeeAoW9Y
LOIlQ3ALz9t+A3w4Ft5h3RZBHPwSPAgRv4fDv3y016rnPSna6wC5atlW9b1jxcnS
myP3kNcAXJDWwpQmMwYG8NJGCANwYRUNGcXlMvYbMpmuYHqc7kf+AbkG3H8Z1ktJ
jfwK8aw2ZX/AlINIQZ7fVJLDOkMapbjApUNOc7UoXx9Z8qXiVDizisRCJxy2Kj9h
pR+XMIwgPwCTgmQ+W+hQ50h7S4H9VVSfEe+H/+k6kHhRxEAZq5NGIzC7Mh8xvyHa
EII5tAS8fQwfnJ75URITUp2Vrdry5aDEZ90AIlYiQVuhUwFeNimjKOr8i9Zse7JC
MucIcmBsvwThVn22e6x14cNfc4KwqcWSQvxMuzqejHq4WTMf9Ln15G7nVMulyUTZ
hfJ4Spr45BEr+4UDMNqwIRQdIMXHa+JZGs3Nj7SJAhwEEwEKAAYFAlYaCkgACgkQ
ykkN1QqzdQMHbBAAm6Y0PaDBlhiYd+nCaxpNJGG0h2F/2nPLXNaGdTQSICD8B97i
J1Hvio0mEHnkbbm6e2s0rvxervgy4BuxgwzWgguaLQsALgyGpY2pHzsQAVQVVq6H
PQdwSOy731oO7R7CeJB/UIT02ne5WnLxxUN1e4qYLHp0+QFXOd4TPuTwPEG/Gewr
EVJN4C2k373eSsWwvXCBYe5UDLqPHrVTYnyU8uFmi4yOMbmIyyb1x7At6adc8FWQ
DQQt/0YElDe3m4Xmco4OMBem8i7QFchinhLIZPwNCR4aGrhbQYuq7C8JOWjEGFg8
k322fOwAEopr3+dHemToGde5j2u7JnatAeu7CwNVMY4Z9s/wUChP7gXlNenKIgeD
hUsG9RroqpXTLKmjz+2fSCGT5o2rBgwRnwpTcDaFWZlVzb1r/KQxTRsEkvDfSU1Y
jixoqFJYBj/2fhl1EPF7gb5WK8tBZ8PqhPaJwXAynzSGEG6QLbYwxCoKfVvl8PZj
SGg4Dmca6QpUskYwuiMMZhJJDNxKn5t2NZFEilZVaITRtNxtyRm2xvbcPXsSjAdo
VXCqKX777rfPryPW4Yjw55a7uaQQe3M6d4ndgVP491tGBMfBTHa7hKei/R1S106C
2R+rrE3o42WnhM3AarlWRqaHzuJQuofAjtRv19Ibk6ahK/qFuZBBFAWnUiSJARwE
EAECAAYFAldOVSMACgkQ28vfLzZwP7I7OQgAnDlCoagIdBNHxGAPieZt5bJTj8Mv
DtoxOAJtUjbJPTu5iw23pi2b83xmYCNQQkJ86IiSX56kILr9SP1uscChjM8aqwBK
H5vMWAzHxdbTNFrjmCm/NAF+6ArFi5snlWf3phLPUIdhNhGA4jhklWMuy6rflujy
BCgtZSh0VbaU/02ir3/QXBc331VN+qbXoCxD8lFagj0rg4GLCWFFCPJUeAr/SmIp
v28UIVNDUI9lyCB4G3utjBhDpo0LHv+X+AXkD5V9kwZBE5NzahL/3AWjm9B9Vqb1
JO1PVYv7sXqG25+xRMJssnsoGQYH75LSwoau3Yo1l8J35LOLYPUQfO9NYokCPgQT
AQIAKAUCVhmSBgIbAwUJA8GMagYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ
5md6xour3WxiVxAAkN6x14p905j7NUB0Ky/p3da9KeIp5uAyTR/CcE9pLvvdSMyd
xH8nE35EyHT84l7/yQHQ0wXxAFilBSGBt3C6Sth8J+11zxesUeDmJ1dX2Z0xRFz+
qO7MBJ2ccU9pK20niPgaKuBBZsDoye9wKtli2UxOCid26CeLs5Y1gAcPuY9Hmzh3
FnGhzrI5dP0HcE9lQXKA04vqviT1hxd+LlleCij1ItQR0ZYhV7z4SZp66vEfnh/R
mtaC5L0ZFfoAartLSVX6a16dQDqbLy/ukecQeQ2qWo+IkNQe+p23GR1FihBZeHxC
G+L9igu/cFgRLubMqHelwVCwL12Uazb2tG2zAnaTi5WgU0urvLqMRCuyQ40KlQ4h
ly6oOEKWcwGBhfTD+baBsHLfrVdikz4IiV8+7oQsb/xyuQEz66FYLptDpX3obgRR
ls0xjJ1YlZsmFg/NCJaAoPILBnS8wpbQp+T8yf9YcfczsMs9wALtM2rkLZqS6dn0
yBekDL3ZsuiS7Ot6WM351nKCvDtpe1hF4CAkE2xhCLdRyvDHmbq4vBf0nyAvzTCI
hUzgQeUKDDjxcmH1yxGNXswlfllqK6QkI9HnV/AuTI6nEjlBRNmtLg7SijHmuAZd
+X8Sy/CibqCgY0J51FlylH+Cx8qQUaUB81KKimCohTejzrfUm3xUOvautFG5Ag0E
VhmSBgEQAOQbxM1ZydIHIlnKx6LEmQdujX7Ns60NxrGdhLLHoJusuTutjTEt50Ex
MHhn/PjYVeK1JU/gTh0fPM7il9xwj+cUBbOtBQ+E2sVXXMSBMj93+6ivLBVesq27
R3ls63EMKHGcyYsIqHafBG9EvBwHBj+UNG3qKyEZv/NaX6UUoEYrvI4yx+z+ahew
K5RMAZ1qNUqtZfsDlKW3SF3rgRBBmVWowim1G6tB0HVor4YRA/iHwH6WIu04QqzG
A0uQpvptVJ0i1Hd9SoXisJUsovXSRTqj7+eFbILGywbvM2NYwF52lW9jbz3gu/Hb
O3uPY0xdshW/8F92FZRXzuMMv3O6I5SaVRRJE2oJVJHtteEpyrbkCqhaLzkSiNxf
sqzOw03gYICnxSDY3fqKBRKq84DMbiXbv4DwqeXWZXR2Yhs85Rn5cgoNqg5oyNwy
PlQOfqZzoiDle3SWs41pCM2po1tGgZXkeRqNedRI9V+c8ZacOrTPnjRL0Ae475n4
EFP3Ajur7UaXRe57AiSn4B30E5/D0HC0SeeRWacFeAHJ8WGvf6wXNGoAmtJL+TRJ
iSqNVjZ1EhuwYJpjUgPEfesXyCc5U6qkHMHcn0rXVteG4mrn0/191CPtfamxpDM9
hhTZ0WEbwFRwC41QQnRCO6EQfkPwZLC9BtSSuRVCI30617HiOFwDABEBAAGJAiUE
GAECAA8FAlYZkgYCGwwFCQPBjGoACgkQ5md6xour3WwC1Q//QnYoOLfPiSI/NVI6
agjCECNdtpUfdiGy7sEH3FYpNQGu8LDahcmTsxxcp2LeXjZIhuJt/dRPAMC/teQq
ihZvdz5iuYwqg8I7ZtZh+qxqxvjwOwtKnELpoMpZyK81v4C2oLQAzNdMC18QTBt+
L3RSMDdnPJ92GsCoYSGdLT0Jy16l/ShUQZ85EFUEjzFEDVnlLKpfZoqVCIULe0nj
NCyNY6txc6X4uChCB5ZtsLaHgUTm0I+wb+AX0wbEDELyldzkbfVPTxbCMQgkPx0E
W7ufcM3wx9sGT9I3FNOqZKHa8xq08be7z6OJZlsuw1NfeWG+UF9f6KZjH/zxIdtY
IDoVReAU5g/LfOQTHXpg+7eArlf/hVh57uFjPJxdh8wqKfFzIVSoksCwv3w3Hrca
7eh7Po46U6Tt6icWInBUthvOja0CgDojw+mm3GKvGMif/9YZXY/RHcc3t2CQDp/c
Shzcaly9QYj0eDujTQj7XFd/AAwdj8YWA4Ha2Peh4/oK4ugt7pKwt51MvYzSYDel
NFTn1hbTXTcj21i2/C9I6oqIhKt8c+St6Tge7PkGjq5BRqvY2L/IJmS5TmSerciL
bpjAhwE2YmGQ7oB+3V798HtAmceRNf8AY0GWrZswJlg7xUn+WJNwQ9uIHI1fxYHx
2Nr+AmDDs6ZOEI5zhwxioePw/Cg=
=9lKb
-----END PGP PUBLIC KEY BLOCK-----

21
build.gradle Normal file
View 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'

View File

@ -40,7 +40,7 @@ under the License.
<description>The Apache POI project Ant build.</description> <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 name="release.rc" value="RC1"/>
<property environment="env"/> <property environment="env"/>
@ -78,7 +78,7 @@ under the License.
JVM system properties for running tests, JVM system properties for running tests,
user.language and user.country are required as we have locale-sensitive formatters 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="POI.testdata.path" value="test-data"/>
<property name="java.awt.headless" value="true"/> <property name="java.awt.headless" value="true"/>
<property name="additionaljar" value=""/> <property name="additionaljar" value=""/>

View File

@ -35,6 +35,13 @@
<programming-language>Java</programming-language> <programming-language>Java</programming-language>
<category rdf:resource="http://projects.apache.org/category/content" /> <category rdf:resource="http://projects.apache.org/category/content" />
<category rdf:resource="http://projects.apache.org/category/library" /> <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> <release>
<Version> <Version>
<name>Apache POI 3.14</name> <name>Apache POI 3.14</name>

View File

@ -6,7 +6,7 @@
<parent> <parent>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId> <artifactId>poi-parent</artifactId>
<version>3.16-beta1-SNAPSHOT</version> <version>3.15-beta4-SNAPSHOT</version>
</parent> </parent>
<artifactId>poi-examples</artifactId> <artifactId>poi-examples</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>

View File

@ -6,7 +6,7 @@
<parent> <parent>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId> <artifactId>poi-parent</artifactId>
<version>3.16-beta1-SNAPSHOT</version> <version>3.15-beta4-SNAPSHOT</version>
</parent> </parent>
<artifactId>poi-excelant</artifactId> <artifactId>poi-excelant</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>

View File

@ -6,7 +6,7 @@
<parent> <parent>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId> <artifactId>poi-parent</artifactId>
<version>3.16-beta1-SNAPSHOT</version> <version>3.15-beta4-SNAPSHOT</version>
</parent> </parent>
<artifactId>poi-main</artifactId> <artifactId>poi-main</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>

View File

@ -6,7 +6,7 @@
<parent> <parent>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId> <artifactId>poi-parent</artifactId>
<version>3.16-beta1-SNAPSHOT</version> <version>3.15-beta4-SNAPSHOT</version>
<relativePath>..</relativePath> <relativePath>..</relativePath>
</parent> </parent>
<artifactId>poi-ooxml-schema-encryption</artifactId> <artifactId>poi-ooxml-schema-encryption</artifactId>

View File

@ -6,7 +6,7 @@
<parent> <parent>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId> <artifactId>poi-parent</artifactId>
<version>3.16-beta1-SNAPSHOT</version> <version>3.15-beta4-SNAPSHOT</version>
<relativePath>..</relativePath> <relativePath>..</relativePath>
</parent> </parent>
<artifactId>poi-ooxml-schema-security</artifactId> <artifactId>poi-ooxml-schema-security</artifactId>

View File

@ -6,7 +6,7 @@
<parent> <parent>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId> <artifactId>poi-parent</artifactId>
<version>3.16-beta1-SNAPSHOT</version> <version>3.15-beta4-SNAPSHOT</version>
<relativePath>..</relativePath> <relativePath>..</relativePath>
</parent> </parent>
<artifactId>poi-ooxml-schema</artifactId> <artifactId>poi-ooxml-schema</artifactId>

View File

@ -6,7 +6,7 @@
<parent> <parent>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId> <artifactId>poi-parent</artifactId>
<version>3.16-beta1-SNAPSHOT</version> <version>3.15-beta4-SNAPSHOT</version>
</parent> </parent>
<artifactId>poi-ooxml</artifactId> <artifactId>poi-ooxml</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>

View File

@ -3,7 +3,7 @@
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId> <artifactId>poi-parent</artifactId>
<packaging>pom</packaging> <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> <name>Apache POI - the Java API for Microsoft Documents</name>
<description>Maven build of Apache POI for Sonar checks</description> <description>Maven build of Apache POI for Sonar checks</description>
<url>http://poi.apache.org/</url> <url>http://poi.apache.org/</url>

View File

@ -6,7 +6,7 @@
<parent> <parent>
<groupId>org.apache.poi</groupId> <groupId>org.apache.poi</groupId>
<artifactId>poi-parent</artifactId> <artifactId>poi-parent</artifactId>
<version>3.16-beta1-SNAPSHOT</version> <version>3.15-beta4-SNAPSHOT</version>
</parent> </parent>
<artifactId>poi-scratchpad</artifactId> <artifactId>poi-scratchpad</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>

View File

@ -67,27 +67,21 @@ public class InCellLists {
* the Excel spreadsheet file this code will create. * the Excel spreadsheet file this code will create.
*/ */
public void demonstrateMethodCalls(String outputFilename) throws IOException { public void demonstrateMethodCalls(String outputFilename) throws IOException {
HSSFWorkbook workbook = null; HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = null;
HSSFRow row = null;
HSSFCell cell = null;
ArrayList<MultiLevelListItem> multiLevelListItems = null;
ArrayList<String> listItems = null;
try { try {
workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("In Cell Lists");
sheet = workbook.createSheet("In Cell Lists"); HSSFRow row = sheet.createRow(0);
row = sheet.createRow(0);
// Create a cell at A1 and insert a single, bulleted, item into // Create a cell at A1 and insert a single, bulleted, item into
// that cell. // that cell.
cell = row.createCell(0); HSSFCell cell = row.createCell(0);
this.bulletedItemInCell(workbook, "List Item", cell); this.bulletedItemInCell(workbook, "List Item", cell);
// Create a cell at A2 and insert a plain list - that is one // Create a cell at A2 and insert a plain list - that is one
// whose items are neither bulleted or numbered - into that cell. // whose items are neither bulleted or numbered - into that cell.
row = sheet.createRow(1); row = sheet.createRow(1);
cell = row.createCell(0); cell = row.createCell(0);
listItems = new ArrayList<String>(); ArrayList<String> listItems = new ArrayList<String>();
listItems.add("List Item One."); listItems.add("List Item One.");
listItems.add("List Item Two."); listItems.add("List Item Two.");
listItems.add("List Item Three."); listItems.add("List Item Three.");
@ -131,7 +125,7 @@ public class InCellLists {
// to preserve order. // to preserve order.
row = sheet.createRow(4); row = sheet.createRow(4);
cell = row.createCell(0); cell = row.createCell(0);
multiLevelListItems = new ArrayList<MultiLevelListItem>(); ArrayList<MultiLevelListItem> multiLevelListItems = new ArrayList<MultiLevelListItem>();
listItems = new ArrayList<String>(); listItems = new ArrayList<String>();
listItems.add("ML List Item One - Sub Item One."); listItems.add("ML List Item One - Sub Item One.");
listItems.add("ML List Item One - Sub Item Two."); listItems.add("ML List Item One - Sub Item Two.");
@ -189,11 +183,9 @@ public class InCellLists {
ioEx.printStackTrace(System.out); ioEx.printStackTrace(System.out);
} }
finally { finally {
if (workbook != null) {
workbook.close(); workbook.close();
} }
} }
}
/** /**
* Inserts a single bulleted item into a cell. * Inserts a single bulleted item into a cell.
@ -236,7 +228,7 @@ public class InCellLists {
* will be written. * will be written.
*/ */
public void listInCell(HSSFWorkbook workbook, ArrayList<String> listItems, HSSFCell cell) { public void listInCell(HSSFWorkbook workbook, ArrayList<String> listItems, HSSFCell cell) {
StringBuffer buffer = new StringBuffer(); StringBuilder buffer = new StringBuilder();
HSSFCellStyle wrapStyle = workbook.createCellStyle(); HSSFCellStyle wrapStyle = workbook.createCellStyle();
wrapStyle.setWrapText(true); wrapStyle.setWrapText(true);
for(String listItem : listItems) { for(String listItem : listItems) {
@ -269,7 +261,7 @@ public class InCellLists {
HSSFCell cell, HSSFCell cell,
int startingValue, int startingValue,
int increment) { int increment) {
StringBuffer buffer = new StringBuffer(); StringBuilder buffer = new StringBuilder();
int itemNumber = startingValue; int itemNumber = startingValue;
// Note that again, an HSSFCellStye object is required and that // Note that again, an HSSFCellStye object is required and that
// it's wrap text property should be set to 'true' // 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 // Note that the basic method is identical to the listInCell() method
// with one difference; a number prefixed to the items text. // with one difference; a number prefixed to the items text.
for(String listItem : listItems) { for(String listItem : listItems) {
buffer.append(String.valueOf(itemNumber) + ". "); buffer.append(itemNumber).append(". ");
buffer.append(listItem); buffer.append(listItem);
buffer.append("\n"); buffer.append("\n");
itemNumber += increment; itemNumber += increment;
@ -303,7 +295,7 @@ public class InCellLists {
public void bulletedListInCell(HSSFWorkbook workbook, public void bulletedListInCell(HSSFWorkbook workbook,
ArrayList<String> listItems, ArrayList<String> listItems,
HSSFCell cell) { HSSFCell cell) {
StringBuffer buffer = new StringBuffer(); StringBuilder buffer = new StringBuilder();
// Note that again, an HSSFCellStye object is required and that // Note that again, an HSSFCellStye object is required and that
// it's wrap text property should be set to 'true' // it's wrap text property should be set to 'true'
HSSFCellStyle wrapStyle = workbook.createCellStyle(); HSSFCellStyle wrapStyle = workbook.createCellStyle();
@ -339,8 +331,7 @@ public class InCellLists {
public void multiLevelListInCell(HSSFWorkbook workbook, public void multiLevelListInCell(HSSFWorkbook workbook,
ArrayList<MultiLevelListItem> multiLevelListItems, ArrayList<MultiLevelListItem> multiLevelListItems,
HSSFCell cell) { HSSFCell cell) {
StringBuffer buffer = new StringBuffer(); StringBuilder buffer = new StringBuilder();
ArrayList<String> lowerLevelItems = null;
// Note that again, an HSSFCellStye object is required and that // Note that again, an HSSFCellStye object is required and that
// it's wrap text property should be set to 'true' // it's wrap text property should be set to 'true'
HSSFCellStyle wrapStyle = workbook.createCellStyle(); HSSFCellStyle wrapStyle = workbook.createCellStyle();
@ -353,7 +344,7 @@ public class InCellLists {
buffer.append("\n"); buffer.append("\n");
// and then an ArrayList whose elements encapsulate the text // and then an ArrayList whose elements encapsulate the text
// for the lower level list items. // for the lower level list items.
lowerLevelItems = multiLevelListItem.getLowerLevelItems(); ArrayList<String> lowerLevelItems = multiLevelListItem.getLowerLevelItems();
if(!(lowerLevelItems == null) && !(lowerLevelItems.isEmpty())) { if(!(lowerLevelItems == null) && !(lowerLevelItems.isEmpty())) {
for(String item : lowerLevelItems) { for(String item : lowerLevelItems) {
buffer.append(InCellLists.TAB); buffer.append(InCellLists.TAB);
@ -401,10 +392,8 @@ public class InCellLists {
int highLevelIncrement, int highLevelIncrement,
int lowLevelStartingValue, int lowLevelStartingValue,
int lowLevelIncrement) { int lowLevelIncrement) {
StringBuffer buffer = new StringBuffer(); StringBuilder buffer = new StringBuilder();
int highLevelItemNumber = highLevelStartingValue; int highLevelItemNumber = highLevelStartingValue;
int lowLevelItemNumber = 0;
ArrayList<String> lowerLevelItems = null;
// Note that again, an HSSFCellStye object is required and that // Note that again, an HSSFCellStye object is required and that
// it's wrap text property should be set to 'true' // it's wrap text property should be set to 'true'
HSSFCellStyle wrapStyle = workbook.createCellStyle(); HSSFCellStyle wrapStyle = workbook.createCellStyle();
@ -413,20 +402,20 @@ public class InCellLists {
for(MultiLevelListItem multiLevelListItem : multiLevelListItems) { for(MultiLevelListItem multiLevelListItem : multiLevelListItems) {
// For each element in the ArrayList, get the text for the high // For each element in the ArrayList, get the text for the high
// level list item...... // level list item......
buffer.append(String.valueOf(highLevelItemNumber)); buffer.append(highLevelItemNumber);
buffer.append(". "); buffer.append(". ");
buffer.append(multiLevelListItem.getItemText()); buffer.append(multiLevelListItem.getItemText());
buffer.append("\n"); buffer.append("\n");
// and then an ArrayList whose elements encapsulate the text // and then an ArrayList whose elements encapsulate the text
// for the lower level list items. // for the lower level list items.
lowerLevelItems = multiLevelListItem.getLowerLevelItems(); ArrayList<String> lowerLevelItems = multiLevelListItem.getLowerLevelItems();
if(!(lowerLevelItems == null) && !(lowerLevelItems.isEmpty())) { if(!(lowerLevelItems == null) && !(lowerLevelItems.isEmpty())) {
lowLevelItemNumber = lowLevelStartingValue; int lowLevelItemNumber = lowLevelStartingValue;
for(String item : lowerLevelItems) { for(String item : lowerLevelItems) {
buffer.append(InCellLists.TAB); buffer.append(InCellLists.TAB);
buffer.append(String.valueOf(highLevelItemNumber)); buffer.append(highLevelItemNumber);
buffer.append("."); buffer.append(".");
buffer.append(String.valueOf(lowLevelItemNumber)); buffer.append(lowLevelItemNumber);
buffer.append(" "); buffer.append(" ");
buffer.append(item); buffer.append(item);
buffer.append("\n"); buffer.append("\n");
@ -459,8 +448,7 @@ public class InCellLists {
public void multiLevelBulletedListInCell(HSSFWorkbook workbook, public void multiLevelBulletedListInCell(HSSFWorkbook workbook,
ArrayList<MultiLevelListItem> multiLevelListItems, ArrayList<MultiLevelListItem> multiLevelListItems,
HSSFCell cell) { HSSFCell cell) {
StringBuffer buffer = new StringBuffer(); StringBuilder buffer = new StringBuilder();
ArrayList<String> lowerLevelItems = null;
// Note that again, an HSSFCellStye object is required and that // Note that again, an HSSFCellStye object is required and that
// it's wrap text property should be set to 'true' // it's wrap text property should be set to 'true'
HSSFCellStyle wrapStyle = workbook.createCellStyle(); HSSFCellStyle wrapStyle = workbook.createCellStyle();
@ -475,7 +463,7 @@ public class InCellLists {
buffer.append("\n"); buffer.append("\n");
// and then an ArrayList whose elements encapsulate the text // and then an ArrayList whose elements encapsulate the text
// for the lower level list items. // for the lower level list items.
lowerLevelItems = multiLevelListItem.getLowerLevelItems(); ArrayList<String> lowerLevelItems = multiLevelListItem.getLowerLevelItems();
if(!(lowerLevelItems == null) && !(lowerLevelItems.isEmpty())) { if(!(lowerLevelItems == null) && !(lowerLevelItems.isEmpty())) {
for(String item : lowerLevelItems) { for(String item : lowerLevelItems) {
buffer.append(InCellLists.TAB); buffer.append(InCellLists.TAB);

View File

@ -232,6 +232,7 @@ public class TestAllFiles {
EXPECTED_FAILURES.add("spreadsheet/43493.xls"); EXPECTED_FAILURES.add("spreadsheet/43493.xls");
EXPECTED_FAILURES.add("spreadsheet/46904.xls"); EXPECTED_FAILURES.add("spreadsheet/46904.xls");
EXPECTED_FAILURES.add("document/Bug50955.doc"); EXPECTED_FAILURES.add("document/Bug50955.doc");
EXPECTED_FAILURES.add("document/57843.doc");
EXPECTED_FAILURES.add("slideshow/PPT95.ppt"); EXPECTED_FAILURES.add("slideshow/PPT95.ppt");
EXPECTED_FAILURES.add("openxml4j/OPCCompliance_CoreProperties_DCTermsNamespaceLimitedUseFAIL.docx"); EXPECTED_FAILURES.add("openxml4j/OPCCompliance_CoreProperties_DCTermsNamespaceLimitedUseFAIL.docx");
EXPECTED_FAILURES.add("openxml4j/OPCCompliance_CoreProperties_DoNotUseCompatibilityMarkupFAIL.docx"); EXPECTED_FAILURES.add("openxml4j/OPCCompliance_CoreProperties_DoNotUseCompatibilityMarkupFAIL.docx");

View File

@ -20,7 +20,6 @@ package org.apache.poi.hssf.usermodel;
import java.util.Arrays; import java.util.Arrays;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Vector; import java.util.Vector;
import org.apache.poi.hssf.model.InternalWorkbook; import org.apache.poi.hssf.model.InternalWorkbook;
@ -90,7 +89,7 @@ public final class HSSFDataFormat implements DataFormat {
public short getFormat(String pFormat) { public short getFormat(String pFormat) {
// Normalise the format string // Normalise the format string
String format; String format;
if (pFormat.toUpperCase(Locale.ROOT).equals("TEXT")) { if (pFormat.equalsIgnoreCase("TEXT")) {
format = "@"; format = "@";
} else { } else {
format = pFormat; format = pFormat;

View File

@ -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.Cell;
import org.apache.poi.ss.usermodel.CellValue; import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.FormulaEvaluator; import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;
/** /**
@ -81,11 +80,6 @@ public class HSSFFormulaEvaluator extends BaseFormulaEvaluator {
return new HSSFFormulaEvaluator(workbook, stabilityClassifier, udfFinder); return new HSSFFormulaEvaluator(workbook, stabilityClassifier, udfFinder);
} }
@Override
protected RichTextString createRichTextString(String str) {
return new HSSFRichTextString(str);
}
/** /**
* Coordinates several formula evaluators together so that formulas that involve external * Coordinates several formula evaluators together so that formulas that involve external
@ -141,9 +135,86 @@ public class HSSFFormulaEvaluator extends BaseFormulaEvaluator {
_bookEvaluator.notifyUpdateCell(new HSSFEvaluationCell((HSSFCell)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 @Override
public HSSFCell evaluateInCell(Cell cell) { 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 + ")");
}
} }
/** /**

View File

@ -963,8 +963,9 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss
* Get the HSSFSheet object at the given index. * Get the HSSFSheet object at the given index.
* @param index of the sheet number (0-based physical & logical) * @param index of the sheet number (0-based physical & logical)
* @return HSSFSheet at the provided index * @return HSSFSheet at the provided index
* @throws IllegalArgumentException if the index is out of range (index
* &lt; 0 || index &gt;= getNumberOfSheets()).
*/ */
@Override @Override
public HSSFSheet getSheetAt(int index) public HSSFSheet getSheetAt(int index)
{ {

View File

@ -88,27 +88,26 @@ public class FileBackedDataSource extends DataSource {
throw new IndexOutOfBoundsException("Position " + position + " past the end of the file"); 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; ByteBuffer dst;
int worked = -1;
if (writable) { if (writable) {
dst = channel.map(FileChannel.MapMode.READ_WRITE, position, length); dst = channel.map(FileChannel.MapMode.READ_WRITE, position, length);
worked = 0;
// remember the buffer for cleanup if necessary // remember this buffer for cleanup
buffersToClean.add(dst); buffersToClean.add(dst);
} else { } else {
// Read // allocate the buffer on the heap if we cannot map the data in directly
channel.position(position); channel.position(position);
dst = ByteBuffer.allocate(length); dst = ByteBuffer.allocate(length);
worked = IOUtils.readFully(channel, dst);
}
// Check // Read the contents and check that we could read some data
int worked = IOUtils.readFully(channel, dst);
if(worked == -1) { if(worked == -1) {
throw new IndexOutOfBoundsException("Position " + position + " past the end of the file"); throw new IndexOutOfBoundsException("Position " + position + " past the end of the file");
} }
}
// Ready it for reading // make it ready for reading
dst.position(0); dst.position(0);
// All done // All done

View File

@ -84,7 +84,7 @@ public class Bin2Dec extends Fixed1ArgFunction implements FreeRefFunction {
//Add 1 to obtained number //Add 1 to obtained number
sum++; sum++;
value = "-" + String.valueOf(sum); value = "-" + sum;
} }
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
return ErrorEval.NUM_ERROR; return ErrorEval.NUM_ERROR;

View File

@ -26,308 +26,308 @@ public interface CellStyle {
* @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#GENERAL} instead. * @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#GENERAL} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short ALIGN_GENERAL = 0x0; //HorizontalAlignment.GENERAL.getCode(); short ALIGN_GENERAL = 0x0; //HorizontalAlignment.GENERAL.getCode();
/** /**
* left-justified horizontal alignment * left-justified horizontal alignment
* @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#LEFT} instead. * @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#LEFT} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short ALIGN_LEFT = 0x1; //HorizontalAlignment.LEFT.getCode(); short ALIGN_LEFT = 0x1; //HorizontalAlignment.LEFT.getCode();
/** /**
* center horizontal alignment * center horizontal alignment
* @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#CENTER} instead. * @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#CENTER} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short ALIGN_CENTER = 0x2; //HorizontalAlignment.CENTER.getCode(); short ALIGN_CENTER = 0x2; //HorizontalAlignment.CENTER.getCode();
/** /**
* right-justified horizontal alignment * right-justified horizontal alignment
* @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#RIGHT} instead. * @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#RIGHT} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short ALIGN_RIGHT = 0x3; //HorizontalAlignment.RIGHT.getCode(); short ALIGN_RIGHT = 0x3; //HorizontalAlignment.RIGHT.getCode();
/** /**
* fill? horizontal alignment * fill? horizontal alignment
* @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#FILL} instead. * @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#FILL} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short ALIGN_FILL = 0x4; //HorizontalAlignment.FILL.getCode(); short ALIGN_FILL = 0x4; //HorizontalAlignment.FILL.getCode();
/** /**
* justified horizontal alignment * justified horizontal alignment
* @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#JUSTIFY} instead. * @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#JUSTIFY} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short ALIGN_JUSTIFY = 0x5; //HorizontalAlignment.JUSTIFY.getCode(); short ALIGN_JUSTIFY = 0x5; //HorizontalAlignment.JUSTIFY.getCode();
/** /**
* center-selection? horizontal alignment * center-selection? horizontal alignment
* @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#CENTER_SELECTION} instead. * @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#CENTER_SELECTION} instead.
*/ */
@Removal(version="3.17") @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 * top-aligned vertical alignment
* @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#TOP} instead. * @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#TOP} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short VERTICAL_TOP = 0x0; //VerticalAlignment.TOP.getCode(); short VERTICAL_TOP = 0x0; //VerticalAlignment.TOP.getCode();
/** /**
* center-aligned vertical alignment * center-aligned vertical alignment
* @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#CENTER} instead. * @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#CENTER} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short VERTICAL_CENTER = 0x1; //VerticalAlignment.CENTER.getCode(); short VERTICAL_CENTER = 0x1; //VerticalAlignment.CENTER.getCode();
/** /**
* bottom-aligned vertical alignment * bottom-aligned vertical alignment
* @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#BOTTOM} instead. * @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#BOTTOM} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short VERTICAL_BOTTOM = 0x2; //VerticalAlignment.BOTTOM.getCode(); short VERTICAL_BOTTOM = 0x2; //VerticalAlignment.BOTTOM.getCode();
/** /**
* vertically justified vertical alignment * vertically justified vertical alignment
* @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#JUSTIFY} instead. * @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#JUSTIFY} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short VERTICAL_JUSTIFY = 0x3; //VerticalAlignment.JUSTIFY.getCode(); short VERTICAL_JUSTIFY = 0x3; //VerticalAlignment.JUSTIFY.getCode();
/** /**
* No border * No border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#NONE} instead. * @deprecated 3.15 beta 2. Use {@link BorderStyle#NONE} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short BORDER_NONE = 0x0; //BorderStyle.NONE.getCode(); short BORDER_NONE = 0x0; //BorderStyle.NONE.getCode();
/** /**
* Thin border * Thin border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#THIN} instead. * @deprecated 3.15 beta 2. Use {@link BorderStyle#THIN} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short BORDER_THIN = 0x1; //BorderStyle.THIN.getCode(); short BORDER_THIN = 0x1; //BorderStyle.THIN.getCode();
/** /**
* Medium border * Medium border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM} instead. * @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short BORDER_MEDIUM = 0x2; //BorderStyle.MEDIUM.getCode(); short BORDER_MEDIUM = 0x2; //BorderStyle.MEDIUM.getCode();
/** /**
* dash border * dash border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#DASHED} instead. * @deprecated 3.15 beta 2. Use {@link BorderStyle#DASHED} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short BORDER_DASHED = 0x3; //BorderStyle.DASHED.getCode(); short BORDER_DASHED = 0x3; //BorderStyle.DASHED.getCode();
/** /**
* dot border * dot border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#DOTTED} instead. * @deprecated 3.15 beta 2. Use {@link BorderStyle#DOTTED} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short BORDER_DOTTED = 0x4; //BorderStyle.DOTTED.getCode(); short BORDER_DOTTED = 0x4; //BorderStyle.DOTTED.getCode();
/** /**
* Thick border * Thick border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#THICK} instead. * @deprecated 3.15 beta 2. Use {@link BorderStyle#THICK} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short BORDER_THICK = 0x5; //BorderStyle.THICK.getCode(); short BORDER_THICK = 0x5; //BorderStyle.THICK.getCode();
/** /**
* double-line border * double-line border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#DOUBLE} instead. * @deprecated 3.15 beta 2. Use {@link BorderStyle#DOUBLE} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short BORDER_DOUBLE = 0x6; //BorderStyle.DOUBLE.getCode(); short BORDER_DOUBLE = 0x6; //BorderStyle.DOUBLE.getCode();
/** /**
* hair-line border * hair-line border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#HAIR} instead. * @deprecated 3.15 beta 2. Use {@link BorderStyle#HAIR} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short BORDER_HAIR = 0x7; //BorderStyle.HAIR.getCode(); short BORDER_HAIR = 0x7; //BorderStyle.HAIR.getCode();
/** /**
* Medium dashed border * Medium dashed border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM_DASHED} instead. * @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM_DASHED} instead.
*/ */
@Removal(version="3.17") @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 * dash-dot border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#DASH_DOT} instead. * @deprecated 3.15 beta 2. Use {@link BorderStyle#DASH_DOT} instead.
*/ */
@Removal(version="3.17") @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 * medium dash-dot border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM_DASH_DOT} instead. * @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM_DASH_DOT} instead.
*/ */
@Removal(version="3.17") @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 * dash-dot-dot border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#DASH_DOT_DOT} instead. * @deprecated 3.15 beta 2. Use {@link BorderStyle#DASH_DOT_DOT} instead.
*/ */
@Removal(version="3.17") @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 * medium dash-dot-dot border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM_DASH_DOT_DOT} instead. * @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM_DASH_DOT_DOT} instead.
*/ */
@Removal(version="3.17") @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 * slanted dash-dot border
* @deprecated 3.15 beta 2. Use {@link BorderStyle#SLANTED_DASH_DOT} instead. * @deprecated 3.15 beta 2. Use {@link BorderStyle#SLANTED_DASH_DOT} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: No background
* @deprecated 3.15 beta 3. Use {@link FillPatternType#NO_FILL} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#NO_FILL} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: Solidly filled
* @deprecated 3.15 beta 3. Use {@link FillPatternType#SOLID_FOREGROUND} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#SOLID_FOREGROUND} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: Small fine dots
* @deprecated 3.15 beta 3. Use {@link FillPatternType#FINE_DOTS} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#FINE_DOTS} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: Wide dots
* @deprecated 3.15 beta 3. Use {@link FillPatternType#ALT_BARS} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#ALT_BARS} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: Sparse dots
* @deprecated 3.15 beta 3. Use {@link FillPatternType#SPARSE_DOTS} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#SPARSE_DOTS} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: Thick horizontal bands
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_HORZ_BANDS} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_HORZ_BANDS} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: Thick vertical bands
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_VERT_BANDS} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_VERT_BANDS} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: Thick backward facing diagonals
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_BACKWARD_DIAG} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_BACKWARD_DIAG} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: Thick forward facing diagonals
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_FORWARD_DIAG} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_FORWARD_DIAG} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: Large spots
* @deprecated 3.15 beta 3. Use {@link FillPatternType#BIG_SPOTS} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#BIG_SPOTS} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: Brick-like layout
* @deprecated 3.15 beta 3. Use {@link FillPatternType#BRICKS} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#BRICKS} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short BRICKS = 10; //FillPatternType.BRICKS.getCode(); short BRICKS = 10; //FillPatternType.BRICKS.getCode();
/** /**
* Fill Pattern: Thin horizontal bands * Fill Pattern: Thin horizontal bands
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_HORZ_BANDS} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_HORZ_BANDS} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: Thin vertical bands
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_VERT_BANDS} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_VERT_BANDS} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: Thin backward diagonal
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_BACKWARD_DIAG} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_BACKWARD_DIAG} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: Thin forward diagonal
* @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_FORWARD_DIAG} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_FORWARD_DIAG} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: Squares
* @deprecated 3.15 beta 3. Use {@link FillPatternType#SQUARES} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#SQUARES} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short SQUARES = 15; //FillPatternType.SQUARES.getCode(); short SQUARES = 15; //FillPatternType.SQUARES.getCode();
/** /**
* Fill Pattern: Diamonds * Fill Pattern: Diamonds
* @deprecated 3.15 beta 3. Use {@link FillPatternType#DIAMONDS} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#DIAMONDS} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short DIAMONDS = 16; //FillPatternType.DIAMONDS.getCode(); short DIAMONDS = 16; //FillPatternType.DIAMONDS.getCode();
/** /**
* Fill Pattern: Less Dots * Fill Pattern: Less Dots
* @deprecated 3.15 beta 3. Use {@link FillPatternType#LESS_DOTS} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#LESS_DOTS} instead.
*/ */
@Removal(version="3.17") @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 * Fill Pattern: Least Dots
* @deprecated 3.15 beta 3. Use {@link FillPatternType#LEAST_DOTS} instead. * @deprecated 3.15 beta 3. Use {@link FillPatternType#LEAST_DOTS} instead.
*/ */
@Removal(version="3.17") @Removal(version="3.17")
static final short LEAST_DOTS = 18; //FillPatternType.LEAST_DOTS.getCode(); short LEAST_DOTS = 18; //FillPatternType.LEAST_DOTS.getCode();
/** /**
* get the index within the Workbook (sequence within the collection of ExtnededFormat objects) * get the index within the Workbook (sequence within the collection of ExtnededFormat objects)
@ -353,7 +353,7 @@ public interface CellStyle {
/** /**
* Get the format string * Get the format string
*/ */
public String getDataFormatString(); String getDataFormatString();
/** /**
* set the font for this style * set the font for this style
@ -870,17 +870,17 @@ public interface CellStyle {
* to be of the same type (HSSFCellStyle or * to be of the same type (HSSFCellStyle or
* XSSFCellStyle) * XSSFCellStyle)
*/ */
public void cloneStyleFrom(CellStyle source); void cloneStyleFrom(CellStyle source);
/** /**
* Controls if the Cell should be auto-sized * Controls if the Cell should be auto-sized
* to shrink to fit if the text is too long * 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 * Should the Cell be auto-sized by Excel to shrink
* it to fit if this text is too long? * it to fit if this text is too long?
*/ */
public boolean getShrinkToFit(); boolean getShrinkToFit();
} }

View File

@ -18,6 +18,8 @@
package org.apache.poi.ss.usermodel; package org.apache.poi.ss.usermodel;
import org.apache.poi.ss.formula.eval.ErrorEval; 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 * Mimics the 'data view' of a cell. This allows formula evaluator
@ -47,12 +49,15 @@ public final class CellValue {
public CellValue(double numberValue) { public CellValue(double numberValue) {
this(CellType.NUMERIC, numberValue, false, null, 0); this(CellType.NUMERIC, numberValue, false, null, 0);
} }
public static CellValue valueOf(boolean booleanValue) { public static CellValue valueOf(boolean booleanValue) {
return booleanValue ? TRUE : FALSE; return booleanValue ? TRUE : FALSE;
} }
public CellValue(String stringValue) { public CellValue(String stringValue) {
this(CellType.STRING, 0.0, false, stringValue, 0); this(CellType.STRING, 0.0, false, stringValue, 0);
} }
public static CellValue getError(int errorCode) { public static CellValue getError(int errorCode) {
return new CellValue(CellType.ERROR, 0.0, false, null, errorCode); return new CellValue(CellType.ERROR, 0.0, false, null, errorCode);
} }
@ -64,30 +69,44 @@ public final class CellValue {
public boolean getBooleanValue() { public boolean getBooleanValue() {
return _booleanValue; return _booleanValue;
} }
/** /**
* @return Returns the numberValue. * @return Returns the numberValue.
*/ */
public double getNumberValue() { public double getNumberValue() {
return _numberValue; return _numberValue;
} }
/** /**
* @return Returns the stringValue. * @return Returns the stringValue.
*/ */
public String getStringValue() { public String getStringValue() {
return _textValue; return _textValue;
} }
/** /**
* @return Returns the cellType. * Return the cell type.
*
* @return the cell type
* @since POI 3.15 * @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() { public CellType getCellTypeEnum() {
return _cellType; 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. * @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 @Deprecated
public int getCellType() { public int getCellType() {
@ -100,6 +119,7 @@ public final class CellValue {
public byte getErrorValue() { public byte getErrorValue() {
return (byte) _errorCode; return (byte) _errorCode;
} }
public String toString() { public String toString() {
StringBuffer sb = new StringBuffer(64); StringBuffer sb = new StringBuffer(64);
sb.append(getClass().getName()).append(" ["); sb.append(getClass().getName()).append(" [");

View File

@ -35,22 +35,22 @@ import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
public interface Workbook extends Closeable, Iterable<Sheet> { public interface Workbook extends Closeable, Iterable<Sheet> {
/** Extended windows meta file */ /** Extended windows meta file */
public static final int PICTURE_TYPE_EMF = 2; int PICTURE_TYPE_EMF = 2;
/** Windows Meta File */ /** Windows Meta File */
public static final int PICTURE_TYPE_WMF = 3; int PICTURE_TYPE_WMF = 3;
/** Mac PICT format */ /** Mac PICT format */
public static final int PICTURE_TYPE_PICT = 4; int PICTURE_TYPE_PICT = 4;
/** JPEG format */ /** JPEG format */
public static final int PICTURE_TYPE_JPEG = 5; int PICTURE_TYPE_JPEG = 5;
/** PNG format */ /** PNG format */
public static final int PICTURE_TYPE_PNG = 6; int PICTURE_TYPE_PNG = 6;
/** Device independent bitmap */ /** 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) * @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. * Indicates the book window is hidden, but can be shown by the user via the user interface.
* *
* @see #setSheetHidden(int, int) * @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). * 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) * @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 * 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); 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. * the high level representation. Use this to create new sheets.
* *
* @return Sheet representing the new sheet. * @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)} * See {@link org.apache.poi.ss.util.WorkbookUtil#createSafeSheetName(String nameProposal)}
* for a safe way to create valid names * for a safe way to create valid names
* </p> * </p>
* @param sheetname sheetname to set for the sheet. * @param sheetname The name to set for the sheet.
* @return Sheet representing the new sheet. * @return Sheet representing the new sheet.
* @throws IllegalArgumentException if the name is null or invalid * @throws IllegalArgumentException if the name is null or invalid
* or workbook already contains a sheet with this name * 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) * @param index of the sheet number (0-based physical & logical)
* @return Sheet at the provided index * @return Sheet at the provided index
* @throws IllegalArgumentException if the index is out of range (index
* &lt; 0 || index &gt;= getNumberOfSheets()).
*/ */
Sheet getSheetAt(int index); Sheet getSheetAt(int index);
@ -617,7 +619,7 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
* workbook values when the workbook is opened * workbook values when the workbook is opened
* @since 3.8 * @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. * 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 * @return SpreadsheetVersion enum
* @since 3.14 beta 2 * @since 3.14 beta 2
*/ */
public SpreadsheetVersion getSpreadsheetVersion(); SpreadsheetVersion getSpreadsheetVersion();
} }

View File

@ -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? // We should only be checking merged regions if useMergedCells is true. Why are we doing this for-loop?
int colspan = 1; int colspan = 1;
for (CellRangeAddress region : sheet.getMergedRegions()) { for (CellRangeAddress region : sheet.getMergedRegions()) {
if (containsCell(region, row.getRowNum(), column)) { if (region.isInRange(row.getRowNum(), column)) {
if (!useMergedCells) { if (!useMergedCells) {
// If we're not using merged cells, skip this one and move on to the next. // If we're not using merged cells, skip this one and move on to the next.
return -1; return -1;
@ -151,8 +151,8 @@ public class SheetUtil {
if (cellType == CellType.STRING) { if (cellType == CellType.STRING) {
RichTextString rt = cell.getRichStringCellValue(); RichTextString rt = cell.getRichStringCellValue();
String[] lines = rt.getString().split("\\n"); String[] lines = rt.getString().split("\\n");
for (int i = 0; i < lines.length; i++) { for (String line : lines) {
String txt = lines[i] + defaultChar; String txt = line + defaultChar;
AttributedString str = new AttributedString(txt); AttributedString str = new AttributedString(txt);
copyAttributes(font, str, 0, txt.length()); 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 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 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 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 * @param str the text contained in the cell
* @return the best fit cell width * @return the best fit cell width
*/ */
@ -219,8 +219,7 @@ public class SheetUtil {
} }
// frameWidth accounts for leading spaces which is excluded from bounds.getWidth() // frameWidth accounts for leading spaces which is excluded from bounds.getWidth()
final double frameWidth = bounds.getX() + bounds.getWidth(); final double frameWidth = bounds.getX() + bounds.getWidth();
final double width = Math.max(minWidth, ((frameWidth / colspan) / defaultCharWidth) + style.getIndention()); return Math.max(minWidth, ((frameWidth / colspan) / defaultCharWidth) + style.getIndention());
return width;
} }
/** /**
@ -273,13 +272,12 @@ public class SheetUtil {
AttributedString str = new AttributedString(String.valueOf(defaultChar)); AttributedString str = new AttributedString(String.valueOf(defaultChar));
copyAttributes(defaultFont, str, 0, 1); copyAttributes(defaultFont, str, 0, 1);
TextLayout layout = new TextLayout(str.getIterator(), fontRenderContext); TextLayout layout = new TextLayout(str.getIterator(), fontRenderContext);
int defaultCharWidth = (int) layout.getAdvance(); return (int) layout.getAdvance();
return defaultCharWidth;
} }
/** /**
* Compute width of a single cell in a row * 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 row the row that contains the cell of interest
* @param column the column number of the cell whose width is to be calculated * @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) { private static void copyAttributes(Font font, AttributedString str, int startIdx, int endIdx) {
str.addAttribute(TextAttribute.FAMILY, font.getFontName(), startIdx, endIdx); str.addAttribute(TextAttribute.FAMILY, font.getFontName(), startIdx, endIdx);
str.addAttribute(TextAttribute.SIZE, (float)font.getFontHeightInPoints()); 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.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); 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] * @return true if the range contains the cell [rowIx, colIx]
* @deprecated 3.15 beta 2. Use {@link CellRangeAddressBase#isInRange(int, int)}. * @deprecated 3.15 beta 2. Use {@link CellRangeAddressBase#isInRange(int, int)}.
*/ */
@Deprecated
public static boolean containsCell(CellRangeAddress cr, int rowIx, int colIx) { public static boolean containsCell(CellRangeAddress cr, int rowIx, int colIx) {
return cr.isInRange(rowIx, colIx); return cr.isInRange(rowIx, colIx);
} }

View File

@ -30,7 +30,7 @@ import org.apache.commons.logging.LogFactory;
*/ */
public class CommonsLogger extends POILogger public class CommonsLogger extends POILogger
{ {
private static LogFactory _creator = LogFactory.getFactory(); private static final LogFactory _creator = LogFactory.getFactory();
private Log log = null; private Log log = null;
@Override @Override
@ -46,8 +46,10 @@ public class CommonsLogger extends POILogger
* @param obj1 The object to log. * @param obj1 The object to log.
*/ */
@Override @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(level==FATAL)
{ {
if(log.isFatalEnabled()) if(log.isFatalEnabled())
@ -100,9 +102,11 @@ public class CommonsLogger extends POILogger
* @param exception An exception to be logged * @param exception An exception to be logged
*/ */
@Override @Override
public void log(final int level, final Object obj1, protected void _log(final int level, final Object obj1,
final Throwable exception) 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(level==FATAL)
{ {
if(log.isFatalEnabled()) if(log.isFatalEnabled())
@ -174,6 +178,8 @@ public class CommonsLogger extends POILogger
@Override @Override
public boolean check(final int level) 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(level==FATAL)
{ {
if(log.isFatalEnabled()) if(log.isFatalEnabled())

View File

@ -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 * @param directory the directory to create
* @throws IOException * @throws IOException if unable to create temporary directory or it is not a directory
*/ */
private void createTempDirectory(File directory) throws IOException { 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 + "'"); 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 @Override

View File

@ -23,6 +23,7 @@ package org.apache.poi.util;
* calls as cheap as possible by performing lazy evaluation of the log * calls as cheap as possible by performing lazy evaluation of the log
* message.<p> * message.<p>
*/ */
@Internal
public class NullLogger extends POILogger { public class NullLogger extends POILogger {
@Override @Override
public void initialize(final String cat) { public void initialize(final String cat) {
@ -37,7 +38,7 @@ public class NullLogger extends POILogger {
*/ */
@Override @Override
public void log(final int level, final Object obj1) { protected void _log(final int level, final Object obj1) {
// do nothing // do nothing
} }
@ -49,7 +50,19 @@ public class NullLogger extends POILogger {
* @param exception An exception to be logged * @param exception An exception to be logged
*/ */
@Override @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 // do nothing
} }

View File

@ -35,7 +35,7 @@ public final class POILogFactory {
/** /**
* Map of POILogger instances, with classes as keys * 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 * A common instance of NullLogger, as it does nothing

View File

@ -54,7 +54,7 @@ public abstract class POILogger {
* @param level One of DEBUG, INFO, WARN, ERROR, FATAL * @param level One of DEBUG, INFO, WARN, ERROR, FATAL
* @param obj1 The object to log. This is converted to a string. * @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 * Log a message
@ -63,11 +63,20 @@ public abstract class POILogger {
* @param obj1 The object to log. This is converted to a string. * @param obj1 The object to log. This is converted to a string.
* @param exception An exception to be logged * @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 * 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 * @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, // somehow this ambiguity works and doesn't lead to a loop,
// but it's confusing ... // but it's confusing ...
if (lastEx == null) { if (lastEx == null) {
log(level, msg); _log(level, msg);
} else { } else {
log(level, msg, lastEx); _log(level, msg, lastEx);
} }
} }
} }

View File

@ -42,9 +42,9 @@ public class SystemOutLogger extends POILogger
* @param obj1 The object to log. * @param obj1 The object to log.
*/ */
@Override @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 @Override
@SuppressForbidden("uses printStackTrace") @SuppressForbidden("uses printStackTrace")
public void log(final int level, final Object obj1, protected void _log(final int level, final Object obj1,
final Throwable exception) { final Throwable exception) {
if (check(level)) { if (check(level)) {
System.out.println("[" + _cat + "]" + LEVEL_STRINGS_SHORT[Math.min(LEVEL_STRINGS_SHORT.length-1, level)] + " " + obj1); System.out.println("[" + _cat + "]" + LEVEL_STRINGS_SHORT[Math.min(LEVEL_STRINGS_SHORT.length-1, level)] + " " + obj1);

View File

@ -33,7 +33,6 @@ import org.apache.poi.hsmf.datatypes.AttachmentChunks;
import org.apache.poi.hsmf.extractor.OutlookTextExtactor; import org.apache.poi.hsmf.extractor.OutlookTextExtactor;
import org.apache.poi.hssf.extractor.ExcelExtractor; import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hwpf.extractor.WordExtractor; 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.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess; import org.apache.poi.openxml4j.opc.PackageAccess;
@ -123,7 +122,7 @@ public class ExtractorFactory {
return OLE2ExtractorFactory.getPreferEventExtractor(); 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; NPOIFSFileSystem fs = null;
try { try {
fs = new NPOIFSFileSystem(f); 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 // Figure out the kind of stream
// If clearly doesn't do mark/reset, wrap up // If clearly doesn't do mark/reset, wrap up
if (! inp.markSupported()) { if (! inp.markSupported()) {

View File

@ -64,7 +64,7 @@ public class SignatureConfig {
private static final POILogger LOG = POILogFactory.getLogger(SignatureConfig.class); private static final POILogger LOG = POILogFactory.getLogger(SignatureConfig.class);
public static interface SignatureConfigurable { public interface SignatureConfigurable {
void setSignatureConfig(SignatureConfig signatureConfig); void setSignatureConfig(SignatureConfig signatureConfig);
} }

View File

@ -96,6 +96,7 @@ public final class OOXMLLite {
"BaseTestXSheet", "BaseTestXSheet",
"BaseTestXRow", "BaseTestXRow",
"BaseTestXCell", "BaseTestXCell",
"BaseTestXSSFPivotTable",
"TestSXSSFWorkbook\\$\\d", "TestSXSSFWorkbook\\$\\d",
"TestSXSSFWorkbook\\$NullOutputStream", "TestSXSSFWorkbook\\$NullOutputStream",
"TestUnfixedBugs", "TestUnfixedBugs",

View File

@ -134,7 +134,7 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
if (this instanceof PlaceableShape) { if (this instanceof PlaceableShape) {
PlaceableShape<?,?> ps = (PlaceableShape<?,?>)this; 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 * Different types of placeholders are allowed and can be specified by using the placeholder
* type attribute for this element * 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) { protected void setPlaceholder(Placeholder placeholder) {
String xquery = "declare namespace p='"+PML_NS+"' .//*/p:nvPr"; 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(); int idx = (int)fillRef.getIdx();
CTSchemeColor phClr = fillRef.getSchemeClr(); CTSchemeColor phClr = fillRef.getSchemeClr();
CTStyleMatrix matrix = theme.getXmlObject().getThemeElements().getFmtScheme(); CTStyleMatrix matrix = theme.getXmlObject().getThemeElements().getFmtScheme();
XmlObject styleLst = null; final XmlObject styleLst;
int childIdx; int childIdx;
if (idx >= 1 && idx <= 999) { if (idx >= 1 && idx <= 999) {
childIdx = idx-1; childIdx = idx-1;

View File

@ -907,7 +907,9 @@ public class SXSSFWorkbook implements Workbook {
try { try {
sheet.getSheetDataWriter().close(); sheet.getSheetDataWriter().close();
} catch (IOException e) { } catch (IOException e) {
// ignore exception here logger.log(POILogger.WARN,
"An exception occurred while closing sheet data writer for sheet "
+ sheet.getSheetName() + ".", e);
} }
} }
@ -926,10 +928,7 @@ public class SXSSFWorkbook implements Workbook {
@Override @Override
public void write(OutputStream stream) throws IOException public void write(OutputStream stream) throws IOException
{ {
for (SXSSFSheet sheet : _xFromSxHash.values()) flushSheets();
{
sheet.flushRows();
}
//Save the template //Save the template
File tmplFile = TempFile.createTempFile("poi-sxssf-template", ".xlsx"); File tmplFile = TempFile.createTempFile("poi-sxssf-template", ".xlsx");
@ -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. * Dispose of temporary files backing this workbook on disk.
* Calling this method will render the workbook unusable. * Calling this method will render the workbook unusable.

View File

@ -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.Cell;
import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.CellValue; 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 * 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)); _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 * Turns a XSSFCell / SXSSFCell into a XSSFEvaluationCell
*/ */

View File

@ -28,10 +28,13 @@ import javax.xml.namespace.QName;
import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship; 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.Cell;
import org.apache.poi.ss.usermodel.CellType; 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.Row;
import org.apache.poi.ss.usermodel.Sheet; 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.AreaReference;
import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.Beta; 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.CTCacheField;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCacheFields; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCacheFields;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotCacheDefinition; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotCacheDefinition;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheetSource;
public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{
@ -116,6 +120,40 @@ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{
out.close(); 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. * 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 * @param sheet The sheet where the data i collected from
@ -123,7 +161,7 @@ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{
@Beta @Beta
protected void createCacheFields(Sheet sheet) { protected void createCacheFields(Sheet sheet) {
//Get values for start row, start and end column //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 firstCell = ar.getFirstCell();
CellReference lastCell = ar.getLastCell(); CellReference lastCell = ar.getLastCell();
int columnStart = firstCell.getCol(); int columnStart = firstCell.getCol();

View File

@ -30,11 +30,11 @@ import javax.xml.namespace.QName;
import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationship; 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.Cell;
import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataConsolidateFunction; import org.apache.poi.ss.usermodel.DataConsolidateFunction;
import org.apache.poi.ss.usermodel.Sheet; 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.AreaReference;
import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.Beta; import org.apache.poi.util.Beta;
@ -214,13 +214,8 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
} }
protected AreaReference getPivotArea() { protected AreaReference getPivotArea() {
AreaReference pivotArea = new AreaReference( final Workbook wb = getDataSheet().getWorkbook();
getPivotCacheDefinition() AreaReference pivotArea = getPivotCacheDefinition().getPivotArea(wb);
.getCTPivotCacheDefinition()
.getCacheSource()
.getWorksheetSource()
.getRef(),
SpreadsheetVersion.EXCEL2007);
return pivotArea; 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 * 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 position Position for pivot table in sheet
* @param sourceSheet Sheet where the source will be collected from * @param sourceSheet Sheet where the source will be collected from
* @param refConfig an configurator that knows how to configure pivot table references
*/ */
@Beta @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. //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)); 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()); worksheetSource.setSheet(sourceSheet.getSheetName());
setDataSheet(sourceSheet); setDataSheet(sourceSheet);
String[] firstCell = source.getFirstCell().getCellRefParts(); refConfig.configureReference(worksheetSource);
String[] lastCell = source.getLastCell().getCellRefParts(); if (worksheetSource.getName() == null && worksheetSource.getRef() == null) throw new IllegalArgumentException("Pivot table source area reference or name must be specified.");
worksheetSource.setRef(firstCell[2]+firstCell[1]+':'+lastCell[2]+lastCell[1]);
} }
@Beta @Beta
@ -465,11 +460,20 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
int firstColumn = sourceArea.getFirstCell().getCol(); int firstColumn = sourceArea.getFirstCell().getCol();
int lastColumn = sourceArea.getLastCell().getCol(); int lastColumn = sourceArea.getLastCell().getCol();
CTPivotField pivotField; CTPivotField pivotField;
for(int i = 0; i<=lastColumn-firstColumn; i++) { for(int i = firstColumn; i<=lastColumn; i++) {
pivotField = pivotFields.addNewPivotField(); pivotField = pivotFields.addNewPivotField();
pivotField.setDataField(false); pivotField.setDataField(false);
pivotField.setShowAll(false); pivotField.setShowAll(false);
} }
pivotFields.setCount(pivotFields.sizeOfPivotFieldArray()); 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);
}
} }

View File

@ -64,8 +64,10 @@ import org.apache.poi.ss.usermodel.Footer;
import org.apache.poi.ss.usermodel.Header; import org.apache.poi.ss.usermodel.Header;
import org.apache.poi.ss.usermodel.IgnoredErrorType; import org.apache.poi.ss.usermodel.IgnoredErrorType;
import org.apache.poi.ss.usermodel.IndexedColors; 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.Row;
import org.apache.poi.ss.usermodel.Sheet; 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.AreaReference;
import org.apache.poi.ss.util.CellAddress; import org.apache.poi.ss.util.CellAddress;
import org.apache.poi.ss.util.CellRangeAddress; 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.POILogger;
import org.apache.poi.util.Removal; import org.apache.poi.util.Removal;
import org.apache.poi.xssf.model.CommentsTable; 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.ColumnHelper;
import org.apache.poi.xssf.usermodel.helpers.XSSFIgnoredErrorHelper; import org.apache.poi.xssf.usermodel.helpers.XSSFIgnoredErrorHelper;
import org.apache.poi.xssf.usermodel.helpers.XSSFRowShifter; 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 // Performance optimization: explicit boxing is slightly faster than auto-unboxing, though may use more memory
final Integer rownumI = new Integer(row.getRowNum()); // NOSONAR final int rowNum = row.getRowNum();
int idx = _rows.headMap(rownumI).size(); final Integer rowNumI = new Integer(rowNum); // NOSONAR
_rows.remove(rownumI); // this is not the physical row number!
final int idx = _rows.headMap(rowNumI).size();
_rows.remove(rowNumI);
worksheet.getSheetData().removeRow(idx); worksheet.getSheetData().removeRow(idx);
// also remove any comment located in that row // also remove any comment located in that row
if(sheetComments != null) { if(sheetComments != null) {
for (CellAddress ref : getCellComments().keySet()) { for (CellAddress ref : getCellComments().keySet()) {
if (ref.getRow() == idx) { if (ref.getRow() == rowNum) {
sheetComments.removeComment(ref); 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 * Create a pivot table using the AreaReference range on sourceSheet, at the given position.
* @param source Area from where data will be collected * If the source reference contains a sheet name, it must match the sourceSheet
* @param position A reference to the cell where the table will start * @param source location of pivot data
* @param sourceSheet The sheet where source will be collected from * @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 * @return The pivot table
*/ */
@Beta @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(); final String sourceSheetName = source.getFirstCell().getSheetName();
if(sourceSheetName != null && !sourceSheetName.equalsIgnoreCase(sourceSheet.getSheetName())) { if(sourceSheetName != null && !sourceSheetName.equalsIgnoreCase(sourceSheet.getSheetName())) {
throw new IllegalArgumentException("The area is referenced in another sheet than the " throw new IllegalArgumentException("The area is referenced in another sheet than the "
+ "defined source sheet " + sourceSheet.getSheetName() + "."); + "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(); XSSFPivotTable pivotTable = createPivotTable();
//Creates default settings for the pivot table //Creates default settings for the pivot table
pivotTable.setDefaultPivotTableDefinition(); pivotTable.setDefaultPivotTableDefinition();
//Set sources and references //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.getPivotCacheDefinition().createCacheFields(sourceSheet);
pivotTable.createDefaultDataColumns(); 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 * Create a pivot table using the AreaReference range, at the given position.
* @param source Area from where data will be collected * If the source reference contains a sheet name, that sheet is used, otherwise this sheet is assumed as the source sheet.
* @param position A reference to the cell where the table will start * @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 * @return The pivot table
*/ */
@Beta @Beta
@ -4201,6 +4236,57 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
return createPivotTable(source, position, this); 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 * Returns all the pivot tables for this Sheet
*/ */

View File

@ -319,6 +319,7 @@ public class ColumnHelper {
} }
public int getIndexOfColumn(CTCols cols, CTCol searchCol) { public int getIndexOfColumn(CTCols cols, CTCol searchCol) {
if (cols == null || searchCol == null) return -1;
int i = 0; int i = 0;
for (CTCol col : cols.getColArray()) { for (CTCol col : cols.getColArray()) {
if (col.getMin() == searchCol.getMin() && col.getMax() == searchCol.getMax()) { if (col.getMin() == searchCol.getMin() && col.getMax() == searchCol.getMax()) {

View File

@ -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 ref = f.getRef();
String shiftedRef = shiftFormula(row, ref, shifter); String shiftedRef = shiftFormula(row, ref, shifter);
if (shiftedRef != null) f.setRef(shiftedRef); if (shiftedRef != null) f.setRef(shiftedRef);

View File

@ -16,6 +16,7 @@
==================================================================== */ ==================================================================== */
package org.apache.poi.extractor; package org.apache.poi.extractor;
import static org.apache.poi.POITestCase.assertContains;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull; 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.hpbf.extractor.PublisherTextExtractor;
import org.apache.poi.hslf.extractor.PowerPointExtractor; import org.apache.poi.hslf.extractor.PowerPointExtractor;
import org.apache.poi.hsmf.extractor.OutlookTextExtactor; import org.apache.poi.hsmf.extractor.OutlookTextExtactor;
import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.OldExcelFormatException; import org.apache.poi.hssf.OldExcelFormatException;
import org.apache.poi.hssf.extractor.EventBasedExcelExtractor; import org.apache.poi.hssf.extractor.EventBasedExcelExtractor;
import org.apache.poi.hssf.extractor.ExcelExtractor; import org.apache.poi.hssf.extractor.ExcelExtractor;
@ -1019,4 +1021,16 @@ public class TestExtractorFactory {
// expected here // 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();
}
} }

View File

@ -55,6 +55,7 @@ import org.apache.poi.POIDataSamples;
import org.apache.poi.POITestCase; import org.apache.poi.POITestCase;
import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess; 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.DigestInfo;
import org.apache.poi.poifs.crypt.dsig.SignatureConfig; import org.apache.poi.poifs.crypt.dsig.SignatureConfig;
import org.apache.poi.poifs.crypt.dsig.SignatureInfo; import org.apache.poi.poifs.crypt.dsig.SignatureInfo;
@ -99,7 +100,7 @@ public class TestSignatureInfo {
public static void initBouncy() throws IOException { public static void initBouncy() throws IOException {
CryptoFunctions.registerBouncyCastle(); 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); cal = LocaleUtil.getLocaleCalendar(LocaleUtil.TIMEZONE_UTC);
assertNotNull(cal); assertNotNull(cal);
// cal.set(2014, 7, 6, 21, 42, 12); // cal.set(2014, 7, 6, 21, 42, 12);
@ -403,7 +404,9 @@ public class TestSignatureInfo {
// verify // verify
Iterator<SignaturePart> spIter = si.getSignatureParts().iterator(); 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(); SignaturePart sp = spIter.next();
boolean valid = sp.validate(); boolean valid = sp.validate();
assertTrue(valid); assertTrue(valid);

View File

@ -31,7 +31,6 @@ import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import junit.framework.AssertionFailedError; import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
import org.junit.Test; import org.junit.Test;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;

View File

@ -16,16 +16,13 @@
==================================================================== */ ==================================================================== */
package org.apache.poi.xssf.usermodel; package org.apache.poi.xssf.usermodel;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.io.IOException; import java.io.IOException;
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataConsolidateFunction; 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.AreaReference;
import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.XSSFITestDataProvider; import org.apache.poi.xssf.XSSFITestDataProvider;
@ -38,98 +35,28 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotFields;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotTableDefinition; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotTableDefinition;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataConsolidateFunction; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataConsolidateFunction;
public class TestXSSFPivotTable { public abstract class BaseTestXSSFPivotTable {
private static final XSSFITestDataProvider _testDataProvider = XSSFITestDataProvider.instance; private static final XSSFITestDataProvider _testDataProvider = XSSFITestDataProvider.instance;
private XSSFWorkbook wb; protected XSSFWorkbook wb;
private XSSFPivotTable pivotTable; protected XSSFPivotTable pivotTable;
private XSSFPivotTable offsetPivotTable; protected XSSFPivotTable offsetPivotTable;
private Cell offsetOuterCell; 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 @Before
public void setUp(){ public abstract void setUp();
wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet();
Row row1 = sheet.createRow(0);
// Create a cell and put a value in it.
Cell cell = row1.createCell(0);
cell.setCellValue("Names");
Cell cell2 = row1.createCell(1);
cell2.setCellValue("#");
Cell cell7 = row1.createCell(2);
cell7.setCellValue("Data");
Cell cell10 = row1.createCell(3);
cell10.setCellValue("Value");
Row row2 = sheet.createRow(1);
Cell cell3 = row2.createCell(0);
cell3.setCellValue("Jan");
Cell cell4 = row2.createCell(1);
cell4.setCellValue(10);
Cell cell8 = row2.createCell(2);
cell8.setCellValue("Apa");
Cell cell11 = row1.createCell(3);
cell11.setCellValue(11.11);
Row row3 = sheet.createRow(2);
Cell cell5 = row3.createCell(0);
cell5.setCellValue("Ben");
Cell cell6 = row3.createCell(1);
cell6.setCellValue(9);
Cell cell9 = row3.createCell(2);
cell9.setCellValue("Bepa");
Cell cell12 = row1.createCell(3);
cell12.setCellValue(12.12);
AreaReference source = new AreaReference("A1:C2", _testDataProvider.getSpreadsheetVersion());
pivotTable = sheet.createPivotTable(source, new CellReference("H5"));
XSSFSheet offsetSheet = wb.createSheet();
Row tableRow_1 = offsetSheet.createRow(1);
offsetOuterCell = tableRow_1.createCell(1);
offsetOuterCell.setCellValue(-1);
Cell tableCell_1_1 = tableRow_1.createCell(2);
tableCell_1_1.setCellValue("Row #");
Cell tableCell_1_2 = tableRow_1.createCell(3);
tableCell_1_2.setCellValue("Exponent");
Cell tableCell_1_3 = tableRow_1.createCell(4);
tableCell_1_3.setCellValue("10^Exponent");
Row tableRow_2 = offsetSheet.createRow(2);
Cell tableCell_2_1 = tableRow_2.createCell(2);
tableCell_2_1.setCellValue(0);
Cell tableCell_2_2 = tableRow_2.createCell(3);
tableCell_2_2.setCellValue(0);
Cell tableCell_2_3 = tableRow_2.createCell(4);
tableCell_2_3.setCellValue(1);
Row tableRow_3= offsetSheet.createRow(3);
Cell tableCell_3_1 = tableRow_3.createCell(2);
tableCell_3_1.setCellValue(1);
Cell tableCell_3_2 = tableRow_3.createCell(3);
tableCell_3_2.setCellValue(1);
Cell tableCell_3_3 = tableRow_3.createCell(4);
tableCell_3_3.setCellValue(10);
Row tableRow_4 = offsetSheet.createRow(4);
Cell tableCell_4_1 = tableRow_4.createCell(2);
tableCell_4_1.setCellValue(2);
Cell tableCell_4_2 = tableRow_4.createCell(3);
tableCell_4_2.setCellValue(2);
Cell tableCell_4_3 = tableRow_4.createCell(4);
tableCell_4_3.setCellValue(100);
AreaReference offsetSource = new AreaReference(new CellReference("C2"), new CellReference("E4"));
offsetPivotTable = offsetSheet.createPivotTable(offsetSource, new CellReference("C6"));
}
@After @After
public void tearDown() throws IOException { public void tearDown() throws IOException {
if (wb != null) {
XSSFWorkbook wb2 = _testDataProvider.writeOutAndReadBack(wb); XSSFWorkbook wb2 = _testDataProvider.writeOutAndReadBack(wb);
wb.close(); wb.close();
wb2.close(); wb2.close();
} }
}
/** /**
* Verify that when creating a row label it's created on the correct row * Verify that when creating a row label it's created on the correct row
@ -155,6 +82,7 @@ public class TestXSSFPivotTable {
assertEquals(0, (int)pivotTable.getRowLabelColumns().get(0)); assertEquals(0, (int)pivotTable.getRowLabelColumns().get(0));
assertEquals(1, (int)pivotTable.getRowLabelColumns().get(1)); assertEquals(1, (int)pivotTable.getRowLabelColumns().get(1));
} }
/** /**
* Verify that it's not possible to create a row label outside of the referenced area. * 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 * Verify that it's possible to create a new filter
*/ */
@Test
public void testAddReportFilter() { public void testAddReportFilter() {
int columnIndex = 0; int columnIndex = 0;

View File

@ -3091,4 +3091,41 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
assertEquals("09 Mar 2016", result); 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();
}
} }

View File

@ -682,15 +682,4 @@ public final class TestXSSFFormulaEvaluation extends BaseTestFormulaEvaluator {
value = evaluator.evaluate(cell); value = evaluator.evaluate(cell);
assertEquals(1, value.getNumberValue(), 0.001); 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();
}
} }

View File

@ -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"));
}
}

View File

@ -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"));
}
}

View File

@ -1581,7 +1581,7 @@ public final class TestXSSFSheet extends BaseTestXSheet {
System.out.println("Array formulas currently unsupported"); System.out.println("Array formulas currently unsupported");
// FIXME: Array Formula set with Sheet.setArrayFormula() instead of cell.setFormula() // 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()); 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"); // System.out.println("Array formulas currently unsupported");
/* /*
// FIXME: Array Formula set with Sheet.setArrayFormula() instead of cell.setFormula() // 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()); assertEquals("[Array Formula] N10 cell formula", "{SUM(H10:J10*{1,2,3})}", cell.getCellFormula());
cell = CellUtil.getCell(destRow2, col); cell = CellUtil.getCell(destRow2, col);
// FIXME: Array Formula set with Sheet.setArrayFormula() instead of cell.setFormula() // 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()); 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());
}
} }

View File

@ -17,6 +17,8 @@
package org.apache.poi.xssf.usermodel; 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.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull; 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.ss.util.CellUtil;
import org.apache.poi.xssf.XSSFITestDataProvider; import org.apache.poi.xssf.XSSFITestDataProvider;
import org.apache.poi.xssf.XSSFTestDataSamples; import org.apache.poi.xssf.XSSFTestDataSamples;
import org.junit.Ignore; import org.apache.xmlbeans.impl.values.XmlValueDisconnectedException;
import org.junit.Test; import org.junit.Test;
public final class TestXSSFSheetShiftRows extends BaseTestSheetShiftRows { public final class TestXSSFSheetShiftRows extends BaseTestSheetShiftRows {
@ -377,7 +379,9 @@ public final class TestXSSFSheetShiftRows extends BaseTestSheetShiftRows {
wb.close(); 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 @Test
public void bug59733() throws IOException { public void bug59733() throws IOException {
Workbook workbook = new XSSFWorkbook(); 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.XSSFRow.getRowNum(XSSFRow.java:363)
at org.apache.poi.xssf.usermodel.TestXSSFSheetShiftRows.bug59733(TestXSSFSheetShiftRows.java:393) at org.apache.poi.xssf.usermodel.TestXSSFSheetShiftRows.bug59733(TestXSSFSheetShiftRows.java:393)
*/ */
// FIXME: remove try, catch, and testPassesNow, skipTest when test passes
try {
sheet.removeRow(sheet.getRow(0)); sheet.removeRow(sheet.getRow(0));
assertEquals(1, sheet.getRow(1).getRowNum()); assertEquals(1, sheet.getRow(1).getRowNum());
testPassesNow(59733);
} catch (XmlValueDisconnectedException e) {
skipTest(e);
}
workbook.close(); 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();
}
} }

View File

@ -137,6 +137,8 @@ public final class Attachment {
/** /**
* Returns the contents of the attachment. * Returns the contents of the attachment.
*
* @throws IllegalArgumentException if there is no AttachmentData available in this Attachment
*/ */
public byte[] getContents() { public byte[] getContents() {
TNEFAttribute contents = getAttribute(TNEFProperty.ID_ATTACHDATA); TNEFAttribute contents = getAttribute(TNEFProperty.ID_ATTACHDATA);

View File

@ -154,37 +154,37 @@ public class WordToFoUtils extends AbstractWordUtils
{ {
block.setAttribute( block.setAttribute(
"text-indent", "text-indent",
String.valueOf( paragraph.getFirstLineIndent() paragraph.getFirstLineIndent()
/ TWIPS_PER_PT ) / TWIPS_PER_PT
+ "pt" ); + "pt" );
} }
if ( paragraph.getIndentFromLeft() != 0 ) if ( paragraph.getIndentFromLeft() != 0 )
{ {
block.setAttribute( block.setAttribute(
"start-indent", "start-indent",
String.valueOf( paragraph.getIndentFromLeft() paragraph.getIndentFromLeft()
/ TWIPS_PER_PT ) / TWIPS_PER_PT
+ "pt" ); + "pt" );
} }
if ( paragraph.getIndentFromRight() != 0 ) if ( paragraph.getIndentFromRight() != 0 )
{ {
block.setAttribute( block.setAttribute(
"end-indent", "end-indent",
String.valueOf( paragraph.getIndentFromRight() paragraph.getIndentFromRight()
/ TWIPS_PER_PT ) / TWIPS_PER_PT
+ "pt" ); + "pt" );
} }
if ( paragraph.getSpacingBefore() != 0 ) if ( paragraph.getSpacingBefore() != 0 )
{ {
block.setAttribute( block.setAttribute(
"space-before", "space-before",
String.valueOf( paragraph.getSpacingBefore() / TWIPS_PER_PT ) paragraph.getSpacingBefore() / TWIPS_PER_PT
+ "pt" ); + "pt" );
} }
if ( paragraph.getSpacingAfter() != 0 ) if ( paragraph.getSpacingAfter() != 0 )
{ {
block.setAttribute( "space-after", block.setAttribute( "space-after",
String.valueOf( paragraph.getSpacingAfter() / TWIPS_PER_PT ) paragraph.getSpacingAfter() / TWIPS_PER_PT
+ "pt" ); + "pt" );
} }
} }

View File

@ -32,11 +32,13 @@ import org.apache.poi.hwpf.model.PlexOfField;
import org.apache.poi.hwpf.model.SubdocumentType; import org.apache.poi.hwpf.model.SubdocumentType;
import org.apache.poi.hwpf.model.io.HWPFOutputStream; import org.apache.poi.hwpf.model.io.HWPFOutputStream;
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem; 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.IOUtils;
import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger; import org.apache.poi.util.POILogger;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -901,4 +903,19 @@ public class TestBugs extends TestCase
HWPFDocument hwpfDocument2 = HWPFTestDataSamples.writeOutAndReadBack(hwpfDocument); HWPFDocument hwpfDocument2 = HWPFTestDataSamples.writeOutAndReadBack(hwpfDocument);
assertNotNull(hwpfDocument2); 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
}
}
} }

View File

@ -23,6 +23,7 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
import java.lang.reflect.AccessibleObject; import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field; 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 + ".");
}
} }

View File

@ -1885,12 +1885,12 @@ public final class TestBugs extends BaseTestBugzillaIssues {
// TODO - Fix these so they work... // TODO - Fix these so they work...
/*row = s.getRow(4); /*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("'[$http://gagravarr.org/FormulaRefs2.xls]Sheet1'!B2", row.getCell(1).getCellFormula());
assertEquals(123.0, row.getCell(1).getNumericCellValue(), 0); assertEquals(123.0, row.getCell(1).getNumericCellValue(), 0);
row = s.getRow(5); 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("'[$http://example.com/FormulaRefs.xls]Sheet1'!B1", row.getCell(1).getCellFormula());
assertEquals(234.0, row.getCell(1).getNumericCellValue(), 0);*/ assertEquals(234.0, row.getCell(1).getNumericCellValue(), 0);*/

View File

@ -227,7 +227,7 @@ public final class TestPOIFSDocumentPath extends TestCase {
{ {
for (int k = 0; k < paths.length; k++) for (int k = 0; k < paths.length; k++)
{ {
assertEquals(String.valueOf(j) + "<>" + String.valueOf(k), assertEquals(j + "<>" + k,
paths[ j ], paths[ k ]); paths[ j ], paths[ k ]);
} }
} }
@ -274,13 +274,13 @@ public final class TestPOIFSDocumentPath extends TestCase {
{ {
if (k == j) if (k == j)
{ {
assertEquals(String.valueOf(j) + "<>" assertEquals(j + "<>"
+ String.valueOf(k), fullPaths[ j ], + k, fullPaths[ j ],
builtUpPaths[ k ]); builtUpPaths[ k ]);
} }
else else
{ {
assertTrue(String.valueOf(j) + "<>" + String.valueOf(k), assertTrue(j + "<>" + k,
!(fullPaths[ j ].equals(builtUpPaths[ k ]))); !(fullPaths[ j ].equals(builtUpPaths[ k ])));
} }
} }
@ -306,7 +306,7 @@ public final class TestPOIFSDocumentPath extends TestCase {
{ {
for (int j = 0; j < badPaths.length; j++) for (int j = 0; j < badPaths.length; j++)
{ {
assertTrue(String.valueOf(j) + "<>" + String.valueOf(k), assertTrue(j + "<>" + k,
!(fullPaths[ k ].equals(badPaths[ j ]))); !(fullPaths[ k ].equals(badPaths[ j ])));
} }
} }

View File

@ -18,10 +18,10 @@
package org.apache.poi.poifs.macros; package org.apache.poi.poifs.macros;
import static org.apache.poi.POITestCase.assertContains; 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.assertFalse;
import static org.junit.Assert.assertNotNull; 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.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@ -268,16 +268,28 @@ public class TestVBAMacroReader {
public void bug59858() throws IOException { public void bug59858() throws IOException {
try { try {
fromFile(POIDataSamples.getSpreadSheetInstance(), "59858.xls"); fromFile(POIDataSamples.getSpreadSheetInstance(), "59858.xls");
fail("This test passes now. Please update the unit test and bug 59858."); testPassesNow(59858);
} catch (IOException e) { } catch (IOException e) {
if (e.getMessage().matches("Module offset for '.+' was never read.")) { if (e.getMessage().matches("Module offset for '.+' was never read.")) {
//e.printStackTrace(); //e.printStackTrace();
// NPE when reading module.offset in VBAMacroReader.readMacros (approx line 258) // NPE when reading module.offset in VBAMacroReader.readMacros (approx line 258)
assumeTrue("This test currently fails. See stdout.", false); skipTest(e);
} else { } else {
// something unexpected failed // something unexpected failed
throw e; 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);
}
}
} }

View File

@ -33,12 +33,9 @@ import java.awt.font.FontRenderContext;
import java.awt.font.TextAttribute; import java.awt.font.TextAttribute;
import java.awt.font.TextLayout; import java.awt.font.TextLayout;
import java.awt.geom.Rectangle2D; import java.awt.geom.Rectangle2D;
import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.text.AttributedString; import java.text.AttributedString;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import static org.junit.Assert.*; import static org.junit.Assert.*;

View File

@ -17,6 +17,8 @@
package org.apache.poi.ss.usermodel; 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.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
@ -295,7 +297,7 @@ public abstract class BaseTestSheetShiftRows {
wb.close(); 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 @Test
public final void shiftWithMergedRegions_bug56454() throws IOException { public final void shiftWithMergedRegions_bug56454() throws IOException {
Workbook wb = _testDataProvider.createWorkbook(); Workbook wb = _testDataProvider.createWorkbook();
@ -328,7 +330,15 @@ public abstract class BaseTestSheetShiftRows {
expectedMergedRegions.add(A4_B8); expectedMergedRegions.add(A4_B8);
expectedMergedRegions.add(C4_D8); expectedMergedRegions.add(C4_D8);
// 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()); assertEquals(expectedMergedRegions, sheet.getMergedRegions());
testPassesNow(56454);
} catch (AssertionError e) {
skipTest(e);
}
wb.close(); wb.close();
} }
@ -589,7 +599,7 @@ public abstract class BaseTestSheetShiftRows {
read.close(); read.close();
} }
@Ignore("bug 56454: Incorrectly handles merged regions that do not contain column 0") //@Ignore("bug 56454: Incorrectly handles merged regions that do not contain column 0")
@Test @Test
public void shiftRowsWithMergedRegionsThatDoNotContainColumnZero() throws IOException { public void shiftRowsWithMergedRegionsThatDoNotContainColumnZero() throws IOException {
Workbook wb = _testDataProvider.createWorkbook(); Workbook wb = _testDataProvider.createWorkbook();
@ -614,9 +624,17 @@ public abstract class BaseTestSheetShiftRows {
// C5:D7 will be shifted down with same size // C5:D7 will be shifted down with same size
sheet.shiftRows(4, sheet.getLastRowNum(), 1); sheet.shiftRows(4, sheet.getLastRowNum(), 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(2, sheet.getNumMergedRegions());
assertEquals(CellRangeAddress.valueOf("A4:B8"), sheet.getMergedRegion(0)); assertEquals(CellRangeAddress.valueOf("A4:B8"), sheet.getMergedRegion(0));
assertEquals(CellRangeAddress.valueOf("C5:D8"), sheet.getMergedRegion(1)); assertEquals(CellRangeAddress.valueOf("C5:D8"), sheet.getMergedRegion(1));
testPassesNow(56454);
} catch (AssertionError e) {
skipTest(e);
}
wb.close(); wb.close();
} }

View File

@ -570,7 +570,7 @@ public abstract class BaseTestSheetUpdateArrayFormulas {
assertEquals(cra.formatAsString(), mcell.getArrayFormulaRange().formatAsString()); assertEquals(cra.formatAsString(), mcell.getArrayFormulaRange().formatAsString());
assertEquals("A2:A4*B2:B4", mcell.getCellFormula()); assertEquals("A2:A4*B2:B4", mcell.getCellFormula());
assertTrue(mcell.isPartOfArrayFormulaGroup()); assertTrue(mcell.isPartOfArrayFormulaGroup());
assertEquals(CellType.FORMULA, mcell.getCellType()); assertEquals(CellType.FORMULA, mcell.getCellTypeEnum());
} }
*/ */

View File

@ -23,6 +23,7 @@ import java.util.List;
* POILogger which logs into an ArrayList, so that * POILogger which logs into an ArrayList, so that
* tests can see what got logged * tests can see what got logged
*/ */
@Internal
public class DummyPOILogger extends POILogger { public class DummyPOILogger extends POILogger {
public List<String>logged = new ArrayList<String>(); public List<String>logged = new ArrayList<String>();
@ -39,12 +40,12 @@ public class DummyPOILogger extends POILogger {
public void initialize(String cat) {} public void initialize(String cat) {}
@Override @Override
public void log(int level, Object obj1) { protected void _log(int level, Object obj1) {
logged.add(level + " - " + obj1); logged.add(level + " - " + obj1);
} }
@Override @Override
public void log(int level, Object obj1, Throwable exception) { protected void _log(int level, Object obj1, Throwable exception) {
logged.add(level + " - " + obj1 + " - " + exception); logged.add(level + " - " + obj1 + " - " + exception);
} }
} }

View File

@ -65,13 +65,13 @@ public final class TestPOILogger extends POILogger {
} }
@Override @Override
public void log(int level, Object obj1) { protected void _log(int level, Object obj1) {
lastLog = (obj1 == null) ? "" : obj1.toString(); lastLog = (obj1 == null) ? "" : obj1.toString();
lastEx = null; lastEx = null;
} }
@Override @Override
public void log(int level, Object obj1, Throwable exception) { protected void _log(int level, Object obj1, Throwable exception) {
lastLog = (obj1 == null) ? "" : obj1.toString(); lastLog = (obj1 == null) ? "" : obj1.toString();
lastEx = exception; lastEx = exception;
} }

0
test-data/diagram/44501a.vsd Executable file → Normal file
View File

0
test-data/diagram/44501b.vsd Executable file → Normal file
View File

0
test-data/diagram/44501d.vsd Executable file → Normal file
View File

Binary file not shown.

Binary file not shown.

0
test-data/hsmf/logsat.com_signatures_valid.msg Executable file → Normal file
View File

View File

View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

0
test-data/spreadsheet/Themes2.xls Executable file → Normal file
View File

0
test-data/spreadsheet/noSharedStringTable.xlsx Executable file → Normal file
View File