使用java在excel中读取嵌入的Object

时间:2012-03-19 07:10:17

标签: java excel apache-poi

我想制作一张excel表,我需要发送其他表来填写它。 在excel表格中,另一个人填写他的信息,也可以附上excel表格的文本/ doc文件....             我需要访问该text / doc文件..请给我一个解决方案。 我正在使用Apache POI - HSSF api。

提前致谢。

package excelExchange;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import java.util.Vector;

import org.apache.poi.hslf.HSLFSlideShow;
import org.apache.poi.hslf.usermodel.SlideShow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFObjectData;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.poifs.filesystem.DirectoryNode;
//import org.apache.poi.h;
import org.apache.poi.poifs.filesystem.*;

public class ReadEmbeddedObject {

    public static void main(String[] args) throws IOException {

        String fileName = "C:\\Mayur\\NewsLetter\\files\\projectInfo.xls";
        //Vector dataHolder = 
        ReadCSV(fileName);
    }

    public static void ReadCSV(String fileName) throws IOException{
        Vector cellVectorHolder = new Vector();
        FileInputStream myInput = new FileInputStream(fileName);

        // myFileSystem=fs
        //myWorkBook=workbook



        POIFSFileSystem fs = new POIFSFileSystem(myInput);
        HSSFWorkbook workbook = new HSSFWorkbook(fs);

          for (HSSFObjectData obj : workbook.getAllEmbeddedObjects()) {
            //the OLE2 Class Name of the object
            System.out.println("Objects : "+ obj.getOLE2ClassName()+ "   2 .");
            String oleName = obj.getOLE2ClassName();


            if (oleName.equals("Worksheet")) {
                System.out.println("Worksheet");
                DirectoryNode dn = (DirectoryNode) obj.getDirectory();
                HSSFWorkbook embeddedWorkbook = new HSSFWorkbook(dn, fs, false);
                System.out.println(oleName+": " + embeddedWorkbook.getNumberOfSheets());
                System.out.println("Information :--- ");
                System.out.println(" name " + embeddedWorkbook.getSheetName(0));
                //System.out.println(entry.getName() + ": " + embeddedWorkbook.getNumberOfSheets());
            } else if (oleName.equals("Document")) {


                System.out.println("Document");
                DirectoryNode dn = (DirectoryNode) obj.getDirectory();
                HWPFDocument embeddedWordDocument = new HWPFDocument(dn,fs);
                System.out.println("Doc : " + embeddedWordDocument.getRange().text());
            }  else if (oleName.equals("Presentation")) {
                System.out.println("Presentation");
                DirectoryNode dn = (DirectoryNode) obj.getDirectory();
                SlideShow embeddedPowerPointDocument = new SlideShow(new HSLFSlideShow(dn, fs));
                //Entry entry = (Entry) entries.next();
                System.out.println(": " + embeddedPowerPointDocument.getSlides().length);
            } else {
                System.out.println("Else part ");
                if(obj.hasDirectoryEntry()){
                    // The DirectoryEntry is a DocumentNode. Examine its entries to find out what it is
                    DirectoryNode dn = (DirectoryNode) obj.getDirectory();
                    for (Iterator entries = dn.getEntries(); entries.hasNext();) {
                        Entry entry = (Entry) entries.next();
                        System.out.println(oleName + "." + entry.getName());
                    }
                } else {
                    // There is no DirectoryEntry
                    // Recover the object's data from the HSSFObjectData instance.
                    byte[] objectData = obj.getObjectData();
                }
            }
        }


    }

}

</code>

2 个答案:

答案 0 :(得分:1)

POI具有迭代嵌入对象的API。 (HSSFWorkbook .getAllEmbeddedObjectsXSSFWorkbook.getAllEmbedds)。这里的示例http://poi.apache.org/spreadsheet/quick-guide.html#Embedded

答案 1 :(得分:0)

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;

/**
 * Demonstrates how you can extract embedded data from a .xlsx file
 */
public class GetEmbedded {

    public static void main(String[] args) throws Exception {
        String path = "SomeExcelFile.xlsx"
        XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(new File(path)));

             for (PackagePart pPart : workbook.getAllEmbedds()) {
                            String contentType = pPart.getContentType();
                            if (contentType.equals("application/vnd.ms-excel")) { //This is to read xls workbook embedded to xlsx file
                                HSSFWorkbook embeddedWorkbook = new HSSFWorkbook(pPart.getInputStream());
                                int countOfSheetXls=embeddedWorkbook.getNumberOfSheets();

                 }
                            else if (contentType.equals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) { //This is to read xlsx workbook embedded to xlsx file
                                 if(pPart.getPartName().getName().equals("/xl/embeddings/Microsoft_Excel_Worksheet12.xlsx")){
                                 //"/xl/embeddings/Microsoft_Excel_Worksheet12.xlsx" - Can read an Excel from a particular sheet 
                                // This is the worksheet from the Parent Excel-sheet-12

                                     XSSFWorkbook embeddedWorkbook = new XSSFWorkbook(pPart.getInputStream());
                                     int countOfSheetXlsx=embeddedWorkbook.getNumberOfSheets();
                                     ArrayList<String> sheetNames= new ArrayList<String>();
                                        for(int i=0;i<countOfSheetXlsx;i++){
                                        String name=workbook.getSheetName(i);
                                        sheetNames.add(name);
                                        }
                                }
                            }
                }
     }
}