【问题标题】:Creating an xssf workbook from an uploaded .xlsx(2007 Excel file)从上传的 .xlsx(2007 Excel 文件)创建 xssf 工作簿
【发布时间】:2012-03-29 22:28:42
【问题描述】:

在代码中客户端通过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);

然后进一步处理工作簿。

我想知道如何创建 XSSFWorkbook,因为我已经创建了上面的 HSSFWorkbook。

我在 classpath 和 lib 文件夹中有所有 ooxml 和相关的 jars。

无法从 byteArrayInputStream 创建 XSSFWorkbook。 Apache XSSF Workbook 。它只能从 Inputstream 和 OPCPackage 创建。

关于如何进一步发展的任何想法/指示。我很乐意提供有关任何其他有帮助的代码 sn-ps 的更多详细信息。

【问题讨论】:

    标签: java apache-poi


    【解决方案1】:

    您可以愉快地从 InputStream 创建 XSSFWorkbook

    一种选择是使用 WorkbookFactory,它会自动检测适当的类型并为您返回 HSSFWorkbook 或 XSSFWorkbook:

    Workbook wb = WorkbookFactory.create(inputStream);
    

    否则,您可以像这样从流中创建 XSSFWorkbook:

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

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

    【讨论】:

    • 很好的解释。在使用工作簿工厂创建工作簿后,有什么方法可以告诉您正在使用哪种文件?我只在那个 Factory 类中看到了 create 方法。
    • 如果您真的需要知道它是哪个,只需使用instanceof 测试它是HSSFWorkbook 还是XSSFWorkbook
    • 这是一个问题,因为 App Engine 的内存量有限,不幸的是,将整个输入流加载到内存中会导致 java.lang.outofmemory 问题。由于应用引擎世界中没有本地文件结构,因此需要找出一种在从输入流中读取时进行缓冲的方法。
    • @advocate 你想使用事件模型/事件用户模型来减少你的内存占用,但这应该是一个全新的问题
    • 好吧,如果有一种解决方法会是首选,因为我编写了代码并在部署到应用引擎之前仅在本地进行了测试。我宁愿不必完全重写我的解析器 =\ 我希望可能有一个从输入流到某种缓冲或文件输入流的 java 转换解决方法,或者可能有一些 Apache API 调用以某种方式缓冲输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2021-02-10
    • 1970-01-01
    相关资源
    最近更新 更多