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

我一直在使用JXL来处理webapp文件夹内的excel文件。 这适用于开发和生产。 我只是注入一个ServletContext并调用如下所示:

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

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

 [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不完全兼容,但大多数人谈论从头开始创build文件或将其写入本地磁盘。 我没有这样做,所以我想确定这是App Engine的限制,而不是我正在做的事情。

我从exception的猜测是POI需要写入权限,甚至读取文件,而JXL没有。 有没有办法使用Apache POI在应用程序引擎中读取电子表格?

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

对于.xlsx文件,请使用.xlsx文件

 OPCPackage pkg = OPCPackage.open(new File("input.xlsx"), PackageAccess.READ); XSSFWorkbook wb = new XSSFWorkbook(pkg); 

对于.xls文件,请使用.xls文件

 NPOIFSFileSystem fs = new NPOIFSFileSystem(new File("input.xls"), true); HSSFWorkbook wb = new HSSFWorkbook(fs); 

如果您正在使用WorkbookFactory ,那么您可以通过为密码传递null 并将只读标志设置为

 Workbook wb = WorkbookFactory.create(new File("input.xlsx"), null, true); 

一般来说,从InputStream中读取总是只读的,在文件中有一个只读和读写的选项

请参阅构造函数 javadocs了解更多细节,以及WorkbookFactory 。