<replace dir="${xmlbean.sources.dir}" includes="**/*.java" excludes="**/impl/**">
<replacetoken>org.apache.xmlbeans.XmlBeans.getContextTypeLoader()</replacetoken>
- <replacevalue>org.apache.poi.POIXMLTypeLoader</replacevalue>
+ <replacevalue>org.apache.poi.ooxml.POIXMLTypeLoader</replacevalue>
</replace>
<!-- remove deprecated warnings, as we prefer the array methods - see #56854 -->
<copy todir="${xmlbean.sources.dir}">
<fileset dir="${ooxml.src}">
- <include name="org/apache/poi/POIXMLTypeLoader.java"/>
- <include name="org/apache/poi/util/DocumentHelper.java"/>
- <include name="org/apache/poi/util/SAXHelper.java"/>
+ <include name="org/apache/poi/ooxml/POIXMLTypeLoader.java"/>
+ <include name="org/apache/poi/ooxml/util/DocumentHelper.java"/>
+ <include name="org/apache/poi/ooxml/util/SAXHelper.java"/>
<include name="org/apache/poi/openxml4j/opc/PackageNamespaces.java"/>
</fileset>
<fileset dir="${main.src}">
includeantruntime="false">
<!-- debug="${compile.debug}" -->
<classpath refid="ooxml.classpath"/>
-
- <!-- unfortunately JUnit is required here for OOXMLLite, we should rather move OOXMLLite
- to test or a separate folder to clean up dependencies -->
- <classpath location="${main.junit.jar}"/>
</javac>
<jar basedir="${xmlbean.classes.dir}" destfile="@{classes-jar}" excludes="org/apache/**" level="9" />
<classpath>
<path refid="ooxml.classpath"/>
<path refid="ooxml.xmlsec.classpath"/>
-
- <!-- unfortunately JUnit is required here for OOXMLLite, we should rather move OOXMLLite
- to test or a separate folder to clean up dependencies -->
- <pathelement location="${main.junit.jar}"/>
</classpath>
</javac>
<!-- compile the tests -->
<zipfileset includes="**/*" src="${ooxml.security.jar}"/>
</jar>
- <java classname="org.apache.poi.util.OOXMLLite" fork="yes"
+ <java classname="org.apache.poi.ooxml.util.OOXMLLite" fork="yes"
failonerror="true">
<classpath>
<pathelement path="${ooxml.lite-merged.dir}/ooxml-lite-merged.jar"/>
<version>1.05</version>
</dependency>
- <!-- non-test dependency for OOXMLLite -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
+ <scope>test</scope>
</dependency>
<dependency>
<target>
<replace dir="${basedir}/target/generated-sources/xmlbeans" includes="**/*.java" excludes="**/impl/**">
<replacetoken>org.apache.xmlbeans.XmlBeans.getContextTypeLoader()</replacetoken>
- <replacevalue>org.apache.poi.POIXMLTypeLoader</replacevalue>
+ <replacevalue>org.apache.poi.ooxml.POIXMLTypeLoader</replacevalue>
</replace>
</target>
</configuration>
ByteArrayOutputStream out = writeToArray(wb);
// read in the written file
- Workbook read;
- try {
- read = WorkbookFactory.create(new ByteArrayInputStream(out.toByteArray()));
- } catch (InvalidFormatException e) {
- throw new IllegalStateException(e);
- }
+ Workbook read = WorkbookFactory.create(new ByteArrayInputStream(out.toByteArray()));
+
assertNotNull(read);
readContent(read);
import java.util.List;
import org.apache.poi.EncryptedDocumentException;
-import org.apache.poi.POIOLE2TextExtractor;
-import org.apache.poi.POITextExtractor;
import org.apache.poi.hssf.OldExcelFormatException;
import org.apache.poi.hssf.extractor.EventBasedExcelExtractor;
import org.apache.poi.hssf.extractor.ExcelExtractor;
* Should this thread use event based extractors is available?
* Checks the all-threads one first, then thread specific.
*/
- protected static boolean getPreferEventExtractor() {
+ public static boolean getPreferEventExtractor() {
if(allPreferEventExtractors != null) {
return allPreferEventExtractors;
}
private static Class<?> getScratchpadClass() {
try {
return OLE2ExtractorFactory.class.getClassLoader().loadClass(
- "org.apache.poi.extractor.OLE2ScratchpadExtractorFactory"
+ "org.apache.poi.extractor.ole2.OLE2ScratchpadExtractorFactory"
);
} catch (ClassNotFoundException e) {
LOGGER.log(POILogger.ERROR, "POI Scratchpad jar missing");
--- /dev/null
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hssf.usermodel;
+
+import java.io.IOException;
+
+import org.apache.poi.poifs.filesystem.DirectoryNode;
+import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
+import org.apache.poi.util.Internal;
+
+/**
+ * Helper class which is instantiated by reflection from
+ * {@link WorkbookFactory#create(java.io.File)} and similar
+ */
+@Internal
+public class HSSFWorkbookFactory extends WorkbookFactory {
+ /**
+ * Creates a HSSFWorkbook from the given NPOIFSFileSystem<p>
+ * Note that in order to properly release resources the
+ * Workbook should be closed after use.
+ */
+ public static HSSFWorkbook createWorkbook(final NPOIFSFileSystem fs) throws IOException {
+ return new HSSFWorkbook(fs);
+ }
+
+ /**
+ * Creates a HSSFWorkbook from the given DirectoryNode<p>
+ * Note that in order to properly release resources the
+ * Workbook should be closed after use.
+ */
+ public static HSSFWorkbook createWorkbook(final DirectoryNode root) throws IOException {
+ return new HSSFWorkbook(root, true);
+ }
+}
case OOXML:
return createXSLFSlideShow(is);
default:
- throw new IllegalArgumentException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
+ throw new IOException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
}
}
throw (EncryptedDocumentException)t;
} else if (t instanceof OldFileFormatException) {
throw (OldFileFormatException)t;
+ } else if (t instanceof RuntimeException) {
+ throw (RuntimeException)t;
} else {
throw new IOException(t);
}
* @return the preview picture
*/
PictureData getPictureData();
+
+ default String getContentType() {
+ return "binary/octet-stream";
+ }
}
@Internal
public class XSLFSlideShowFactory extends SlideShowFactory {
+ /**
+ * Creates a XMLSlideShow from the given OOXML Package.
+ * This is a convenience method to go along the create-methods of the super class.
+ *
+ * <p>Note that in order to properly release resources the
+ * SlideShow should be closed after use.</p>
+ *
+ * @param pkg The {@link OPCPackage} opened for reading data.
+ *
+ * @return The created SlideShow
+ *
+ * @throws IOException if an error occurs while reading the data
+ * @throws InvalidFormatException
+ */
+ public static XMLSlideShow create(OPCPackage pkg) throws IOException {
+ try {
+ return new XMLSlideShow(pkg);
+ } catch (IllegalArgumentException ioe) {
+ // ensure that file handles are closed (use revert() to not re-write the file)
+ pkg.revert();
+ //pkg.close();
+
+ // rethrow exception
+ throw ioe;
+ }
+ }
+
/**
* Creates a XMLSlideShow from the given OOXML Package
*
import javax.xml.namespace.QName;
-import org.apache.poi.POIXMLDocumentPart;
-import org.apache.poi.POIXMLException;
+import org.apache.poi.ooxml.POIXMLDocumentPart;
+import org.apache.poi.ooxml.POIXMLException;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackageRelationshipTypes;
import org.apache.poi.poifs.filesystem.DirectoryEntry;
cur.dispose();
}
}
+
+ @Override
+ public String getContentType() {
+ return getObjectPart().getContentType();
+ }
}
--- /dev/null
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.xssf.usermodel;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.poi.EncryptedDocumentException;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.openxml4j.opc.PackageAccess;
+import org.apache.poi.openxml4j.opc.ZipPackage;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
+
+public class XSSFWorkbookFactory extends WorkbookFactory {
+
+ /**
+ * Creates a XSSFWorkbook from the given OOXML Package.
+ * This is a convenience method to go along the create-methods of the super class.
+ *
+ * <p>Note that in order to properly release resources the
+ * Workbook should be closed after use.</p>
+ *
+ * @param pkg The {@link OPCPackage} opened for reading data.
+ *
+ * @return The created Workbook
+ *
+ * @throws IOException if an error occurs while reading the data
+ * @throws InvalidFormatException
+ */
+ public static XSSFWorkbook create(OPCPackage pkg) throws IOException {
+ return createWorkbook(pkg);
+ }
+
+ /**
+ * Creates a XSSFWorkbook from the given OOXML Package
+ *
+ * <p>Note that in order to properly release resources the
+ * Workbook should be closed after use.</p>
+ *
+ * @param pkg The {@link ZipPackage} opened for reading data.
+ *
+ * @return The created Workbook
+ *
+ * @throws IOException if an error occurs while reading the data
+ * @throws InvalidFormatException
+ */
+ public static XSSFWorkbook createWorkbook(ZipPackage pkg) throws IOException {
+ return createWorkbook((OPCPackage)pkg);
+ }
+
+ /**
+ * Creates a XSSFWorkbook from the given OOXML Package
+ *
+ * <p>Note that in order to properly release resources the
+ * Workbook should be closed after use.</p>
+ *
+ * @param pkg The {@link OPCPackage} opened for reading data.
+ *
+ * @return The created Workbook
+ *
+ * @throws IOException if an error occurs while reading the data
+ * @throws InvalidFormatException
+ */
+ public static XSSFWorkbook createWorkbook(OPCPackage pkg) throws IOException {
+ try {
+ return new XSSFWorkbook(pkg);
+ } catch (IllegalArgumentException ioe) {
+ // ensure that file handles are closed (use revert() to not re-write the file)
+ pkg.revert();
+ //pkg.close();
+
+ // rethrow exception
+ throw ioe;
+ }
+ }
+
+ /**
+ * Creates the XSSFWorkbook from the given File, which must exist and be readable.
+ * <p>Note that in order to properly release resources the Workbook should be closed after use.
+ *
+ * @param file The file to read data from.
+ * @param readOnly If the Workbook should be opened in read-only mode to avoid writing back
+ * changes when the document is closed.
+ *
+ * @return The created Workbook
+ *
+ * @throws IOException if an error occurs while reading the data
+ * @throws EncryptedDocumentException If the wrong password is given for a protected file
+ */
+ @SuppressWarnings("resource")
+ public static XSSFWorkbook createWorkbook(File file, boolean readOnly)
+ throws IOException, InvalidFormatException {
+ OPCPackage pkg = OPCPackage.open(file, readOnly ? PackageAccess.READ : PackageAccess.READ_WRITE);
+ return createWorkbook(pkg);
+ }
+
+ /**
+ * Creates a XSSFWorkbook from the given InputStream
+ *
+ * <p>Note that in order to properly release resources the
+ * Workbook should be closed after use.</p>
+ *
+ * @param stream The {@link InputStream} to read data from.
+ *
+ * @return The created Workbook
+ *
+ * @throws IOException if an error occurs while reading the data
+ * @throws InvalidFormatException
+ */
+ @SuppressWarnings("resource")
+ public static XSSFWorkbook createWorkbook(InputStream stream) throws IOException, InvalidFormatException {
+ OPCPackage pkg = OPCPackage.open(stream);
+ return createWorkbook(pkg);
+ }
+
+
+}
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
+import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory;
import org.junit.Test;
public final class TestWorkbookFactory {
assertCloseDoesNotModifyFile(xls, wb);
// Package -> xssf
- wb = WorkbookFactory.create(
+ wb = XSSFWorkbookFactory.create(
OPCPackage.open(
HSSFTestDataSamples.openSampleFileStream(xlsx))
);
stream.close();
}
fail();
- } catch(InvalidFormatException e) {
+ } catch(IOException e) {
// Good
}
final byte[] after = HSSFTestDataSamples.getTestDataFileContent(txt);
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.POIDataSamples;
-import org.apache.poi.POIXMLDocumentPart;
-import org.apache.poi.POIXMLDocumentPart.RelationPart;
-import org.apache.poi.POIXMLException;
-import org.apache.poi.POIXMLProperties;
+import org.apache.poi.ooxml.POIXMLDocumentPart;
+import org.apache.poi.ooxml.POIXMLDocumentPart.RelationPart;
+import org.apache.poi.ooxml.POIXMLException;
+import org.apache.poi.ooxml.POIXMLProperties;
import org.apache.poi.common.usermodel.HyperlinkType;
import org.apache.poi.hssf.HSSFITestDataProvider;
import org.apache.poi.hssf.HSSFTestDataSamples;
}
/**
- * Password Protected .xlsx files should give a helpful
- * error message when called via WorkbookFactory with no password
+ * Password Protected .xlsx files are now (as of 4.0.0) tested for the default password
+ * when opened via WorkbookFactory, so there's no EncryptedDocumentException thrown anymore
*/
- @Test(expected = EncryptedDocumentException.class)
+ @Test
public void bug55692_poifs() throws IOException {
// Via a POIFSFileSystem
try (POIFSFileSystem fsP = new POIFSFileSystem(
// Workbook Factory gives helpful error on package
try {
- WorkbookFactory.create(pkg).close();
+ XSSFWorkbookFactory.create(pkg).close();
fail(".xlsb files not supported");
} catch (XLSBUnsupportedException e) {
// Good, detected and warned
return loadDoc( poifsFileSystem.getRoot() );
}
- static String substringBeforeLast( String str, String separator )
- {
- if ( isEmpty( str ) || isEmpty( separator ) )
- {
- return str;
- }
- int pos = str.lastIndexOf( separator );
- if ( pos == -1 )
- {
- return str;
- }
- return str.substring( 0, pos );
- }
-
}
{
public Triplet update( Triplet original )
{
- if ( AbstractWordUtils.isNotEmpty( original.fontName ) )
+ if ( isNotEmpty( original.fontName ) )
{
String fontName = original.fontName;
if ( fontName.endsWith( " Regular" ) )
- fontName = AbstractWordUtils.substringBeforeLast( fontName,
- " Regular" );
+ fontName = substringBeforeLast( fontName, " Regular" );
if ( fontName
.endsWith( " \u041F\u043E\u043B\u0443\u0436\u0438\u0440\u043D\u044B\u0439" ) )
- fontName = AbstractWordUtils
- .substringBeforeLast( fontName,
- " \u041F\u043E\u043B\u0443\u0436\u0438\u0440\u043D\u044B\u0439" )
+ fontName = substringBeforeLast( fontName,
+ " \u041F\u043E\u043B\u0443\u0436\u0438\u0440\u043D\u044B\u0439" )
+ " Bold";
if ( fontName
.endsWith( " \u041F\u043E\u043B\u0443\u0436\u0438\u0440\u043D\u044B\u0439 \u041A\u0443\u0440\u0441\u0438\u0432" ) )
- fontName = AbstractWordUtils
- .substringBeforeLast(
- fontName,
- " \u041F\u043E\u043B\u0443\u0436\u0438\u0440\u043D\u044B\u0439 \u041A\u0443\u0440\u0441\u0438\u0432" )
+ fontName = substringBeforeLast(
+ fontName,
+ " \u041F\u043E\u043B\u0443\u0436\u0438\u0440\u043D\u044B\u0439 \u041A\u0443\u0440\u0441\u0438\u0432" )
+ " Bold Italic";
if ( fontName.endsWith( " \u041A\u0443\u0440\u0441\u0438\u0432" ) )
- fontName = AbstractWordUtils.substringBeforeLast( fontName,
- " \u041A\u0443\u0440\u0441\u0438\u0432" ) + " Italic";
+ fontName = substringBeforeLast( fontName, " \u041A\u0443\u0440\u0441\u0438\u0432" ) + " Italic";
original.fontName = fontName;
}
- if ( AbstractWordUtils.isNotEmpty( original.fontName ) )
+ if ( isNotEmpty( original.fontName ) )
{
if ( "Times Regular".equals( original.fontName )
|| "Times-Regular".equals( original.fontName )
return original;
}
+
+ private static boolean isEmpty( String str )
+ {
+ return str == null || str.length() == 0;
+ }
+
+ private static boolean isNotEmpty( String str )
+ {
+ return !isEmpty( str );
+ }
+
+
+ private static String substringBeforeLast( String str, String separator )
+ {
+ if ( isEmpty( str ) || isEmpty( separator ) )
+ {
+ return str;
+ }
+ int pos = str.lastIndexOf( separator );
+ if ( pos == -1 )
+ {
+ return str;
+ }
+ return str.substring( 0, pos );
+ }
+
}