Java 提取.xls后,ole文件在Microsoft Excel中为空,但在apache poi中可读

Java 提取.xls后,ole文件在Microsoft Excel中为空,但在apache poi中可读,java,apache-poi,Java,Apache Poi,我有一个.doc文件,其中有一个嵌入的.xls和一个嵌入的.doc。 我可以提取这两个文件并保存它。 当我想打开.doc文档时,一切都很好。 当我想打开.xls-document时,它是空的,编辑器什么也不打开,我也看不到任何空单元格什么都没有 因此,我尝试用ApachePOI再次阅读提取的.xls文档,当我查看工作表名称或单元格内容时,一切都在那里 你知道那是什么吗 我的设置是: ApachePOI版本3.15(我还尝试了一些次要版本) word和excel文件是使用office 2007创建

我有一个.doc文件,其中有一个嵌入的.xls和一个嵌入的.doc。 我可以提取这两个文件并保存它。 当我想打开.doc文档时,一切都很好。 当我想打开.xls-document时,它是空的,编辑器什么也不打开,我也看不到任何空单元格什么都没有

因此,我尝试用ApachePOI再次阅读提取的.xls文档,当我查看工作表名称或单元格内容时,一切都在那里

你知道那是什么吗

我的设置是: ApachePOI版本3.15(我还尝试了一些次要版本) word和excel文件是使用office 2007创建的

守则-第2部分:

POIFSFileSystem fs = new POIFSFileSystem(file);

    POIOLE2TextExtractor poiole2TextExtractor = ExtractorFactory.createExtractor(fs);
    POITextExtractor[] embeddedExtractors = ExtractorFactory.getEmbededDocsTextExtractors(poiole2TextExtractor);

    for (POITextExtractor textExtractor : embeddedExtractors) {
        // If the embedded object was an Excel spreadsheet.
        if (textExtractor instanceof ExcelExtractor) {
            ExcelExtractor excelExtractor = (ExcelExtractor) textExtractor;
            DirectoryNode directoryNode = (DirectoryNode) excelExtractor.getRoot();


            HSSFWorkbook hssfWorkbook = new HSSFWorkbook(directoryNode, true);

            File tmp = new File(targetfolder, "test.xls");
            FileOutputStream fileOutputStream = new FileOutputStream(tmp);

            hssfWorkbook.write(fileOutputStream);
            fileOutputStream.flush();
            fileOutputStream.close();
            hssfWorkbook.close();
        }

谢谢:)

所以我不知怎么发现了问题:

对于HSSFWorkbook,我需要设置以下属性:

hssfWorkbook.setHidden(false);
对于所有格式的xlsx(2007),如果调用该方法,将得到一个NotImplementedException-因此您必须手动修复它。。。我发现解决办法如下:

String workbookContent = new String(ZipFileUtils.getInnerFile(tmp, "xl/workbook.xml"), "UTF-8");
                workbookContent = workbookContent.replaceFirst("visibility=\"hidden\"", "");
                ZipFileUtils.replaceZippedFile(tmp, "xl/workbook.xml",
                        workbookContent.getBytes( "UTF-8"), new FileOutputStream(tmp2));

其中tmp=我提取的xlsx文件,我在tmp2时刻将其保存到一个新文件中

我刚刚用libre office试用过,在那里我可以打开该文件。。可能这取决于Office 20072016-也不起作用..你能在中提出一个错误,因为缺少一个有效的XSSF
setHidden
方法吗?应该很快就能修复,尤其是当您已经确定了该方法需要做什么时!