保存并处理表格时,Word挂起

时间:2018-08-23 18:22:59

标签: ms-office vsto

我最近在Word中遇到了一个非常奇怪的问题,而且我没想到能够解决。但是我做到了,现在我想分享该解决方案。

我看到的行为是表操作经常会弄乱图形并挂起单词,以至于需要重新启动它,除非一旦更改停止就取消了更改。我发现可重现的测试用例是:

  1. 使用表格创建或打开任何文档。
  2. 保存两次。
  3. 使用弹出的控件插入新列。

我的解决方案在保存期间做了很多不同的事情,并且没有异常或日志中出现任何表明错误的信息。

在普通Word中没有发生这种情况。

1 个答案:

答案 0 :(得分:1)

为找出原因,我开始删除大量代码,然后重新测试以确定它们是否有作用。

我最终创建了此MCVE:

  

请注意,这是一个文档级模板项目。

using System;
using Microsoft.Office.Tools.Word;
using Microsoft.Office.Interop.Word;

namespace TableUndoBug
{
    public partial class ThisDocument
    {
        private void ThisDocument_Startup(object sender, System.EventArgs e)
        {
            BeforeSave += ThisDocument_BeforeSave;
        }

        private void ThisDocument_BeforeSave(object sender, SaveEventArgs e)
        {
            try
            {
                foreach (Table table in Tables)
                {
                    int numRows = table.Rows.Count;
                    var c = table.Cell(numRows, 0); // this line is the culprit
                    // this call should be using 1, not 0, but it completes successfully anyway.
                    // if you change it, this bug disappears
                }
            }
            catch (Exception)
            {
            }
        }

        private void ThisDocument_Shutdown(object sender, System.EventArgs e)
        {
        }

        #region VSTO Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisDocument_Startup);
            this.Shutdown += new System.EventHandler(ThisDocument_Shutdown);
        }

        #endregion
    }
}

这是要测试的步骤(在将它们放在一起的同时,我还发现了一些测试用例):

  

此示例项目说明了Word 2013 / VSTO中的错误。

     

要复制:

     
      
  1. 从Visual Studio运行它。

  2.   
  3. 将文档保存在任何地方。

  4.   
  5. 插入表格。

  6.   

测试案例1:

  
      
  1. 再次保存2次。

  2.   
  3. 尝试使用悬停时弹出的控件插入列。

         

    图形会混乱,但不会挂起。

  4.   

测试案例2:

  
      
  1. 使用表格的上下文菜单添加标题(我认为这里重要的是样式应用程序)。
  2.   
  3. 再次保存2次。
  4.   
  5. 尝试使用悬停时弹出的控件插入列。

         

    图形将被弄乱,并且将挂起一会儿。

  6.   

测试案例3:

  
      
  1. 再次保存2次。
  2.   
  3. 使用快速访问工具栏中的撤消按钮。
  4.   
  5. 使用快速访问工具栏中的重做按钮。

         

    图形将被弄乱,并且将挂起一会儿。

  6.   

解决方案就在代码中:检查应该从1开始的从0开始的索引。该API可能会在此处失败,但由于某种原因它不会失败。