C # - Microsoft Word Automation - Создать новую страницу, используя тот же шаблон - PullRequest
0 голосов
/ 28 августа 2018

У меня есть определенный шаблон, который я использую для каждой страницы. По сути, это два столбца таблиц с 1 столбцом и 1 строкой. Почему все это не один стол, я не знаю, но я застрял с ним. Похоже на следующее. Опять же, каждая ячейка на самом деле является своей собственной таблицей. Так что на странице 40 таблиц. Они будут использоваться в качестве ярлыков в связующем. Обратите внимание, что таблица слева дублируется справа. Это потому, что они складываются и будут использоваться как один.

enter image description here

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

Мой код выглядит следующим образом:

Word.Application app = new Word.Application();
        var doc = app.Documents.Add(@"C:\.....LabelTemplate.dotx");
        object missing = System.Type.Missing;
        object pageBreak = Word.WdBreakType.wdPageBreak;
        Word.Selection selection = app.Selection;

        string path = Path.Combine(destination, "labels.docx");
        int page = 1;
        foreach (var batch in batches)
        {

            for (int i = 1; i <= batch.Count(); i++)
            {

                Word.Table table = doc.Tables[i];

                table.Range.Font.Size = 7;
                table.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
                table.Range.Font.Bold = 1;

                int x = i - 1;
                string text = batch[x].WellName + "\v" + batch[x].Field + "\v" + batch[x].Reservior;
                //int cellNum = i + 1;
                table.Cell(1, 1).Range.Text = text;

                Word.Table table2 = doc.Tables[i + 20];

                table2.Range.Font.Size = 7;
                table2.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
                table2.Range.Font.Bold = 1;

                table2.Cell(1, 1).Range.Text = text;

                if (i % 20 == 0)
                {
                    selection.EndKey(Word.WdUnits.wdStory, Word.WdMovementType.wdMove);
                    selection.InsertBreak(ref pageBreak);

                }

            }
            page++;

        }

        doc.SaveAs(path);
        doc.Close();
        app.Quit();

1 Ответ

0 голосов
/ 28 августа 2018

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

Строительные блоки хранятся в шаблонах (dotx или dotm). Шаблон может быть присоединен к документу (обычно, когда документ создается из этого шаблона) или он может быть «глобальным», например Normal.dotm.

В этом случае Building Block сохраняется в прикрепленном шаблоне и будет доступен для любого документа, созданного из этого шаблона (но не для других документов).

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

Следующий фрагмент кода показывает обе возможности. Два строительных блока вставляются один за другим в конце объекта Document.

Строительный блок вставляется методом Insert.

Word.Range rng = doc.Content;
rng.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
Word.Template objTmpl = (Word.Template) doc.get_AttachedTemplate(); // NormalTemplate
Word.BuildingBlock objBB = objTmpl.BuildingBlockEntries.Item("TestCCwithActiveX");
objBB.Insert(rng, true);
rng = doc.Content;
rng.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
Word.BuildingBlock objBB2 = objTmpl.BuildingBlockTypes.Item(Word.WdBuildingBlockTypes.wdTypeAutoText).Categories.Item("Test").BuildingBlocks.Item("test heading");
objBB2.Insert(rng, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...