我做了以下代码将外部数据表添加到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++;
}
那么有没有办法让这个过程更快?
答案 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);