Web*_*ser 7 java xlsx apache-poi
我正在使用Apache POI 3.8库来读取Web应用程序中的XLSX文件.以下代码在Java控制台应用程序中运行良好:
InputStream inputFS = new FileInputStream("test.xlsx");
Workbook workbook = new XSSFWorkbook(inputFS); // below exception is thrown on this line
Sheet sheet = workbook.getSheetAt(0);
Run Code Online (Sandbox Code Playgroud)
但在Web应用程序中使用时会抛出"读取错误".下面粘贴了堆栈跟踪的相关摘录:
java.io.IOException: Read error
at java.io.FileInputStream.readBytes(Native Method) ~[na:1.6.0_31]
at java.io.FileInputStream.read(Unknown Source) ~[na:1.6.0_31]
at java.io.FilterInputStream.read(Unknown Source) ~[na:1.6.0_31]
at java.io.PushbackInputStream.read(Unknown Source) ~[na:1.6.0_31]
at java.util.zip.ZipInputStream.readFully(Unknown Source) ~[na:1.6.0_31]
at java.util.zip.ZipInputStream.readLOC(Unknown Source) ~[na:1.6.0_31]
at java.util.zip.ZipInputStream.getNextEntry(Unknown Source) ~[na:1.6.0_31]
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:51) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:83) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:228) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.util.PackageHelper.open(PackageHelper.java:39) ~[poi-ooxml-3.8-20120326.jar:3.8]
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:187) ~[poi-ooxml-3.8-20120326.jar:3.8]
at com.corp.ReportManager.parseExcelReport(ReportManager.java:575) [ReportManager.class:na]
Run Code Online (Sandbox Code Playgroud)
以下JAR包含在类路径中(按相同顺序):
poi-3.8-20120326.jar
poi-ooxml-3.8-20120326.jar
poi-ooxml-schemas-3.8-20120326.jar
xbean.jar
dom4j-1.6.1.jar
Run Code Online (Sandbox Code Playgroud)
由于我在调用上面的代码之前收集了一些堆利用率统计信息,因此似乎没有与内存相关的问题.XLSX文件的大小为1.15 MB.
##### Heap utilization statistics [MB] #####
Used Memory:13 MB
Free Memory:9 MB
Total Memory:23 MB
Max Memory:247 MB
Run Code Online (Sandbox Code Playgroud)
使用上面代码的方法有一个参数 - FileInputStream.代码片段中的第一行是代码的一部分,但是调用方法的一部分.由于所讨论的方法不了解Excel格式甚至文件扩展名以进行有根据的猜测,我决定首先尝试使用HSSF API读取FileInputStream,如下所示:
Sheet sheet = null;
try {
POIFSFileSystem poifs = new POIFSFileSystem(inputFS);
Workbook workbook = new HSSFWorkbook(poifs);
sheet = workbook.getSheetAt(0);
}
catch (Exception e) {
}
if (sheet == null) {
try {
Workbook workbook = new XSSFWorkbook(inputFS);
sheet = workbook.getSheetAt(0);
}
catch (Exception e) {
}
}
Run Code Online (Sandbox Code Playgroud)
上述代码的问题在于,inputFS第二次尝试通过XSSF API打开对象时的状态是未知的.这产生了一个read error.我用以下代码替换了上面的代码,工作正常,问题似乎得到解决:
Sheet sheet = null;
try {
Workbook workbook = WorkbookFactory.create(inputFS);
sheet = workbook.getSheetAt(0);
}
catch (Exception e) {
}
Run Code Online (Sandbox Code Playgroud)
我用XLS(旧的,二进制的)和XLSX(更新的,基于XML的)格式测试了它,它可以工作.感谢大家的帮助和投入!
| 归档时间: |
|
| 查看次数: |
39688 次 |
| 最近记录: |