刘弘扬fine 2024-11-13 19:46 采纳率: 50%
浏览 24
已结题

c#打开word开启修订并实时显示批注

通过c#打开word文档,并且修订的时候,同时给修订的内容增加批注。需求是张三通过c#打开本地的一个word文档,打开的时候开启修订模式,这个修订功能实现了,现在需要修订内容的地方,实时增加批注,也就是用户只要加了一个字,修订跟批注的样式都展示出来,这个功能当前没有实现,希望有人给点指引。希望实现批注也展示,图片如下

img

代码如下:

path你们不用管,是word文档路径,nickName是修订人,需要把这个修订人放到批注里面
```c#
private void EnableRevisionsInWord(string path, string nickName)
{
    Document wordDoc = null;
    try
    {
        // 设置 Word 用户名,以便批注显示在指定用户下
        wordApp.UserName = nickName;  // 设置用户名为批注作者

        // 打开 Word 文档
        wordDoc = wordApp.Documents.Open(path, ReadOnly: false, Visible: true);
        wordApp.Visible = true;

        // 启用修订
        wordDoc.TrackRevisions = true; // 启用修订,允许修改的痕迹
        wordDoc.ShowRevisions = true;  // 显示修订

        // 启用批注
        wordApp.ActiveWindow.View.ShowRevisionsAndComments = true; // 显示批注

        // 设置视图以显示修订及批注
        wordApp.ActiveWindow.View.RevisionsView = WdRevisionsView.wdRevisionsViewFinal; // 修订视图设置为 Final(显示最终修订,包括批注)

        // 强制显示批注
        AddCommentsToRevisions(wordDoc, nickName);

    }
    catch (Exception ex)
    {
        LogMessage("EnableRevisionsInWord exception: " + ex.Message);
    }
}

private void AddCommentsToRevisions(Document document, string nickName)
{
    try
    {
        var revisions = document.Revisions;
        int revisionCount = revisions.Count;

        // 使用 HashSet 来存储已添加批注的位置
        HashSet<int> commentedRevisions = new HashSet<int>();

        // 防止重复添加批注
        foreach (Comment existingComment in document.Comments)
        {
            commentedRevisions.Add(existingComment.Scope.Start);
        }

        for (int i = 1; i <= revisionCount; i++)
        {
            var revision = revisions[i];
            var range = revision.Range;

            // 检查修订是否已有批注
            if (!commentedRevisions.Contains(range.Start))
            {
                string revisionText = range.Text;
                // 在批注内容中嵌入修订人信息,以确保修订人不被覆盖
                string commentText = $"修订人: {nickName} | 修订类型: {revision.Type}, 内容: {revisionText}";

                // 直接添加批注文本,不依赖 UserName
                document.Comments.Add(range, commentText);

                // 将该修订位置添加到集合中
                commentedRevisions.Add(range.Start);
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("添加批注失败:" + ex.Message);
    }
}

```

  • 写回答

20条回答 默认 最新

  • Jackyin0720 2024-11-13 21:34
    关注

    目前了解到的是实现起来非常复杂。是一定要的需求吗?
    你需要深入研究Word的文档对象模型(DOM),并找到一种方法来检测文档内容的实时更改。
    另一种方法是使用Word的修订模式,并让用户手动添加批注。然后,你可以使用VBA或C#代码来分析修订历史,并根据需要生成报告或执行其他操作。这种方法更简单,也更符合Word的常规使用方式

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(19条)

报告相同问题?

问题事件

  • 系统已结题 11月22日
  • 已采纳回答 11月14日
  • 修改了问题 11月13日
  • 创建了问题 11月13日