]> source.dussan.org Git - poi.git/commitdiff
merge trunk to branch
authorAndreas Beeker <kiwiwings@apache.org>
Wed, 28 Sep 2016 21:01:40 +0000 (21:01 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Wed, 28 Sep 2016 21:01:40 +0000 (21:01 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/hssf_cryptoapi@1762709 13f79535-47bb-0310-9956-ffa450edef68

81 files changed:
KEYS
build.gradle [new file with mode: 0644]
build.xml
doap_POI.rdf
sonar/examples/pom.xml
sonar/excelant/pom.xml
sonar/main/pom.xml
sonar/ooxml-schema-encryption/pom.xml
sonar/ooxml-schema-security/pom.xml
sonar/ooxml-schema/pom.xml
sonar/ooxml/pom.xml
sonar/pom.xml
sonar/scratchpad/pom.xml
src/examples/src/org/apache/poi/hssf/usermodel/examples/InCellLists.java
src/integrationtest/org/apache/poi/TestAllFiles.java
src/java/org/apache/poi/hssf/usermodel/HSSFDataFormat.java
src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java
src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
src/java/org/apache/poi/poifs/nio/FileBackedDataSource.java
src/java/org/apache/poi/ss/formula/functions/Bin2Dec.java
src/java/org/apache/poi/ss/usermodel/CellStyle.java
src/java/org/apache/poi/ss/usermodel/CellValue.java
src/java/org/apache/poi/ss/usermodel/Workbook.java
src/java/org/apache/poi/ss/util/SheetUtil.java
src/java/org/apache/poi/util/CommonsLogger.java
src/java/org/apache/poi/util/DefaultTempFileCreationStrategy.java
src/java/org/apache/poi/util/NullLogger.java
src/java/org/apache/poi/util/POILogFactory.java
src/java/org/apache/poi/util/POILogger.java
src/java/org/apache/poi/util/SystemOutLogger.java
src/ooxml/java/org/apache/poi/extractor/ExtractorFactory.java
src/ooxml/java/org/apache/poi/poifs/crypt/dsig/SignatureConfig.java
src/ooxml/java/org/apache/poi/util/OOXMLLite.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java
src/ooxml/java/org/apache/poi/xssf/usermodel/BaseXSSFFormulaEvaluator.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotCacheDefinition.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPivotTable.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/ColumnHelper.java
src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java
src/ooxml/testcases/org/apache/poi/extractor/TestExtractorFactory.java
src/ooxml/testcases/org/apache/poi/poifs/crypt/TestSignatureInfo.java
src/ooxml/testcases/org/apache/poi/ss/formula/functions/TestProper.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/BaseTestXSSFPivotTable.java [new file with mode: 0644]
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTable.java [deleted file]
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTableName.java [new file with mode: 0644]
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTableRef.java [new file with mode: 0644]
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftRows.java
src/scratchpad/src/org/apache/poi/hmef/Attachment.java
src/scratchpad/src/org/apache/poi/hwpf/converter/WordToFoUtils.java
src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBugs.java
src/testcases/org/apache/poi/POITestCase.java
src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
src/testcases/org/apache/poi/poifs/filesystem/TestPOIFSDocumentPath.java
src/testcases/org/apache/poi/poifs/macros/TestVBAMacroReader.java
src/testcases/org/apache/poi/ss/formula/atp/TestIfError.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestSheetShiftRows.java
src/testcases/org/apache/poi/ss/usermodel/BaseTestSheetUpdateArrayFormulas.java
src/testcases/org/apache/poi/util/DummyPOILogger.java
src/testcases/org/apache/poi/util/TestPOILogger.java
test-data/diagram/44501a.vsd [changed mode: 0755->0644]
test-data/diagram/44501b.vsd [changed mode: 0755->0644]
test-data/diagram/44501d.vsd [changed mode: 0755->0644]
test-data/document/57843.doc [new file with mode: 0644]
test-data/document/60158.docm [new file with mode: 0644]
test-data/hsmf/logsat.com_signatures_valid.msg [changed mode: 0755->0644]
test-data/slideshow/aascu.org_workarea_downloadasset.aspx_id=5864.pptx [changed mode: 0755->0644]
test-data/slideshow/br.com.diversas.palestras_Nelson_20-_20Temas_20Diversos_20XXXVI_pmrg_462538ba7a204-programa_alianca_12-04-2007.ppt [changed mode: 0755->0644]
test-data/slideshow/br.com.tvcamboriu.www_pps_Pensar_5b1_5d.ppt [changed mode: 0755->0644]
test-data/spreadsheet/45565.xls [new file with mode: 0644]
test-data/spreadsheet/59687.xlsx [new file with mode: 0644]
test-data/spreadsheet/TestShiftRowSharedFormula.xlsx [new file with mode: 0644]
test-data/spreadsheet/Themes2.xls [changed mode: 0755->0644]
test-data/spreadsheet/at.gv.land-oberoesterreich.www_cps_rde_xbcr_SID-4A1B954F-5C07F98E_ooe_stat_download_bp10.xls [changed mode: 0755->0644]
test-data/spreadsheet/craftonhills.edu_programreview_report.aspx_goalpriorityreport_0011d159-1eeb-4b63-8833-867b0926e5f3.xlsx [changed mode: 0755->0644]
test-data/spreadsheet/noSharedStringTable.xlsx [changed mode: 0755->0644]

diff --git a/KEYS b/KEYS
index 6767cb00a30b55744ed189ac3c18c174feb6e13a..adc245d13118a21c759c89a2c4fa45f63427cb16 100644 (file)
--- a/KEYS
+++ b/KEYS
@@ -2386,3 +2386,102 @@ cCRRHYCeAZDU5UMxi0nonfT+060i2rLPSd7o0bstG7gb1pD99rKxL57M7uy+WBnk
 YobtRLhWHvHyWS4dKqiteeTwAqG2ZFOq98KCu1LXMKj42HqwOtB3L23HlhqVyA==
 =8e4G
 -----END PGP PUBLIC KEY BLOCK-----
+pub   4096R/8BABDD6C 2015-10-10 [expires: 2017-10-09]
+uid                  Javen O'Neal <javenoneal@gmail.com>
+uid                  Javen O'Neal <onealj@apache.org>
+sub   4096R/309424B4 2015-10-10 [expires: 2017-10-09]
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.22 (GNU/Linux)
+
+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-----
diff --git a/build.gradle b/build.gradle
new file mode 100644 (file)
index 0000000..20f98e8
--- /dev/null
@@ -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'
index d3623395d9297285e726634c5b9ef26698117999..975cf5c50c9253760891790d1d7769149c328fe1 100644 (file)
--- a/build.xml
+++ b/build.xml
@@ -40,7 +40,7 @@ under the License.
 
     <description>The Apache POI project Ant build.</description>
 
-    <property name="version.id" value="3.16-beta1"/>
+    <property name="version.id" value="3.15-beta4"/>
     <property name="release.rc" value="RC1"/>
 
     <property environment="env"/>
@@ -78,7 +78,7 @@ under the License.
       JVM system properties for running tests,
       user.language and user.country are required as we have locale-sensitive formatters
     -->
-    <property name="testpattern" value="Test*"/>
+    <property name="testpattern" value="Test*"/> <!--note: this excludes BaseTest* -->
     <property name="POI.testdata.path" value="test-data"/>
     <property name="java.awt.headless" value="true"/>
     <property name="additionaljar" value=""/>
index 5369344cd0f5fe2c19cebaa97a9a9310e5f77994..08106f476aed9914cd0a709ad19db331a6d7d7e9 100644 (file)
     <programming-language>Java</programming-language>
     <category rdf:resource="http://projects.apache.org/category/content" />
     <category rdf:resource="http://projects.apache.org/category/library" />
+    <release>
+      <Version>
+        <name>Apache POI 3.15</name>
+        <created>2016-09-21</created>
+        <revision>3.15</revision>
+      </Version>
+    </release>
     <release>
       <Version>
         <name>Apache POI 3.14</name>
index ea53c059708f9b2fba1e6b3e3ca13049356c5b3c..cac1dc446c7af6974abd5e106b3ebacd84d0afe2 100644 (file)
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>3.16-beta1-SNAPSHOT</version>
+        <version>3.15-beta4-SNAPSHOT</version>
     </parent>
     <artifactId>poi-examples</artifactId>
     <packaging>jar</packaging>
index a7b9408dc4b8f65d46ef29b5bd774bbfc413c6c3..2cbeec72807d1a9e281ab5cd614d3f00d37148a3 100644 (file)
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>3.16-beta1-SNAPSHOT</version>
+        <version>3.15-beta4-SNAPSHOT</version>
     </parent>
     <artifactId>poi-excelant</artifactId>
     <packaging>jar</packaging>
index 36422a83c820d6a6de3aa9a5e9f103464fba0b3c..26a8f2ba40ce49a0772aa39d2b3a78dc29ed0ac2 100644 (file)
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>3.16-beta1-SNAPSHOT</version>
+        <version>3.15-beta4-SNAPSHOT</version>
     </parent>
     <artifactId>poi-main</artifactId>
     <packaging>jar</packaging>
index cbb2eff7d38535f43592c0ad4ed72eadd378ed9f..d704a6525d40fefcbe28acae42bef43381378f3e 100644 (file)
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>3.16-beta1-SNAPSHOT</version>
+        <version>3.15-beta4-SNAPSHOT</version>
         <relativePath>..</relativePath>
     </parent>
     <artifactId>poi-ooxml-schema-encryption</artifactId>
index a822c73435f7bfa406e5ba8cedf3d17e4ce5aea9..7aae600f41561ffde1a1f3fbde04c8460d28f697 100644 (file)
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>3.16-beta1-SNAPSHOT</version>
+        <version>3.15-beta4-SNAPSHOT</version>
         <relativePath>..</relativePath>
     </parent>
     <artifactId>poi-ooxml-schema-security</artifactId>
index 5e2b9fef566d21607b52a21bf9869af2bb2488a2..e1d6526da94311305a3da04fd14f06684f24a1e2 100644 (file)
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>3.16-beta1-SNAPSHOT</version>
+        <version>3.15-beta4-SNAPSHOT</version>
         <relativePath>..</relativePath>
     </parent>
     <artifactId>poi-ooxml-schema</artifactId>
index 27636cdfa1e4c40e061b457ad90b51b11701a03b..305695ff1a48eba541a8a3e5bd51a8dc4236087f 100644 (file)
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>3.16-beta1-SNAPSHOT</version>
+        <version>3.15-beta4-SNAPSHOT</version>
     </parent>
     <artifactId>poi-ooxml</artifactId>
     <packaging>jar</packaging>
index 8e2a9fc42fb663050dc7f75fc8a5522be00c74ca..5acb3a5da2bd8b192c165f5b1be4bd82a1c58baf 100644 (file)
@@ -3,7 +3,7 @@
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-parent</artifactId>
        <packaging>pom</packaging>
-       <version>3.16-beta1-SNAPSHOT</version>
+       <version>3.15-beta4-SNAPSHOT</version>
        <name>Apache POI - the Java API for Microsoft Documents</name>
        <description>Maven build of Apache POI for Sonar checks</description>
        <url>http://poi.apache.org/</url>
index 6760762d673a366b89341e628630320f483e8531..91ede69a1cf67377b8a4c59b7c8db8e00830b312 100644 (file)
@@ -6,7 +6,7 @@
     <parent>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-parent</artifactId>
-        <version>3.16-beta1-SNAPSHOT</version>
+        <version>3.15-beta4-SNAPSHOT</version>
     </parent>
     <artifactId>poi-scratchpad</artifactId>
     <packaging>jar</packaging>
index a666c6ab7b72bbb50fb2e1917b0ec4672f7007bf..e1d4cbcbf811ef919f43fa5856e5760a5f4d916a 100644 (file)
@@ -67,27 +67,21 @@ public class InCellLists {
      *                       the Excel spreadsheet file this code will create.\r
      */\r
     public void demonstrateMethodCalls(String outputFilename) throws IOException {\r
-        HSSFWorkbook workbook = null;\r
-        HSSFSheet sheet = null;\r
-        HSSFRow row = null;\r
-        HSSFCell cell = null;\r
-        ArrayList<MultiLevelListItem> multiLevelListItems = null;\r
-        ArrayList<String> listItems = null;\r
+        HSSFWorkbook workbook = new HSSFWorkbook();\r
         try {\r
-            workbook = new HSSFWorkbook();\r
-            sheet = workbook.createSheet("In Cell Lists");\r
-            row = sheet.createRow(0);\r
+            HSSFSheet sheet = workbook.createSheet("In Cell Lists");\r
+            HSSFRow row = sheet.createRow(0);\r
 \r
             // Create a cell at A1 and insert a single, bulleted, item into\r
             // that cell.\r
-            cell = row.createCell(0);\r
+            HSSFCell cell = row.createCell(0);\r
             this.bulletedItemInCell(workbook, "List Item", cell);\r
 \r
             // Create a cell at A2 and insert a plain list - that is one\r
             // whose items are neither bulleted or numbered - into that cell.\r
             row = sheet.createRow(1);\r
             cell = row.createCell(0);\r
-            listItems = new ArrayList<String>();\r
+            ArrayList<String> listItems = new ArrayList<String>();\r
             listItems.add("List Item One.");\r
             listItems.add("List Item Two.");\r
             listItems.add("List Item Three.");\r
@@ -131,7 +125,7 @@ public class InCellLists {
             // to preserve order.\r
             row = sheet.createRow(4);\r
             cell = row.createCell(0);\r
-            multiLevelListItems = new ArrayList<MultiLevelListItem>();\r
+            ArrayList<MultiLevelListItem> multiLevelListItems = new ArrayList<MultiLevelListItem>();\r
             listItems = new ArrayList<String>();\r
             listItems.add("ML List Item One - Sub Item One.");\r
             listItems.add("ML List Item One - Sub Item Two.");\r
@@ -189,9 +183,7 @@ public class InCellLists {
             ioEx.printStackTrace(System.out);\r
         }\r
         finally {\r
-            if (workbook != null) {\r
-                workbook.close();\r
-            }\r
+            workbook.close();\r
         }\r
     }\r
 \r
@@ -236,7 +228,7 @@ public class InCellLists {
      *             will be written.\r
      */\r
     public void listInCell(HSSFWorkbook workbook, ArrayList<String> listItems, HSSFCell cell) {\r
-        StringBuffer buffer = new StringBuffer();\r
+        StringBuilder buffer = new StringBuilder();\r
         HSSFCellStyle wrapStyle = workbook.createCellStyle();\r
         wrapStyle.setWrapText(true);\r
         for(String listItem : listItems) {\r
@@ -269,7 +261,7 @@ public class InCellLists {
                                    HSSFCell cell,\r
                                    int startingValue,\r
                                    int increment) {\r
-        StringBuffer buffer = new StringBuffer();\r
+        StringBuilder buffer = new StringBuilder();\r
         int itemNumber = startingValue;\r
         // Note that again, an HSSFCellStye object is required and that\r
         // it's wrap text property should be set to 'true'\r
@@ -278,7 +270,7 @@ public class InCellLists {
         // Note that the basic method is identical to the listInCell() method\r
         // with one difference; a number prefixed to the items text.\r
         for(String listItem : listItems) {\r
-            buffer.append(String.valueOf(itemNumber) + ". ");\r
+            buffer.append(itemNumber).append(". ");\r
             buffer.append(listItem);\r
             buffer.append("\n");\r
             itemNumber += increment;\r
@@ -303,7 +295,7 @@ public class InCellLists {
     public void bulletedListInCell(HSSFWorkbook workbook,\r
                                    ArrayList<String> listItems,\r
                                    HSSFCell cell) {\r
-        StringBuffer buffer = new StringBuffer();\r
+        StringBuilder buffer = new StringBuilder();\r
         // Note that again, an HSSFCellStye object is required and that\r
         // it's wrap text property should be set to 'true'\r
         HSSFCellStyle wrapStyle = workbook.createCellStyle();\r
@@ -339,8 +331,7 @@ public class InCellLists {
     public void multiLevelListInCell(HSSFWorkbook workbook,\r
                                      ArrayList<MultiLevelListItem> multiLevelListItems,\r
                                      HSSFCell cell) {\r
-        StringBuffer buffer = new StringBuffer();\r
-        ArrayList<String> lowerLevelItems = null;\r
+        StringBuilder buffer = new StringBuilder();\r
         // Note that again, an HSSFCellStye object is required and that\r
         // it's wrap text property should be set to 'true'\r
         HSSFCellStyle wrapStyle = workbook.createCellStyle();\r
@@ -353,7 +344,7 @@ public class InCellLists {
             buffer.append("\n");\r
             // and then an ArrayList whose elements encapsulate the text\r
             // for the lower level list items.\r
-            lowerLevelItems = multiLevelListItem.getLowerLevelItems();\r
+            ArrayList<String> lowerLevelItems = multiLevelListItem.getLowerLevelItems();\r
             if(!(lowerLevelItems == null) && !(lowerLevelItems.isEmpty())) {\r
                 for(String item : lowerLevelItems) {\r
                     buffer.append(InCellLists.TAB);\r
@@ -401,10 +392,8 @@ public class InCellLists {
                                              int highLevelIncrement,\r
                                              int lowLevelStartingValue,\r
                                              int lowLevelIncrement) {\r
-        StringBuffer buffer = new StringBuffer();\r
+        StringBuilder buffer = new StringBuilder();\r
         int highLevelItemNumber = highLevelStartingValue;\r
-        int lowLevelItemNumber = 0;\r
-        ArrayList<String> lowerLevelItems = null;\r
         // Note that again, an HSSFCellStye object is required and that\r
         // it's wrap text property should be set to 'true'\r
         HSSFCellStyle wrapStyle = workbook.createCellStyle();\r
@@ -413,20 +402,20 @@ public class InCellLists {
         for(MultiLevelListItem multiLevelListItem : multiLevelListItems) {\r
             // For each element in the ArrayList, get the text for the high\r
             // level list item......\r
-            buffer.append(String.valueOf(highLevelItemNumber));\r
+            buffer.append(highLevelItemNumber);\r
             buffer.append(". ");\r
             buffer.append(multiLevelListItem.getItemText());\r
             buffer.append("\n");\r
             // and then an ArrayList whose elements encapsulate the text\r
             // for the lower level list items.\r
-            lowerLevelItems = multiLevelListItem.getLowerLevelItems();\r
+            ArrayList<String> lowerLevelItems = multiLevelListItem.getLowerLevelItems();\r
             if(!(lowerLevelItems == null) && !(lowerLevelItems.isEmpty())) {\r
-                lowLevelItemNumber = lowLevelStartingValue;\r
+                int lowLevelItemNumber = lowLevelStartingValue;\r
                 for(String item : lowerLevelItems) {\r
                     buffer.append(InCellLists.TAB);\r
-                    buffer.append(String.valueOf(highLevelItemNumber));\r
+                    buffer.append(highLevelItemNumber);\r
                     buffer.append(".");\r
-                    buffer.append(String.valueOf(lowLevelItemNumber));\r
+                    buffer.append(lowLevelItemNumber);\r
                     buffer.append(" ");\r
                     buffer.append(item);\r
                     buffer.append("\n");\r
@@ -459,8 +448,7 @@ public class InCellLists {
     public void multiLevelBulletedListInCell(HSSFWorkbook workbook,\r
                                              ArrayList<MultiLevelListItem> multiLevelListItems,\r
                                              HSSFCell cell) {\r
-        StringBuffer buffer = new StringBuffer();\r
-        ArrayList<String> lowerLevelItems = null;\r
+        StringBuilder buffer = new StringBuilder();\r
         // Note that again, an HSSFCellStye object is required and that\r
         // it's wrap text property should be set to 'true'\r
         HSSFCellStyle wrapStyle = workbook.createCellStyle();\r
@@ -475,7 +463,7 @@ public class InCellLists {
             buffer.append("\n");\r
             // and then an ArrayList whose elements encapsulate the text\r
             // for the lower level list items.\r
-            lowerLevelItems = multiLevelListItem.getLowerLevelItems();\r
+            ArrayList<String> lowerLevelItems = multiLevelListItem.getLowerLevelItems();\r
             if(!(lowerLevelItems == null) && !(lowerLevelItems.isEmpty())) {\r
                 for(String item : lowerLevelItems) {\r
                     buffer.append(InCellLists.TAB);\r
index e364c9f28ade7677424efa05a154d2074d89e514..6def523dbf2166134ffae6bd5e85a0d2f08d02f8 100644 (file)
@@ -232,6 +232,7 @@ public class TestAllFiles {
         EXPECTED_FAILURES.add("spreadsheet/43493.xls");
         EXPECTED_FAILURES.add("spreadsheet/46904.xls");
         EXPECTED_FAILURES.add("document/Bug50955.doc");
+        EXPECTED_FAILURES.add("document/57843.doc");
         EXPECTED_FAILURES.add("slideshow/PPT95.ppt");
         EXPECTED_FAILURES.add("openxml4j/OPCCompliance_CoreProperties_DCTermsNamespaceLimitedUseFAIL.docx");
         EXPECTED_FAILURES.add("openxml4j/OPCCompliance_CoreProperties_DoNotUseCompatibilityMarkupFAIL.docx");
index 6eecc7b2c9c0dbe79062546dde19efd9aaa851d6..23fe8cad767fde1b7382065b59dcfec0d2dfccec 100644 (file)
@@ -20,7 +20,6 @@ package org.apache.poi.hssf.usermodel;
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Locale;
 import java.util.Vector;
 
 import org.apache.poi.hssf.model.InternalWorkbook;
@@ -90,7 +89,7 @@ public final class HSSFDataFormat implements DataFormat {
        public short getFormat(String pFormat) {
           // Normalise the format string
                String format;
-               if (pFormat.toUpperCase(Locale.ROOT).equals("TEXT")) {
+               if (pFormat.equalsIgnoreCase("TEXT")) {
                        format = "@";
                } else {
                        format = pFormat;
index 20c7ffa1e42de18ec1b33a13acdcd07d8eb8867d..fa5082635ded5c4f55b2469149adfeb4371dcce5 100644 (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.CellValue;
 import org.apache.poi.ss.usermodel.FormulaEvaluator;
-import org.apache.poi.ss.usermodel.RichTextString;
 import org.apache.poi.ss.usermodel.Workbook;
 
 /**
@@ -80,11 +79,6 @@ public class HSSFFormulaEvaluator extends BaseFormulaEvaluator {
     public static HSSFFormulaEvaluator create(HSSFWorkbook workbook, IStabilityClassifier stabilityClassifier, UDFFinder udfFinder) {
         return new HSSFFormulaEvaluator(workbook, stabilityClassifier, udfFinder);
     }
-    
-    @Override
-    protected RichTextString createRichTextString(String str) {
-        return new HSSFRichTextString(str);
-    }
 
 
     /**
@@ -140,10 +134,87 @@ public class HSSFFormulaEvaluator extends BaseFormulaEvaluator {
     public void notifySetFormula(Cell cell) {
         _bookEvaluator.notifyUpdateCell(new HSSFEvaluationCell((HSSFCell)cell));
     }
-    
+
+    /**
+     * If cell contains formula, it evaluates the formula, and saves the result of the formula. The
+     * cell remains as a formula cell. If the cell does not contain formula, rather than throwing an
+     * exception, this method returns {@link CellType#_NONE} and leaves the cell unchanged.
+     *
+     * Note that the type of the <em>formula result</em> is returned, so you know what kind of
+     * cached formula result is also stored with  the formula.
+     * <pre>
+     * CellType evaluatedCellType = evaluator.evaluateFormulaCell(cell);
+     * </pre>
+     * Be aware that your cell will hold both the formula, and the result. If you want the cell
+     * replaced with the result of the formula, use {@link #evaluateInCell(org.apache.poi.ss.usermodel.Cell)}
+     * @param cell The cell to evaluate
+     * @return {@link CellType#_NONE} for non-formula cells, or the type of the <em>formula result</em>
+     * @since POI 3.15 beta 3
+     * @deprecated POI 3.15 beta 3. Will be deleted when we make the CellType enum transition. See bug 59791.
+     */
+    @Internal
+    @Override
+    public CellType evaluateFormulaCellEnum(Cell cell) {
+        if (cell == null || cell.getCellTypeEnum() != CellType.FORMULA) {
+            return CellType._NONE;
+        }
+        CellValue cv = evaluateFormulaCellValue(cell);
+        // cell remains a formula cell, but the cached value is changed
+        setCellValue(cell, cv);
+        return cv.getCellType();
+    }
+
+    /**
+     * If cell contains formula, it evaluates the formula, and
+     *  puts the formula result back into the cell, in place
+     *  of the old formula.
+     * Else if cell does not contain formula, this method leaves
+     *  the cell unchanged.
+     * Note that the same instance of HSSFCell is returned to
+     * allow chained calls like:
+     * <pre>
+     * int evaluatedCellType = evaluator.evaluateInCell(cell).getCellType();
+     * </pre>
+     * Be aware that your cell value will be changed to hold the
+     *  result of the formula. If you simply want the formula
+     *  value computed for you, use {@link #evaluateFormulaCellEnum(Cell)}}
+     */
     @Override
     public HSSFCell evaluateInCell(Cell cell) {
-        return (HSSFCell) super.evaluateInCell(cell);
+        if (cell == null) {
+            return null;
+        }
+        HSSFCell result = (HSSFCell) cell;
+        if (cell.getCellTypeEnum() == CellType.FORMULA) {
+            CellValue cv = evaluateFormulaCellValue(cell);
+            setCellValue(cell, cv);
+            setCellType(cell, cv); // cell will no longer be a formula cell
+        }
+        return result;
+    }
+
+    private static void setCellValue(Cell cell, CellValue cv) {
+        CellType cellType = cv.getCellType();
+        switch (cellType) {
+            case BOOLEAN:
+                cell.setCellValue(cv.getBooleanValue());
+                break;
+            case ERROR:
+                cell.setCellErrorValue(cv.getErrorValue());
+                break;
+            case NUMERIC:
+                cell.setCellValue(cv.getNumberValue());
+                break;
+            case STRING:
+                cell.setCellValue(new HSSFRichTextString(cv.getStringValue()));
+                break;
+            case BLANK:
+                // never happens - blanks eventually get translated to zero
+            case FORMULA:
+                // this will never happen, we have already evaluated the formula
+            default:
+                throw new IllegalStateException("Unexpected cell value type (" + cellType + ")");
+        }
     }
 
     /**
index 2800904af10370551629ea23f4b6d7bf5841794b..b4339587b935502f70f23bfda71f45737a3f4e5d 100644 (file)
@@ -963,8 +963,9 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss
      * Get the HSSFSheet object at the given index.
      * @param index of the sheet number (0-based physical & logical)
      * @return HSSFSheet at the provided index
+     * @throws IllegalArgumentException if the index is out of range (index
+     *            &lt; 0 || index &gt;= getNumberOfSheets()).
      */
-
     @Override
     public HSSFSheet getSheetAt(int index)
     {
index 47637daa3a6c58e084242095f3d1813a95c698d6..32a8701fb8ef2d8312929f0e91c639227f5fd0d1 100644 (file)
@@ -88,27 +88,26 @@ public class FileBackedDataSource extends DataSource {
          throw new IndexOutOfBoundsException("Position " + position + " past the end of the file");
       }
       
-      // Do we read or map (for read/write?
+      // Do we read or map (for read/write)?
       ByteBuffer dst;
-      int worked = -1;
       if (writable) {
           dst = channel.map(FileChannel.MapMode.READ_WRITE, position, length);
-          worked = 0;
-          // remember the buffer for cleanup if necessary
-          buffersToClean.add(dst);  
+
+          // remember this buffer for cleanup
+          buffersToClean.add(dst);
       } else {
-          // Read
+          // allocate the buffer on the heap if we cannot map the data in directly
           channel.position(position);
           dst = ByteBuffer.allocate(length);
-          worked = IOUtils.readFully(channel, dst);
-      }
 
-      // Check
-      if(worked == -1) {
-         throw new IndexOutOfBoundsException("Position " + position + " past the end of the file");
+          // Read the contents and check that we could read some data
+          int worked = IOUtils.readFully(channel, dst);
+          if(worked == -1) {
+              throw new IndexOutOfBoundsException("Position " + position + " past the end of the file");
+          }
       }
 
-      // Ready it for reading
+      // make it ready for reading
       dst.position(0);
 
       // All done
index 9617877ca6675925576746e8a43dc9b79b36b538..cb206051c090c07d83c7b3657c802beb454ee080 100644 (file)
@@ -84,7 +84,7 @@ public class Bin2Dec extends Fixed1ArgFunction implements FreeRefFunction {
                 //Add 1 to obtained number\r
                 sum++;\r
     \r
-                value = "-" + String.valueOf(sum);\r
+                value = "-" + sum;\r
             }\r
         } catch (NumberFormatException e) {\r
             return ErrorEval.NUM_ERROR;\r
index df3d57259825f639d1070980164b69b377a26a40..1eab8dec19ca09f128ea9d56c3603ecc8e1fe791 100644 (file)
@@ -26,308 +26,308 @@ public interface CellStyle {
      * @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#GENERAL} instead.
      */
     @Removal(version="3.17")
-    static final short ALIGN_GENERAL = 0x0; //HorizontalAlignment.GENERAL.getCode();
+    short ALIGN_GENERAL = 0x0; //HorizontalAlignment.GENERAL.getCode();
 
     /**
      * left-justified horizontal alignment
      * @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#LEFT} instead.
      */
     @Removal(version="3.17")
-    static final short ALIGN_LEFT = 0x1; //HorizontalAlignment.LEFT.getCode();
+    short ALIGN_LEFT = 0x1; //HorizontalAlignment.LEFT.getCode();
 
     /**
      * center horizontal alignment
      * @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#CENTER} instead.
      */
     @Removal(version="3.17")
-    static final short ALIGN_CENTER = 0x2; //HorizontalAlignment.CENTER.getCode();
+    short ALIGN_CENTER = 0x2; //HorizontalAlignment.CENTER.getCode();
 
     /**
      * right-justified horizontal alignment
      * @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#RIGHT} instead.
      */
     @Removal(version="3.17")
-    static final short ALIGN_RIGHT = 0x3; //HorizontalAlignment.RIGHT.getCode();
+    short ALIGN_RIGHT = 0x3; //HorizontalAlignment.RIGHT.getCode();
 
     /**
      * fill? horizontal alignment
      * @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#FILL} instead.
      */
     @Removal(version="3.17")
-    static final short ALIGN_FILL = 0x4; //HorizontalAlignment.FILL.getCode();
+    short ALIGN_FILL = 0x4; //HorizontalAlignment.FILL.getCode();
 
     /**
      * justified horizontal alignment
      * @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#JUSTIFY} instead.
      */
     @Removal(version="3.17")
-    static final short ALIGN_JUSTIFY = 0x5; //HorizontalAlignment.JUSTIFY.getCode();
+    short ALIGN_JUSTIFY = 0x5; //HorizontalAlignment.JUSTIFY.getCode();
 
     /**
      * center-selection? horizontal alignment
      * @deprecated POI 3.15 beta 3. Use {@link HorizontalAlignment#CENTER_SELECTION} instead.
      */
     @Removal(version="3.17")
-    static final short ALIGN_CENTER_SELECTION = 0x6; //HorizontalAlignment.CENTER_SELECTION.getCode();
+    short ALIGN_CENTER_SELECTION = 0x6; //HorizontalAlignment.CENTER_SELECTION.getCode();
 
     /**
      * top-aligned vertical alignment
      * @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#TOP} instead.
      */
     @Removal(version="3.17")
-    static final short VERTICAL_TOP = 0x0; //VerticalAlignment.TOP.getCode();
+    short VERTICAL_TOP = 0x0; //VerticalAlignment.TOP.getCode();
 
     /**
      * center-aligned vertical alignment
      * @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#CENTER} instead.
      */
     @Removal(version="3.17")
-    static final short VERTICAL_CENTER = 0x1; //VerticalAlignment.CENTER.getCode();
+    short VERTICAL_CENTER = 0x1; //VerticalAlignment.CENTER.getCode();
 
     /**
      * bottom-aligned vertical alignment
      * @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#BOTTOM} instead.
      */
     @Removal(version="3.17")
-    static final short VERTICAL_BOTTOM = 0x2; //VerticalAlignment.BOTTOM.getCode();
+    short VERTICAL_BOTTOM = 0x2; //VerticalAlignment.BOTTOM.getCode();
 
     /**
      * vertically justified vertical alignment
      * @deprecated POI 3.15 beta 3. Use {@link VerticalAlignment#JUSTIFY} instead.
      */
     @Removal(version="3.17")
-    static final short VERTICAL_JUSTIFY = 0x3; //VerticalAlignment.JUSTIFY.getCode();
+    short VERTICAL_JUSTIFY = 0x3; //VerticalAlignment.JUSTIFY.getCode();
 
     /**
      * No border
      * @deprecated 3.15 beta 2. Use {@link BorderStyle#NONE} instead.
      */
     @Removal(version="3.17")
-    static final short BORDER_NONE = 0x0; //BorderStyle.NONE.getCode();
+    short BORDER_NONE = 0x0; //BorderStyle.NONE.getCode();
 
     /**
      * Thin border
      * @deprecated 3.15 beta 2. Use {@link BorderStyle#THIN} instead.
      */
     @Removal(version="3.17")
-    static final short BORDER_THIN = 0x1; //BorderStyle.THIN.getCode();
+    short BORDER_THIN = 0x1; //BorderStyle.THIN.getCode();
 
     /**
      * Medium border
      * @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM} instead.
      */
     @Removal(version="3.17")
-    static final short BORDER_MEDIUM = 0x2; //BorderStyle.MEDIUM.getCode();
+    short BORDER_MEDIUM = 0x2; //BorderStyle.MEDIUM.getCode();
 
     /**
      * dash border
      * @deprecated 3.15 beta 2. Use {@link BorderStyle#DASHED} instead.
      */
     @Removal(version="3.17")
-    static final short BORDER_DASHED = 0x3; //BorderStyle.DASHED.getCode();
+    short BORDER_DASHED = 0x3; //BorderStyle.DASHED.getCode();
 
     /**
      * dot border
      * @deprecated 3.15 beta 2. Use {@link BorderStyle#DOTTED} instead.
      */
     @Removal(version="3.17")
-    static final short BORDER_DOTTED = 0x4; //BorderStyle.DOTTED.getCode();
+    short BORDER_DOTTED = 0x4; //BorderStyle.DOTTED.getCode();
 
     /**
      * Thick border
      * @deprecated 3.15 beta 2. Use {@link BorderStyle#THICK} instead.
      */
     @Removal(version="3.17")
-    static final short BORDER_THICK = 0x5; //BorderStyle.THICK.getCode();
+    short BORDER_THICK = 0x5; //BorderStyle.THICK.getCode();
 
     /**
      * double-line border
      * @deprecated 3.15 beta 2. Use {@link BorderStyle#DOUBLE} instead.
      */
     @Removal(version="3.17")
-    static final short BORDER_DOUBLE = 0x6; //BorderStyle.DOUBLE.getCode();
+    short BORDER_DOUBLE = 0x6; //BorderStyle.DOUBLE.getCode();
 
     /**
      * hair-line border
      * @deprecated 3.15 beta 2. Use {@link BorderStyle#HAIR} instead.
      */
     @Removal(version="3.17")
-    static final short BORDER_HAIR = 0x7; //BorderStyle.HAIR.getCode();
+    short BORDER_HAIR = 0x7; //BorderStyle.HAIR.getCode();
 
     /**
      * Medium dashed border
      * @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM_DASHED} instead.
      */
     @Removal(version="3.17")
-    static final short BORDER_MEDIUM_DASHED = 0x8; //BorderStyle.MEDIUM_DASHED.getCode();
+    short BORDER_MEDIUM_DASHED = 0x8; //BorderStyle.MEDIUM_DASHED.getCode();
 
     /**
      * dash-dot border
      * @deprecated 3.15 beta 2. Use {@link BorderStyle#DASH_DOT} instead.
      */
     @Removal(version="3.17")
-    static final short BORDER_DASH_DOT = 0x9; //BorderStyle.DASH_DOT.getCode();
+    short BORDER_DASH_DOT = 0x9; //BorderStyle.DASH_DOT.getCode();
 
     /**
      * medium dash-dot border
      * @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM_DASH_DOT} instead.
      */
     @Removal(version="3.17")
-    static final short BORDER_MEDIUM_DASH_DOT = 0xA; //BorderStyle.MEDIUM_DASH_DOT.getCode();
+    short BORDER_MEDIUM_DASH_DOT = 0xA; //BorderStyle.MEDIUM_DASH_DOT.getCode();
 
     /**
      * dash-dot-dot border
      * @deprecated 3.15 beta 2. Use {@link BorderStyle#DASH_DOT_DOT} instead.
      */
     @Removal(version="3.17")
-    static final short BORDER_DASH_DOT_DOT = 0xB; //BorderStyle.DASH_DOT_DOT.getCode();
+    short BORDER_DASH_DOT_DOT = 0xB; //BorderStyle.DASH_DOT_DOT.getCode();
 
     /**
      * medium dash-dot-dot border
      * @deprecated 3.15 beta 2. Use {@link BorderStyle#MEDIUM_DASH_DOT_DOT} instead.
      */
     @Removal(version="3.17")
-    static final short BORDER_MEDIUM_DASH_DOT_DOT = 0xC; //BorderStyle.MEDIUM_DASH_DOT_DOT.getCode();
+    short BORDER_MEDIUM_DASH_DOT_DOT = 0xC; //BorderStyle.MEDIUM_DASH_DOT_DOT.getCode();
 
     /**
      * slanted dash-dot border
      * @deprecated 3.15 beta 2. Use {@link BorderStyle#SLANTED_DASH_DOT} instead.
      */
     @Removal(version="3.17")
-    static final short BORDER_SLANTED_DASH_DOT = 0xD; //BorderStyle.SLANTED_DASH_DOT.getCode();
+    short BORDER_SLANTED_DASH_DOT = 0xD; //BorderStyle.SLANTED_DASH_DOT.getCode();
 
     /** 
      * Fill Pattern: No background
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#NO_FILL} instead.
      */
     @Removal(version="3.17")
-    static final short NO_FILL = 0; //FillPatternType.NO_FILL.getCode();
+    short NO_FILL = 0; //FillPatternType.NO_FILL.getCode();
 
     /**
      * Fill Pattern: Solidly filled
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#SOLID_FOREGROUND} instead.
      */
     @Removal(version="3.17")
-    static final short SOLID_FOREGROUND = 1; //FillPatternType.SOLID_FOREGROUND.getCode();
+    short SOLID_FOREGROUND = 1; //FillPatternType.SOLID_FOREGROUND.getCode();
 
     /**
      * Fill Pattern: Small fine dots
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#FINE_DOTS} instead.
      */
     @Removal(version="3.17")
-    static final short FINE_DOTS = 2; //FillPatternType.FINE_DOTS.getCode();
+    short FINE_DOTS = 2; //FillPatternType.FINE_DOTS.getCode();
 
     /**
      * Fill Pattern: Wide dots
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#ALT_BARS} instead.
      */
     @Removal(version="3.17")
-    static final short ALT_BARS = 3; //FillPatternType.ALT_BARS.getCode();
+    short ALT_BARS = 3; //FillPatternType.ALT_BARS.getCode();
 
     /**
      * Fill Pattern: Sparse dots
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#SPARSE_DOTS} instead.
      */
     @Removal(version="3.17")
-    static final short SPARSE_DOTS = 4; //FillPatternType.SPARSE_DOTS.getCode();
+    short SPARSE_DOTS = 4; //FillPatternType.SPARSE_DOTS.getCode();
 
     /**
      * Fill Pattern: Thick horizontal bands
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_HORZ_BANDS} instead.
      */
     @Removal(version="3.17")
-    static final short THICK_HORZ_BANDS = 5; //FillPatternType.THICK_HORZ_BANDS.getCode();
+    short THICK_HORZ_BANDS = 5; //FillPatternType.THICK_HORZ_BANDS.getCode();
 
     /**
      * Fill Pattern: Thick vertical bands
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_VERT_BANDS} instead.
      */
     @Removal(version="3.17")
-    static final short THICK_VERT_BANDS = 6; //FillPatternType.THICK_VERT_BANDS.getCode();
+    short THICK_VERT_BANDS = 6; //FillPatternType.THICK_VERT_BANDS.getCode();
 
     /**
      * Fill Pattern: Thick backward facing diagonals
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_BACKWARD_DIAG} instead.
      */
     @Removal(version="3.17")
-    static final short THICK_BACKWARD_DIAG = 7; //FillPatternType.THICK_BACKWARD_DIAG.getCode();
+    short THICK_BACKWARD_DIAG = 7; //FillPatternType.THICK_BACKWARD_DIAG.getCode();
 
     /**
      * Fill Pattern: Thick forward facing diagonals
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#THICK_FORWARD_DIAG} instead.
      */
     @Removal(version="3.17")
-    static final short THICK_FORWARD_DIAG = 8; //FillPatternType.THICK_FORWARD_DIAG.getCode();
+    short THICK_FORWARD_DIAG = 8; //FillPatternType.THICK_FORWARD_DIAG.getCode();
 
     /**
      * Fill Pattern: Large spots
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#BIG_SPOTS} instead.
      */
     @Removal(version="3.17")
-    static final short BIG_SPOTS = 9; //FillPatternType.BIG_SPOTS.getCode();
+    short BIG_SPOTS = 9; //FillPatternType.BIG_SPOTS.getCode();
 
     /**
      * Fill Pattern: Brick-like layout
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#BRICKS} instead.
      */
     @Removal(version="3.17")
-    static final short BRICKS = 10; //FillPatternType.BRICKS.getCode();
+    short BRICKS = 10; //FillPatternType.BRICKS.getCode();
 
     /**
      * Fill Pattern: Thin horizontal bands
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_HORZ_BANDS} instead.
      */
     @Removal(version="3.17")
-    static final short THIN_HORZ_BANDS = 11; //FillPatternType.THIN_HORZ_BANDS.getCode();
+    short THIN_HORZ_BANDS = 11; //FillPatternType.THIN_HORZ_BANDS.getCode();
 
     /**
      * Fill Pattern: Thin vertical bands
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_VERT_BANDS} instead.
      */
     @Removal(version="3.17")
-    static final short THIN_VERT_BANDS = 12; //FillPatternType.THIN_VERT_BANDS.getCode();
+    short THIN_VERT_BANDS = 12; //FillPatternType.THIN_VERT_BANDS.getCode();
 
     /**
      * Fill Pattern: Thin backward diagonal
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_BACKWARD_DIAG} instead.
      */
     @Removal(version="3.17")
-    static final short THIN_BACKWARD_DIAG = 13; //FillPatternType.THIN_BACKWARD_DIAG.getCode();
+    short THIN_BACKWARD_DIAG = 13; //FillPatternType.THIN_BACKWARD_DIAG.getCode();
 
     /**
      * Fill Pattern: Thin forward diagonal
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#THIN_FORWARD_DIAG} instead.
      */
     @Removal(version="3.17")
-    static final short THIN_FORWARD_DIAG = 14; //FillPatternType.THIN_FORWARD_DIAG.getCode();
+    short THIN_FORWARD_DIAG = 14; //FillPatternType.THIN_FORWARD_DIAG.getCode();
 
     /**
      * Fill Pattern: Squares
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#SQUARES} instead.
      */
     @Removal(version="3.17")
-    static final short SQUARES = 15; //FillPatternType.SQUARES.getCode();
+    short SQUARES = 15; //FillPatternType.SQUARES.getCode();
 
     /**
      * Fill Pattern: Diamonds
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#DIAMONDS} instead.
      */
     @Removal(version="3.17")
-    static final short DIAMONDS = 16; //FillPatternType.DIAMONDS.getCode();
+    short DIAMONDS = 16; //FillPatternType.DIAMONDS.getCode();
 
     /**
      * Fill Pattern: Less Dots
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#LESS_DOTS} instead.
      */
     @Removal(version="3.17")
-    static final short LESS_DOTS = 17; //FillPatternType.LESS_DOTS.getCode();
+    short LESS_DOTS = 17; //FillPatternType.LESS_DOTS.getCode();
 
     /**
      * Fill Pattern: Least Dots
      * @deprecated 3.15 beta 3. Use {@link FillPatternType#LEAST_DOTS} instead.
      */
     @Removal(version="3.17")
-    static final short LEAST_DOTS = 18; //FillPatternType.LEAST_DOTS.getCode();
+    short LEAST_DOTS = 18; //FillPatternType.LEAST_DOTS.getCode();
 
     /**
      * get the index within the Workbook (sequence within the collection of ExtnededFormat objects)
@@ -353,7 +353,7 @@ public interface CellStyle {
     /**
      * Get the format string
      */
-    public String getDataFormatString();
+    String getDataFormatString();
 
     /**
      * set the font for this style
@@ -870,17 +870,17 @@ public interface CellStyle {
      *  to be of the same type (HSSFCellStyle or
      *  XSSFCellStyle)
      */
-    public void cloneStyleFrom(CellStyle source);
+    void cloneStyleFrom(CellStyle source);
     
     /**
      * Controls if the Cell should be auto-sized
      *  to shrink to fit if the text is too long
      */
-    public void setShrinkToFit(boolean shrinkToFit);
+    void setShrinkToFit(boolean shrinkToFit);
 
     /**
      * Should the Cell be auto-sized by Excel to shrink
      *  it to fit if this text is too long?
      */
-    public boolean getShrinkToFit();
+    boolean getShrinkToFit();
 }
index 301accfca8e2f7a0c0e27a11fec5307660735b12..b10210882a5f7b4b6af950b9f660e912cef3c3a4 100644 (file)
@@ -18,6 +18,8 @@
 package org.apache.poi.ss.usermodel;
 
 import org.apache.poi.ss.formula.eval.ErrorEval;
+import org.apache.poi.util.Internal;
+import org.apache.poi.util.Removal;
 
 /**
  * Mimics the 'data view' of a cell. This allows formula evaluator
@@ -47,12 +49,15 @@ public final class CellValue {
        public CellValue(double numberValue) {
                this(CellType.NUMERIC, numberValue, false, null, 0);
        }
+
        public static CellValue valueOf(boolean booleanValue) {
                return booleanValue ? TRUE : FALSE;
        }
+
        public CellValue(String stringValue) {
                this(CellType.STRING, 0.0, false, stringValue, 0);
        }
+
        public static CellValue getError(int errorCode) {
                return new CellValue(CellType.ERROR, 0.0, false, null, errorCode);
        }
@@ -64,30 +69,44 @@ public final class CellValue {
        public boolean getBooleanValue() {
                return _booleanValue;
        }
+
        /**
         * @return Returns the numberValue.
         */
        public double getNumberValue() {
                return _numberValue;
        }
+
        /**
         * @return Returns the stringValue.
         */
        public String getStringValue() {
                return _textValue;
        }
+
+    /**
+     * Return the cell type.
+     *
+     * @return the cell type
+     * @since POI 3.15
+     * @deprecated POI 3.15
+     * Will be renamed to <code>getCellTypeEnum()</code> when we make the CellType enum transition in POI 4.0. See bug 59791.
+     */
+    @Internal(since="POI 3.15 beta 3")
+    @Removal(version="4.2")
+    public CellType getCellTypeEnum() {
+        return _cellType;
+    }
+
        /**
-        * @return Returns the cellType.
-        * @since POI 3.15
-        */
-       public CellType getCellTypeEnum() {
-               return _cellType;
-       }
-       /**
-        * @return Returns the cellType.
+        * Return the cell type.
+        *
+        * Will return {@link CellType} in version 4.0 of POI.
+        * For forwards compatibility, do not hard-code cell type literals in your code.
+        *
+        * @return the cell type
+        *
         * @deprecated POI 3.15. Use {@link #getCellTypeEnum()} instead.
-        * In the future, the signature of this method will be changed to return a
-        * {@link CellType}.
         */
        @Deprecated
        public int getCellType() {
@@ -100,6 +119,7 @@ public final class CellValue {
        public byte getErrorValue() {
                return (byte) _errorCode;
        }
+
        public String toString() {
                StringBuffer sb = new StringBuffer(64);
                sb.append(getClass().getName()).append(" [");
index e52615fb1a9d870fc80140c6e78ffad2f0c7b20d..f5043b727f326a0ea837ff61942e391fdcd07806 100644 (file)
@@ -35,22 +35,22 @@ import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
 public interface Workbook extends Closeable, Iterable<Sheet> {
 
     /** Extended windows meta file */
-    public static final int PICTURE_TYPE_EMF = 2;
+    int PICTURE_TYPE_EMF = 2;
 
     /** Windows Meta File */
-    public static final int PICTURE_TYPE_WMF = 3;
+    int PICTURE_TYPE_WMF = 3;
 
     /** Mac PICT format */
-    public static final int PICTURE_TYPE_PICT = 4;
+    int PICTURE_TYPE_PICT = 4;
 
     /** JPEG format */
-    public static final int PICTURE_TYPE_JPEG = 5;
+    int PICTURE_TYPE_JPEG = 5;
 
     /** PNG format */
-    public static final int PICTURE_TYPE_PNG = 6;
+    int PICTURE_TYPE_PNG = 6;
 
     /** Device independent bitmap */
-    public static final int PICTURE_TYPE_DIB = 7;
+    int PICTURE_TYPE_DIB = 7;
 
 
     /**
@@ -58,14 +58,14 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
      *
      * @see #setSheetHidden(int, int)
      */
-    public static final int SHEET_STATE_VISIBLE = 0;
+    int SHEET_STATE_VISIBLE = 0;
 
     /**
      * Indicates the book window is hidden, but can be shown by the user via the user interface.
      *
      * @see #setSheetHidden(int, int)
      */
-    public static final int SHEET_STATE_HIDDEN = 1;
+    int SHEET_STATE_HIDDEN = 1;
 
     /**
      * Indicates the sheet is hidden and cannot be shown in the user interface (UI).
@@ -77,7 +77,7 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
      *
      * @see #setSheetHidden(int, int)
      */
-    public static final int SHEET_STATE_VERY_HIDDEN = 2;
+    int SHEET_STATE_VERY_HIDDEN = 2;
 
     /**
      * Convenience method to get the active sheet.  The active sheet is is the sheet
@@ -169,7 +169,7 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
     int getSheetIndex(Sheet sheet);
 
     /**
-     * Sreate an Sheet for this Workbook, adds it to the sheets and returns
+     * Create a Sheet for this Workbook, adds it to the sheets and returns
      * the high level representation.  Use this to create new sheets.
      *
      * @return Sheet representing the new sheet.
@@ -217,7 +217,7 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
      * See {@link org.apache.poi.ss.util.WorkbookUtil#createSafeSheetName(String nameProposal)}
      *      for a safe way to create valid names
      * </p>
-     * @param sheetname  sheetname to set for the sheet.
+     * @param sheetname The name to set for the sheet.
      * @return Sheet representing the new sheet.
      * @throws IllegalArgumentException if the name is null or invalid
      *  or workbook already contains a sheet with this name
@@ -253,6 +253,8 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
      *
      * @param index of the sheet number (0-based physical & logical)
      * @return Sheet at the provided index
+     * @throws IllegalArgumentException if the index is out of range (index
+     *            &lt; 0 || index &gt;= getNumberOfSheets()).
      */
     Sheet getSheetAt(int index);
 
@@ -617,7 +619,7 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
      * workbook values when the workbook is opened
      * @since 3.8
      */
-    public void setForceFormulaRecalculation(boolean value);
+    void setForceFormulaRecalculation(boolean value);
 
     /**
      * Whether Excel will be asked to recalculate all formulas when the  workbook is opened.
@@ -632,6 +634,5 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
      * @return SpreadsheetVersion enum
      * @since 3.14 beta 2
      */
-    public SpreadsheetVersion getSpreadsheetVersion();
-
+    SpreadsheetVersion getSpreadsheetVersion();
 }
index d64dbeba82ad579df87f61b1edc67064c5dc5847..f234380fe9c86f871789177f7c40f4b96ed4aa9b 100644 (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?
         int colspan = 1;
         for (CellRangeAddress region : sheet.getMergedRegions()) {
-            if (containsCell(region, row.getRowNum(), column)) {
+            if (region.isInRange(row.getRowNum(), column)) {
                 if (!useMergedCells) {
                     // If we're not using merged cells, skip this one and move on to the next.
                     return -1;
@@ -151,8 +151,8 @@ public class SheetUtil {
         if (cellType == CellType.STRING) {
             RichTextString rt = cell.getRichStringCellValue();
             String[] lines = rt.getString().split("\\n");
-            for (int i = 0; i < lines.length; i++) {
-                String txt = lines[i] + defaultChar;
+            for (String line : lines) {
+                String txt = line + defaultChar;
 
                 AttributedString str = new AttributedString(txt);
                 copyAttributes(font, str, 0, txt.length());
@@ -193,7 +193,7 @@ public class SheetUtil {
      * @param defaultCharWidth the width of a character using the default font in a workbook
      * @param colspan the number of columns that is spanned by the cell (1 if the cell is not part of a merged region)
      * @param style the cell style, which contains text rotation and indention information needed to compute the cell width
-     * @param width the minimum best-fit width. This algorithm will only return values greater than or equal to the minimum width.
+     * @param minWidth the minimum best-fit width. This algorithm will only return values greater than or equal to the minimum width.
      * @param str the text contained in the cell
      * @return the best fit cell width
      */
@@ -219,8 +219,7 @@ public class SheetUtil {
         }
         // frameWidth accounts for leading spaces which is excluded from bounds.getWidth()
         final double frameWidth = bounds.getX() + bounds.getWidth();
-        final double width = Math.max(minWidth, ((frameWidth / colspan) / defaultCharWidth) + style.getIndention());
-        return width;
+        return Math.max(minWidth, ((frameWidth / colspan) / defaultCharWidth) + style.getIndention());
     }
 
     /**
@@ -273,13 +272,12 @@ public class SheetUtil {
         AttributedString str = new AttributedString(String.valueOf(defaultChar));
         copyAttributes(defaultFont, str, 0, 1);
         TextLayout layout = new TextLayout(str.getIterator(), fontRenderContext);
-        int defaultCharWidth = (int) layout.getAdvance();
-        return defaultCharWidth;
+        return (int) layout.getAdvance();
     }
 
     /**
      * Compute width of a single cell in a row
-     * Convenience method for {@link getCellWidth}
+     * Convenience method for {@link #getCellWidth}
      *
      * @param row the row that contains the cell of interest
      * @param column the column number of the cell whose width is to be calculated
@@ -334,7 +332,7 @@ public class SheetUtil {
     private static void copyAttributes(Font font, AttributedString str, int startIdx, int endIdx) {
         str.addAttribute(TextAttribute.FAMILY, font.getFontName(), startIdx, endIdx);
         str.addAttribute(TextAttribute.SIZE, (float)font.getFontHeightInPoints());
-        if (font.getBoldweight() == Font.BOLDWEIGHT_BOLD) str.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, startIdx, endIdx);
+        if (font.getBold()) str.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, startIdx, endIdx);
         if (font.getItalic() ) str.addAttribute(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE, startIdx, endIdx);
         if (font.getUnderline() == Font.U_SINGLE ) str.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, startIdx, endIdx);
     }
@@ -348,6 +346,7 @@ public class SheetUtil {
      * @return true if the range contains the cell [rowIx, colIx]
      * @deprecated 3.15 beta 2. Use {@link CellRangeAddressBase#isInRange(int, int)}.
      */
+    @Deprecated
     public static boolean containsCell(CellRangeAddress cr, int rowIx, int colIx) {
         return cr.isInRange(rowIx,  colIx);
     }
index 1cbb9628ca4b2ae3cea805d7d876e00e8dc78464..a204fde17a71448b018424c5b9bdd6acb63c0a39 100644 (file)
@@ -30,7 +30,7 @@ import org.apache.commons.logging.LogFactory;
  */
 public class CommonsLogger extends POILogger
 {
-    private static LogFactory   _creator = LogFactory.getFactory();
+    private static final LogFactory   _creator = LogFactory.getFactory();
     private Log             log   = null;
 
     @Override
@@ -46,8 +46,10 @@ public class CommonsLogger extends POILogger
      * @param obj1 The object to log.
      */
     @Override
-    public void log(final int level, final Object obj1)
+    protected void _log(final int level, final Object obj1)
     {
+        // FIXME: What happens if level is in between two levels (an even number)?
+        // Should this be `if (level >= FATAL) ...`?
         if(level==FATAL)
         {
           if(log.isFatalEnabled())
@@ -100,9 +102,11 @@ public class CommonsLogger extends POILogger
      * @param exception An exception to be logged
      */
     @Override
-    public void log(final int level, final Object obj1,
+    protected void _log(final int level, final Object obj1,
                     final Throwable exception) 
     {
+        // FIXME: What happens if level is in between two levels (an even number)?
+        // Should this be `if (level >= FATAL) ...`?
         if(level==FATAL)
         {
           if(log.isFatalEnabled())
@@ -174,6 +178,8 @@ public class CommonsLogger extends POILogger
     @Override
     public boolean check(final int level)
     {
+        // FIXME: What happens if level is in between two levels (an even number)?
+        // Should this be `if (level >= FATAL) ...`?
         if(level==FATAL)
         {
           if(log.isFatalEnabled())
index ef9e8443a4aa43bdd05f09410ce232f216a7d0d3..6f44752873f0c975d2e1917cc9ab516e2e0ff2d4 100644 (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
-     * @throws IOException
+     * @param directory  the directory to create
+     * @throws IOException if unable to create temporary directory or it is not a directory
      */
     private void createTempDirectory(File directory) throws IOException {
-        if (!(directory.exists() || directory.mkdirs()) || !directory.isDirectory()) {
+        // create directory if it doesn't exist
+        final boolean dirExists = (directory.exists() || directory.mkdirs());
+        
+        if (!dirExists) {
             throw new IOException("Could not create temporary directory '" + directory + "'");
         }
+        else if (!directory.isDirectory()) {
+            throw new IOException("Could not create temporary directory. '" + directory + "' exists but is not a directory.");
+        }
     }
     
     @Override
index fe0979cfef32fa2b11b000f3bc6e46d8bd9cbccc..e21adfaa7f46d91d6f92ecc47341e05016a44d6e 100644 (file)
@@ -23,6 +23,7 @@ package org.apache.poi.util;
  * calls as cheap as possible by performing lazy evaluation of the log
  * message.<p>
  */
+@Internal
 public class NullLogger extends POILogger {
     @Override
     public void initialize(final String cat) {
@@ -37,7 +38,7 @@ public class NullLogger extends POILogger {
      */
 
     @Override
-    public void log(final int level, final Object obj1) {
+    protected void _log(final int level, final Object obj1) {
         // do nothing
     }
 
@@ -49,7 +50,19 @@ public class NullLogger extends POILogger {
      * @param exception An exception to be logged
      */
     @Override
-    public void log(int level, Object obj1, final Throwable exception) {
+    protected void _log(int level, Object obj1, final Throwable exception) {
+        // do nothing
+    }
+
+    /**
+     * Log a message. Lazily appends Object parameters together.
+     * If the last parameter is a {@link Throwable} it is logged specially.
+     *
+     * @param level One of DEBUG, INFO, WARN, ERROR, FATAL
+     * @param objs the objects to place in the message
+     */
+    @Override
+    public void log(int level, Object... objs) {
         // do nothing
     }
 
index ba2551de7b7c397fa0cd2e99fcd3cead59988c13..1e34ccd29bacffd085792e7b355a1345cc4cf925 100644 (file)
@@ -35,7 +35,7 @@ public final class POILogFactory {
     /**
      * Map of POILogger instances, with classes as keys
      */
-    private static Map<String,POILogger> _loggers = new HashMap<String,POILogger>();
+    private static final Map<String,POILogger> _loggers = new HashMap<String,POILogger>();
 
     /**
      * A common instance of NullLogger, as it does nothing
index 04198bfbabb36034ecae026ad5f172ef90a8cf07..c54c7542552e4951551720ebe6f335d466a7f71b 100644 (file)
@@ -54,7 +54,7 @@ public abstract class POILogger {
      * @param level One of DEBUG, INFO, WARN, ERROR, FATAL
      * @param obj1 The object to log.  This is converted to a string.
      */
-    abstract protected void log(int level, Object obj1);
+    abstract protected void _log(int level, Object obj1);
 
     /**
      * Log a message
@@ -63,11 +63,20 @@ public abstract class POILogger {
      * @param obj1 The object to log.  This is converted to a string.
      * @param exception An exception to be logged
      */
-    abstract protected void log(int level, Object obj1, final Throwable exception);
+    abstract protected void _log(int level, Object obj1, final Throwable exception);
 
 
     /**
      * Check if a logger is enabled to log at the specified level
+     * This allows code to avoid building strings or evaluating functions in
+     * the arguments to log.
+     * 
+     * An example:
+     * <code><pre>
+     * if (logger.check(POILogger.INFO)) {
+     *     logger.log(POILogger.INFO, "Avoid concatenating " + " strings and evaluating " + functions());
+     * }
+     * </pre></code>
      *
      * @param level One of DEBUG, INFO, WARN, ERROR, FATAL
      */
@@ -98,9 +107,9 @@ public abstract class POILogger {
         // somehow this ambiguity works and doesn't lead to a loop,
         // but it's confusing ...
         if (lastEx == null) {
-            log(level, msg);
+            _log(level, msg);
         } else {
-            log(level, msg, lastEx);
+            _log(level, msg, lastEx);
         }
     }
 }
index 36d96ca038cc02883d6bb8a4fe729e99a7bb02bf..457f25410c9daa8a513f4e96ea1d9f73f3a83708 100644 (file)
@@ -42,9 +42,9 @@ public class SystemOutLogger extends POILogger
      * @param obj1 The object to log.
      */
     @Override
-    public void log(final int level, final Object obj1)
+    protected void _log(final int level, final Object obj1)
     {
-       log(level, obj1, null);
+       _log(level, obj1, null);
     }
 
     /**
@@ -56,7 +56,7 @@ public class SystemOutLogger extends POILogger
      */
     @Override
     @SuppressForbidden("uses printStackTrace")
-    public void log(final int level, final Object obj1,
+    protected void _log(final int level, final Object obj1,
                     final Throwable exception) {
         if (check(level)) {
             System.out.println("[" + _cat + "]" + LEVEL_STRINGS_SHORT[Math.min(LEVEL_STRINGS_SHORT.length-1, level)] + " " + obj1);
index a67e83e246a04cca03cea3c69a6cda0290f30b67..cdd35b3594b4b2ad2d35bcf0c5233d1575176e13 100644 (file)
@@ -33,7 +33,6 @@ import org.apache.poi.hsmf.datatypes.AttachmentChunks;
 import org.apache.poi.hsmf.extractor.OutlookTextExtactor;
 import org.apache.poi.hssf.extractor.ExcelExtractor;
 import org.apache.poi.hwpf.extractor.WordExtractor;
-import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
 import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.openxml4j.opc.PackageAccess;
@@ -123,7 +122,7 @@ public class ExtractorFactory {
          return OLE2ExtractorFactory.getPreferEventExtractor();
     }
 
-    public static POITextExtractor createExtractor(File f) throws IOException, InvalidFormatException, OpenXML4JException, XmlException {
+    public static POITextExtractor createExtractor(File f) throws IOException, OpenXML4JException, XmlException {
         NPOIFSFileSystem fs = null;
         try {
             fs = new NPOIFSFileSystem(f);
@@ -163,7 +162,7 @@ public class ExtractorFactory {
         }
      }
 
-    public static POITextExtractor createExtractor(InputStream inp) throws IOException, InvalidFormatException, OpenXML4JException, XmlException {
+    public static POITextExtractor createExtractor(InputStream inp) throws IOException, OpenXML4JException, XmlException {
         // Figure out the kind of stream
         // If clearly doesn't do mark/reset, wrap up
         if (! inp.markSupported()) {
index 25efc1e55949fa549447494ed2d4a28265f2ae00..6779d8a210435c04d18cfb22c0f467750f9394d5 100644 (file)
@@ -64,7 +64,7 @@ public class SignatureConfig {
 \r
     private static final POILogger LOG = POILogFactory.getLogger(SignatureConfig.class);\r
     \r
-    public static interface SignatureConfigurable {\r
+    public interface SignatureConfigurable {\r
         void setSignatureConfig(SignatureConfig signatureConfig);        \r
     }\r
 \r
index b3207712383d9aacadbc9d41cc27f92c7cf12602..afb60f600e469421983e9ba7976d48f09810c52d 100644 (file)
@@ -96,6 +96,7 @@ public final class OOXMLLite {
                 "BaseTestXSheet",
                 "BaseTestXRow",
                 "BaseTestXCell",
+                "BaseTestXSSFPivotTable",
                 "TestSXSSFWorkbook\\$\\d",
                 "TestSXSSFWorkbook\\$NullOutputStream",
                 "TestUnfixedBugs",
index 0c4e4971d5375e020c2dbd1177487ac1ba556574..70df3f806ab7a0360fc4cb9c16360342d06ea3f2 100644 (file)
@@ -134,7 +134,7 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
 \r
         if (this instanceof PlaceableShape) {\r
             PlaceableShape<?,?> ps = (PlaceableShape<?,?>)this;\r
-            ps.setAnchor(((PlaceableShape<?,?>)sh).getAnchor());\r
+            ps.setAnchor(sh.getAnchor());\r
         }\r
         \r
         \r
@@ -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\r
      * type attribute for this element\r
      *\r
-     * @param placeholder\r
+     * @param placeholder The shape to use as placeholder or null if no placeholder should be set.\r
      */\r
     protected void setPlaceholder(Placeholder placeholder) {\r
         String xquery = "declare namespace p='"+PML_NS+"' .//*/p:nvPr";\r
@@ -494,7 +494,7 @@ public abstract class XSLFShape implements Shape<XSLFShape,XSLFTextParagraph> {
         int idx = (int)fillRef.getIdx();\r
         CTSchemeColor phClr = fillRef.getSchemeClr();\r
         CTStyleMatrix matrix = theme.getXmlObject().getThemeElements().getFmtScheme();\r
-        XmlObject styleLst = null;\r
+        final XmlObject styleLst;\r
         int childIdx;\r
         if (idx >= 1 && idx <= 999) {\r
             childIdx = idx-1;\r
index 331ad9a0fd3e9d786c222a11c69d446e607ea06e..6b9ce374fbb00a71652207df1c5b4e6084403430 100644 (file)
@@ -907,7 +907,9 @@ public class SXSSFWorkbook implements Workbook {
             try {
                 sheet.getSheetDataWriter().close();
             } catch (IOException e) {
-                // ignore exception here
+                logger.log(POILogger.WARN,
+                        "An exception occurred while closing sheet data writer for sheet "
+                        + sheet.getSheetName() + ".", e);
             }
         }
 
@@ -926,11 +928,8 @@ public class SXSSFWorkbook implements Workbook {
     @Override
     public void write(OutputStream stream) throws IOException
     {
-       for (SXSSFSheet sheet : _xFromSxHash.values())
-       {
-               sheet.flushRows();
-       }
-       
+        flushSheets();
+
         //Save the template
         File tmplFile = TempFile.createTempFile("poi-sxssf-template", ".xlsx");
         try
@@ -956,6 +955,13 @@ public class SXSSFWorkbook implements Workbook {
         }
     }
     
+    protected void flushSheets() throws IOException {
+        for (SXSSFSheet sheet : _xFromSxHash.values())
+        {
+            sheet.flushRows();
+        }
+    }
+    
     /**
      * Dispose of temporary files backing this workbook on disk.
      * Calling this method will render the workbook unusable.
index 780126c3d59a5254877ed0c94e03159d2b863670..11fe3efadf749ca0b9af78a75d056c097e14b0f6 100644 (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.CellType;
 import org.apache.poi.ss.usermodel.CellValue;
-import org.apache.poi.ss.usermodel.RichTextString;
+import org.apache.poi.util.Internal;
 
 /**
  * Internal POI use only - parent of XSSF and SXSSF formula evaluators
@@ -52,6 +52,78 @@ public abstract class BaseXSSFFormulaEvaluator extends BaseFormulaEvaluator {
         _bookEvaluator.notifyUpdateCell(new XSSFEvaluationCell((XSSFCell)cell));
     }
 
+    /**
+     * If cell contains formula, it evaluates the formula,
+     *  and saves the result of the formula. The cell
+     *  remains as a formula cell.
+     * Else if cell does not contain formula, this method leaves
+     *  the cell unchanged.
+     * Note that the type of the formula result is returned,
+     *  so you know what kind of value is also stored with
+     *  the formula.
+     * <pre>
+     * CellType evaluatedCellType = evaluator.evaluateFormulaCellEnum(cell);
+     * </pre>
+     * Be aware that your cell will hold both the formula,
+     *  and the result. If you want the cell replaced with
+     *  the result of the formula, use {@link #evaluate(org.apache.poi.ss.usermodel.Cell)} }
+     * @param cell The cell to evaluate
+     * @return The type of the formula result (the cell's type remains as CellType.FORMULA however)
+     *         If cell is not a formula cell, returns {@link CellType#_NONE} rather than throwing an exception.
+     * @since POI 3.15 beta 3
+     * @deprecated POI 3.15 beta 3. Will be deleted when we make the CellType enum transition. See bug 59791.
+     */
+    @Internal(since="POI 3.15 beta 3")
+    public CellType evaluateFormulaCellEnum(Cell cell) {
+        if (cell == null || cell.getCellTypeEnum() != CellType.FORMULA) {
+            return CellType._NONE;
+        }
+        CellValue cv = evaluateFormulaCellValue(cell);
+        // cell remains a formula cell, but the cached value is changed
+        setCellValue(cell, cv);
+        return cv.getCellType();
+    }
+
+    /**
+     * If cell contains formula, it evaluates the formula, and
+     *  puts the formula result back into the cell, in place
+     *  of the old formula.
+     * Else if cell does not contain formula, this method leaves
+     *  the cell unchanged.
+     */
+    protected void doEvaluateInCell(Cell cell) {
+        if (cell == null) return;
+        if (cell.getCellTypeEnum() == CellType.FORMULA) {
+            CellValue cv = evaluateFormulaCellValue(cell);
+            setCellType(cell, cv); // cell will no longer be a formula cell
+            setCellValue(cell, cv);
+        }
+    }
+
+    private static void setCellValue(Cell cell, CellValue cv) {
+        CellType cellType = cv.getCellType();
+        switch (cellType) {
+            case BOOLEAN:
+                cell.setCellValue(cv.getBooleanValue());
+                break;
+            case ERROR:
+                cell.setCellErrorValue(cv.getErrorValue());
+                break;
+            case NUMERIC:
+                cell.setCellValue(cv.getNumberValue());
+                break;
+            case STRING:
+                cell.setCellValue(new XSSFRichTextString(cv.getStringValue()));
+                break;
+            case BLANK:
+                // never happens - blanks eventually get translated to zero
+            case FORMULA:
+                // this will never happen, we have already evaluated the formula
+            default:
+                throw new IllegalStateException("Unexpected cell value type (" + cellType + ")");
+        }
+    }
+
     /**
      * Turns a XSSFCell / SXSSFCell into a XSSFEvaluationCell
      */
index 8ab465aff1daca6035da56ac50e772a262c265b5..26735c782c48c6d80c2289c227cac3feeaa62e05 100644 (file)
@@ -28,10 +28,13 @@ import javax.xml.namespace.QName;
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.Name;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.util.AreaReference;
 import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.util.Beta;
@@ -41,6 +44,7 @@ import org.apache.xmlbeans.XmlOptions;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCacheField;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCacheFields;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotCacheDefinition;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheetSource;
 
 public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{
 
@@ -116,6 +120,40 @@ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{
         out.close();
     }
 
+    /**
+     * Find the 2D base data area for the pivot table, either from its direct reference or named table/range.
+     * @return AreaReference representing the current area defined by the pivot table
+     * @throws IllegalArgumentException if the ref attribute is not contiguous or the name attribute is not found.
+     */
+    @Beta
+    public AreaReference getPivotArea(Workbook wb) throws IllegalArgumentException {
+        final CTWorksheetSource wsSource = ctPivotCacheDefinition.getCacheSource().getWorksheetSource();
+        
+        final String ref = wsSource.getRef();
+        final String name = wsSource.getName();
+        
+        if (ref == null && name == null) throw new IllegalArgumentException("Pivot cache must reference an area, named range, or table.");
+        
+        // this is the XML format, so tell the reference that.
+        if (ref != null) return new AreaReference(ref, SpreadsheetVersion.EXCEL2007);
+        
+        if (name != null) {
+            // named range or table?
+            final Name range = wb.getName(name);
+            if (range != null) return new AreaReference(range.getRefersToFormula(), SpreadsheetVersion.EXCEL2007);
+            // not a named range, check for a table.
+            // do this second, as tables are sheet-specific, but named ranges are not, and may not have a sheet name given.
+            final XSSFSheet sheet = (XSSFSheet) wb.getSheet(wsSource.getSheet());
+            for (XSSFTable table : sheet.getTables()) {
+                if (table.getName().equals(name)) { //case-sensitive?
+                    return new AreaReference(table.getStartCellReference(), table.getEndCellReference());
+                }
+            }
+        }
+        
+        throw new IllegalArgumentException("Name '" + name + "' was not found.");
+    }
+    
     /**
      * Generates a cache field for each column in the reference area for the pivot table.
      * @param sheet The sheet where the data i collected from
@@ -123,7 +161,7 @@ public class XSSFPivotCacheDefinition extends POIXMLDocumentPart{
     @Beta
     protected void createCacheFields(Sheet sheet) {
         //Get values for start row, start and end column
-        AreaReference ar = new AreaReference(ctPivotCacheDefinition.getCacheSource().getWorksheetSource().getRef());
+        AreaReference ar = getPivotArea(sheet.getWorkbook());
         CellReference firstCell = ar.getFirstCell();
         CellReference lastCell = ar.getLastCell();
         int columnStart = firstCell.getCol();
index bf85f65de1ac36e1f503c8e70de7aec4fc15de84..e6f91afde7924931a2ae75c04c8295f873c5234e 100644 (file)
@@ -30,11 +30,11 @@ import javax.xml.namespace.QName;
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
-import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.ss.usermodel.DataConsolidateFunction;
 import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.util.AreaReference;
 import org.apache.poi.ss.util.CellReference;
 import org.apache.poi.util.Beta;
@@ -214,13 +214,8 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
     }
 
     protected AreaReference getPivotArea() {
-        AreaReference pivotArea = new AreaReference(
-                getPivotCacheDefinition()
-                .getCTPivotCacheDefinition()
-                .getCacheSource()
-                .getWorksheetSource()
-                .getRef(),
-                SpreadsheetVersion.EXCEL2007);
+        final Workbook wb = getDataSheet().getWorkbook();
+        AreaReference pivotArea = getPivotCacheDefinition().getPivotArea(wb);
         return pivotArea;
     }
     
@@ -419,12 +414,13 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
 
     /**
      * Creates cacheSource and workSheetSource for pivot table and sets the source reference as well assets the location of the pivot table
-     * @param source Source for data for pivot table
      * @param position Position for pivot table in sheet
      * @param sourceSheet Sheet where the source will be collected from
+     * @param refConfig  an configurator that knows how to configure pivot table references
      */
     @Beta
-    protected void createSourceReferences(AreaReference source, CellReference position, Sheet sourceSheet){
+    protected void createSourceReferences(CellReference position, Sheet sourceSheet, PivotTableReferenceConfigurator refConfig){
+        
         //Get cell one to the right and one down from position, add both to AreaReference and set pivot table location.
         AreaReference destination = new AreaReference(position, new CellReference(position.getRow()+1, position.getCol()+1));
 
@@ -448,9 +444,8 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
         worksheetSource.setSheet(sourceSheet.getSheetName());
         setDataSheet(sourceSheet);
 
-        String[] firstCell = source.getFirstCell().getCellRefParts();
-        String[] lastCell = source.getLastCell().getCellRefParts();
-        worksheetSource.setRef(firstCell[2]+firstCell[1]+':'+lastCell[2]+lastCell[1]);
+        refConfig.configureReference(worksheetSource);
+        if (worksheetSource.getName() == null && worksheetSource.getRef() == null) throw new IllegalArgumentException("Pivot table source area reference or name must be specified.");
     }
 
     @Beta
@@ -465,11 +460,20 @@ public class XSSFPivotTable extends POIXMLDocumentPart {
         int firstColumn = sourceArea.getFirstCell().getCol();
         int lastColumn = sourceArea.getLastCell().getCol();
         CTPivotField pivotField;
-        for(int i = 0; i<=lastColumn-firstColumn; i++) {
+        for(int i = firstColumn; i<=lastColumn; i++) {
             pivotField = pivotFields.addNewPivotField();
             pivotField.setDataField(false);
             pivotField.setShowAll(false);
         }
         pivotFields.setCount(pivotFields.sizeOfPivotFieldArray());
     }
+    
+    protected static interface PivotTableReferenceConfigurator {
+        
+        /**
+         * Configure the name or area reference for the pivot table 
+         * @param wsSource CTWorksheetSource that needs the pivot source reference assignment
+         */
+        public void configureReference(CTWorksheetSource wsSource);
+    }
 }
index d72dca445e5e4eabb363b2447ba9d18d59e36779..bc2f071bea0428bf046d995a60691b74245490f2 100644 (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.IgnoredErrorType;
 import org.apache.poi.ss.usermodel.IndexedColors;
+import org.apache.poi.ss.usermodel.Name;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Table;
 import org.apache.poi.ss.util.AreaReference;
 import org.apache.poi.ss.util.CellAddress;
 import org.apache.poi.ss.util.CellRangeAddress;
@@ -80,6 +82,7 @@ import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 import org.apache.poi.util.Removal;
 import org.apache.poi.xssf.model.CommentsTable;
+import org.apache.poi.xssf.usermodel.XSSFPivotTable.PivotTableReferenceConfigurator;
 import org.apache.poi.xssf.usermodel.helpers.ColumnHelper;
 import org.apache.poi.xssf.usermodel.helpers.XSSFIgnoredErrorHelper;
 import org.apache.poi.xssf.usermodel.helpers.XSSFRowShifter;
@@ -1925,15 +1928,17 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
         }
 
         // Performance optimization: explicit boxing is slightly faster than auto-unboxing, though may use more memory
-        final Integer rownumI = new Integer(row.getRowNum()); // NOSONAR
-        int idx = _rows.headMap(rownumI).size();
-        _rows.remove(rownumI);
+        final int rowNum = row.getRowNum();
+        final Integer rowNumI = new Integer(rowNum); // NOSONAR
+        // this is not the physical row number!
+        final int idx = _rows.headMap(rowNumI).size();
+        _rows.remove(rowNumI);
         worksheet.getSheetData().removeRow(idx);
 
         // also remove any comment located in that row
         if(sheetComments != null) {
             for (CellAddress ref : getCellComments().keySet()) {
-                if (ref.getRow() == idx) {
+                if (ref.getRow() == rowNum) {
                     sheetComments.removeComment(ref);
                 }
             }
@@ -4158,27 +4163,56 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
     }
 
     /**
-     * Create a pivot table and set area of source, source sheet and a position for pivot table
-     * @param source Area from where data will be collected
-     * @param position A reference to the cell where the table will start
-     * @param sourceSheet The sheet where source will be collected from
+     * Create a pivot table using the AreaReference range on sourceSheet, at the given position.
+     * If the source reference contains a sheet name, it must match the sourceSheet
+     * @param source location of pivot data
+     * @param position A reference to the top left cell where the pivot table will start
+     * @param sourceSheet The sheet containing the source data, if the source reference doesn't contain a sheet name
+     * @throws IllegalArgumentException if source references a sheet different than sourceSheet
      * @return The pivot table
      */
     @Beta
-    public XSSFPivotTable createPivotTable(AreaReference source, CellReference position, Sheet sourceSheet) {
+    public XSSFPivotTable createPivotTable(final AreaReference source, CellReference position, Sheet sourceSheet) {
         final String sourceSheetName = source.getFirstCell().getSheetName();
         if(sourceSheetName != null && !sourceSheetName.equalsIgnoreCase(sourceSheet.getSheetName())) {
             throw new IllegalArgumentException("The area is referenced in another sheet than the "
                     + "defined source sheet " + sourceSheet.getSheetName() + ".");
         }
+
+        return createPivotTable(position, sourceSheet, new PivotTableReferenceConfigurator() {
+                public void configureReference(CTWorksheetSource wsSource) {
+                    final String[] firstCell = source.getFirstCell().getCellRefParts();
+                    final String firstRow = firstCell[1];
+                    final String firstCol = firstCell[2];
+                    final String[] lastCell = source.getLastCell().getCellRefParts();
+                    final String lastRow = lastCell[1];
+                    final String lastCol = lastCell[2];
+                    final String ref = firstCol+firstRow+':'+lastCol+lastRow; //or just source.formatAsString()
+                    wsSource.setRef(ref);
+                }
+            });
+        }
+        
+    /**
+     * Create a pivot table using the AreaReference or named/table range on sourceSheet, at the given position.
+     * If the source reference contains a sheet name, it must match the sourceSheet.
+     * @param sourceRef location of pivot data - mutually exclusive with SourceName
+     * @param sourceName range or table name for pivot data - mutually exclusive with SourceRef
+     * @param position A reference to the top left cell where the pivot table will start
+     * @param sourceSheet The sheet containing the source data, if the source reference doesn't contain a sheet name
+     * @throws IllegalArgumentException if source references a sheet different than sourceSheet
+     * @return The pivot table
+     */
+    private XSSFPivotTable createPivotTable(CellReference position, Sheet sourceSheet, PivotTableReferenceConfigurator refConfig) {
+        
         XSSFPivotTable pivotTable = createPivotTable();
         //Creates default settings for the pivot table
         pivotTable.setDefaultPivotTableDefinition();
 
         //Set sources and references
-        pivotTable.createSourceReferences(source, position, sourceSheet);
+        pivotTable.createSourceReferences(position, sourceSheet, refConfig);
 
-        //Create cachefield/s and empty SharedItems
+        //Create cachefield/s and empty SharedItems - must be after creating references
         pivotTable.getPivotCacheDefinition().createCacheFields(sourceSheet);
         pivotTable.createDefaultDataColumns();
 
@@ -4186,9 +4220,10 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
     }
 
     /**
-     * Create a pivot table and set area of source and a position for pivot table
-     * @param source Area from where data will be collected
-     * @param position A reference to the cell where the table will start
+     * Create a pivot table using the AreaReference range, at the given position.
+     * If the source reference contains a sheet name, that sheet is used, otherwise this sheet is assumed as the source sheet.
+     * @param source location of pivot data
+     * @param position A reference to the top left cell where the pivot table will start
      * @return The pivot table
      */
     @Beta
@@ -4201,6 +4236,57 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
         return createPivotTable(source, position, this);
     }
     
+    /**
+     * Create a pivot table using the Name range reference on sourceSheet, at the given position.
+     * If the source reference contains a sheet name, it must match the sourceSheet
+     * @param source location of pivot data
+     * @param position A reference to the top left cell where the pivot table will start
+     * @param sourceSheet The sheet containing the source data, if the source reference doesn't contain a sheet name
+     * @throws IllegalArgumentException if source references a sheet different than sourceSheet
+     * @return The pivot table
+     */
+    @Beta
+    public XSSFPivotTable createPivotTable(final Name source, CellReference position, Sheet sourceSheet) {
+        if(source.getSheetName() != null && !source.getSheetName().equals(sourceSheet.getSheetName())) {
+            throw new IllegalArgumentException("The named range references another sheet than the "
+                    + "defined source sheet " + sourceSheet.getSheetName() + ".");
+        }
+        
+        return createPivotTable(position, sourceSheet, new PivotTableReferenceConfigurator() {
+                public void configureReference(CTWorksheetSource wsSource) {
+                    wsSource.setName(source.getNameName());
+                }
+            });
+        }
+        
+    /**
+     * Create a pivot table using the Name range, at the given position.
+     * If the source reference contains a sheet name, that sheet is used, otherwise this sheet is assumed as the source sheet.
+     * @param source location of pivot data
+     * @param position A reference to the top left cell where the pivot table will start
+     * @return The pivot table
+     */
+    @Beta
+    public XSSFPivotTable createPivotTable(Name source, CellReference position) {
+        return createPivotTable(source, position, getWorkbook().getSheet(source.getSheetName()));
+    }
+    
+    /**
+     * Create a pivot table using the Table, at the given position.
+     * Tables are required to have a sheet reference, so no additional logic around reference sheet is needed.
+     * @param source location of pivot data
+     * @param position A reference to the top left cell where the pivot table will start
+     * @return The pivot table
+     */
+    @Beta
+    public XSSFPivotTable createPivotTable(final Table source, CellReference position) {
+       return createPivotTable(position, getWorkbook().getSheet(source.getSheetName()), new PivotTableReferenceConfigurator() {
+           public void configureReference(CTWorksheetSource wsSource) {
+               wsSource.setName(source.getName());
+           }
+       });
+    }
+    
     /**
      * Returns all the pivot tables for this Sheet
      */
index 1e51e5e3f79d00d4424644a82b70816ce121bda9..b27100656beae45abe195a4b59afc2dddfceacd7 100644 (file)
@@ -319,6 +319,7 @@ public class ColumnHelper {
     }
 
     public int getIndexOfColumn(CTCols cols, CTCol searchCol) {
+        if (cols == null || searchCol == null) return -1;
         int i = 0;
         for (CTCol col : cols.getColArray()) {
             if (col.getMin() == searchCol.getMin() && col.getMax() == searchCol.getMax()) {
index d11ed1fa81fc52144ee77d8df87e3a248d8b5027..e55b014a7f97e30a6cfddef5188eb9224eb17000 100644 (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 shiftedRef = shiftFormula(row, ref, shifter);
                     if (shiftedRef != null) f.setRef(shiftedRef);
index 9d206f71971034c49b89fe3d16d79f38df3a25ba..26fe68a63218a651347c21fe3cf1a286a2d885cb 100644 (file)
@@ -16,6 +16,7 @@
 ==================================================================== */
 package org.apache.poi.extractor;
 
+import static org.apache.poi.POITestCase.assertContains;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -37,6 +38,7 @@ import org.apache.poi.hdgf.extractor.VisioTextExtractor;
 import org.apache.poi.hpbf.extractor.PublisherTextExtractor;
 import org.apache.poi.hslf.extractor.PowerPointExtractor;
 import org.apache.poi.hsmf.extractor.OutlookTextExtactor;
+import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.hssf.OldExcelFormatException;
 import org.apache.poi.hssf.extractor.EventBasedExcelExtractor;
 import org.apache.poi.hssf.extractor.ExcelExtractor;
@@ -1019,4 +1021,16 @@ public class TestExtractorFactory {
             // expected here
         }
     }
+    
+    // This bug is currently open. This test will fail with "expected error not thrown" when the bug has been fixed.
+    // When this happens, change this from @Test(expected=...) to @Test
+    // bug 45565: text within TextBoxes is extracted by ExcelExtractor and WordExtractor
+    @Test(expected=AssertionError.class)
+    public void test45565() throws Exception {
+        POITextExtractor extractor = ExtractorFactory.createExtractor(HSSFTestDataSamples.getSampleFile("45565.xls"));
+        String text = extractor.getText();
+        assertContains(text, "testdoc");
+        assertContains(text, "test phrase");
+        extractor.close();
+    }
 }
index 77c91cdcae94de21f3c98ad37d2c9186686177c4..202b9e18e95b5f6747742b78bc046b8ac4359cd3 100644 (file)
@@ -55,6 +55,7 @@ import org.apache.poi.POIDataSamples;
 import org.apache.poi.POITestCase;\r
 import org.apache.poi.openxml4j.opc.OPCPackage;\r
 import org.apache.poi.openxml4j.opc.PackageAccess;\r
+import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;\r
 import org.apache.poi.poifs.crypt.dsig.DigestInfo;\r
 import org.apache.poi.poifs.crypt.dsig.SignatureConfig;\r
 import org.apache.poi.poifs.crypt.dsig.SignatureInfo;\r
@@ -99,7 +100,7 @@ public class TestSignatureInfo {
     public static void initBouncy() throws IOException {\r
         CryptoFunctions.registerBouncyCastle();\r
 \r
-        /*** TODO : set cal to now ... only set to fixed date for debugging ... */ \r
+        // Set cal to now ... only set to fixed date for debugging ...\r
         cal = LocaleUtil.getLocaleCalendar(LocaleUtil.TIMEZONE_UTC);\r
         assertNotNull(cal);\r
 //        cal.set(2014, 7, 6, 21, 42, 12);\r
@@ -403,7 +404,9 @@ public class TestSignatureInfo {
         \r
         // verify\r
         Iterator<SignaturePart> spIter = si.getSignatureParts().iterator();\r
-        assertTrue(spIter.hasNext());\r
+        assertTrue("Had: " + si.getSignatureConfig().getOpcPackage().\r
+                        getRelationshipsByType(PackageRelationshipTypes.DIGITAL_SIGNATURE_ORIGIN),\r
+                spIter.hasNext());\r
         SignaturePart sp = spIter.next();\r
         boolean valid = sp.validate();\r
         assertTrue(valid);\r
index a24fd88795cc90debfcce6451b4151de6974c867..921dc445eb05e21954b4b900930128d7157481d3 100644 (file)
@@ -31,7 +31,6 @@ import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
 import junit.framework.AssertionFailedError;
-import junit.framework.TestCase;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/BaseTestXSSFPivotTable.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/BaseTestXSSFPivotTable.java
new file mode 100644 (file)
index 0000000..4458125
--- /dev/null
@@ -0,0 +1,299 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.poi.xssf.usermodel;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.DataConsolidateFunction;
+import org.apache.poi.ss.util.AreaReference;
+import org.apache.poi.ss.util.CellReference;
+import org.apache.poi.xssf.XSSFITestDataProvider;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageField;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageFields;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotFields;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotTableDefinition;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataConsolidateFunction;
+
+public abstract class BaseTestXSSFPivotTable {
+    private static final XSSFITestDataProvider _testDataProvider = XSSFITestDataProvider.instance;
+    protected XSSFWorkbook wb;
+    protected XSSFPivotTable pivotTable;
+    protected XSSFPivotTable offsetPivotTable;
+    protected Cell offsetOuterCell;
+    
+    /**
+     * required to set up the test pivot tables and cell reference, either by name or reference.
+     * @see junit.framework.TestCase#setUp()
+     */
+    @Before
+    public abstract void setUp();
+    
+    @After
+    public void tearDown() throws IOException {
+        if (wb != null) {
+            XSSFWorkbook wb2 = _testDataProvider.writeOutAndReadBack(wb);
+            wb.close();
+            wb2.close();
+        }
+    }
+
+    /**
+     * Verify that when creating a row label it's  created on the correct row
+     * and the count is increased by one.
+     */
+    @Test
+    public void testAddRowLabelToPivotTable() {
+        int columnIndex = 0;
+
+        assertEquals(0, pivotTable.getRowLabelColumns().size());
+        
+        pivotTable.addRowLabel(columnIndex);
+        CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
+
+        assertEquals(defintion.getRowFields().getFieldArray(0).getX(), columnIndex);
+        assertEquals(defintion.getRowFields().getCount(), 1);
+        assertEquals(1, pivotTable.getRowLabelColumns().size());
+        
+        columnIndex = 1;
+        pivotTable.addRowLabel(columnIndex);
+        assertEquals(2, pivotTable.getRowLabelColumns().size());
+        
+        assertEquals(0, (int)pivotTable.getRowLabelColumns().get(0));
+        assertEquals(1, (int)pivotTable.getRowLabelColumns().get(1));
+    }
+
+    /**
+     * Verify that it's not possible to create a row label outside of the referenced area.
+     */
+    @Test
+    public void testAddRowLabelOutOfRangeThrowsException() {
+        int columnIndex = 5;
+
+        try {
+            pivotTable.addRowLabel(columnIndex);
+        } catch(IndexOutOfBoundsException e) {
+            return;
+        }
+        fail();
+    }
+
+    /**
+     * Verify that when creating one column label, no col fields are being created.
+     */
+    @Test
+    public void testAddOneColumnLabelToPivotTableDoesNotCreateColField() {
+        int columnIndex = 0;
+
+        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex);
+        CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
+
+        assertEquals(defintion.getColFields(), null);
+    }
+
+    /**
+     * Verify that it's possible to create three column labels with different DataConsolidateFunction
+     */
+    @Test
+    public void testAddThreeDifferentColumnLabelsToPivotTable() {
+        int columnOne = 0;
+        int columnTwo = 1;
+        int columnThree = 2;
+
+        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnOne);
+        pivotTable.addColumnLabel(DataConsolidateFunction.MAX, columnTwo);
+        pivotTable.addColumnLabel(DataConsolidateFunction.MIN, columnThree);
+        CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
+
+        assertEquals(defintion.getDataFields().getDataFieldList().size(), 3);
+    }
+    
+    
+    /**
+     * Verify that it's possible to create three column labels with the same DataConsolidateFunction
+     */
+    @Test
+    public void testAddThreeSametColumnLabelsToPivotTable() {
+        int columnOne = 0;
+        int columnTwo = 1;
+        int columnThree = 2;
+
+        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnOne);
+        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnTwo);
+        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnThree);
+        CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
+
+        assertEquals(defintion.getDataFields().getDataFieldList().size(), 3);
+    }
+    
+    /**
+     * Verify that when creating two column labels, a col field is being created and X is set to -2.
+     */
+    @Test
+    public void testAddTwoColumnLabelsToPivotTable() {
+        int columnOne = 0;
+        int columnTwo = 1;
+
+        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnOne);
+        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnTwo);
+        CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
+
+        assertEquals(defintion.getColFields().getFieldArray(0).getX(), -2);
+    }
+
+    /**
+     * Verify that a data field is created when creating a data column
+     */
+    @Test
+    public void testColumnLabelCreatesDataField() {
+        int columnIndex = 0;
+
+        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex);
+
+        CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
+
+        assertEquals(defintion.getDataFields().getDataFieldArray(0).getFld(), columnIndex);
+        assertEquals(defintion.getDataFields().getDataFieldArray(0).getSubtotal(),
+                STDataConsolidateFunction.Enum.forInt(DataConsolidateFunction.SUM.getValue()));
+    }
+    
+    /**
+     * Verify that it's possible to set a custom name when creating a data column
+     */
+    @Test
+    public void testColumnLabelSetCustomName() {
+        int columnIndex = 0;
+
+        String customName = "Custom Name";
+        
+        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex, customName);
+
+        CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
+
+        assertEquals(defintion.getDataFields().getDataFieldArray(0).getFld(), columnIndex);
+        assertEquals(defintion.getDataFields().getDataFieldArray(0).getName(), customName);
+    }
+
+    /**
+     * Verify that it's not possible to create a column label outside of the referenced area.
+     */
+    @Test
+    public void testAddColumnLabelOutOfRangeThrowsException() {
+        int columnIndex = 5;
+
+        try {
+            pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex);
+        } catch(IndexOutOfBoundsException e) {
+            return;
+        }
+        fail();
+    }
+
+     /**
+     * Verify when creating a data column set to a data field, the data field with the corresponding
+     * column index will be set to true.
+     */
+    @Test
+    public void testAddDataColumn() {
+        int columnIndex = 0;
+        boolean isDataField = true;
+
+        pivotTable.addDataColumn(columnIndex, isDataField);
+        CTPivotFields pivotFields = pivotTable.getCTPivotTableDefinition().getPivotFields();
+        assertEquals(pivotFields.getPivotFieldArray(columnIndex).getDataField(), isDataField);
+    }
+
+    /**
+     * Verify that it's not possible to create a data column outside of the referenced area.
+     */
+    @Test
+    public void testAddDataColumnOutOfRangeThrowsException() {
+        int columnIndex = 5;
+        boolean isDataField = true;
+
+        try {
+            pivotTable.addDataColumn(columnIndex, isDataField);
+        } catch(IndexOutOfBoundsException e) {
+            return;
+        }
+        fail();
+    }
+
+     /**
+     * Verify that it's possible to create a new filter
+     */
+    @Test
+    public void testAddReportFilter() {
+        int columnIndex = 0;
+
+        pivotTable.addReportFilter(columnIndex);
+        CTPageFields fields = pivotTable.getCTPivotTableDefinition().getPageFields();
+        CTPageField field = fields.getPageFieldArray(0);
+        assertEquals(field.getFld(), columnIndex);
+        assertEquals(field.getHier(), -1);
+        assertEquals(fields.getCount(), 1);
+    }
+
+     /**
+     * Verify that it's not possible to create a new filter outside of the referenced area.
+     */
+    @Test
+    public void testAddReportFilterOutOfRangeThrowsException() {
+        int columnIndex = 5;
+        try {
+            pivotTable.addReportFilter(columnIndex);
+        } catch(IndexOutOfBoundsException e) {
+            return;
+        }
+        fail();
+    }
+    
+    /**
+     * Verify that the Pivot Table operates only within the referenced area, even when the
+     * first column of the referenced area is not index 0.
+     */
+    @Test
+    public void testAddDataColumnWithOffsetData() {
+        offsetPivotTable.addColumnLabel(DataConsolidateFunction.SUM, 1);
+        assertEquals(CellType.NUMERIC, offsetOuterCell.getCellTypeEnum());
+        
+        offsetPivotTable.addColumnLabel(DataConsolidateFunction.SUM, 0);
+    }
+    
+    @Test
+    public void testPivotTableSheetNamesAreCaseInsensitive() {
+        wb.setSheetName(0,  "original");
+        wb.setSheetName(1,  "offset");
+        XSSFSheet original = wb.getSheet("OriginaL");
+        XSSFSheet offset = wb.getSheet("OffseT");
+        // assume sheets are accessible via case-insensitive name
+        assertNotNull(original);
+        assertNotNull(offset);
+        
+        AreaReference source = new AreaReference("ORIGinal!A1:C2", _testDataProvider.getSpreadsheetVersion());
+        // create a pivot table on the same sheet, case insensitive
+        original.createPivotTable(source, new CellReference("W1"));
+        // create a pivot table on a different sheet, case insensitive
+        offset.createPivotTable(source, new CellReference("W1"));
+    }
+}
index e695f385f9babe1498f0ebaca3a01e94bdb4e26a..7fb1b507d53dddf78de2982a9650cdef519ad651 100644 (file)
@@ -3091,4 +3091,41 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
 
         assertEquals("09 Mar 2016", result);
     }
+    
+    // This bug is currently open. When this bug is fixed, it should not throw an AssertionError
+    @Test(expected=AssertionError.class)
+    public void test55076_collapseColumnGroups() throws Exception {
+        Workbook wb = new XSSFWorkbook();
+        Sheet sheet = wb.createSheet();
+        
+        // this column collapsing bug only occurs when the grouped columns are different widths
+        sheet.setColumnWidth(1, 400);
+        sheet.setColumnWidth(2, 600);
+        sheet.setColumnWidth(3, 800);
+        
+        assertEquals(400, sheet.getColumnWidth(1));
+        assertEquals(600, sheet.getColumnWidth(2));
+        assertEquals(800, sheet.getColumnWidth(3));
+        
+        sheet.groupColumn(1, 3);
+        sheet.setColumnGroupCollapsed(1, true);
+        
+        assertEquals(0, sheet.getColumnOutlineLevel(0));
+        assertEquals(1, sheet.getColumnOutlineLevel(1));
+        assertEquals(1, sheet.getColumnOutlineLevel(2));
+        assertEquals(1, sheet.getColumnOutlineLevel(3));
+        assertEquals(0, sheet.getColumnOutlineLevel(4));
+        
+        // none of the columns should be hidden
+        // column group collapsing is a different concept
+        for (int c=0; c<5; c++) {
+            assertFalse("Column " + c, sheet.isColumnHidden(c));
+        }
+        
+        assertEquals(400, sheet.getColumnWidth(1));
+        assertEquals(600, sheet.getColumnWidth(2));
+        assertEquals(800, sheet.getColumnWidth(3));
+        
+        wb.close();
+    }
 }
index 84a4aa68006f7925955c4a6fb37dbbf0c002ad07..6dcaef960378b34bc871035f5bd2c1482ff2ebf0 100644 (file)
@@ -682,15 +682,4 @@ public final class TestXSSFFormulaEvaluation extends BaseTestFormulaEvaluator {
         value = evaluator.evaluate(cell);
         assertEquals(1, value.getNumberValue(), 0.001);
     }
-    
-    @Test
-    public void evaluateInCellReturnsSameDataType() throws IOException {
-        XSSFWorkbook wb = new XSSFWorkbook();
-        wb.createSheet().createRow(0).createCell(0);
-        XSSFFormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
-        XSSFCell cell = wb.getSheetAt(0).getRow(0).getCell(0);
-        XSSFCell same = evaluator.evaluateInCell(cell);
-        assertSame(cell, same);
-        wb.close();
-    }
 }
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTable.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTable.java
deleted file mode 100644 (file)
index 851ca33..0000000
+++ /dev/null
@@ -1,370 +0,0 @@
-/* ====================================================================
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-==================================================================== */
-package org.apache.poi.xssf.usermodel;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-import java.io.IOException;
-
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellType;
-import org.apache.poi.ss.usermodel.DataConsolidateFunction;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.util.AreaReference;
-import org.apache.poi.ss.util.CellReference;
-import org.apache.poi.xssf.XSSFITestDataProvider;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageField;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageFields;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotFields;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotTableDefinition;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.STDataConsolidateFunction;
-
-public class TestXSSFPivotTable {
-    private static final XSSFITestDataProvider _testDataProvider = XSSFITestDataProvider.instance;
-    private XSSFWorkbook wb;
-    private XSSFPivotTable pivotTable;
-    private XSSFPivotTable offsetPivotTable;
-    private Cell offsetOuterCell;
-    
-    @Before
-    public void setUp(){
-        wb = new XSSFWorkbook();
-        XSSFSheet sheet =  wb.createSheet();
-
-        Row row1 = sheet.createRow(0);
-        // Create a cell and put a value in it.
-        Cell cell = row1.createCell(0);
-        cell.setCellValue("Names");
-        Cell cell2 = row1.createCell(1);
-        cell2.setCellValue("#");
-        Cell cell7 = row1.createCell(2);
-        cell7.setCellValue("Data");
-        Cell cell10 = row1.createCell(3);
-        cell10.setCellValue("Value");
-
-        Row row2 = sheet.createRow(1);
-        Cell cell3 = row2.createCell(0);
-        cell3.setCellValue("Jan");
-        Cell cell4 = row2.createCell(1);
-        cell4.setCellValue(10);
-        Cell cell8 = row2.createCell(2);
-        cell8.setCellValue("Apa");
-        Cell cell11 = row1.createCell(3);
-        cell11.setCellValue(11.11);
-
-        Row row3 = sheet.createRow(2);
-        Cell cell5 = row3.createCell(0);
-        cell5.setCellValue("Ben");
-        Cell cell6 = row3.createCell(1);
-        cell6.setCellValue(9);
-        Cell cell9 = row3.createCell(2);
-        cell9.setCellValue("Bepa");
-        Cell cell12 = row1.createCell(3);
-        cell12.setCellValue(12.12);
-
-        AreaReference source = new AreaReference("A1:C2", _testDataProvider.getSpreadsheetVersion());
-        pivotTable = sheet.createPivotTable(source, new CellReference("H5"));
-        
-        XSSFSheet offsetSheet = wb.createSheet();
-        
-        Row tableRow_1 = offsetSheet.createRow(1);
-        offsetOuterCell = tableRow_1.createCell(1);
-        offsetOuterCell.setCellValue(-1);
-        Cell tableCell_1_1 = tableRow_1.createCell(2);
-        tableCell_1_1.setCellValue("Row #");
-        Cell tableCell_1_2 = tableRow_1.createCell(3);
-        tableCell_1_2.setCellValue("Exponent");
-        Cell tableCell_1_3 = tableRow_1.createCell(4);
-        tableCell_1_3.setCellValue("10^Exponent");
-        
-        Row tableRow_2 = offsetSheet.createRow(2);
-        Cell tableCell_2_1 = tableRow_2.createCell(2);
-        tableCell_2_1.setCellValue(0);
-        Cell tableCell_2_2 = tableRow_2.createCell(3);
-        tableCell_2_2.setCellValue(0);
-        Cell tableCell_2_3 = tableRow_2.createCell(4);
-        tableCell_2_3.setCellValue(1);
-        
-        Row tableRow_3= offsetSheet.createRow(3);
-        Cell tableCell_3_1 = tableRow_3.createCell(2);
-        tableCell_3_1.setCellValue(1);
-        Cell tableCell_3_2 = tableRow_3.createCell(3);
-        tableCell_3_2.setCellValue(1);
-        Cell tableCell_3_3 = tableRow_3.createCell(4);
-        tableCell_3_3.setCellValue(10);
-        
-        Row tableRow_4 = offsetSheet.createRow(4);
-        Cell tableCell_4_1 = tableRow_4.createCell(2);
-        tableCell_4_1.setCellValue(2);
-        Cell tableCell_4_2 = tableRow_4.createCell(3);
-        tableCell_4_2.setCellValue(2);
-        Cell tableCell_4_3 = tableRow_4.createCell(4);
-        tableCell_4_3.setCellValue(100);
-        
-        AreaReference offsetSource = new AreaReference(new CellReference("C2"), new CellReference("E4"));
-        offsetPivotTable = offsetSheet.createPivotTable(offsetSource, new CellReference("C6"));
-    }
-    
-    @After
-    public void tearDown() throws IOException {
-        XSSFWorkbook wb2 = _testDataProvider.writeOutAndReadBack(wb);
-        wb.close();
-        wb2.close();
-    }
-
-    /**
-     * Verify that when creating a row label it's  created on the correct row
-     * and the count is increased by one.
-     */
-    @Test
-    public void testAddRowLabelToPivotTable() {
-        int columnIndex = 0;
-
-        assertEquals(0, pivotTable.getRowLabelColumns().size());
-        
-        pivotTable.addRowLabel(columnIndex);
-        CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
-
-        assertEquals(defintion.getRowFields().getFieldArray(0).getX(), columnIndex);
-        assertEquals(defintion.getRowFields().getCount(), 1);
-        assertEquals(1, pivotTable.getRowLabelColumns().size());
-        
-        columnIndex = 1;
-        pivotTable.addRowLabel(columnIndex);
-        assertEquals(2, pivotTable.getRowLabelColumns().size());
-        
-        assertEquals(0, (int)pivotTable.getRowLabelColumns().get(0));
-        assertEquals(1, (int)pivotTable.getRowLabelColumns().get(1));
-    }
-    /**
-     * Verify that it's not possible to create a row label outside of the referenced area.
-     */
-    @Test
-    public void testAddRowLabelOutOfRangeThrowsException() {
-        int columnIndex = 5;
-
-        try {
-            pivotTable.addRowLabel(columnIndex);
-        } catch(IndexOutOfBoundsException e) {
-            return;
-        }
-        fail();
-    }
-
-    /**
-     * Verify that when creating one column label, no col fields are being created.
-     */
-    @Test
-    public void testAddOneColumnLabelToPivotTableDoesNotCreateColField() {
-        int columnIndex = 0;
-
-        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex);
-        CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
-
-        assertEquals(defintion.getColFields(), null);
-    }
-
-    /**
-     * Verify that it's possible to create three column labels with different DataConsolidateFunction
-     */
-    @Test
-    public void testAddThreeDifferentColumnLabelsToPivotTable() {
-        int columnOne = 0;
-        int columnTwo = 1;
-        int columnThree = 2;
-
-        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnOne);
-        pivotTable.addColumnLabel(DataConsolidateFunction.MAX, columnTwo);
-        pivotTable.addColumnLabel(DataConsolidateFunction.MIN, columnThree);
-        CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
-
-        assertEquals(defintion.getDataFields().getDataFieldList().size(), 3);
-    }
-    
-    
-    /**
-     * Verify that it's possible to create three column labels with the same DataConsolidateFunction
-     */
-    @Test
-    public void testAddThreeSametColumnLabelsToPivotTable() {
-        int columnOne = 0;
-        int columnTwo = 1;
-        int columnThree = 2;
-
-        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnOne);
-        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnTwo);
-        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnThree);
-        CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
-
-        assertEquals(defintion.getDataFields().getDataFieldList().size(), 3);
-    }
-    
-    /**
-     * Verify that when creating two column labels, a col field is being created and X is set to -2.
-     */
-    @Test
-    public void testAddTwoColumnLabelsToPivotTable() {
-        int columnOne = 0;
-        int columnTwo = 1;
-
-        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnOne);
-        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnTwo);
-        CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
-
-        assertEquals(defintion.getColFields().getFieldArray(0).getX(), -2);
-    }
-
-    /**
-     * Verify that a data field is created when creating a data column
-     */
-    @Test
-    public void testColumnLabelCreatesDataField() {
-        int columnIndex = 0;
-
-        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex);
-
-        CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
-
-        assertEquals(defintion.getDataFields().getDataFieldArray(0).getFld(), columnIndex);
-        assertEquals(defintion.getDataFields().getDataFieldArray(0).getSubtotal(),
-                STDataConsolidateFunction.Enum.forInt(DataConsolidateFunction.SUM.getValue()));
-    }
-    
-    /**
-     * Verify that it's possible to set a custom name when creating a data column
-     */
-    @Test
-    public void testColumnLabelSetCustomName() {
-        int columnIndex = 0;
-
-        String customName = "Custom Name";
-        
-        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex, customName);
-
-        CTPivotTableDefinition defintion = pivotTable.getCTPivotTableDefinition();
-
-        assertEquals(defintion.getDataFields().getDataFieldArray(0).getFld(), columnIndex);
-        assertEquals(defintion.getDataFields().getDataFieldArray(0).getName(), customName);
-    }
-
-    /**
-     * Verify that it's not possible to create a column label outside of the referenced area.
-     */
-    @Test
-    public void testAddColumnLabelOutOfRangeThrowsException() {
-        int columnIndex = 5;
-
-        try {
-            pivotTable.addColumnLabel(DataConsolidateFunction.SUM, columnIndex);
-        } catch(IndexOutOfBoundsException e) {
-            return;
-        }
-        fail();
-    }
-
-     /**
-     * Verify when creating a data column set to a data field, the data field with the corresponding
-     * column index will be set to true.
-     */
-    @Test
-    public void testAddDataColumn() {
-        int columnIndex = 0;
-        boolean isDataField = true;
-
-        pivotTable.addDataColumn(columnIndex, isDataField);
-        CTPivotFields pivotFields = pivotTable.getCTPivotTableDefinition().getPivotFields();
-        assertEquals(pivotFields.getPivotFieldArray(columnIndex).getDataField(), isDataField);
-    }
-
-    /**
-     * Verify that it's not possible to create a data column outside of the referenced area.
-     */
-    @Test
-    public void testAddDataColumnOutOfRangeThrowsException() {
-        int columnIndex = 5;
-        boolean isDataField = true;
-
-        try {
-            pivotTable.addDataColumn(columnIndex, isDataField);
-        } catch(IndexOutOfBoundsException e) {
-            return;
-        }
-        fail();
-    }
-
-     /**
-     * Verify that it's possible to create a new filter
-     */
-    public void testAddReportFilter() {
-        int columnIndex = 0;
-
-        pivotTable.addReportFilter(columnIndex);
-        CTPageFields fields = pivotTable.getCTPivotTableDefinition().getPageFields();
-        CTPageField field = fields.getPageFieldArray(0);
-        assertEquals(field.getFld(), columnIndex);
-        assertEquals(field.getHier(), -1);
-        assertEquals(fields.getCount(), 1);
-    }
-
-     /**
-     * Verify that it's not possible to create a new filter outside of the referenced area.
-     */
-    @Test
-    public void testAddReportFilterOutOfRangeThrowsException() {
-        int columnIndex = 5;
-        try {
-            pivotTable.addReportFilter(columnIndex);
-        } catch(IndexOutOfBoundsException e) {
-            return;
-        }
-        fail();
-    }
-    
-    /**
-     * Verify that the Pivot Table operates only within the referenced area, even when the
-     * first column of the referenced area is not index 0.
-     */
-    @Test
-    public void testAddDataColumnWithOffsetData() {
-        offsetPivotTable.addColumnLabel(DataConsolidateFunction.SUM, 1);
-        assertEquals(CellType.NUMERIC, offsetOuterCell.getCellTypeEnum());
-        
-        offsetPivotTable.addColumnLabel(DataConsolidateFunction.SUM, 0);
-    }
-    
-    @Test
-    public void testPivotTableSheetNamesAreCaseInsensitive() {
-        wb.setSheetName(0,  "original");
-        wb.setSheetName(1,  "offset");
-        XSSFSheet original = wb.getSheet("OriginaL");
-        XSSFSheet offset = wb.getSheet("OffseT");
-        // assume sheets are accessible via case-insensitive name
-        assertNotNull(original);
-        assertNotNull(offset);
-        
-        AreaReference source = new AreaReference("ORIGinal!A1:C2", _testDataProvider.getSpreadsheetVersion());
-        // create a pivot table on the same sheet, case insensitive
-        original.createPivotTable(source, new CellReference("W1"));
-        // create a pivot table on a different sheet, case insensitive
-        offset.createPivotTable(source, new CellReference("W1"));
-    }
-}
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTableName.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTableName.java
new file mode 100644 (file)
index 0000000..8df2a66
--- /dev/null
@@ -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"));
+    }
+}
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTableRef.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPivotTableRef.java
new file mode 100644 (file)
index 0000000..ec0c5c6
--- /dev/null
@@ -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"));
+    }
+}
index 3f7be066d12360a1d89f9018c53af18d8167d82f..24c1d723757588b68863cc743a8f62b98559329b 100644 (file)
@@ -1581,7 +1581,7 @@ public final class TestXSSFSheet extends BaseTestXSheet {
         System.out.println("Array formulas currently unsupported");
         // FIXME: Array Formula set with Sheet.setArrayFormula() instead of cell.setFormula()
         /*
-        assertEquals("[Array Formula] N7 cell type", CellType.FORMULA, cell.getCellType());
+        assertEquals("[Array Formula] N7 cell type", CellType.FORMULA, cell.getCellTypeEnum());
         assertEquals("[Array Formula] N7 cell formula", "{SUM(H7:J7*{1,2,3})}", cell.getCellFormula());
         */
         
@@ -1792,12 +1792,12 @@ public final class TestXSSFSheet extends BaseTestXSheet {
         // System.out.println("Array formulas currently unsupported");
     /*
         // FIXME: Array Formula set with Sheet.setArrayFormula() instead of cell.setFormula()
-        assertEquals("[Array Formula] N10 cell type", CellType.FORMULA, cell.getCellType());
+        assertEquals("[Array Formula] N10 cell type", CellType.FORMULA, cell.getCellTypeEnum());
         assertEquals("[Array Formula] N10 cell formula", "{SUM(H10:J10*{1,2,3})}", cell.getCellFormula());
         
         cell = CellUtil.getCell(destRow2, col);
         // FIXME: Array Formula set with Sheet.setArrayFormula() instead of cell.setFormula() 
-        assertEquals("[Array Formula] N11 cell type", CellType.FORMULA, cell.getCellType());
+        assertEquals("[Array Formula] N11 cell type", CellType.FORMULA, cell.getCellTypeEnum());
         assertEquals("[Array Formula] N11 cell formula", "{SUM(H11:J11*{1,2,3})}", cell.getCellFormula());
      */
         
@@ -2020,4 +2020,21 @@ public final class TestXSSFSheet extends BaseTestXSheet {
                }
 
     }
+    
+    // bug 59687:  XSSFSheet.RemoveRow doesn't handle row gaps properly when removing row comments
+    @Test
+    public void testRemoveRowWithCommentAndGapAbove() throws IOException {
+        final Workbook wb = _testDataProvider.openSampleWorkbook("59687.xlsx");
+        final Sheet sheet = wb.getSheetAt(0);
+
+        // comment exists
+        CellAddress commentCellAddress = new CellAddress("A4");
+        assertNotNull(sheet.getCellComment(commentCellAddress));
+        
+        assertEquals("Wrong starting # of comments",  1, sheet.getCellComments().size());
+        
+        sheet.removeRow(sheet.getRow(commentCellAddress.getRow()));
+        
+        assertEquals("There should not be any comments left!",  0, sheet.getCellComments().size());
+    }
 }
index 3e2cd540302769592041050ee8a67772da1b1893..fa4c77fbf869b774a17acf30260bf540ad5a0f7f 100644 (file)
@@ -17,6 +17,8 @@
 
 package org.apache.poi.xssf.usermodel;
 
+import static org.apache.poi.POITestCase.skipTest;
+import static org.apache.poi.POITestCase.testPassesNow;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
@@ -35,7 +37,7 @@ import org.apache.poi.ss.util.CellAddress;
 import org.apache.poi.ss.util.CellUtil;
 import org.apache.poi.xssf.XSSFITestDataProvider;
 import org.apache.poi.xssf.XSSFTestDataSamples;
-import org.junit.Ignore;
+import org.apache.xmlbeans.impl.values.XmlValueDisconnectedException;
 import org.junit.Test;
 
 public final class TestXSSFSheetShiftRows extends BaseTestSheetShiftRows {
@@ -377,7 +379,9 @@ public final class TestXSSFSheetShiftRows extends BaseTestSheetShiftRows {
         wb.close();
     }
     
-    @Ignore("Bug 59733 - shiftRows() causes org.apache.xmlbeans.impl.values.XmlValueDisconnectedException")
+    // This test is written as expected-to-fail and should be rewritten
+    // as expected-to-pass when the bug is fixed.
+    //@Ignore("Bug 59733 - shiftRows() causes org.apache.xmlbeans.impl.values.XmlValueDisconnectedException")
     @Test
     public void bug59733() throws IOException {
         Workbook workbook = new XSSFWorkbook();
@@ -399,9 +403,50 @@ public final class TestXSSFSheetShiftRows extends BaseTestSheetShiftRows {
             at org.apache.poi.xssf.usermodel.XSSFRow.getRowNum(XSSFRow.java:363)
             at org.apache.poi.xssf.usermodel.TestXSSFSheetShiftRows.bug59733(TestXSSFSheetShiftRows.java:393)
          */
-        sheet.removeRow(sheet.getRow(0));
-        assertEquals(1, sheet.getRow(1).getRowNum());
+        // FIXME: remove try, catch, and testPassesNow, skipTest when test passes
+        try {
+            sheet.removeRow(sheet.getRow(0));
+            assertEquals(1, sheet.getRow(1).getRowNum());
+            testPassesNow(59733);
+        } catch (XmlValueDisconnectedException e) {
+            skipTest(e);
+        }
+        
 
         workbook.close();
+    }\r
+\r
+    private static String getCellFormula(Sheet sheet, String address) {\r
+        CellAddress cellAddress = new CellAddress(address);\r
+        Row row = sheet.getRow(cellAddress.getRow());\r
+        assertNotNull(row);\r
+        Cell cell = row.getCell(cellAddress.getColumn());\r
+        assertNotNull(cell);\r
+        assertEquals(CellType.FORMULA, cell.getCellTypeEnum());\r
+        return cell.getCellFormula();\r
+    }\r
+
+    // This test is written as expected-to-fail and should be rewritten
+    // as expected-to-pass when the bug is fixed.
+    @Test\r
+    public void testSharedFormulas() throws Exception {\r
+        XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("TestShiftRowSharedFormula.xlsx");\r
+        XSSFSheet sheet = wb.getSheetAt(0);\r
+        assertEquals("SUM(C2:C4)", getCellFormula(sheet, "C5"));\r
+        assertEquals("SUM(D2:D4)", getCellFormula(sheet, "D5"));\r
+        assertEquals("SUM(E2:E4)", getCellFormula(sheet, "E5"));\r
+\r
+        sheet.shiftRows(3, sheet.getLastRowNum(), 1);
+        // FIXME: remove try, catch, and testPassesNow, skipTest when test passes\r
+        try {\r
+            assertEquals("SUM(C2:C5)", getCellFormula(sheet, "C6"));\r
+            assertEquals("SUM(D2:D5)", getCellFormula(sheet, "D6"));\r
+            assertEquals("SUM(E2:E5)", getCellFormula(sheet, "E6"));
+            testPassesNow(59983);
+        } catch (AssertionError e) {
+            skipTest(e);
+        }
+        
+        wb.close();\r
     }
 }
index 89b063c263140a256ed8bf5fd85556784c46a279..59c90a4dc0a5dc3cf3931b7f88cb11405106f874 100644 (file)
@@ -137,6 +137,8 @@ public final class Attachment {
    
    /**
     * Returns the contents of the attachment.
+    *
+    * @throws IllegalArgumentException if there is no AttachmentData available in this Attachment
     */
    public byte[] getContents() {
       TNEFAttribute contents = getAttribute(TNEFProperty.ID_ATTACHDATA);
index e901de821662b8f3e4f421594d7a7f679e257860..32cf161a5c3a4df34e484a34fc0d5fd794c943b8 100644 (file)
@@ -154,37 +154,37 @@ public class WordToFoUtils extends AbstractWordUtils
         {
             block.setAttribute(
                     "text-indent",
-                    String.valueOf( paragraph.getFirstLineIndent()
-                            / TWIPS_PER_PT )
+                    paragraph.getFirstLineIndent()
+                            / TWIPS_PER_PT
                             + "pt" );
         }
         if ( paragraph.getIndentFromLeft() != 0 )
         {
             block.setAttribute(
                     "start-indent",
-                    String.valueOf( paragraph.getIndentFromLeft()
-                            / TWIPS_PER_PT )
+                    paragraph.getIndentFromLeft()
+                            / TWIPS_PER_PT
                             + "pt" );
         }
         if ( paragraph.getIndentFromRight() != 0 )
         {
             block.setAttribute(
                     "end-indent",
-                    String.valueOf( paragraph.getIndentFromRight()
-                            / TWIPS_PER_PT )
+                    paragraph.getIndentFromRight()
+                            / TWIPS_PER_PT
                             + "pt" );
         }
         if ( paragraph.getSpacingBefore() != 0 )
         {
             block.setAttribute(
                     "space-before",
-                    String.valueOf( paragraph.getSpacingBefore() / TWIPS_PER_PT )
+                    paragraph.getSpacingBefore() / TWIPS_PER_PT
                             + "pt" );
         }
         if ( paragraph.getSpacingAfter() != 0 )
         {
             block.setAttribute( "space-after",
-                    String.valueOf( paragraph.getSpacingAfter() / TWIPS_PER_PT )
+                    paragraph.getSpacingAfter() / TWIPS_PER_PT
                             + "pt" );
         }
     }
index 6a69aab8a377e1ef68593290faabf0a57026d196..b4591ad45517e43e029824fd8bbc0417ac2dc1ff 100644 (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.io.HWPFOutputStream;
 import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
+import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 
 import java.io.ByteArrayOutputStream;
+import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
@@ -901,4 +903,19 @@ public class TestBugs extends TestCase
         HWPFDocument hwpfDocument2 = HWPFTestDataSamples.writeOutAndReadBack(hwpfDocument);
         assertNotNull(hwpfDocument2);
     }
+    
+    public void test57843() throws IOException {
+        try {
+            File f = POIDataSamples.getDocumentInstance().getFile("57843.doc");
+            boolean readOnly = true;
+            POIFSFileSystem fs = new POIFSFileSystem(f, readOnly);
+            HWPFOldDocument doc = new HWPFOldDocument(fs);
+            assertNotNull(doc);
+            doc.close();
+            fs.close();
+            fixed("57843");
+        } catch (ArrayIndexOutOfBoundsException e) {
+            // expected until this bug is fixed
+        }
+    }
 }
index 786c6e1124973883c2dc2e9d6a9f7a5bd51cdf2d..a8cc8e1db62795ddfb23d408cccb2a2fdf5e0341 100644 (file)
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
 
 import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Field;
@@ -174,4 +175,62 @@ public final class POITestCase {
             }
         }
     }
+    
+    /**
+     * Rather than adding {@literal @}Ignore to known-failing tests,
+     * write the test so that it notifies us if it starts passing.
+     * This is useful for closing related or forgotten bugs.
+     * 
+     * An Example:
+     * <code><pre>
+     * public static int add(int a, int b) {
+     *     // a known bug in behavior that has not been fixed yet
+     *     raise UnsupportedOperationException("add");
+     * }
+     * 
+     * {@literal @}Test
+     * public void knownFailingUnitTest() {
+     *     try {
+     *         assertEquals(2, add(1,1));
+     *         // this test fails because the assumption that this bug had not been fixed is false
+     *         testPassesNow(12345);
+     *     } catch (UnsupportedOperationException e) {
+     *         // test is skipped because the assumption that this bug had not been fixed is true
+     *         skipTest(e);
+     *     }
+     * }
+     * 
+     * Once passing, this unit test can be rewritten as:
+     * {@literal @}Test
+     * public void knownPassingUnitTest() {
+     *     assertEquals(2, add(1,1));
+     * }
+     * 
+     * If you have a better idea how to simplify test code while still notifying
+     * us when a previous known-failing test now passes, please improve these.
+     * As a bonus, a known-failing test that fails should not be counted as a
+     * passing test.
+     * 
+     * One possible alternative is to expect the known exception, but without
+     * a clear message that it is a good thing to no longer get the expected
+     * exception once the test passes.
+     * {@literal @}Test(expected=UnsupportedOperationException.class)
+     * public void knownFailingUnitTest() {
+     *     assertEquals(2, add(1,1));
+     * }
+     *
+     * @param e  the exception that was caught that will no longer
+     * be raised when the bug is fixed 
+     */
+    public static void skipTest(Throwable e) {
+        assumeTrue("This test currently fails with " + e, false);
+    }
+    /**
+     * @see #skipTest(Throwable)
+     *
+     * @param bug  the bug number corresponding to a known bug in bugzilla
+     */
+    public static void testPassesNow(int bug) {
+        fail("This test passes now. Please update the unit test and bug " + bug + ".");
+    }
 }
index 2ce6e1de8a5a2bdea37953231da2fb3bbe89de30..65042127e819b57cc0e4b8c5863debe8cde9973b 100644 (file)
@@ -1885,12 +1885,12 @@ public final class TestBugs extends BaseTestBugzillaIssues {
 
        // TODO - Fix these so they work...
        /*row = s.getRow(4);
-       assertEquals(CellType.FORMULA, row.getCell(1).getCellType());
+       assertEquals(CellType.FORMULA, row.getCell(1).getCellTypeEnum());
        assertEquals("'[$http://gagravarr.org/FormulaRefs2.xls]Sheet1'!B2", row.getCell(1).getCellFormula());
        assertEquals(123.0, row.getCell(1).getNumericCellValue(), 0);
 
        row = s.getRow(5);
-       assertEquals(CellType.FORMULA, row.getCell(1).getCellType());
+       assertEquals(CellType.FORMULA, row.getCell(1).getCellTypeEnum());
        assertEquals("'[$http://example.com/FormulaRefs.xls]Sheet1'!B1", row.getCell(1).getCellFormula());
        assertEquals(234.0, row.getCell(1).getNumericCellValue(), 0);*/
        
index fef200fdcbf76eccd263de84869ecbaa4b2762c1..0ca030438184318aacfa2fd2c970c32016f367bc 100644 (file)
@@ -227,7 +227,7 @@ public final class TestPOIFSDocumentPath extends TestCase {
         {
             for (int k = 0; k < paths.length; k++)
             {
-                assertEquals(String.valueOf(j) + "<>" + String.valueOf(k),
+                assertEquals(j + "<>" + k,
                              paths[ j ], paths[ k ]);
             }
         }
@@ -274,13 +274,13 @@ public final class TestPOIFSDocumentPath extends TestCase {
             {
                 if (k == j)
                 {
-                    assertEquals(String.valueOf(j) + "<>"
-                                 + String.valueOf(k), fullPaths[ j ],
+                    assertEquals(j + "<>"
+                                 + k, fullPaths[ j ],
                                                       builtUpPaths[ k ]);
                 }
                 else
                 {
-                    assertTrue(String.valueOf(j) + "<>" + String.valueOf(k),
+                    assertTrue(j + "<>" + k,
                                !(fullPaths[ j ].equals(builtUpPaths[ k ])));
                 }
             }
@@ -306,7 +306,7 @@ public final class TestPOIFSDocumentPath extends TestCase {
         {
             for (int j = 0; j < badPaths.length; j++)
             {
-                assertTrue(String.valueOf(j) + "<>" + String.valueOf(k),
+                assertTrue(j + "<>" + k,
                            !(fullPaths[ k ].equals(badPaths[ j ])));
             }
         }
index 2d98a4f38da8e174798f65e335f8fecfb153d3a4..614b4effafcbd37fa1cb70463dcb4ba99b7af8c9 100644 (file)
 package org.apache.poi.poifs.macros;
 
 import static org.apache.poi.POITestCase.assertContains;
+import static org.apache.poi.POITestCase.skipTest;
+import static org.apache.poi.POITestCase.testPassesNow;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -268,16 +268,28 @@ public class TestVBAMacroReader {
     public void bug59858() throws IOException {
         try {
             fromFile(POIDataSamples.getSpreadSheetInstance(), "59858.xls");
-            fail("This test passes now. Please update the unit test and bug 59858.");
+            testPassesNow(59858);
         } catch (IOException e) {
             if (e.getMessage().matches("Module offset for '.+' was never read.")) {
                 //e.printStackTrace();
                 // NPE when reading module.offset in VBAMacroReader.readMacros (approx line 258)
-                assumeTrue("This test currently fails. See stdout.", false);
+                skipTest(e);
             } else {
                 // something unexpected failed
                 throw e;
             }
         }
     }
+    
+    // This test is written as expected-to-fail and should be rewritten
+    // as expected-to-pass when the bug is fixed.
+    @Test
+    public void bug60158() throws IOException {
+        try {
+            fromFile(POIDataSamples.getDocumentInstance(), "60158.docm");
+            testPassesNow(60158);
+        } catch (ArrayIndexOutOfBoundsException e) {
+            skipTest(e);
+        }
+    }
 }
index ebf6951f01356a5ddbe8b9fa7040dc2e6d0d1639..3a0a5b9b76097f0c2c153a9e68aee104fe4c7a96 100644 (file)
@@ -84,7 +84,7 @@ public class TestIfError extends TestCase {
         
         
         assertEquals("Checks that the cell is numeric",
-                       CellType.STRING, evaluator.evaluate(cell2).getCellTypeEnum());        
+                       CellType.STRING, evaluator.evaluate(cell2).getCellTypeEnum());
         assertEquals("Rounds -10 to a nearest multiple of -3 (-9)",
                 "Error in calculation", evaluator.evaluate(cell2).getStringValue());
         
index f9725ba8ae06b1eb462747f1f8ccac4293ff125f..7e41827a7573ddde617ea5eb7e3259d8a13bccf7 100644 (file)
@@ -33,12 +33,9 @@ import java.awt.font.FontRenderContext;
 import java.awt.font.TextAttribute;
 import java.awt.font.TextLayout;
 import java.awt.geom.Rectangle2D;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.text.AttributedString;
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import static org.junit.Assert.*;
index efae0d80c631d08ab4f64e4c4f5ae071e55e77c3..556e89b43a62cc0efc4991780547ba85978f387a 100644 (file)
@@ -17,6 +17,8 @@
 
 package org.apache.poi.ss.usermodel;
 
+import static org.apache.poi.POITestCase.skipTest;
+import static org.apache.poi.POITestCase.testPassesNow;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
@@ -295,7 +297,7 @@ public abstract class BaseTestSheetShiftRows {
         wb.close();
     }
 
-    @Ignore("bug 56454: Incorrectly handles merged regions that do not contain column 0")
+    //@Ignore("bug 56454: Incorrectly handles merged regions that do not contain column 0")
     @Test
     public final void shiftWithMergedRegions_bug56454() throws IOException {
         Workbook wb = _testDataProvider.createWorkbook();
@@ -328,7 +330,15 @@ public abstract class BaseTestSheetShiftRows {
         expectedMergedRegions.add(A4_B8);
         expectedMergedRegions.add(C4_D8);
         
-        assertEquals(expectedMergedRegions, sheet.getMergedRegions());
+        // This test is written as expected-to-fail and should be rewritten
+        // as expected-to-pass when the bug is fixed.
+        // FIXME: remove try, catch, and testPassesNow, skipTest when test passes
+        try {
+            assertEquals(expectedMergedRegions, sheet.getMergedRegions());
+            testPassesNow(56454);
+        } catch (AssertionError e) {
+            skipTest(e);
+        }
         wb.close();
     }
     
@@ -589,7 +599,7 @@ public abstract class BaseTestSheetShiftRows {
         read.close();
     }
     
-    @Ignore("bug 56454: Incorrectly handles merged regions that do not contain column 0")
+    //@Ignore("bug 56454: Incorrectly handles merged regions that do not contain column 0")
     @Test
     public void shiftRowsWithMergedRegionsThatDoNotContainColumnZero() throws IOException {
         Workbook wb = _testDataProvider.createWorkbook();
@@ -614,9 +624,17 @@ public abstract class BaseTestSheetShiftRows {
         // C5:D7 will be shifted down with same size
         sheet.shiftRows(4, sheet.getLastRowNum(), 1);
 
-        assertEquals(2, sheet.getNumMergedRegions());
-        assertEquals(CellRangeAddress.valueOf("A4:B8"), sheet.getMergedRegion(0));
-        assertEquals(CellRangeAddress.valueOf("C5:D8"), sheet.getMergedRegion(1));
+        // This test is written as expected-to-fail and should be rewritten
+        // as expected-to-pass when the bug is fixed.
+        // FIXME: remove try, catch, and testPassesNow, skipTest when test passes
+        try {
+            assertEquals(2, sheet.getNumMergedRegions());
+            assertEquals(CellRangeAddress.valueOf("A4:B8"), sheet.getMergedRegion(0));
+            assertEquals(CellRangeAddress.valueOf("C5:D8"), sheet.getMergedRegion(1));
+            testPassesNow(56454);
+        } catch (AssertionError e) {
+            skipTest(e);
+        }
         
         wb.close();
     }
index 5e2ad4a8dfae8b1f3fca864680c7f26e3c6eff61..bbd95cccdcd40b2e81a5792c3de0a702e9b2f701 100644 (file)
@@ -570,7 +570,7 @@ public abstract class BaseTestSheetUpdateArrayFormulas {
             assertEquals(cra.formatAsString(), mcell.getArrayFormulaRange().formatAsString());
             assertEquals("A2:A4*B2:B4", mcell.getCellFormula());
             assertTrue(mcell.isPartOfArrayFormulaGroup());
-            assertEquals(CellType.FORMULA, mcell.getCellType());
+            assertEquals(CellType.FORMULA, mcell.getCellTypeEnum());
         }
 
         */
index c8566fe66301f76b7e1344bc2203fbe356601f1d..7da48ce269bf38466d2ea35f4936dada3e209465 100644 (file)
@@ -23,6 +23,7 @@ import java.util.List;
  * POILogger which logs into an ArrayList, so that 
  *  tests can see what got logged
  */
+@Internal
 public class DummyPOILogger extends POILogger {
        public List<String>logged = new ArrayList<String>(); 
 
@@ -39,12 +40,12 @@ public class DummyPOILogger extends POILogger {
        public void initialize(String cat) {}
 
     @Override
-       public void log(int level, Object obj1) {
+       protected void _log(int level, Object obj1) {
                logged.add(level + " - " + obj1);
        }
 
     @Override
-       public void log(int level, Object obj1, Throwable exception) {
+       protected void _log(int level, Object obj1, Throwable exception) {
                logged.add(level + " - " + obj1 + " - " + exception);
        }
 }
index 3914b764369398fa65d9b4b544f33fddec7d8057..6650ed9e6605aefbdc401b9b1440b4f7568dff6a 100644 (file)
@@ -65,13 +65,13 @@ public final class TestPOILogger extends POILogger {
     }
 
     @Override
-    public void log(int level, Object obj1) {
+    protected void _log(int level, Object obj1) {
         lastLog = (obj1 == null) ? "" : obj1.toString();
         lastEx = null;
     }
 
     @Override
-    public void log(int level, Object obj1, Throwable exception) {
+    protected void _log(int level, Object obj1, Throwable exception) {
         lastLog = (obj1 == null) ? "" : obj1.toString();
         lastEx = exception;
     }
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/test-data/document/57843.doc b/test-data/document/57843.doc
new file mode 100644 (file)
index 0000000..57be6c6
Binary files /dev/null and b/test-data/document/57843.doc differ
diff --git a/test-data/document/60158.docm b/test-data/document/60158.docm
new file mode 100644 (file)
index 0000000..2b7908f
Binary files /dev/null and b/test-data/document/60158.docm differ
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/test-data/spreadsheet/45565.xls b/test-data/spreadsheet/45565.xls
new file mode 100644 (file)
index 0000000..7facba5
Binary files /dev/null and b/test-data/spreadsheet/45565.xls differ
diff --git a/test-data/spreadsheet/59687.xlsx b/test-data/spreadsheet/59687.xlsx
new file mode 100644 (file)
index 0000000..8ce567f
Binary files /dev/null and b/test-data/spreadsheet/59687.xlsx differ
diff --git a/test-data/spreadsheet/TestShiftRowSharedFormula.xlsx b/test-data/spreadsheet/TestShiftRowSharedFormula.xlsx
new file mode 100644 (file)
index 0000000..d8ac0c6
Binary files /dev/null and b/test-data/spreadsheet/TestShiftRowSharedFormula.xlsx differ
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)