我很难让内容控件遵循多行格式。它似乎解释了我从字面上给出的所有东西。我是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时。
我觉得我必须非常接近得到我需要的东西,但是我的摆弄让我无处可去。有什么想法吗?谢谢。
答案 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元素,只需用段落元素替换它们。
这不是我想象的那样,但它似乎符合我的需要。