通过 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.Document
和 missing
作为 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();
我创建了一个带有 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.Document
和 missing
作为 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();