2016-04-22 17 views
1

Ich versuche, einen Stapel von identisch formatierten Word-docx-Dateien zu lesen und die Daten in eine Datenbank zu extrahieren. Ich habe keine Probleme mit dem Text, aber ich kämpfe mit den Kontrollkästchen. Ich muss sagen, dass ich neu bei docx4j bin, aber seit vier Tagen mit diesem Problem zu kämpfen habe. Ich würde wirklich etwas Hilfe/Hilfe/Beratung schätzen.Docx4j - Wie bekomme ich einen dox Checkbox-Status

Ich habe ein Dokument angehängt (test.docx), das ich versuche zu lesen. Das erste Kontrollkästchen, das ich selbst mit Word eingefügt habe, wird von meinem Code erkannt und erscheint im ersten Durchlauf als CTSdtCell, die anderen Kontrollkästchen jedoch nicht. Sie scheinen in der Datei anders dargestellt zu sein, durch ein CTObject, CTSHape, CTIMageData und einen CTControl, und ich finde keine Möglichkeit, die Checkbox von diesen oder einer davon zu bekommen.

public static void main(String[] args) throws Exception { 
    WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File("test.docx"));  
    MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart(); 
    Finder finder = new Finder(FldChar.class); 
    new TraversalUtil(documentPart.getContent(), finder); 
} 

public static class Finder extends CallbackImpl { 
    protected Class<?> typeToFind; 
    protected Finder(Class<?> typeToFind) { 
     this.typeToFind = typeToFind; 
    } 

    public List<Object> results = new ArrayList<Object>(); 

    @Override 
    public List<Object> apply(Object o) { 
     String txtVal=""; 
     System.out.println(o.getClass().getName()); 

     if (o instanceof org.docx4j.wml.CTSdtCell) { 
      List<Object> objs = ((org.docx4j.wml.CTSdtCell)o).getSdtPr().getRPrOrAliasOrLock(); 
      findCheckbox(objs); 
     } 

     if (o instanceof org.docx4j.wml.SdtRun) { 
      List<Object> objs = ((org.docx4j.wml.SdtRun)o).getSdtPr().getRPrOrAliasOrLock(); 
      findCheckbox(objs); 
     } 

     if (o instanceof org.docx4j.wml.SdtBlock) { 
      List<Object> objs = ((org.docx4j.wml.SdtBlock)o).getSdtPr().getRPrOrAliasOrLock(); 
      findCheckbox(objs); 
     } 

     if (o instanceof org.docx4j.wml.Text) { 
      System.out.println("  Text Value : "+((org.docx4j.wml.Text)o).getValue()); 
     } 

     // Adapt as required 
     if (o.getClass().equals(typeToFind)) { 
      results.add(o); 
     } 
     return null; 
    } 

    private static void findCheckbox(List<Object> objs) { 
     for (Object obj : objs) { 
      if (obj instanceof javax.xml.bind.JAXBElement) { 
       if (((javax.xml.bind.JAXBElement)obj).getDeclaredType().getName().equals("org.docx4j.w14.CTSdtCheckbox")) { 
        JAXBElement<CTSdtCheckbox> elem = ((javax.xml.bind.JAXBElement)obj); 
        org.docx4j.w14.CTSdtCheckbox cb = elem.getValue(); 
        org.docx4j.w14.CTOnOff OnOff=cb.getChecked(); 
        System.out.println("  CheckBox found with value="+OnOff.getVal()); 
       } 
      } 
     } 
    } 
} 

Die Ergebnisse sind:

org.docx4j.wml.Tbl 
org.docx4j.wml.Tr 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : WORK INSTRUCTION # 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Drawing 
org.docx4j.dml.wordprocessingDrawing.Inline 
org.docx4j.dml.CTBlip 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : A 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : STEP BY STEP 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : - 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : WORK INSTRUCTION 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Drawing 
org.docx4j.dml.wordprocessingDrawing.Inline 
org.docx4j.dml.CTBlip 
org.docx4j.wml.Tr 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : 1234567 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.Tr 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : TASK 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : Chlorine drum change 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : DATE 
org.docx4j.wml.CTSdtCell 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : 12/07/2015 
org.docx4j.wml.Tr 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : MACHINE 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : ORIGINATOR 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : D.GROVE 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : CLOCK NUMBER 
org.docx4j.wml.CTSdtCell 
     CheckBox found with value=1 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : ? 
