You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Aspose.Word下拉列表'Choose an item'项异常/丢失问题咨询

问题描述

我的Word文档中有两个下拉列表,均包含显示名称为"Choose an item"、值为空的选项。执行以下代码后出现异常情况:

ByteArrayOutputStream baOutputStream = new ByteArrayOutputStream();
InputStream in;             
in = this.getClass().getResourceAsStream("/resources/dropdown1.docx");
Document doc = new Document(in);
NodeCollection sdtNodes = doc.getChildNodes(NodeType.STRUCTURED_DOCUMENT_TAG, true);
for (StructuredDocumentTag sdt : (Iterable<StructuredDocumentTag>)sdtNodes)
    if (sdt.getSdtType() == SdtType.DROP_DOWN_LIST)
        for (SdtListItem item : (Iterable<SdtListItem>)sdt.getListItems()) {
            System.out.println(item.getDisplayText() + " | " + item.getValue());
        }
doc.save(baOutputStream, SaveFormat.DOCX);

遇到的问题:

  • 仅dropdown1下拉列表存在值为| Choose an item.的项(但该内容不在item.getDisplayText()中),civilDept5_1下拉列表甚至没有值或显示文本为"Choose an item"的项。
  • 保存并下载文档后,仅dropdown1下拉列表保留"Choose an item"选项,civilDept5的该选项已丢失。

问题解答

问题1原因

两个下拉列表的内部结构或创建方式存在差异:

  • dropdown1的"Choose an item"是作为下拉列表的默认占位符文本存在的,并非正式的列表项。Aspose.Words读取时会将空值与占位符文本拼接输出,但它不属于ListItems集合,所以getDisplayText()无法获取到该文本。
  • civilDept5_1的"Choose an item"是通过Word的内容控件占位符属性设置的,这类占位符不会被Aspose.Words识别为SdtListItem,因此遍历ListItems时找不到对应项。

问题2原因

Aspose.Words对不同类型下拉列表的序列化逻辑不同:

  • civilDept5的"Choose an item"是占位符而非正式列表项,Aspose.Words保存文档时,若未显式设置占位符文本,会默认清除这类非结构化的占位符内容。
  • dropdown1的占位符被Aspose.Words识别为关联空值的特殊项,保存时会保留该关联关系,因此选项不会丢失。

解决建议
  • 统一将"Choose an item"添加为正式下拉列表项,设置显示文本为"Choose an item"、值为空字符串,确保Aspose.Words能正常识别和遍历。
  • 若需保留占位符逻辑,可通过代码显式设置占位符文本,避免保存时丢失:
if (sdt.getSdtType() == SdtType.DROP_DOWN_LIST) {
    if (sdt.getPlaceholder() == null) {
        sdt.setPlaceholderText("Choose an item");
    }
}

内容的提问来源于stack exchange,提问作者user1169587

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:10:31