我正在学习OpenXML。我已经找了几个小时,试图找到如何完成一个简单的任务:在c#的content控件中插入文本。
我有一个带有两个控件"Name“和”Age“的模板文档。我可以很好地找到它们,但我就是不能在其中添加文本。我试过很多方法,但都没有用。
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;
}
}
}发布于 2013-04-10 01:08:15
任何想要VB格式的代码直接查找/替换键/值字典数组的人...
Using document As WordprocessingDocument = WordprocessingDocument.Open(cls_sNewFilename, True)
Dim mainPart As MainDocumentPart = document.MainDocumentPart
Dim body As Body = mainPart.Document.Body
'if custom xml content exists, delete it first
mainPart.DeleteParts(Of CustomXmlPart)(mainPart.CustomXmlParts)
For Each sdt As SdtElement In body.Descendants(Of SdtElement)().ToList()
Dim [alias] As SdtAlias = sdt.Descendants(Of SdtAlias)().FirstOrDefault()
If [alias] IsNot Nothing Then
If sdt.ToString() = "DocumentFormat.OpenXml.Wordprocessing.SdtRun" Then
Dim xStdRun As SdtRun = DirectCast(sdt, SdtRun)
Dim xStdContentRun As SdtContentRun = xStdRun.Descendants(Of SdtContentRun)().FirstOrDefault()
Dim xRun As Run = xStdContentRun.Descendants(Of Run)().FirstOrDefault()
Dim xText As Text = xRun.Descendants(Of Text)().FirstOrDefault()
Dim sdtTitle As String = [alias].Val.Value
xText.Text = dictReplacements.Item(sdtTitle)
ElseIf sdt.ToString() = "DocumentFormat.OpenXml.Wordprocessing.SdtBlock" Then
Dim xStdBlock As SdtBlock = DirectCast(sdt, SdtBlock)
Dim xStdContentBlock As SdtContentBlock = xStdBlock.Descendants(Of SdtContentBlock)().FirstOrDefault()
Dim xRun As Run = xStdContentBlock.Descendants(Of Run)().FirstOrDefault()
Dim xText As Text = xStdContentBlock.Descendants(Of Text)().FirstOrDefault()
Dim sdtTitle As String = [alias].Val.Value
xText.Text = dictReplacements.Item(sdtTitle)
End If
End If
Next
mainPart.Document.Save()
document.Close()
End Using由于某种原因,最后的部分似乎是sdtBlock而不是sdtRun,因此出现了ElseIf!
https://stackoverflow.com/questions/3810014
复制相似问题