使用OpenXML将多行文本插入到富文本内容控件中

时间:2017-09-21 22:41:23

标签: openxml multiline contentcontrol

我很难让内容控件遵循多行格式。它似乎解释了我从字面上给出的所有东西。我是OpenXML的新手,我觉得我必须遗漏一些简单的东西。

我正在使用此功能转换我的多行字符串。

    private static void parseTextForOpenXML(Run run, string text)
    {
        string[] newLineArray = { Environment.NewLine, "<br/>", "<br />", "\r\n" };
        string[] textArray = text.Split(newLineArray, StringSplitOptions.None);

        bool first = true;

        foreach (string line in textArray)
        {
            if (!first)
            {
                run.Append(new Break());
            }

            first = false;

            Text txt = new Text { Text = line };
            run.Append(txt);
        }
    }

我用这个

将它插入到控件中
    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;
    }

我称之为......

doc.InsertText("Primary", primaryRun.InnerText);

虽然我也尝试过InnerXML和OuterXML。结果看起来像

示例AttnExample CompanyExample AddressNew York,NY 12345或

<w:r xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:t>Example Attn</w:t><w:br /><w:t>Example Company</w:t><w:br /><w:t>Example Address</w:t><w:br /><w:t>New York, NY 12345</w:t></w:r>

该方法适用于简单的文本插入。只是当我需要它来解释它对我不起作用的XML时。

我觉得我必须非常接近得到我需要的东西,但是我的摆弄让我无处可去。有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:0)

我相信我试图这样做的方式注定要失败。设置元素的Text属性总是被解释为要显示的文本。我最终不得不采取略微不同的方式。我创建了一个新的插入方法。

    public static WordprocessingDocument InsertText(this WordprocessingDocument doc, string contentControlTag, Paragraph paragraph)
    {
        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.");

        OpenXmlElement cc = element.Descendants<Text>().First().Parent;
        cc.RemoveAllChildren();
        cc.Append(paragraph);

        return doc;
    }

它启动相同,并通过搜索它的标签获取内容控制。但后来我得到它的父级,删除那里的Content Control元素,只需用段落元素替换它们。

这不是我想象的那样,但它似乎符合我的需要。