通过 C# 在 Microsoft Word 中动态填充现有 table

Fill existing table in Microsoft Word dynamically via C#

我创建了一个带有 table 的 Word 模板,我想动态填充它。 行数始终是动态的并且总是不同的。

如何填充和扩展现有的 table?我已经开始实现代码了。 我可以创建新的 table 并填充它们,但不能创建现有的。

object oMissing = Missing.Value;

Word._Application word = new Word.Application();
word.Visible = true;

// Template
object oTemplate = "C:\Temp\Template.dotx";
Word._Document document = word.Documents.Add(ref oTemplate, ref oMissing, ref oMissing, ref oMissing);

// Insert table and fill with data
Word.Table oTable;

int columnCount = 4;
int rowCount = someVariableCount;

// Table Bookmark
object oBookMark = "Table";

Word.Range wrdRng = document.Bookmarks.get_Item(oBookMark).Range;
oTable = document.Tables.Add(wrdRng, someVariableCount, columnCount, ref oMissing, true);

在 Word 中创建和扩展 table 的最有效方法是 "dump" 分隔文本格式的内容,然后将其转换为 table。做任何其他事情——比如创建一个 table,然后写 cell-by-cell 或附加 row-by-row——都比较慢。 table 越长,速度越慢!这是由于 Word 会根据每次更改动态布置页面。

如果您想从文档中已有的 header 行开始,或者需要扩展现有的 table,则将分隔内容直接插入现有的 table 下方,并且转换为 table。在测试中,table 列并不总是使用此方法完全对齐。作为 work-around,table 可以插入别处,然后移动到现有的 table,它应该在其中调整正确的列宽。

带有 semi-colon 字段分隔符和 char(13) 记录分隔符的示例数据。请注意,任何字符都可以用作字段分隔符,但需要 ANSI 13 作为记录分隔符:

Test;One;3;End

New line;Two;4;End

在名为 Tbl 的书签处插入并创建一个新的 table。假设 doc 作为 Word.Documentmissing 作为 object 已经被定义和实例化:

        string tableData = "Test;One;3;End\nNew line;Two;4;End";
        string bkmName = "TableTarget";
        if (doc.Bookmarks.Exists(bkmName))
        {
            Word.Range rngTable = doc.Bookmarks[bkmName].Range;
            rngTable.Text = tableData;
            Word.Table tbl = rngTable.ConvertToTable(";", missing, missing, missing, missing,
                missing, missing, missing, missing, missing, missing, missing, missing, missing,
                missing, Word.WdDefaultTableBehavior.wdWord8TableBehavior);
        }

附加到现有 table(文档中的第一个):

        string tableData = "Test;One;3;End\nNew line;Two;4;End";
        //Target table, to be extended
        Word.Table tbl = doc.Tables[1];
        Word.Range rngTbl = tbl.Range;
        rngTbl.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
        //Target for inserting the data (end of the document)
        Word.Range rng = doc.Content;
        rng.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
        rng.Text = tableData;
        Word.Table tblExtend = rng.ConvertToTable(";", missing, missing, missing, missing,
                missing, missing, missing, missing, missing, missing, missing, missing, missing,
                missing, Word.WdDefaultTableBehavior.wdWord8TableBehavior);
        //Move the new table content to the end of the target table
        tblExtend.Range.Cut();
        rngTbl.PasteAppendTable();