1

Microsoft Word ドキュメント (docx) から「編集者」をプログラムで抽出する最良の方法を決定しようとしています。具体的には、 「レビュー」タブ→「保護」セクション、「編集制限」オプション→「2.編集制限」セクション→「個人」リストボックス。これが何らかの方法でコードなしで達成される可能性がある場合は、SharePoint を使用してワークフロー中にこの情報を抽出することに言及しています。

ファイルを解凍し、document.xml ファイル内の「w:permStart」ノードを検索することで、それを実行できると思います。Microsoft が決定した場合に、ある時点で壊れる可能性があるため、そのようなハッキングに頼ることをためらっています。物事を変えること。

Office API は可能性を提供しているように見えます ( Editor Interface ) が、私は今それをテストすることはできず、API の適切なレベルでさえ確信が持てません。これはインターフェイスであり、ドキュメント オブジェクトの実際のプロパティではないためです。または類似。


編集

Word 2010 の UIでは、パネルを開くボタン (またはWord 2007 のボタン) を使用して、抽出する名前がReviewタブの下Protectのリボンの領域に一覧表示されます。Restrict EditingProtect DocumentRestrict Formatting and Editing

このパネルの 2 番目のセクション セクション (ラベル2. Editing restrictions) で、(Underneath )というラベルの付いたボックスがない場合はIndividualsExceptions (optional)Allow only this type of editing in the documentチェック ボックスをオンにします (その後のドロップダウンで何を選択してもかまいません)。

Exceptions (optional)これにより、セクションの下にユーザーを追加できるようになります。More users...リンクをクリックしてダイアログを開き、電子メール アドレス (Microsoft 認証サーバーに接続する) またはドメイン ユーザー アカウント (Word がドメイン システムで実行されている場合) のいずれかを入力します。時刻) をセミコロンで区切ります。これらのユーザーは、というラベルの付いたリストに追加されますIndividuals。これは、Word 文書から抽出したいリストです (下の図)。

このリストは、ドロップダウンで指定された一般的なドキュメント ルールに「例外」を設定するために使用され、特定の例外範囲に関連付けられている名前のみを保存します - 電子メールまたは名前をリストに追加して範囲を作成し、ブロックを選択しますテキスト (またはドキュメント全体) を選択し、その名前の横にあるチェックボックスをオンにして、選択した範囲に関連付けます。w:edドキュメントが保存されると、その名前への参照が、1 つ以上のw:permStart要素 (テキストの範囲ごとに 1 つの要素)の属性として、基礎となる document.xml ファイルに追加されます。

docx ファイルを解凍し、document.xml ドキュメントを解析し、それらの要素の属性のすべての名前を抽出することもできますが、Microsoft Word API の代替方法がある場合、それは非常に洗練されていません。API を使用することをお勧めしますほぼ確実に保守性と安定性が向上するためです。

レビュー -> 保護 -> 編集の制限 -> 制限 -> 個人

4

3 に答える 3

1

Okay, I figured out where Word hides this data :)

What I did was record a Macro of me adding an editor to the document and reverse engineer it from there.

It seems that Editors are assigned to Ranges. If that part isn't too complicated, this should get you most of the way there:

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()
于 2013-02-22T03:19:19.700 に答える
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)....
                }
            }
于 2013-11-01T12:26:43.357 に答える
0

これにより、現在のドキュメントにリビジョンがあるすべての作成者のリストが表示されます。きれいではありませんが、それらを抽出する 1 つの方法を示しています。

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

それが役立つことを願っています!

于 2013-02-19T21:28:09.590 に答える