установить / снять флажок с помощью docx4j в документе MS Word

Я пытаюсь установить / снять флажок с помощью docx4j в документе MS Word.

введите описание изображения здесь

Используя код из этого сообщения: флажки проверки docx4j Я получил следующий XML-код этого элемента из моего документ:

<w:fldChar w:fldCharType="begin" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:ns21="urn:schemas-microsoft-com:office:powerpoint" xmlns:ns23="http://schemas.microsoft.com/office/2006/coverPageProps" xmlns:dsp="http://schemas.microsoft.com/office/drawing/2008/diagram" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:odx="http://opendope.org/xpaths" xmlns:odgm="http://opendope.org/SmartArt/DataHierarchy" xmlns:dgm="http://schemas.openxmlformats.org/drawingml/2006/diagram" xmlns:ns17="urn:schemas-microsoft-com:office:excel" xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:odi="http://opendope.org/components" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:ns9="http://schemas.openxmlformats.org/schemaLibrary/2006/main" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ns32="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" xmlns:ns30="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" xmlns:ns12="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing" xmlns:ns31="http://schemas.openxmlformats.org/drawingml/2006/compatibility" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:odq="http://opendope.org/questions" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" xmlns:odc="http://opendope.org/conditions" xmlns:oda="http://opendope.org/answers">
<w:ffData>
    <w:name w:val=""/>
    <w:enabled/>
    <w:calcOnExit w:val="false"/>
    <w:checkBox>
        <w:sizeAuto/>
        <w:default w:val="true"/>
    </w:checkBox>
</w:ffData>

How could I unset value of this checkbox?

Благодарю вас!


person dimson    schedule 09.04.2015    source источник
comment
как вы вставляете флажок в Ms word, а xml - это w: checkBox? Я вставил флажок в MS Word, но xml имеет вид ‹w: object w: dxaOrig = 1440 w: dyaOrig = 1440› ‹v: shape type = # _ x0000_t75 style = width: 39.75pt; height: 21.75pt id = _x0000_i1049 o: ole = ›‹ v: imagedata o: title = r: id = rId9 / ›‹ / v: shape ›‹ w: control w: name = female w: shapeid = _x0000_i1049 r: id = rId10 / ›‹ / w: object ›   -  person wilson    schedule 21.09.2018


Ответы (3)


Вам нужно найти свой элемент флажка, а когда он у вас есть, все остальное тривиально. Пример.

for (Object o2 : contentControl.getSdtPr().getRPrOrAliasOrLock()) {

        o2 = XmlUtils.unwrap(o2);
        if (o2 instanceof CTSdtCheckbox) {

            CTSdtCheckbox cTSdtCheckbox = (CTSdtCheckbox) o2;
            CTOnOff ctOnOff = new CTOnOff();

            ctOnOff.setVal("1!);
            cTSdtCheckbox.setChecked(ctOnOff);
        }

}
person Lista    schedule 18.03.2016
comment
Есть два типа флажков. Вопрос в том, что касается устаревшего флажка. Этот ответ относится к более новому флажку управления содержимым. - person Sarel Botha; 20.04.2017

В своей работе мне приходилось писать код для установки / снятия флажков двух типов в документах MS Word (.docx): CTFFCheckBox и CTSdtCheckbox. В итоге я использовал XPath и docx4j, чтобы найти флажки и изменить их значения. Вот пример кода для переворота всех CTFFCheckBox в документе:

    WordprocessingMLPackage wordPackage = WordprocessingMLPackage.load(template);
    MainDocumentPart mainDocumentPart = wordPackage.getMainDocumentPart();
    List<Object> list = mainDocumentPart.getJAXBNodesViaXPath("//w:checkBox",false);
    for (Object c : list) {
        JAXBElement<CTFFCheckBox> element = (JAXBElement<CTFFCheckBox>)c;
        CTFFCheckBox checkBox = element.getValue();
        BooleanDefaultTrue checkedVal = checkBox.getChecked();
        BooleanDefaultTrue defaultVal = checkBox.getDefault();
        if (checkedVal != null){
            checkedVal.setVal(!checkedVal.isVal());
        } else {
            defaultVal.setVal(!defaultVal.isVal());
        }
    }

Чтобы перевернуть CTSdtCheckbox, мне также пришлось изменить текстовый символ, представляющий флажок. Установив флажок с одним выражением XPath, я обнаружил текстовый символ, используя другое выражение XPath относительно флажка:

    WordprocessingMLPackage wordPackage = WordprocessingMLPackage.load(template);
    MainDocumentPart mainDocumentPart = wordPackage.getMainDocumentPart();
    List<Object> list = mainDocumentPart.getJAXBNodesViaXPath("//w14:checkbox", false);
    for (Object c : list) {
        JAXBElement<CTSdtCheckbox> element = (JAXBElement<CTSdtCheckbox>)c;
        CTSdtCheckbox checkbox = element.getValue();
        List<Object> list2 = mainDocumentPart.getJAXBNodesViaXPath("../..//w:t", element, false);
        Text chkSymbol = ((JAXBElement<Text>) list2.get(0)).getValue();
        CTOnOff checkedVal = checkbox.getChecked();
        if (checkedVal.getVal().compareTo("0") == 0) {
            checkedVal.setVal("1");
            chkSymbol.setValue(new String(Character.toChars(0x2612)));
        } else {
            checkedVal.setVal("0");
            chkSymbol.setValue(new String(Character.toChars(0x2610)));
        }       
    }
person SteinarH    schedule 28.03.2019

Чтобы снять этот флажок, вам нужно либо изменить флаг по умолчанию, либо добавить новый дочерний узел <w:checked w:val="false"/> к узлу <w:checkBox>.

Например. для вашего примера XML для флажка снятый (заменяющий значение по умолчанию) будет выглядеть следующим образом:

<w:fldChar w:fldCharType="begin">
<w:ffData>
    <w:name w:val=""/>
    <w:enabled/>
    <w:calcOnExit w:val="false"/>
    <w:checkBox>
        <w:sizeAuto/>
        <w:default w:val="true"/>
        <w:checked w:val="false"/>
    </w:checkBox>
</w:ffData>

С docx4j код будет выглядеть следующим образом:

final CTFFCheckBox checkbox = // retrieve your checkbox
final BooleanDefaultTrue booleanFalse = new BooleanDefaultTrue();
booleanFalse.setVal(false);
checkbox.setChecked(booleanFalse); // alternatively call checkbox.setDefault(booleanFalse);

Как получить экземпляр CTFFCheckBox уже объяснялось в ответе на ваш первый вопрос. Если у вас есть экземпляр FldChar, вы можете получить экземпляр флажка через FldChar#getFfData()#getNameOrEnabledOrCalcOnExit(), который возвращает список из JAXBElement элементов. Один из элементов JAXBElement имеет в своем значении экземпляр CTFFCheckbox (JAXBElement#getValue).

person Marteng    schedule 19.07.2017