2016-07-06 10 views
1

ich arbeite derzeit mit Excel-Dateien (* .xlsm) und Apache POI, und ich habe mir den Kopf über eine Aufgabe. Ich erhalte einige Excel-Dateien, in denen PDFs eingebettet sind, und ich möchte sie extrahieren und sie auf der Zeile und Spalte umbenennen. Dies scheint seltsam, wie ich weiß, dass die eingebetteten Objekte als Bilder dargestellt werden, können sie mehr belegen als eine Zelle und technisch sind sie nicht "In" der Zelle.Get Row und Col für eingebettetes Objekt mit POI

Das folgende Code-Snippet lässt mich die eingebetteten PDFs extrahieren, aber sie heißen OleObject [1..2.3.etc ..], das mir keine Ahnung gibt.

inStream = new FileInputStream(file); 
XSSFWorkbook workbook = new XSSFWorkbook(inStream); 
for (PackagePart pPart : workbook.getAllEmbedds()) { 
    String contentType = pPart.getContentType(); 
    if (contentType.equals("application/vnd.openxmlformats-officedocument.oleObject")){ 
     POIFSFileSystem fs = new POIFSFileSystem(pPart.getInputStream()); 
     TikaInputStream stream = TikaInputStream.get(fs.createDocumentInputStream("CONTENTS")); 

     byte[] bytes = IOUtil.toByteArray(stream); 
     stream.close(); 
     OutputStream outStream = new FileOutputStream(new File(ROOT_DIRECTORY.getAbsolutePath()+"\\PDF"+i+".pdf")); 
     IOUtil.copy(bytes, outStream); 
     outStream.close(); 
    }} 

wollte ich wissen, ob org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet mir den XML-Code des excell Blatt sehen lassen und vielleicht eith taht ich die info ich brauche zu bekommen. So was.

<oleObjects><mc:AlternateContent xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"><mc:Choice Requires="x14"><oleObject progId="Acrobat Document" dvAspect="DVASPECT_ICON" shapeId="1028" r:id="rId4"><objectPr defaultSize="0" r:id="rId5"><anchor moveWithCells="1"><from><xdr:col>8</xdr:col><xdr:colOff>0</xdr:colOff><xdr:row>11</xdr:row><xdr:rowOff>0</xdr:rowOff></from><to><xdr:col>8</xdr:col><xdr:colOff>1143000</xdr:colOff><xdr:row>13</xdr:row><xdr:rowOff>171450</xdr:rowOff></to></anchor></objectPr></oleObject></mc:Choice><mc:Fallback><oleObject progId="Acrobat Document" dvAspect="DVASPECT_ICON" shapeId="1028" r:id="rId4"/></mc:Fallback></mc:AlternateContent></oleObjects> 

-

<objectPr defaultSize="0" r:id="rId5"><anchor moveWithCells="1"><from><xdr:col>8</xdr:col><xdr:colOff>0</xdr:colOff><xdr:row>11</xdr:row><xdr:rowOff>0</xdr:rowOff></from><to><xdr:col>8</xdr:col><xdr:colOff>1143000</xdr:colOff><xdr:row>13</xdr:row><xdr:rowOff>171450</xdr:rowOff></to></anchor></objectPr> 

ich die Ankerinformationen erraten Verwendung möglich wäre, aber im nur nicht in der Lage zu finden, wie es zu bekommen.

Hoffe diese Information macht die Dinge klar auf was ich versuche zu tun.

Vielen Dank im Voraus.

Antwort

0

Ich habe für die aktuellen poi-OOXML-Schemata Quellen Gläser auf den Quellcode sah, die Sie hier finden können: http://repo1.maven.org/maven2/org/apache/poi/ooxml-schemas/1.3/

org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet org.apache erweitert .xmlbeans.XmlObject, das Ihnen den XML-Code als Zeichenfolge mithilfe der geerbten .toString() -Methode zur Verfügung stellen kann. Oder Sie können schnell auf die Liste der OLE-Objekte im Arbeitsblatt zugreifen, indem Sie getOleObjects() für Ihr CTWorksheet-Objekt aufrufen.

/** 
* Gets the "oleObjects" element 
*/ 
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTOleObjects getOleObjects(); 

CTOleObjects selbst erstreckt org.apache.xmlbeans.XmlObject und wieder können Sie die Verwendung von XML toString() für die Analyse erhalten, oder eine Liste von org.openxmlformats.schemas.spreadsheetml.x2006.main.CTOleObject OLE erhalten Objekte für die Iteration mit CTOleObjects.getOleObjectList().

/** 
* Gets a List of "oleObject" elements 
*/ 
java.util.List<org.openxmlformats.schemas.spreadsheetml.x2006.main.CTOleObject> getOleObjectList(); 

CTOleObject scheint nicht Getter-Methoden zu haben, um die und Kind XML-Elemente können Sie die Spalten bestimmen, zu bekommen, so denke ich, müssten Sie einige XML-Analyse zu tun, oder Zeichenfolge suchen diese Informationen zu erhalten wenn es in der XML-Zeichenfolgendarstellung enthalten ist.

Hoffe, das hilft.