这几行代码已经在我们的应用程序中愉快地运行了好几年(以及Office、2003、2007、2010等的几个版本)。目的是在Word文档中执行一种邮件合并,用数据库中的名称、地址等替换字段占位符:
Dim w As Word.Application
Dim d As Microsoft.Office.Interop.Word.Document = Nothing
Dim f As Microsoft.Office.Interop.Word.Field
For Each f In d.Fields
f.Select()
If fieldName = w.Selection.Text Then
f.Result.Text = value
End If
Next
但是,运行Office 2013的用户在线路f.Result.Text = value
:上报告了此错误
System.Runtime.InteropServices.COMException(0x800A17EC):您不是允许编辑此选择,因为它受到保护。
因此,只有当用户运行Office 2013时才会发生这种情况,而且很少有关于此错误的在线帮助。
文档的任何部分都不受保护,用户可以直接在Word中编辑文档,而不会出现任何问题。
在绝望中,甚至在博客文章和讨论中搜索答案,与这个特定的错误相距甚远,Office 2013似乎对ReadingLayout的默认处理方式进行了更改。
引入w.ActiveWindow.View.ReadingLayout = False
似乎解决了我们的问题。
我们在Word 2007/2010中进行了一些C#自动化,但在Word 2013中停止了,并发出了相同的"不允许…"警告。
此网站上的以下步骤解决了此问题。
基本上有两种设置需要检查:
- 文件–选项–常规。取消选中"在阅读视图中打开电子邮件附件和其他不可编辑的文件"
- 文件–选项–信任中心–信任中心设置。选择"受保护的视图",然后清除所有复选框
您没有指定如何打开文档,但我遇到的一个问题通过遵循这个问题的答案得到了解决。
从WordApplication.Documents.Open()
切换到WordApplication.Documents.Add()
解决了我的应用程序的问题。
在我的案例中,此错误是由.LockContentControl == true
的内容控件引起的。
为了解决这个问题,我构建了一个内容控件的IEnumerable<ContentControl>
,该属性设置为true,并设置了.LockContentControl = false
。现在我可以毫无问题地.InsertColumnsRight()
了。然后,我为集合中的所有内容控件恢复.LockContentControl = true
。
尝试了上面的大多数建议,但我发现这解决了问题。我们使用密码以只读方式打开文档作为模板。所以无法使用"添加"
Documents.Open(strTemplateDoc, ReadOnly:=True, PasswordDocument:=strDocPassword, Visible:=False)
将View.Type设置为wdNormalView停止了错误"您不允许编辑此选择,因为它受到保护"
wdDocPage.ActiveWindow.View.Type = Microsoft.Office.Interop.Word.WdViewType.wdNormalView
感谢所有其他人的建议,他们帮了很多忙。
在过去的两天里(在创建dotm模板时),这种情况一直发生在我身上,对我来说,修复它的是创建一个新的normal.dotx!不知道这是否对其他人有效,但对我有效!
打开文档时,指定不应将其作为只读打开
object readOnly = false;
doc = word.Documents.Open(ref path, ref miss, ref readOnly, ...);
对我来说,这个问题类似于Tim Dols的回答,但我需要解锁内容控件的内容。,即CCD_ 11性质:
mycontentcontrol.LockContents = False
对于@CrazyIvan1974,该解决方案的问题在于Add创建了一个新文档。如果在使用"添加"时指向现有文档,它不会加载文档,而是使用原始文档作为模板创建新文档。这可能会断开模板和加载项的连接,如果你在原始上保存,那真的会让你很麻烦