当内容使用Open XML SDK 2.0从当前幻灯片流出时,如何将表拆分为新的PowerPoint幻灯片

时间:2010-04-14 14:13:48

标签: openxml openxml-sdk presentationml

我有一堆数据需要从网站导出到PowerPoint演示文稿,并且一直使用Open XML SDK 2.0来执行此任务。我有一个PowerPoint演示文稿,我通过Open XML SDK 2.0 Productivity Tool生成模板代码,我可以用它来重新创建导出。

在其中一张幻灯片上,我有一张表,要求是向该表添加数据,如果表格超出幻灯片的底部,则会在多张幻灯片中拆分该表格。我采取的方法是确定表格的高度,如果它超过幻灯片的高度,将新内容移动到下一张幻灯片中。我已阅读Bryan and Jones博客关于向PowerPoint幻灯片添加重复数据,但我的情况略有不同。他们使用以下代码:

A.Table tbl = current.Slide.Descendants<A.Table>().First();
A.TableRow tr = new A.TableRow();
tr.Height = heightInEmu;
tr.Append(CreateDrawingCell(imageRel + imageRelId));
tr.Append(CreateTextCell(category));
tr.Append(CreateTextCell(subcategory));
tr.Append(CreateTextCell(model));
tr.Append(CreateTextCell(price.ToString()));
tbl.Append(tr);
imageRelId++;

这对我不起作用,因为他们知道设置表格行的高度,因为它将是图像的高度,但是当添加不同数量的文本时,我不知道提前的高度所以我只需将tr.Height设置为默认值即可。这是我在桌子高度计算的尝试:

   A.Table tbl = tableSlide.Slide.Descendants<A.Table>().First();
   A.TableRow tr = new A.TableRow();
   tr.Height = 370840L;
   tr.Append(PowerPointUtilities.CreateTextCell("This");
   tr.Append(PowerPointUtilities.CreateTextCell("is"));
   tr.Append(PowerPointUtilities.CreateTextCell("a"));
   tr.Append(PowerPointUtilities.CreateTextCell("test"));
   tr.Append(PowerPointUtilities.CreateTextCell("Test"));
   tbl.Append(tr);
   tableSlide.Slide.Save();

   long tableHeight = PowerPointUtilities.TableHeight(tbl);

以下是辅助方法:

public static A.TableCell CreateTextCell(string text)
{
    A.TableCell tableCell = new A.TableCell(
                            new A.TextBody(new A.BodyProperties(),
                            new A.Paragraph(new A.Run(new A.Text(text)))),
                            new A.TableCellProperties());
    return tableCell;
}

public static Int64Value TableHeight(A.Table table)
{
    long height = 0;

    foreach (var row in table.Descendants<A.TableRow>()
                             .Where(h => h.Height.HasValue))
    {
        height += row.Height.Value;
    }

    return height;
}

这会正确地将新表格行添加到现有表格中,但是当我尝试获取表格的高度时,它会返回原始高度而不是新高度。新高度表示我最初设置的默认高度,而不是插入大量文本后的高度。看来高度只有在PowerPoint中打开时才会重新调整。

我也尝试访问行中最大的表格单元格的高度,但似乎无法找到执行该任务的正确属性。

我的问题是你如何确定动态添加的表行的高度,因为它似乎不会更新行的高度,直到它在PowerPoint中打开?在使用Open XML SDK 2.0时,还有其他方法可以确定何时将内容拆分到另一张幻灯片?我对有人可能采取的更好的方法提出任何建议,因为没有太多关于这个问题的文件。

1 个答案:

答案 0 :(得分:2)

这是一个非常好的问题。您可以做的一件事是在System.Drawing.Text中测量字体的高度和宽度,并在代码中创建一种预渲染器,以确定文本是否会导致表格在屏幕外流动。有一点需要跟踪,比如字体将以什么宽度换行并创建一个新行,然后在行和单元格边缘之间留出空格。通过它可以包含的字体总数以及它的大小和插入的文本来跟踪表高度将是一个运行总计 - 并且仍然保持在幻灯片画布的范围内。但是,一旦掌握了所有这些,它就能让您非常了解是否需要新的幻灯片。

这是一篇很好的文章,可以学习如何在.NET中测量渲染文本:http://www.devsource.com/c/a/Languages/Text-Metrics-in-the-Net-Framework-Part-I/