org.docx4j.wml.Tr 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : AREA 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : CHLORINE HOUSE 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : CHECKED 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : (EXPERT) 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : J Clarke 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : CLOCK NUMBER 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : 4985 
org.docx4j.wml.Tr 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : PPE 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Drawing 
org.docx4j.dml.wordprocessingDrawing.Anchor 
org.docx4j.dml.CTBlip 
org.docx4j.dml.CTColorChangeEffect 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : EYE 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Drawing 
org.docx4j.dml.wordprocessingDrawing.Anchor 
org.docx4j.dml.CTBlip 
org.docx4j.dml.CTColorChangeEffect 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : EAR 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Drawing 
org.docx4j.dml.wordprocessingDrawing.Anchor 
org.docx4j.dml.CTBlip 
org.docx4j.dml.CTColorChangeEffect 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : FOOT 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Drawing 
org.docx4j.dml.wordprocessingDrawing.Anchor 
org.docx4j.dml.CTBlip 
org.docx4j.dml.CTColorChangeEffect 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : HEAD 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Drawing 
org.docx4j.dml.wordprocessingDrawing.Anchor 
org.docx4j.dml.CTBlip 
org.docx4j.dml.CTColorChangeEffect 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : HAND 
org.docx4j.wml.Tr 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.CTObject 
org.docx4j.vml.CTShapetype 
org.docx4j.vml.CTStroke 
org.docx4j.vml.CTFormulas 
org.docx4j.vml.CTF 
org.docx4j.vml.CTF 
org.docx4j.vml.CTF 
org.docx4j.vml.CTF 
org.docx4j.vml.CTF 
org.docx4j.vml.CTF 
org.docx4j.vml.CTF 
org.docx4j.vml.CTF 
org.docx4j.vml.CTF 
org.docx4j.vml.CTF 
org.docx4j.vml.CTF 
org.docx4j.vml.CTF 
org.docx4j.vml.CTPath 
org.docx4j.vml.officedrawing.CTLock 
org.docx4j.vml.CTShape 
org.docx4j.vml.CTImageData 
org.docx4j.wml.CTControl 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.CTObject 
org.docx4j.vml.CTShape 
org.docx4j.vml.CTImageData 
org.docx4j.wml.CTControl 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.CTObject 
org.docx4j.vml.CTShape 
org.docx4j.vml.CTImageData 
org.docx4j.wml.CTControl 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.CTObject 
org.docx4j.vml.CTShape 
org.docx4j.vml.CTImageData 
org.docx4j.wml.CTControl 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.CTObject 
org.docx4j.vml.CTShape 
org.docx4j.vml.CTImageData 
org.docx4j.wml.CTControl 
org.docx4j.wml.Tr 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : COSHH 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : SPECIAL PPE REQUIREMENTS 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : *SITE 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : R/A NUMBER 
org.docx4j.wml.Tr 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : CONSIDERATION 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : PRODUCTS 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : B.A. EQUIPMENT 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : 12668 
org.docx4j.wml.Tr 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.CTObject 
org.docx4j.vml.CTShape 
org.docx4j.vml.CTImageData 
org.docx4j.wml.CTControl 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : CHLORINE 
org.docx4j.wml.R 
org.docx4j.wml.Text 
     Text Value : GAS 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.Tr 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.Tc 
org.docx4j.wml.P 
org.docx4j.wml.P 
org.docx4j.wml.CTBookmark 
org.docx4j.wml.CTMarkupRange 

Ich habe nun die Ausgabe von einem MainDocumentPart.getXML() für die Zelle hinzugefügt einem der schwer fassbar Ankreuzfelder enthält. Ich kann nichts sehen, um mir den Wert zu sagen. Kann mir bitte jemand sagen, was ich vermisse?

