【问题标题】:Filling table takes a lot of time in MS Word在 MS Word 中填写表格需要很长时间
【发布时间】:2018-05-16 04:26:07
【问题描述】:

我编写了以下代码来将外部数据表添加到 MS Word 文档中的另一个表中,它工作正常,但如果行数超过 100 行,以及添加行数表会花费很多时间数超过 500 填满 ms 字表真的很慢,无法完成任务。

我尝试隐藏文档并禁用文档的屏幕更新,但仍然无法解决性能缓慢的问题。

//Get the required external data to the DT data table            
DataTable DT = XDt.GetData();
Word.Table TB;
int X = 1;
foreach (DataRow Rw in DT.Rows)
{
    Word.Row Rn = TB.Rows.Add(TB.Rows[X + 1]);

    for(int i=0;i<=DT.Columns.Count-1;i++)
        {
           Rn.Cells[i+1].Range.Text = Rw[i].ToString()); 
        }
    X++;
}

那么有没有办法让这个过程更快?

【问题讨论】:

标签: c# ms-word


【解决方案1】:

将表格添加到 Word 中最有效的方法是首先将数据连接到一个带分隔符的文本字符串中,其中“/n”必须是行尾符号(记录分隔符)。单元格结尾(字段分隔符)可以是您喜欢的不在构成表格的字符串内容中的任何字符。

将此字符串分配给 Range 对象,然后使用 ConvertToTable() 方法创建表。

【讨论】:

    【解决方案2】:

    您正在为TB.Rows.AddBeforeRow 参数检索当前表的最后一行。这比简单地添加行要慢得多。你应该替换这个:

    Word.Row Rn = TB.Rows.Add(TB.Rows[X + 1]);
    

    有了这个:

    Word.Row Rn = TB.Rows.Add();
    

    使用 cmets 中建议的并行化可能会有所帮助,但我担心看到表添加代码在 this link 中提到的在主线程上运行,这并没有太大帮助。

    编辑:

    如果性能仍然是一个问题,我会考虑使用 OpenXML 创建独立于 Word 对象模型的 Word 表。速度要快几个数量级。

    【讨论】:

      【解决方案3】:

      ConvertToTable 方法比一次添加 Rows/Cells 快几个数量级。

      while (reader.Read())
      {
         values = new object[reader.FieldCount];
         var cols = reader.GetValues(values);
         var item = String.Join("\t", values);
         items.Add(item);
      };
      data = String.Join("\n", items.ToArray());
      
      var tempDocument = application.Documents.Add();
      var range = tempDocument.Range();
      range.Text = data;
      var tempTable = range.ConvertToTable(Separator: Microsoft.Office.Interop.Word.WdTableFieldSeparator.wdSeparateByTabs,
                                          NumColumns: reader.FieldCount,
                                          NumRows: rows, DefaultTableBehavior: WdDefaultTableBehavior.wdWord9TableBehavior,
                                          AutoFitBehavior: WdAutoFitBehavior.wdAutoFitWindow);
      

      【讨论】:

        猜你喜欢
        • 2013-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-07
        • 2020-08-26
        • 2014-10-09
        • 2012-11-26
        • 2019-12-27
        相关资源
        最近更新 更多