5

Web サイトから PowerPoint プレゼンテーションにエクスポートする必要があるデータが多数あり、このタスクを実行するために Open XML SDK 2.0 を使用しています。Open XML SDK 2.0 Productivity Tool を使用してエクスポートを再作成するために使用できるテンプレート コードを生成する PowerPoint プレゼンテーションがあります。

それらのスライドの 1 つにテーブルがあり、そのテーブルにデータを追加し、テーブルがスライドの下部を超える場合は、そのテーブルを複数のスライドに分割する必要があります。私が取ったアプローチは、テーブルの高さを決定し、それがスライドの高さを超えている場合は、その新しいコンテンツを次のスライドに移動することです. PowerPoint スライドへの繰り返しデータの追加に関するBryan と Jonesのブログを読みましたが、私のシナリオは少し異なります。次のコードを使用します。

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 を使用しているときに、コンテンツを別のスライドに分割するタイミングを判断する他の方法はありますか? この件に関するドキュメントはあまりないので、誰かが取ったかもしれないより良いアプローチについての提案を受け入れます。

4

1 に答える 1

2

これは本当に素晴らしい質問です。できることの 1 つは、フォントの高さと幅を測定しSystem.Drawing.Text、コードで一種のプリレンダラーを作成して、テキストによって表が画面からはみ出すかどうかを判断することです。フォントがどの幅で折り返されて新しい行が作成され、次に行とセルの余白の間にスペースが作成されるかなど、追跡する必要があるビットがあります。フォントとそのサイズ、プラグインされたテキストで含めることができる行の総数によってテーブルの高さを追跡し、それでもスライドキャンバスの境界内にとどまるのは、現在の合計です。しかし、これらがすべて揃っていれば、新しいスライドが必要かどうかについて非常に優れた洞察が得られるはずです。

これは、.NET でレンダリングされたテキストを測定する方法を学ぶための良い記事です: http://www.devsource.com/c/a/Languages/Text-Metrics-in-the-Net-Framework-Part-I/

于 2010-07-04T23:31:52.130 に答える