我正在尝试读取一堆格式相同的word docx文件,并将数据提取到数据库中。我对文本没有任何问题,但我正在努力处理复选框。我需要说的是,我是docx4j的新手,但我已经在这个问题上挣扎了四天。我真的很重视一些帮助/帮助/建议。
我附上了一份文件(test.docx),我正在尝试阅读。第一个复选框是我使用Word自己插入的,它由我的代码检测到,并在初始传递时显示为CTSdtCell,但其他复选框不是。它们在文件中似乎以不同的方式表示,由CTObject、CTSHape、CTIMageData和CTControl表示,我找不到从这些或其中之一获取复选框的方法。
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());
}
}
}
}
}结果是:
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现在,我已经为包含其中一个难以捉摸的复选框的单元格添加了MainDocumentPart.getXML()的输出。我看不到任何东西能告诉我它的价值。有人能告诉我我错过了什么吗?
<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>发布于 2016-04-26 17:18:16
我已经破解了!!CTImageData指向可以通过文档关系访问的图像。这些图像包含已勾选或未勾选的方框。通过检查图像的大小,我可以分辨出它是哪一个。
我对Word的理解仅仅停留在表面上,也不知道这些“复选框”是如何创建的,但它们的创建方式似乎与我的测试用例不同。因此,我不知道如果/当组织升级其MS Office软件、编辑和保存文档文件时,这些图像是否会发生变化。然而,在初始加载之后,对我的软件的需求将迅速改变,因此这种风险对我来说是很小的。
发布于 2016-04-26 18:33:38
现有的复选框是旧的ActiveX控件:
<w:object w:dxaOrig="225" w:dyaOrig="225">
<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@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>您正在创建的控件是现代的XML友好的checkbox内容控件。
还有复选框字符和复选框表单域...
https://stackoverflow.com/questions/36799026
复制相似问题