Java 从上载的.xlsx(2007 Excel文件)创建xssf工作簿

Java 从上载的.xlsx(2007 Excel文件)创建xssf工作簿,java,apache-poi,Java,Apache Poi,在代码中,客户端通过struts上传一个标准的.xlsx文件 在操作中,我们使用 FormFile myfile = ABCForm.getTheFile(); 我的问题是如何使用此文件创建XSSFWorkbook 我还有一个以这种方式访问2003 excel文件的并行过程 FormFile myfile = ABCForm.getTheFile(); byte[] fileData = myFile.getFileData(); ByteArrayInputStream byteArrayI

在代码中,客户端通过struts上传一个标准的.xlsx文件

在操作中,我们使用

FormFile myfile = ABCForm.getTheFile();
我的问题是如何使用此文件创建XSSFWorkbook

我还有一个以这种方式访问2003 excel文件的并行过程

FormFile myfile = ABCForm.getTheFile();
byte[] fileData = myFile.getFileData();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData);

in the Helper class

POIFSFileSystem fs = new POIFSFileSystem(byteArrayInputStream);
HSSFWorkbook wb = new HSSFWorkbook(fs);
然后对工作簿进行进一步处理

我想知道如何创建XSSF工作簿,因为我已经创建了上面的HSSF工作簿

我在classpath和lib文件夹中有所有ooxml和相关JAR

无法从byteArrayInputStream创建XSSF工作簿。它只能从Inputstream和OPCPackage创建


关于如何进一步进行的任何想法/建议。我很乐意提供有关任何其他代码片段的更多详细信息,这些代码片段将有所帮助。

您可以很高兴地从InputStream创建XSSFWorkbook

一个选项是使用WorkbookFactory,它会自动检测适当的类型并为您返回HSSF工作簿或XSSF工作簿:

Workbook wb = WorkbookFactory.create(inputStream);
否则,您可以从以下流创建XSSF工作簿:

XSSFWorkbook wb = new XSSFWorkbook(OPCPackage.open(inputStream));

但是,请注意,从文件打开XSSFWorkbook所需的内存比从流打开XSSFWorkbook所需的内存要少-对于流,整个文件都需要缓冲到内存中

这是一个很好的解释。在使用工作簿工厂创建工作簿后,是否有任何方法可以告诉您正在使用哪种类型的文件?我只在那个工厂类中看到了创建方法。只需使用
instanceof
来测试它是HSSF工作簿还是XSSF工作簿,如果您真的需要知道它是哪一个,这是一个问题,因为App Engine的内存量有限,而将整个输入流加载到内存会导致java.lang.outofmemory问题。从输入流读取时需要找出缓冲区的方法,因为应用程序引擎世界中没有本地文件结构。@您需要使用事件模型/事件用户模型来减少内存占用,但这应该是一个全新的问题,如果有一个解决方案,我会更喜欢,因为我编写了代码,并在部署到AppEngine之前只在本地进行了测试。我宁愿不必重写我的解析器=\n我希望有一个java转换解决方案,可以从inputstream转换为某种缓冲或文件输入流,也可以通过一些Apache API调用来缓冲输入。