【问题标题】:Extract embedded files from doc using java使用java从doc中提取嵌入文件
【发布时间】:2014-01-29 00:28:23
【问题描述】:

我正在使用 poi 库来处理 MS 文件。为了提取docx、xlsx和pptx的嵌入ole对象,我使用方法:PackagePart pp = src.getAllEmbedds()但是对于doc、xls和ppt等MS文件的旧格式,没有这种方法。所以我正在使用提取器:POITextExtractor[] embeddedExtractors = ExtractorFactory.getEmbededDocsTextExtractors(oleTextExtractor); 但这只能提取文本而不是整个文件。 谁能帮我提取 doc、ppt 和 xls 文件?

【问题讨论】:

    标签: java apache-poi


    【解决方案1】:

    OLE2 文件包括大多数Microsoft Office 文件,例如XLSDOCPPT 以及MFC 基于序列化API 的文件格式。 Office OpenXML 格式Microsoft Office 20072008 中基于新标准的 XML 文件格式。这包括XLSXDOCXPPTX

    对于每个 MS Office 应用程序,都有一个组件模块,它试图为 OLE2 提供一个通用的高级 Java api >OOXML 文档格式。

    【讨论】:

      【解决方案2】:
      import java.io.File;
      import java.io.FileOutputStream;
      import java.io.InputStream;
      import java.util.ArrayList;
      import java.util.HashMap;
      import java.util.Iterator;
      
      import org.apache.poi.hssf.usermodel.HSSFObjectData;
      import org.apache.poi.hssf.usermodel.HSSFWorkbook;
      import org.apache.poi.poifs.filesystem.DirectoryNode;
      import org.apache.poi.poifs.filesystem.DocumentEntry;
      import org.apache.poi.poifs.filesystem.Entry;
      import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
      import org.apache.poi.util.IOUtils;
      import org.apache.poi.xssf.usermodel.XSSFWorkbook;
      
      public class TestEmbedded {
         public static void main(String[] args) throws Exception {
             String path = "ParentExcel.xls";
             File file = new File(path);
      
             NPOIFSFileSystem fs = new NPOIFSFileSystem(file);
             HSSFWorkbook wb = new HSSFWorkbook(fs.getRoot(), true);
      
             for (HSSFObjectData obj : wb.getAllEmbeddedObjects()) {
             System.out.println(obj.getDirectory()+"***************HSSFObject data value************"+obj.getOLE2ClassName());
             String oleName = obj.getOLE2ClassName();
             System.out.println("Has directory Entry node"+obj.hasDirectoryEntry());
             DirectoryNode dn = (DirectoryNode)obj.getDirectory();
             Iterator<Entry> ab = dn.getEntries();
             System.out.println("The entries in the directory node are"+dn.getEntries()+"And also the count"+dn.getEntryCount());
      
             if(oleName.contains("Worksheet")){
      
                InputStream is ;
                Entry entry = ab.next();
                is = dn.createDocumentInputStream(entry);
                FileOutputStream fos = new FileOutputStream("EmbeddedWorkbook.xlsx");
                IOUtils.copy(is, fos);
                fos.close();
             }
      
      
             }
      
          }
      }
      

      【讨论】:

      • @Shwetha Prem。我的要求是一样的,唯一的区别是如果文件来自 UI 端作为你知道的多部分文件,任何建议。还有一件事,该文件是嵌入在 excel 单元格中的 doc/docx
      【解决方案3】:
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.io.InputStream;
      import java.util.ArrayList;
      import java.util.HashMap;
      import java.util.Iterator;
      
      import org.apache.poi.hssf.usermodel.HSSFObjectData;
      import org.apache.poi.hssf.usermodel.HSSFWorkbook;
      import org.apache.poi.poifs.filesystem.DirectoryNode;
      import org.apache.poi.poifs.filesystem.DocumentEntry;
      import org.apache.poi.poifs.filesystem.Entry;
      import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
      import org.apache.poi.poifs.filesystem.POIFSFileSystem;
      import org.apache.poi.util.IOUtils;
      
      
      public class TestEmbedded {
         public static void main(String[] args) throws Exception {
             String path = "DummyParent.xls";
             File file = new File(path);
             POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(file));
             HSSFWorkbook wb = new HSSFWorkbook(fs.getRoot(), true);
      
             for (HSSFObjectData obj : wb.getAllEmbeddedObjects()) {
             System.out.println(obj.getDirectory()+"***************HSSFObject data value************"+obj.getOLE2ClassName());
             String oleName = obj.getOLE2ClassName();
             System.out.println("Has directory Entry node"+obj.hasDirectoryEntry());
             DirectoryNode dn = (DirectoryNode)obj.getDirectory();
             Iterator<Entry> ab = dn.getEntries();
             System.out.println("The entries in the directory node are"+dn.getEntries()+"And also the count"+dn.getEntryCount());
      
             if(oleName.contains("Worksheet")){
                HSSFWorkbook hssfWorkbook = new HSSFWorkbook(dn,fs,false);
               int number = hssfWorkbook.getNumberOfSheets();
               System.out.println("The number of sheets in the Embedded excel - xls"+number);
             }
      
      
             }
      
          }
      }
      

      【讨论】:

      • 您应该编辑您的答案以添加任何相关信息或评论,而不仅仅是评论您自己的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      • 2017-03-25
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多