C# 在MS Word中填写表格需要很多时间

C# 在MS Word中填写表格需要很多时间,c#,ms-word,C#,Ms Word,我编写了以下代码,将外部数据表添加到MS word文档中的另一个表中,其工作正常,但如果行数超过100,则需要花费大量时间;如果添加行数超过500的表,则填充MS word表的速度非常慢,无法完成任务 我试图隐藏文档并禁用文档的屏幕更新,但仍然没有解决性能缓慢的问题 //Get the required external data to the DT data table DataTable DT = XDt.GetData(); Word.Table TB; int X

我编写了以下代码,将外部数据表添加到MS word文档中的另一个表中,其工作正常,但如果行数超过100,则需要花费大量时间;如果添加行数超过500的表,则填充MS word表的速度非常慢,无法完成任务

我试图隐藏文档并禁用文档的屏幕更新,但仍然没有解决性能缓慢的问题

//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++;
}
//获取DT数据表所需的外部数据
DataTable DT=XDt.GetData();
表TB;
int X=1;
foreach(数据行Rw在DT.行中)
{
Word.Row Rn=TB.Rows.Add(TB.Rows[X+1]);

对于(int i=0;i您正在为
TB.Rows.Add
BeforeRow
参数检索当前表的最后一行。这比简单地添加行要慢得多。您应该替换它:

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

Word.Row Rn = TB.Rows.Add();
使用注释中建议的并行化可能会有一些帮助,但我担心,看到表中的添加代码在主线程上运行(如中所述)不会有多大好处

编辑:


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

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


将此字符串指定给范围对象,然后使用ConvertToTable()方法创建表。

ConvertToTable方法比一次添加一行/单元格快几个数量级

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);
使用并行循环。示例: