如何使用Apache POI通过Google App Engine阅读电子表格?

时间:2016-01-08 11:55:13

标签: java excel google-app-engine apache-poi jxl

我一直在使用JXL一段时间来处理webapp文件夹中的excel文件。这适用于开发和生产。我只是注入一个ServletContext并打电话给:

Workbook.getWorkbook(new File(servletContext.getRealPath("WEB-INF/myfile.xls")))和JXL可以读取文件并进行处理。

我最近在App Engine Servlet中切换到使用Apache POI,但我得到一个例外:

[ERROR] java.security.AccessControlException: access denied ("java.io.FilePermission" "C:\Users\Drew\IntelliJ\UsavApp\target\UsavAppV7-1.0-SNAPSHOT\WEB-INF\myfile.xlsx" "write")
[ERROR]     at java.security.AccessControlContext.checkPermission(AccessControlContext.java:372)
[ERROR]     at java.security.AccessController.checkPermission(AccessController.java:559)
[ERROR]     at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
[ERROR]     at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:429)
[ERROR]     at java.lang.SecurityManager.checkWrite(SecurityManager.java:979)
[ERROR]     at java.io.RandomAccessFile.<init>(RandomAccessFile.java:229)
[ERROR]     at org.apache.poi.poifs.nio.FileBackedDataSource.newSrcFile(FileBackedDataSource.java:130)
[ERROR]     at org.apache.poi.poifs.nio.FileBackedDataSource.<init>(FileBackedDataSource.java:46)
[ERROR]     at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:218)
[ERROR]     at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:166)
[ERROR]     at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:278)
[ERROR]     at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:250)
[ERROR]     at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:229)
[ERROR]     at com.utilitiessavings.usavappv7.server.handler.parse.ParseElecTariffBooksHandler.processTariffsFromExcel(ParseElecTariffBooksHandler.java:108)
[ERROR]     at com.utilitiessavings.usavappv7.server.handler.parse.ParseElecTariffBooksHandler.execute(ParseElecTariffBooksHandler.java:91)
[ERROR]     at com.utilitiessavings.usavappv7.server.handler.parse.ParseElecTariffBooksHandler.execute(ParseElecTariffBooksHandler.java:39)
...etc

从阅读中我收集的POI与GAE完全兼容,但大多数人都在讨论从头开始创建文件,或者将它们写入本地磁盘。我没有做其中任何一个,所以我想确定这是App Engine的限制而不是我正在做的事情。

我对异常的猜测是POI甚至需要写访问才能读取文件,而JXL则没有。 有没有办法使用Apache POI在应用引擎中阅读电子表格?

1 个答案:

答案 0 :(得分:3)

对答案进行评论 - 在这种情况下,您应该明确告诉Apache POI以只读模式打开您的文件

对于.xlsx文件,请使用

执行此操作
OPCPackage pkg = OPCPackage.open(new File("input.xlsx"), PackageAccess.READ);
XSSFWorkbook wb = new XSSFWorkbook(pkg);

对于.xls文件,请使用

执行此操作
NPOIFSFileSystem fs = new NPOIFSFileSystem(new File("input.xls"), true);
HSSFWorkbook wb = new HSSFWorkbook(fs);

如果您使用的是WorkbookFactory,则可以通过null传递密码和setting the read-only flag

来传递密码
Workbook wb = WorkbookFactory.create(new File("input.xlsx"), null, true);

一般来说,从InputStream读取始终是只读的,它是使用Files,其中有一个只读和读写选项

有关详细信息,请参阅constructor javadocs,另请参阅WorkbookFactory