尝试清除内容控件的全部内容,包括内部内容控件

问题描述 投票:0回答:1

我有一个内容控件,目前看起来像这样。使用 Apache POI 5.2.2 版本。

xml-fragment    
....xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape">
  <w:sdtPr>
    <w:rPr>
      <w:sz w:val="24"/>
      <w:szCs w:val="24"/>
    </w:rPr>
    <w:alias w:val="condition:Include Clause B-equals-SOMETHINGELSE"/>
    <w:tag w:val="condition:Include Clause B-equals-SOMETHINGELSE"/>
    <w:id w:val="-352886319"/>
    <w:placeholder>
      <w:docPart w:val="40B8349151E69B4080AC951B34BB7066"/>
    </w:placeholder>
    <w15:color w:val="0000FF"/>
    <w15:appearance w15:val="tags"/>
  </w:sdtPr>
  <w:sdtContent>
    <w:sdt>
      <w:sdtPr>
        <w:rPr>
          <w:sz w:val="24"/>
          <w:szCs w:val="24"/>
        </w:rPr>
        <w:alias w:val="clause:Clause B"/>
        <w:tag w:val="clause:Clause B"/>
        <w:id w:val="2110933031"/>
        <w:placeholder>
          <w:docPart w:val="DE22C8B6F70C8945AFCC799440DC836B"/>
        </w:placeholder>
        <w:showingPlcHdr/>
        <w15:color w:val="0000FF"/>
        <w15:appearance w15:val="tags"/>
      </w:sdtPr>
      <w:sdtContent>
        <w:sdt>
          <w:sdtContent>
            <w:r w:rsidRPr="002619CB">
              <w:rPr>
                <w:color w:val="FF0000"/>
              </w:rPr>
              <w:t xml:space="preserve">This is Clause </w:t>
            </w:r>
            <w:r w:rsidRPr="002619CB">
              <w:rPr>
                <w:color w:val="FF0000"/>
              </w:rPr>
              <w:t>B</w:t>
            </w:r>
                .......       
            <w:r>
              <w:t/>
              <w:cr/>
            </w:r>
          </w:sdtContent>
        </w:sdt>
      </w:sdtContent>
    </w:sdt>
  </w:sdtContent>
</xml-fragment>

我使用以下代码清除外部内容控件内的所有“内容”。这意味着我想删除内部内容控件。在这种情况下,第二个条件得到调用,并且仅清除 并保持内部内容控制。如何删除外部内容控件中的所有内容(包括内部内容控件)。谢谢

void setContentBlank() {
    if (this.object instanceof CTSdtBlock) {
        CTSdtBlock ctSdtBlock = (CTSdtBlock)this.object
        if (ctSdtBlock.isSetSdtContent()) {
            CTSdtContentBlock sdtContentBlock = ctSdtBlock.getSdtContent()
            sdtContentBlock.PList.clear()
        }
    } else if (this.object instanceof CTSdtRun) {
        CTSdtRun ctSdtRun = (CTSdtRun)this.object
        if (ctSdtRun.isSetSdtContent()) {
            CTSdtContentRun sdtContentRun = ctSdtRun.getSdtContent()
            CTR[] ctRArray = []
            sdtContentRun.setRArray(ctRArray)
        }
    } else if (this.object instanceof CTSdtCell) {
        CTSdtCell ctSdtCell = (CTSdtCell)this.object
        if (ctSdtCell.isSetSdtContent()) {
            CTSdtContentCell sdtContentCell = ctSdtCell.getSdtContent()
            for (int c = 0; c < sdtContentCell.getTcList().size(); c++) {
                CTTc ctTc = sdtContentCell.getTcList().get(c)
                ctTc.PList.clear()
            }
        }
    }
}
apache-poi apache-poi-4
1个回答
0
投票

外部控件的

sdtContent
没有
PList
也没有
RArray
。它仅包含一个
sdt

要清除内容控件中的所有内容,最简单的方法是先取消设置

sdtContent
,然后添加一个新的空
sdtContent

转换为Java代码的示例代码:

void setContentBlank(XmlObject object) {
    if (object instanceof CTSdtBlock) {
        CTSdtBlock ctSdtBlock = (CTSdtBlock)object;
        if (ctSdtBlock.isSetSdtContent()) {
            ctSdtBlock.unsetSdtContent();
            ctSdtBlock.addNewSdtContent();
        }
    } else if (object instanceof CTSdtRun) {
        CTSdtRun ctSdtRun = (CTSdtRun)object;
        if (ctSdtRun.isSetSdtContent()) {
            ctSdtRun.unsetSdtContent();
            ctSdtRun.addNewSdtContent();
        }
    } else if (object instanceof CTSdtCell) {
        CTSdtCell ctSdtCell = (CTSdtCell)object;
        if (ctSdtCell.isSetSdtContent()) {
            ctSdtCell.unsetSdtContent();
            ctSdtCell.addNewSdtContent();
        }
    }
 }
© www.soinside.com 2019 - 2024. All rights reserved.