我正在尝试确定以编程方式从Microsoft Word文档(docx)中提取“编辑器”的最佳方法 - 具体来说,当您添加时,列表中显示的名称(或电子邮件/域用户名)列表用户通过“评论”标签 - > “保护”部分,“限制编辑”选项 - > “2.编辑限制”部分 - > “个人”列表框。如果在没有代码的情况下以某种方式实现这一点,我提到将使用SharePoint来在工作流程中提取此信息。
我相信我可以通过解压缩文件并在document.xml文件中搜索“w:permStart”节点来实现这一点,我不愿意采取这种黑客攻击的可能性,它可能会在某些时候中断微软应该决定改变一切。
Office API似乎提供了一种可能性(Editor Interface)但是我现在无法测试它并且我不肯定它甚至在api的正确级别,因为它是一个接口而不是文档对象或类似文件的实际属性。
Word 2010用户界面通过Review
按钮(或Protect
在功能区的Restrict Editing
区域的Protect Document
标签下列出我要提取的名称Word 2007中的}按钮,打开Restrict Formatting and Editing
面板。
在此面板的第二部分(标有2. Editing restrictions
),如果没有标有Individuals
的框(Exceptions (optional)
下方),请检查{ {1}}复选框(在下面的下拉菜单中选择了什么并不重要)。
这将允许在Allow only this type of editing in the document
部分下添加用户,通过单击Exceptions (optional)
链接打开一个对话框,其中一个键入电子邮件地址(连接到Microsoft身份验证服务器)或域用户帐户(如果Word正在域系统上运行)以分号分隔。这些用户将被添加到标有More users...
的列表中 - 这是我想从word文档中提取的列表(如下图所示)。
此列表用于对下拉列表中指定的常规文档规则进行“例外”处理,并且仅保存与给定异常范围关联的名称 - 通过向列表添加电子邮件或名称来创建范围,选择一个文本块(或整个文档),然后选中该名称旁边的复选框以将其与所选范围相关联。保存文档时,对该名称的引用将作为一个或多个Individuals
元素的w:ed
属性添加到基础document.xml文件中(每个文本范围一个元素)
我可以解压缩docx文件,解析document.xml文档并提取这些元素中这些属性中的所有名称,但如果有Microsoft Word API的替代方式,则非常不优雅这样做 - 我更喜欢通过API,因为它几乎肯定会更易于维护和稳定。
答案 0 :(得分:1)
好的,我想出了Word隐藏这些数据的地方:)
我所做的是记录我在文档中添加编辑器并从那里进行反向工程的宏。
似乎编辑被分配到Ranges。如果那部分不是太复杂,那么这应该可以帮到你:
Dim wordApp As New Word.Application
Dim wordDocument As Word.Document = wordApp.Documents.Open("C:\MyDoc.docx")
Dim allEditors As Word.Editors = wordDocument.Range(0, 0).Editors
For i As Integer = 1 To allEditors.Count
Debug.Print(allEditors.Item(i).Name)
Next
wordDocument.Close()
答案 1 :(得分:0)
这将为您提供当前文档中包含修订的所有作者的列表。它并不漂亮,但它展示了一种提取它们的方法。
您没有指定VB.Net或C#,但我认为您可以将其转换为C#,如果这是您的首选语言。
Imports Microsoft.Office.Interop
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim wordApp As New Word.Application
Dim wordDocument As Word.Document = wordApp.Documents.Open("c:\MyDoc.docx")
Dim editors As New Dictionary(Of String, String)
' Iterate through all the revisions
For Each r As Word.Revision In wordDocument.Revisions()
If Not editors.ContainsKey(r.Author.ToString) Then
editors.Add(r.Author.ToString(), r.Author)
End If
Next
' List all the unique authors
For Each s As String In editors.Values
Debug.Print(s)
Next
wordDocument.Close()
End Sub
End Class
希望有所帮助!
答案 2 :(得分:0)
你可以试试这个:
for (int j = 1; j <= wordDocument.Sections.Count; j++) { for (int i = 1; i <= wordDocument.Sections[j].Range.Editors.Count; i++) { //your code here wordDocument.Sections[j].Range.Editors.Item(i).... } }