使用迭代在模板(word)上使用Aspose

时间:2018-01-18 13:54:36

标签: .net ms-word aspose

我正在尝试设置Word文档。在本文档中,我想复制我的问卷。因此,我需要迭代所有类别,然后是我的问题,然后是答案。如果有可能我不想在我的代码中配置所有内容(字体和大小等),因为我有一个模板。

我解决这个问题的方法是复制每个类别的模板头,并用类别名称替换一些文本。之后我会以同样的方式处理问题和答案(当然是具体的变量)

我的问题是我找不到标记模板头的方法,所以我可以复制它。另一个问题是我不知道如何替换复制的占位符,我想在其中设置我的类别名称。

如果有人可以帮助我,我会非常感激。

ps:在aspose论坛中就像每个链接一样,这很令人沮丧。

2 个答案:

答案 0 :(得分:0)

不是在模板中复制某些内容作为迭代的一部分,更好的方法是在模板中创建BuildingBlock并根据需要插入。您将BuildingBlock创建为最终用户,并将其保存在模板中。

在模板中写一些占位符文本,并将其标记为插入BuildingBlock的目标。

然后,您可以从模板创建新文档并使用该文档,以便模板不会更改:

 Dim wdDoc as Word.Document = WordApplication.Documents.Add stringTemplatePath
Dim BookmarkTarget as Word.Bookmark = wdDoc.Bookmarks(BookmarkName)

使用Insert方法插入BuildingBlock:

WordApplication.Templates( pathToTemplateFile) _
    .BuildingBlockEntries(stringBuidlingBlockName).Insert(Where:=BookmarkTarget.Range, RichText:=True)

为了在BuildingBlock中标记要为数据输入定位的内容,您有两个选择:Bookmark或ContentControl。两者都适用于要求“替换复制的占位符,我想要设置我的类别名称”。在所有条件相同的情况下,我通常会在使用Interop时为此选择书签。当您向其写入文本时,它将自动删除。例如:

 wdDoc.Bookmarks(Bookmark2Name).Range.Text = stringCategoryInfo

答案 1 :(得分:0)

我已经在你的帮助下解决了这个问题。我不会发布文件,因为主要是用德语写的。 我使用了模板doc和输出文档。在我的模板Doc中声明了书签,以定义我要复制的部分。从模板文档中获取我需要的书签并将其复制到输出文档中。

要复制我在下面的代码中使用的书签:

private void AppendBookmarkedText(NodeImporter importer, Bookmark srcBookmark, CompositeNode dstNode)

{

// This is the paragraph that contains the beginning of the bookmark.

Paragraph startPara = srcBookmark.BookmarkStart.ParentNode as Paragraph;

// This is the paragraph that contains the end of the bookmark.

Paragraph endPara = srcBookmark.BookmarkEnd.ParentNode as Paragraph;

if ((startPara == null) || (endPara == null))

throw new InvalidOperationException("Parent of the bookmark start or end is not a paragraph, cannot handle this scenario yet.");

// Limit ourselves to a reasonably simple scenario.

if (startPara.ParentNode != endPara.ParentNode)

throw new InvalidOperationException("Start and end paragraphs have different parents, cannot handle this scenario yet.");

// We want to copy all paragraphs from the start paragraph up to (and including) the end paragraph,

// therefore the node at which we stop is one after the end paragraph.

Node endNode = endPara.NextSibling;

// This is the loop to go through all paragraph-level nodes in the bookmark.

for (Node curNode = startPara; curNode != endNode; curNode = curNode.NextSibling)

{

// This creates a copy of the current node and imports it (makes it valid) in the context

// of the destination document. Importing means adjusting styles and list identifiers correctly.

Node newNode = importer.ImportNode(curNode, true);

// Now we simply append the new node to the destination.

dstNode.AppendChild(newNode);

}

是的,它只是从这个aspose网站复制而来:https://www.aspose.com/community/forums/post/65476.aspx?Ajax_CallBack=true

在我能够从模板doc中复制内容并在输出文档中将其过去后,很容易使用它。 我在每个循环中只做了这几行:

            CompositeNode dstNode = myOutDoc.LastSection.Body;
            Bookmark mySpecialBookmark= myTemplate.Range.Bookmarks["mySpecialBookmark"]; 

            mySpecialBookmark.Text = mySpecialBookmark.Text.Replace("<myChangingWord>", myObj.newWord);
            AppendBookmarkedText(importer, mySpecialBookmark, dstNode);
            mySpecialBookmark.Text = mySpecialBookmark.Text.Replace(myObj.newWord, "<myChangingWord>");

为了解释我曾经在'&lt;&gt;'中设置我的替换文字在我的文件中澄清哪些文本用于占位不是什么。

非常感谢你的帮助:) (我希望你能理解我写下的内容,我知道我的英语最差)