2014-01-29 22 views
2

我正在使用poi庫來處理MS文件。爲了提取docx,xl​​sx和pptx的嵌入式ole對象,我使用方法:PackagePart pp = src.getAllEmbedds()但是對於doc,xls和ppt等MS格式的舊格式,沒有這種方法。所以我使用提取器:POITextExtractor[] embeddedExtractors = ExtractorFactory.getEmbededDocsTextExtractors(oleTextExtractor);但是這隻能提取文本而不是整個文件。 任何人都可以幫助我提取doc,ppt和xls文件嗎?使用java從doc中提取嵌入文件

回答

1

OLE2文件包括最的Microsoft Office文件,如XLSDOC,並PPT以及MFC序列化API基於文件格式。 辦公室OpenXML格式是新的基於標準的XML 文件格式的Microsoft Office 2007和發現。這包括XLSX,DOCXPPTX

對於每個MS Office的應用存在,試圖提供一個共同的高電平的Java APIOLE2OOXML文檔格式的組件模塊。

+0

十分感謝,這工作〜 – Alvin

+0

不客氣。 –

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


     } 

    } 
} 
+0

上面的代碼是從xls excel中讀取嵌入的xlsx。 –

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


     } 

    } 
} 
+0

上面的代碼是讀取嵌入到另一個xls的xls。 –

+0

您應該編輯您的答案以添加任何相關信息或評論,而不僅僅是評論您自己的答案 – JSantos

相關問題