填充表在MS Word中花费了大量时间

时间:2015-11-30 08:21:35

标签: c# ms-word

我做了以下代码将外部数据表添加到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++;
}

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您正在检索NSMutableArray * list = [NSMutableArray arrayWithArray:codeList]; NSIndexSet * indexesToRemove = [list indexesOfObjectsPassingTest:^BOOL(NSString *code, NSUInteger idx, BOOL *stop) { return [self.codeMapping.allKeys containsObject:code]; }]; [list removeObjectsAtIndexes:indexesToRemove]; BeforeRow参数的当前表格的最后一行。这比简单地添加行慢得多。你应该替换它:

TB.Rows.Add

有了这个:

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

根据评论中的建议使用并行化可能会有所帮助,但我担心如果在this link中提到的表格添加代码在主线程上运行,它就不会有多大帮助。

编辑:

如果性能仍然存在问题,我将尝试使用OpenXML独立于Word对象模型创建Word表。它的速度提高了几个数量级。

答案 2 :(得分:0)

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);