<w:tc> 
     <w:tcPr> 
      <w:tcW w:w="1015" w:type="dxa"/> 
      <w:tcBorders> 
       <w:left w:val="single" w:color="auto" w:sz="24" w:space="0"/> 
       <w:bottom w:val="single" w:color="auto" w:sz="24" w:space="0"/> 
       <w:right w:val="single" w:color="auto" w:sz="24" w:space="0"/> 
      </w:tcBorders> 
      <w:vAlign w:val="center"/> 
     </w:tcPr> 
     <w:p w:rsidRPr="00A7008C" w:rsidR="00F909A4" w:rsidP="00017AE9" w:rsidRDefault="000F5760"> 
      <w:pPr> 
       <w:jc w:val="center"/> 
       <w:rPr> 
        <w:b/> 
        <w:color w:val="FFFFFF" w:themeColor="background1"/> 
       </w:rPr> 
      </w:pPr> 
      <w:r> 
       <w:rPr> 
        <w:b/> 
        <w:color w:val="FFFFFF" w:themeColor="background1"/> 
        <w:sz w:val="36"/> 
       </w:rPr> 
       <w:object w:dxaOrig="225" w:dyaOrig="225"> 
        <v:shape type="#_x0000_t75" style="width:12pt;height:29.25pt" id="_x0000_i1063" o:ole=""> 
         <v:imagedata o:title="" r:id="rId17"/> 
        </v:shape> 
        <w:control w:name="CheckBox11" w:shapeid="_x0000_i1063" r:id="rId18"/> 
       </w:object> 
      </w:r> 
      <w:bookmarkEnd w:id="0"/> 
     </w:p> 
    </w:tc> 
+0

ich die xml für eine Zelle hinzugefügt haben ein schwer erreichbares Checkbox enthält. Warum wird kein Wert angezeigt? – Richard

Antwort

0

Ich habe es geknackt !! Die CTImageData zeigen auf Bilder, auf die über die Beziehungen des Dokuments zugegriffen werden kann. Diese Bilder enthalten die markierten oder nicht markierten Kästchen. Indem ich die Größe der Bilder überprüfe, kann ich sagen, was es ist.

Ich verstehe Word nicht mehr als für oberflächliche Verwendung, und weiß nicht, wie diese "Checkboxen" erstellt wurden, aber es scheint, dass sie nicht auf die gleiche Weise wie meine Tests erstellt wurden. Ich weiß daher nicht, ob sich diese Bilder ändern können, wenn die Organisation ihre MS Office-Software aktualisiert, die Docs-Dateien bearbeitet und erneut speichert. Der Bedarf an meiner Software wird sich jedoch nach der ersten Belastung schnell ändern, und daher ist die Auswirkung dieses Risikos für mich gering.

+0

Legacy Active X-Steuerelemente werden erstellt von: Developer-Menü> Legacy-Tools .. – JasonPlutext

0

Die bestehenden Kontrollkästchen sind Legacy-ActiveX-Steuerelemente:

  <w:object w:dxaOrig="225" w:dyaOrig="225"> 
      <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="[email protected]@[email protected]@[email protected]@[email protected]@5xe" filled="f" stroked="f"> 
       <v:stroke joinstyle="miter"/> 
       <v:formulas> 
       : 
       </v:formulas> 
       <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> 
       <o:lock v:ext="edit" aspectratio="t"/> 
      </v:shapetype> 
      <v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:12pt;height:29.25pt" o:ole=""> 
       <v:imagedata r:id="rId15" o:title=""/> 
      </v:shape> 
      <w:control r:id="rId16" w:name="CheckBox" w:shapeid="_x0000_i1025"/> 
      </w:object> 

Die, die Sie sind Kontrollen sind moderne XML-freundliche Checkbox Inhalte erstellt werden.

Darüber hinaus gibt es Kontrollkästchen Zeichen, und Checkbox Formularfelder ...