C#-Microsoft Word自动化-使用相同的模板创建新页面

时间:2018-08-28 18:04:22

标签: c# ms-word

我有一个用于每个页面的特定模板。它实际上是两列表,其中有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 :(得分:0)

构件块提供了一种方便的方法来存储和重复使用Word文档中的“样板”。内容可以是“纯文本”,也可以包括格式以及Word支持的所有内容。与尝试使用代码重新创建内容或从外部文件导入内容相比,这通常更容易,更快捷。

构件块存储在模板(dotx或dotm)中。模板可以附加到文档(通常是从该模板创建文档时),也可以是“全局”的,例如Normal.dotm。

在这种情况下,Building Block存储在附加的模板中,并且可用于通过该模板创建的任何文档(但不适用于其他文档)。

构建基块可以组织为“类型”和“类别”,这意味着模板“容器”中可以有多个具有相同名称的构建基块。如果是这种情况,在寻址时必须指定Building Block的类型,类别和名称。如果名称在模板中是唯一的,则仅需要名称。

以下代码片段显示了两种可能性。在文档对象的末尾,将两个Building Block依次插入。

使用Insert方法插入Building Block。

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