如何使用Open XML SDK将文本插入Content控件 [英] How to insert text into a content control with the Open XML SDK

查看:0
本文介绍了如何使用Open XML SDK将文本插入Content控件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试开发一种解决方案,它从ASP.NET网页获取输入,并将输入值嵌入到MS Word文档中的相应内容控件中。MS Word文档还包含一些要嵌入页眉和页脚字段中的动态数据。

这里的想法是解决方案应该是基于Web的。为此,我可以使用OpenXML或您建议的任何其他方法吗?

预先非常感谢您提供的所有宝贵意见。我真的很感激他们。

推荐答案

我有一个来自我的项目的小代码示例,用于在您在Word文档中创建的内容控件中插入几个单词:

public static WordprocessingDocument InsertText(this WordprocessingDocument doc, string contentControlTag, string text)
{
    SdtElement element = doc.MainDocumentPart.Document.Body.Descendants<SdtElement>()
      .FirstOrDefault(sdt => sdt.SdtProperties.GetFirstChild<Tag>()?.Val == contentControlTag);

    if (element == null)
      throw new ArgumentException($"ContentControlTag "{contentControlTag}" doesn't exist.");

    element.Descendants<Text>().First().Text = text;
    element.Descendants<Text>().Skip(1).ToList().ForEach(t => t.Remove());

    return doc;
}
它只是在文档中查找具有特定Tag的第一个Content控件(您可以通过在Word中启用设计器模式并右键单击Content控件来设置),并用传递到该方法的文本替换当前文本。在此之后,文档仍将包含内容控件,当然,这可能不是我们所希望的。因此,当我完成对文档的编辑时,我运行以下方法来删除Content控件:

internal static WordprocessingDocument RemoveSdtBlocks(this WordprocessingDocument doc, IEnumerable<string> contentBlocks)
{
    List<SdtElement> SdtBlocks = doc.MainDocumentPart.Document.Descendants<SdtElement>().ToList();

    if (contentBlocks == null)
        return doc;

    foreach(var s in contentBlocks)
    {
        SdtElement currentElement = SdtBlocks.FirstOrDefault(sdt => sdt.SdtProperties.GetFirstChild<Tag>()?.Val == s);
        if (currentElement == null)
            continue;
        IEnumerable<OpenXmlElement> elements = null;

        if (currentElement is SdtBlock)
            elements = (currentElement as SdtBlock).SdtContentBlock.Elements();
        else if (currentElement is SdtCell)
            elements = (currentElement as SdtCell).SdtContentCell.Elements();
        else if (currentElement is SdtRun)
            elements = (currentElement as SdtRun).SdtContentRun.Elements();

        foreach (var el in elements)
            currentElement.InsertBeforeSelf(el.CloneNode(true));
        currentElement.Remove();
    }
    return doc;
}

若要从模板打开WordProcessingDocument并对其进行编辑,有大量联机信息可用。

编辑:

在内存流中使用文档时打开/保存文档的很少的示例代码,当然,您应该使用一个额外的存储库类来管理实际代码中的文档:

byte[] byteArray = File.ReadAllBytes(@"C:...Template.dotx");

using (var stream = new MemoryStream())
{
    stream.Write(byteArray, 0, byteArray.Length);

    using (WordprocessingDocument doc = WordprocessingDocument.Open(stream, true))
    {
       //Needed because I'm working with template dotx file, 
       //remove this if the template is a normal docx. 
        doc.ChangeDocumentType(DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
        doc.InsertText("contentControlName","testtesttesttest");
    }
    using (FileStream fs = new FileStream(@"C:...
ewFile.docx", FileMode.Create))
    {
       stream.WriteTo(fs);
    }
}

这篇关于如何使用Open XML SDK将文本插入Content控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