查找PPT标题中的行数

时间:2015-10-25 19:48:47

标签: c# powerpoint openxml-sdk

我似乎无法在PowerPoint幻灯片标题中找到强制换行符的数量。

它不是任何类型的换行符,也不会被视为段落结尾。根据{{​​3}},它是一个垂直标签,CHR(11)。但这也不起作用(见下文)。

尝试获取角色没有结果。我在pptx文件中有这样的标题:

A

(A [输入] B)

.substring(0)返回A

.substring(1)返回B

我没有尝试.substring(0.5),但我接近那一点。

这是应该工作的,但它不会,它只返回1.

int rowCount = titleText.Length-titleText.Replace(((char)11).ToString(),"").Length+1;

我正在使用Office Open XML SDK 2.5。 谢谢!

编辑:

PowerPoint VBA中的类似代码运行良好。

EDIT2:

也许获取段落文本会破坏垂直标签?向循环中添加计数器会产生1个。

                foreach (var paragraph in shape.TextBody.Descendants<A.Paragraph>())
                {
                    foreach (var text in paragraph.Descendants<A.Text>())
                    {
                        shapeText += text.Text;
                    }
                }
                returnText.Append(analyzeTitleText(shapeText));

私有静态字符串analyzeTitleText(string titleText)

int rowCount = titleText.Length-titleText.Replace(((char)11).ToString(),"").Length+1;

等...

1 个答案:

答案 0 :(得分:1)

换行符存储为Break元素,因此您需要计算标题元素中的中断数。

我创建了一个标题为<a:p> <a:r> <a:rPr lang="en-GB" smtClean="0" /> <a:t>A</a:t> </a:r> <a:br> <a:rPr lang="en-GB" smtClean="0" /> </a:br> <a:r> <a:rPr lang="en-GB" smtClean="0" /> <a:t>b</a:t> </a:r> <a:br> <a:rPr lang="en-GB" smtClean="0" /> </a:br> <a:endParaRPr lang="en-GB" /> </a:p> 的示例幻灯片,并提取了XML。 slide1.xml文件的相关部分如下所示:

<a:br>

请注意IsTitleSlide元素 - 这些是新行。

调整显示如何获取标题元素的MSDN示例,以下内容将输出每张幻灯片标题中新行的数量(请注意using (PresentationDocument presentationDocument = PresentationDocument.Open(filepath, false)) { PresentationPart presentationPart = presentationDocument.PresentationPart; if (presentationPart != null && presentationPart.Presentation != null) { Presentation presentation = presentationPart.Presentation; if (presentation.SlideIdList != null) { foreach (var slideId in presentation.SlideIdList.Elements<SlideId>()) { SlidePart slidePart = presentationPart.GetPartById(slideId.RelationshipId) as SlidePart; var shapes = slidePart.Slide.Descendants<DocumentFormat.OpenXml.Presentation.Shape>().Where(IsTitleShape); int newLines = shapes.SelectMany(s => s.Descendants<DocumentFormat.OpenXml.Drawing.Break>()).Count(); Console.WriteLine("Slide {0} has {1} new lines", slidePart.Uri, newLines); } } } } 定义在MSDN文章,我没有在这里复制该代码,因为获得标题不是你的问题):

$Results = Invoke-Parallel -InputObject $servers -throttle 20 -runspaceTimeout 30 -ImportVariables -ScriptBlock {
    try 
    {
        $Output = Invoke-Command $_ -Credential $creds -Authentication "Negotiate" -ErrorAction Stop {hostname}
    } 
    catch 
    {
        $Output = $_
    }
    @($Output)
}

对于代码返回的上述示例幻灯片:

  

幻灯片/ppt/slides/slide1.xml有2个新行