查找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
我似乎找不到 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