在c#中填充word表的最快方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在c#中填充word表的最快方法?相关的知识,希望对你有一定的参考价值。

目前,我通过for循环。但是,我的表有58行和13列,保存word文档大约需要20秒。是否有更好的方法用数据填充word表?

        for (int i = 1; i<58; i++)
        {
            document.Tables[2].Columns[4].Cells[i].Range.Text = form.report[i].debInfo.value1.ToString();
            document.Tables[2].Columns[5].Cells[i].Range.Text = form.report[i].debInfo.value2.ToString();
            document.Tables[2].Columns[6].Cells[i].Range.Text = form.report[i].debInfo.value3.ToString();
            document.Tables[2].Columns[7].Cells[i].Range.Text = form.report[i].debInfo.value4.ToString();
            document.Tables[2].Columns[8].Cells[i].Range.Text = form.report[i].kredInfo.value1.ToString();
            document.Tables[2].Columns[9].Cells[i].Range.Text = form.report[i].kredInfo.value2.ToString();
            document.Tables[2].Columns[10].Cells[i].Range.Text = form.report[i].kredInfo.value3.ToString();
            document.Tables[2].Columns[11].Cells[i].Range.Text = form.report[i].kredInfo.value4.ToString();
            document.Tables[2].Columns[12].Cells[i].Range.Text = form.report[i].kredInfo.value5.ToString();
            document.Tables[2].Columns[13].Cells[i].Range.Text = form.report[i].value.ToString();
        }

刚检查了我的“保存到单词”方法的执行时间,执行需要大约12秒。 for循环需要约5秒,另一个~6-7秒会生成word文档。

答案

我尝试过this article的代码:

const int NumRows = 58;
const int NumCols = 13;
object objMiss = System.Reflection.Missing.Value;
objTab1 = objDoc.Tables.Add(objWordRng, NumRows, NumCols,
                        ref objMiss, ref objMiss); //add table object in word document
objTab1.Range.ParagraphFormat.SpaceAfter = 6;
int iRow, iCols;
string strText;

for (iRow = 1; iRow <= NumRows; iRow++)
    for (iCols = 1; iCols <= NumCols; iCols++)
       {
           strText = "row:" + iRow + "col:" + iCols;
           objTab1.Cell(iRow, iCols).Range.Text = strText; //add some text to cell
       }

它需要运行时4s在可见模式和2sobjApp.visible = false

您的代码较慢的原因可能是由于您正在解析每行中的对象引用链。

而不是写作

document.Tables[2].Columns[4].Cells[i].Range.Text = form.report[i].debInfo.value1.ToString();

尝试将常用的对象引用存储在辅助数组中。在此示例中,document.Tables[2].Columns[4]将针对每一行进行重新评估。您可以对其进行一次评估并将其存储在本地阵列中。 COM对象属性的评估涉及大量后台处理并且非常慢。

可能还有其他技巧来加速Word COM对象。在Excel中,关闭显示更新会产生巨大的差异。添加表格单元格时,应暂停Word布局渲染。但我不知道该怎么做。

另一答案

我发现以下更快一点,使用Range.ConvertToTable方法

Range r = doc.Paragraphs.Add().Range;

string s = string.Join("
", data.Select(a => string.Format("{0}	{1}	{2}	{3}	{4}	{5}	{6}",a.Item1,a.Item2,a.Item3,a.Item4,a.Item5,a.Item6,a.Item7)));

r.Text = s;

Table t = r.ConvertToTable(Separator: WdTableFieldSeparator.wdSeparateByTabs);

以上是关于在c#中填充word表的最快方法?的主要内容,如果未能解决你的问题,请参考以下文章

C ++在固定大小9的右填充空终止字符数组中找到第一个空格的最快方法

创建和填充数字表的最佳方法是啥?

将数据插入 Oracle 表的最快方法是啥?

在 python 中读取巨大 MySQL 表的最快方法

在 C# 中填充组合框的最快方法是啥? [关闭]

签入记录不存在的链接表的最快方法