代码之家  ›  专栏  ›  技术社区  ›  erosebe

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

  •  0
  • erosebe  · 技术社区  · 7 年前

    我很难让内容控件遵循多行格式。它似乎从字面上解释了我所给予的一切。我是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。结果看起来像

    <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 回复  |  直到 7 年前
        1
  •  0
  •   erosebe    7 年前

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

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

    它以相同的方式启动,并通过搜索其标记来获取内容控制。但是我得到了它的父元素,删除了其中的内容控制元素,并用一个段落元素替换它们。