目前我正在处理包含多个书签的Word.dotx文件,这些书签正在被c#程序更改。
对于Rebranding项目,我需要添加几个新的书签字段,而我的前任代码确实引用了Office Word 2010中的Text Form Field Legacy Control。
我创建了一个新的文本表单字段,其字段设置书签指向TestBookmark1。我已经知道某个错误,文本表单字段的书签名称最多可包含20个字符。
当我运行测试代码时,现有的书签会在新书签崩溃时完美替换。我在此处收到的例外情况是“范围无法删除”
用于替换书签的代码如下:
public void ReplaceBookmark(string bookmarkName, string text)
{
try
{
var bookmarks = GetProperty("Bookmarks", _wordDoc); //worddoc is the Word.Document equivalent in late binding
var exists = InvokeMember("Exists",
bookmarks,
new object[]
{
bookmarkName
}) != null && (bool)InvokeMember("Exists",
bookmarks,
new object[]
{
bookmarkName
});
if (!exists)
return;
var bookmark = InvokeMember("Item",
bookmarks,
new object[]
{
bookmarkName
});
var range = GetProperty("Range", bookmark);
SetProperty("Text", range, text);
InvokeMember("Add",
bookmarks,
new[]
{
bookmarkName, range
});
}
catch
{
CloseWord(false);
throw;
}
}
在 SetProperty(“文字”,范围,文字)处抛出异常;
private static void SetProperty(string propertyName, object instance, object value)
{
if (instance == null)
return;
var type = instance.GetType();
type.InvokeMember(propertyName,
BindingFlags.SetProperty,
null,
instance,
new[]
{
value
});
}
当进入更深层时,它会落在type.InvokeMember函数上。
我已经看到了同样的解决方案Here,但是这个例子使用了我出于公司原因无法使用的早期绑定原则。
这给我留下了以下问题:
提前致谢
答案 0 :(得分:0)
我找到了,可能是另一个Office骗局......
添加新的文本表单字段时,您可以选择添加属性。在“字段设置”中,您可以设置书签。
然而,这并不能完成书签。
设置文本表单字段属性后,您仍需要转到
插入标签=>工具组=>书签=>选择正确的书签(标准正确突出显示),然后按添加。
这听起来很愚蠢,但我显然没有做最后的步骤。
招呼