Заполнить существующую таблицу в Microsoft Word динамически через C # - PullRequest
0 голосов
/ 25 июня 2019

Я создал шаблон Word с таблицей, которую я хотел бы заполнить динамически.Количество строк всегда динамическое и всегда различное.

Как я могу заполнить и расширить существующую таблицу?Я уже начал реализовывать код.Я могу создавать новые таблицы и заполнять их, но не существующие.

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

1 Ответ

1 голос
/ 25 июня 2019

Самый эффективный способ создания и расширения таблиц в Word - это «сбросить» содержимое в текстовом формате с разделителями, а затем преобразовать его в таблицу. Делать что-либо еще - например, создавать таблицу, затем записывать ячейку за ячейкой или добавлять строку за строкой - сравнительно медленно. И чем длиннее стол, тем медленнее он становится! Это связано с тем, что Word динамически размещает страницы при каждом изменении.

Если вы хотите начать со строки заголовка, уже существующей в документе, или вам необходимо расширить существующую таблицу, вставьте содержимое с разделителями непосредственно под существующей таблицей и преобразуйте в таблицу. В тестах столбцы таблицы не всегда точно совмещаются с использованием этого метода. В качестве обходного пути таблицу можно вставить в другое место, а затем переместить в существующую таблицу, где она должна адаптировать правильную ширину столбцов.

Выборка данных с разделителем полей с запятой и разделителем записей char (13). Обратите внимание, что в качестве разделителя полей может использоваться любой символ, но в качестве разделителя записей требуется ANSI 13:

Test; один; 3; Конец

Новая строка; Два; 4; Конец

Вставьте и создайте новую таблицу в закладке с именем Tbl. Предполагается, что doc в качестве Word.Document и missing в качестве объекта уже определены и созданы:

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

Добавить к существующей таблице (первой в документе):

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