我正在学习 OpenXML。我花了好几个小时试图找到如何完成一项简单的任务:将文本插入到 C# 中的内容控件中。
我有一个包含两个控件“姓名”和“年龄”的模板文档。我可以很好地找到它们,但我就是无法在其中添加文本。我尝试了很多方法,但都无济于事。
byte[] templateBytes = System.IO.File.ReadAllBytes(fileName);
using (MemoryStream templateStream = new MemoryStream())
{
templateStream.Write(templateBytes, 0, (int)templateBytes.Length);
using (WordprocessingDocument outDoc = WordprocessingDocument.Open(templateStream, true))
{
MainDocumentPart mainPart = outDoc.MainDocumentPart;
foreach (SdtElement sdt in mainPart.Document.Descendants<SdtElement>().ToList())
{
SdtAlias alias = sdt.Descendants<SdtAlias>().FirstOrDefault();
if (alias != null)
{
string sdtTitle = alias.Val.Value;
switch (sdtTitle)
{
case "Name":
// ¿Qué?
break;
case "Age":
// ¿Qué?
break;
}
}
}
outDoc.ChangeDocumentType(DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
}
using (FileStream fileStream = new FileStream(savePath, System.IO.FileMode.CreateNew))
{
templateStream.WriteTo(fileStream);
}
}
非常感谢所有帮助。
干杯,
蒂姆。
编辑——
感谢您的回复。听取您的建议,我尝试使用生产力工具进行转换和深入研究,以找到要更新的子元素。您能告诉我您是否明白为什么这段代码没有向文档写入任何内容吗?
foreach (SdtElement sdt in mainPart.Document.Descendants<SdtElement>().ToList())
{
SdtAlias alias = sdt.Descendants<SdtAlias>().FirstOrDefault();
if (alias != null)
{
SdtRun xRun = (SdtRun)sdt;
SdtContentRun xContentRun = xRun.Descendants<SdtContentRun>().FirstOrDefault();
Run xRun = xContentRun.Descendants<Run>().FirstOrDefault();
Text xText = xRun.Descendants<Text>().FirstOrDefault();
string sdtTitle = alias.Val.Value;
switch (sdtTitle)
{
case "Name":
xText.Text = "Whatever";
break;
case "Age":
xText.Text = "69";
break;
}
}
}
最佳答案
您需要将 SdtElement 强制转换为任何内容,以便获取其内容子元素。
例如,如果它是一个 SdtBlock:
((SdtBlock)sdt).SdtContentBlock
然后你可以添加东西(例如添加 child )。
From MSDN , 继承层次:
DocumentFormat.OpenXml.Wordprocessing.SdtElement
DocumentFormat.OpenXml.Wordprocessing.SdtBlock
DocumentFormat.OpenXml.Wordprocessing.SdtCell
DocumentFormat.OpenXml.Wordprocessing.SdtRow
DocumentFormat.OpenXml.Wordprocessing.SdtRun
DocumentFormat.OpenXml.Wordprocessing.SdtRunRuby
关于c# - OpenXML 将文本插入内容控件 Word 2007,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3810014/