解压缩.xls后,使用Microsoft Excel将文件清空,但可以使用apache-poi读取

时间:2017-03-15 06:42:46

标签: java apache-poi

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

所以我尝试用apache-poi再次读取提取的.xls文档,当我查看单元格的Sheet-Name或Content时 - 一切都在那里。

你有什么想法吗?

我的设置是: apache-poi版本3.15(我也试过一些次要版本) word和excel文件是使用Office 2007创建的。

代码 - 部分:

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();
        }

谢谢:)

1 个答案:

答案 0 :(得分:0)

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

对于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 = My Extracted xlsx File我将它保存到mmpment tmp2中的新文件