|
|
@@ -16,14 +16,25 @@ |
|
|
|
==================================================================== */ |
|
|
|
package org.apache.poi.stress; |
|
|
|
|
|
|
|
import static org.junit.Assert.assertNotNull; |
|
|
|
|
|
|
|
import java.io.BufferedInputStream; |
|
|
|
import java.io.ByteArrayInputStream; |
|
|
|
import java.io.ByteArrayOutputStream; |
|
|
|
import java.io.File; |
|
|
|
import java.io.FileInputStream; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.InputStream; |
|
|
|
import java.util.Iterator; |
|
|
|
|
|
|
|
import javax.xml.parsers.ParserConfigurationException; |
|
|
|
import javax.xml.transform.TransformerException; |
|
|
|
|
|
|
|
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.util.IOUtils; |
|
|
|
import org.apache.poi.xssf.eventusermodel.XSSFReader; |
|
|
|
import org.apache.poi.xssf.extractor.XSSFExportToXml; |
|
|
|
import org.apache.poi.xssf.usermodel.XSSFMap; |
|
|
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook; |
|
|
@@ -31,27 +42,64 @@ import org.junit.Test; |
|
|
|
import org.xml.sax.SAXException; |
|
|
|
|
|
|
|
public class XSSFFileHandler extends SpreadsheetHandler { |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void handleFile(InputStream stream) throws Exception { |
|
|
|
// ignore password protected files |
|
|
|
if (POIXMLDocumentHandler.isEncrypted(stream)) return; |
|
|
|
|
|
|
|
XSSFWorkbook wb = new XSSFWorkbook(stream); |
|
|
|
|
|
|
|
// use the combined handler for HSSF/XSSF |
|
|
|
handleWorkbook(wb, ".xlsx"); |
|
|
|
|
|
|
|
// ignore password protected files |
|
|
|
if (POIXMLDocumentHandler.isEncrypted(stream)) return; |
|
|
|
|
|
|
|
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
|
|
|
IOUtils.copy(stream, out); |
|
|
|
|
|
|
|
XSSFWorkbook wb = new XSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); |
|
|
|
|
|
|
|
// use the combined handler for HSSF/XSSF |
|
|
|
handleWorkbook(wb, ".xlsx"); |
|
|
|
|
|
|
|
// TODO: some documents fail currently... |
|
|
|
//XSSFFormulaEvaluator evaluator = new XSSFFormulaEvaluator(wb); |
|
|
|
//evaluator.evaluateAll(); |
|
|
|
|
|
|
|
// also verify general POIFS-stuff |
|
|
|
new POIXMLDocumentHandler().handlePOIXMLDocument(wb); |
|
|
|
|
|
|
|
// and finally ensure that exporting to XML works |
|
|
|
exportToXML(wb); |
|
|
|
} |
|
|
|
// also verify general POIFS-stuff |
|
|
|
new POIXMLDocumentHandler().handlePOIXMLDocument(wb); |
|
|
|
|
|
|
|
// and finally ensure that exporting to XML works |
|
|
|
exportToXML(wb); |
|
|
|
|
|
|
|
checkXSSFReader(OPCPackage.open(new ByteArrayInputStream(out.toByteArray()))); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void checkXSSFReader(OPCPackage p) |
|
|
|
throws IOException, OpenXML4JException, InvalidFormatException { |
|
|
|
XSSFReader reader = new XSSFReader(p); |
|
|
|
|
|
|
|
// these can be null... |
|
|
|
InputStream sharedStringsData = reader.getSharedStringsData(); |
|
|
|
if(sharedStringsData != null) { |
|
|
|
sharedStringsData.close(); |
|
|
|
} |
|
|
|
reader.getSharedStringsTable(); |
|
|
|
|
|
|
|
InputStream stylesData = reader.getStylesData(); |
|
|
|
if(stylesData != null) { |
|
|
|
stylesData.close(); |
|
|
|
} |
|
|
|
reader.getStylesTable(); |
|
|
|
|
|
|
|
InputStream themesData = reader.getThemesData(); |
|
|
|
if(themesData != null) { |
|
|
|
themesData.close(); |
|
|
|
} |
|
|
|
|
|
|
|
assertNotNull(reader.getWorkbookData()); |
|
|
|
|
|
|
|
Iterator<InputStream> sheetsData = reader.getSheetsData(); |
|
|
|
while(sheetsData.hasNext()) { |
|
|
|
InputStream str = sheetsData.next(); |
|
|
|
str.close(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void exportToXML(XSSFWorkbook wb) throws SAXException, |
|
|
|
ParserConfigurationException, TransformerException { |
|
|
|
for (XSSFMap map : wb.getCustomXMLMappings()) { |
|
|
@@ -62,16 +110,16 @@ public class XSSFFileHandler extends SpreadsheetHandler { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// a test-case to test this locally without executing the full TestAllFiles |
|
|
|
@Test |
|
|
|
public void test() throws Exception { |
|
|
|
InputStream stream = new FileInputStream("test-data/spreadsheet/WithConditionalFormatting.xlsx"); |
|
|
|
try { |
|
|
|
handleFile(stream); |
|
|
|
} finally { |
|
|
|
stream.close(); |
|
|
|
} |
|
|
|
} |
|
|
|
// a test-case to test this locally without executing the full TestAllFiles |
|
|
|
@Test |
|
|
|
public void test() throws Exception { |
|
|
|
InputStream stream = new BufferedInputStream(new FileInputStream("test-data/openxml4j/50154.xlsx")); |
|
|
|
try { |
|
|
|
handleFile(stream); |
|
|
|
} finally { |
|
|
|
stream.close(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// a test-case to test this locally without executing the full TestAllFiles |
|
|
|
@Test |