查找PPT标题中的行数

Find number of lines in PPT titles

我似乎找不到 PowerPoint 幻灯片标题中的强制换行数。

它不是任何类型的换行符,也不被视为段落结尾。根据this,是一个垂直制表符,CHR(11)。但这也不起作用(见下文)。

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

一个

B

(A[enter]B)

.substring(0) returns A

.substring(1) returns B

我还没有尝试过 .substring(0.5),但我已经接近那个点了。

这是应该起作用的,但它不起作用,它只是 returns 1.

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

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

编辑:

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

编辑 2:

也许获取段落文本会破坏垂直制表符?将计数器添加到循环中每个都得到 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));

private static string analyzeTitleText(string titleText)

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

等...

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

我创建了一个标题为 A[enter]b[enter] 的示例幻灯片并提取了 XML。 slide1.xml 文件的相关部分如下所示:

<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>

注意 <a:br> 元素 - 这些是新行。

改编 MSDN 中显示如何获取标题元素的示例,以下内容将输出每张幻灯片标题中的新行数(请注意 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);
            }
        }
    }
}

对于上面的示例幻灯片,代码 returns:

Slide /ppt/slides/slide1.xml has 2 new lines