【问题标题】:How to split table to new PowerPoint slide when content flows off current slide using Open XML SDK 2.0如何使用 Open XML SDK 2.0 在内容流出当前幻灯片时将表格拆分为新的 PowerPoint 幻灯片
【发布时间】:2010-04-14 14:13:48
【问题描述】:

我有一堆数据需要从网站导出到 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 时确定何时将内容拆分到另一张幻灯片的任何其他方法?由于没有太多关于此主题的文档,因此我愿意接受有关某人可能采取的更好方法的任何建议。

【问题讨论】:

  • 是的,我的意思是这是我要走的路,但没有任何运气。寻找更多带有代码的工作示例。
  • @Otaku:我从来没有找到解决这个问题的方法,因为时间是我项目的一个问题,我们决定让数据从幻灯片中流出,让最终用户重新格式化数据。跨度>

标签: openxml openxml-sdk presentationml


【解决方案1】:

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

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

【讨论】:

  • 我认为您还需要跟踪幻灯片上表格的初始位置作为起始高度。我尝试执行此任务,但无法获得一致的结果,因为在 ppt 呈现它之前,表格的高度似乎没有改变。您可以发布任何代码以查看我是否遗漏了什么?
  • @amurra:不幸的是,我没有任何示例代码 - 我认为这将是解决问题的大量工作和代码,但这是我处理它的方式。 Open XML SDK 的主要问题是它不提供任何渲染信息 - 我想如果您尝试从 VBA 或 VSTO 执行此任务,您只需查看幻灯片画布就可以更快地开发解决方案高度并比较桌面+高度以查看它是否离开页面,如果是,则删除最后一行并使用它开始下一张幻灯片。
  • @amurra:我偶然发现了一篇关于在 .NET 中测量文本的好文章,这对上述建议很有帮助。上面的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多