平台:.NET 4.5,C#,Open XML 2.0 SDK
我正在尝试做什么:
从模板创建一组重复的幻灯片,创建'n'个新幻灯片(每个幻灯片复制模板幻灯片),每张幻灯片中包含一些特定文本。文本是多行,有些可能是粗体,因此必须不是作为单个文本插入,而是作为多个文本段落插入。
问题
我似乎正在做我需要做的所有事情,但是我遇到了一个损坏的文件错误。
到目前为止我成功完成的工作
我能够复制模板幻灯片,创建一组新幻灯片,并且我还能够将新文本插入占位符(通过简单替换)并保存。所以这些操作不是问题。问题是当我以编程方式创建新的段落元素时,设置属性并将节点插入textBody。
以下是我创建新幻灯片的方法的基本步骤
我们在创建新Slide,newSlide的方法中,下面的代码只是循环创建一组随机文本元素。
注意:'绘图'指的是
using Drawing = DocumentFormat.OpenXml.Drawing;
代码
for (int mxx = 0; mxx < 4; mxx++)
{
Drawing.RunProperties rp = new Drawing.RunProperties();
if (mxx % 2 == 0)
rp.Bold = true;
rp.Dirty = false;
Drawing.Text txt = new Drawing.Text();
txt.Text = "another line " + i;
Drawing.Run rn = new Drawing.Run();
Drawing.Paragraph pg = new Drawing.Paragraph();
rn.InsertAt(rp, 0);
rn.InsertAt(txt, 0);
pg.InsertAt(rn, 0);
if (bc > 2 && i > 2) //some conditions - ignore for now
{
DocumentFormat.OpenXml.Presentation.TextBody body = newSlidePart.Slide.Descendants<DocumentFormat.OpenXml.Presentation.TextBody>().ElementAt(1);
body.InsertAt(pg, 0);
}
}
鉴于我对openXML的了解不足(昨天开始!),我不清楚我还需要做什么。我通过提取存档进行逆向工程检查pptx,我可以看到以下主要区别但是腐败的原因是什么?
<p:txBody>
<a:bodyPr anchor="ctr" anchorCtr="1"/>
<a:lstStyle/>
<a:p>
<a:r>
<a:rPr lang="en-US" dirty="0" smtClean="0"/>
<a:t>topic</a:t>
</a:r>
<a:endParaRPr lang="en-US" dirty="0"/>
</a:p>
</p:txBody>
来自我损坏的powerpoint XML的<p:txBody>
<a:p>
<a:r>
<a:rPr lang="en-US" b="0" dirty="0" smtClean="0" />
<a:t>andother line 3</a:t>
</a:r>
</a:p>
<a:p>
<a:r>
<a:rPr lang="en-US" b="1" dirty="0" smtClean="0" />
<a:t>andother line 3</a:t>
</a:r>
</a:p>
<a:bodyPr anchor="ctr" anchorCtr="1" />
<a:lstStyle />
<a:p>
<a:r>
<a:rPr lang="en-US" dirty="0" smtClean="0" />
<a:t>2 topic line strategy venu 10:00 AM - 10:30 AM</a:t>
</a:r>
<a:endParaRPr lang="en-US" dirty="0" />
</a:p>
</p:txBody>
那有什么不同?如您所见,我的块中的a:bodyPtr和lstStyle出现在段落元素之间。这是问题 - 元素的顺序吗?或者我错过了其他什么?
很高兴知道是否有更简单,更正确的方法 - 例如如何在txtBody的当前p的末尾插入para(a:p)......
谢谢!