Agent Skills by ALSEL
Anthropic Claudeソフトウェア開発⭐ リポ 0品質スコア 55/100

aspose-slides

Aspose.Slides.NETライブラリとモダンなC#パターンを使用してMicrosoft PowerPointプレゼンテーションを操作する包括的なスキル

description の原文を見る

Comprehensive skill for manipulating Microsoft PowerPoint presentations using Aspose.Slides.NET library with modern C# patterns

SKILL.md 本文

Aspose.Slides for .NET - PowerPoint 操作スキル

概要

このスキルは Claude Code が Aspose.Slides.NET ライブラリを使用して Microsoft PowerPoint プレゼンテーションを効果的に操作できるようにします。Microsoft PowerPoint のインストールを必要とせず、プレゼンテーションをプログラムで操作するための包括的なガイダンスを提供します。

コア機能

プレゼンテーション構造

  • プレゼンテーションの作成: ゼロから、またはテンプレートから新規作成
  • プレゼンテーションの読み込み: PPT、PPTX、ODP などの形式に対応
  • プレゼンテーションの保存: 複数形式対応(PPTX、PDF、HTML、画像)
  • スライド管理: スライドの追加、削除、複製、並び替え
  • マスタースライドとレイアウト: スライドマスターの操作とレイアウトの適用

コンテンツ操作

  • テキスト処理: TextFrame、Paragraph、Portion による書式設定
  • 図形: AutoShape、カスタム図形、グループ化、配置
  • テーブル: テーブルの作成、書式設定、データ入力
  • グラフ: 様々なグラフタイプの作成とカスタマイズ
  • 画像: 画像と SVG の追加、置き換え、抽出
  • メディア: オーディオ/ビデオの埋め込みと設定

書式設定とスタイリング

  • テキスト書式設定: フォント、色、配置、間隔
  • 図形の書式設定: 塗りつぶし、線、効果、3D プロパティ
  • テーマとカラースキーム: テーマの適用とカスタマイズ
  • 背景: 単色、グラデーション、パターン、画像

高度な機能

  • アニメーション: タイムライン、エフェクト、トリガー
  • トランジション: スライドトランジションとタイミング
  • コメント: プレゼンテーションコメントの追加と管理
  • プロパティ: 文書プロパティ(組み込み、カスタム)
  • SmartArt: SmartArt グラフィックスの操作
  • VBA マクロ: VBA コードへのアクセスと操作

オブジェクトモデルの理解

コア階層

Presentation (IPresentation)
├── Slides (ISlideCollection)
│   ├── Slide (ISlide)
│   │   ├── Shapes (IShapeCollection)
│   │   │   ├── AutoShape (IAutoShape)
│   │   │   ├── Table (ITable)
│   │   │   ├── Chart (IChart)
│   │   │   ├── PictureFrame (IPictureFrame)
│   │   │   └── GroupShape (IGroupShape)
│   │   ├── Background (IBackground)
│   │   └── SlideShowTransition
│   └── NotesSlide (INotesSlide)
├── Masters (IMasterSlideCollection)
│   └── MasterSlide (IMasterSlide)
├── Layouts (ILayoutSlideCollection)
│   └── LayoutSlide (ILayoutSlide)
└── DocumentProperties (IDocumentProperties)

テキスト階層

TextFrame (ITextFrame)
├── Paragraphs (IParagraphCollection)
│   └── Paragraph (IParagraph)
│       ├── Portions (IPortionCollection)
│       │   └── Portion (IPortion)
│       │       └── PortionFormat (IPortionFormat)
│       └── ParagraphFormat (IParagraphFormat)
└── TextFrameFormat (ITextFrameFormat)

モダン C# パターン

リソース管理

using ステートメントを使用して適切にリソースを解放します:

using Aspose.Slides;

// 単一のプレゼンテーション
using var presentation = new Presentation("input.pptx");
// プレゼンテーションを操作
presentation.Save("output.pptx", SaveFormat.Pptx);

// 複数のリソース
using var sourcePresentation = new Presentation("source.pptx");
using var targetPresentation = new Presentation();
// プレゼンテーションを統合

関数型コレクション処理

LINQ と関数型パターンを活用します:

// 型別に図形を検索
var textShapes = slide.Shapes
    .OfType<IAutoShape>()
    .Where(s => s.TextFrame != null)
    .ToList();

// すべてのテキスト部分を処理
var allText = slide.Shapes
    .OfType<IAutoShape>()
    .Where(s => s.TextFrame != null)
    .SelectMany(s => s.TextFrame.Paragraphs)
    .SelectMany(p => p.Portions)
    .Select(p => p.Text);

// テキストを宣言的に更新
slide.Shapes
    .OfType<IAutoShape>()
    .Where(s => s.Name == "Title")
    .Select(s => s.TextFrame)
    .Where(tf => tf != null)
    .ToList()
    .ForEach(tf => tf.Text = "New Title");

パターンマッチングとスイッチ式

モダン C# の機能を活用して図形を処理します:

foreach (var shape in slide.Shapes)
{
    var result = shape switch
    {
        IAutoShape autoShape when autoShape.TextFrame != null 
            => ProcessTextShape(autoShape),
        ITable table 
            => ProcessTable(table),
        IChart chart 
            => ProcessChart(chart),
        IPictureFrame picture 
            => ProcessImage(picture),
        _ => null
    };
}

イミュータビリティとビルダーパターン

宣言的な設定のためのヘルパーメソッドを作成します:

IAutoShape AddConfiguredShape(
    ISlide slide,
    ShapeType shapeType,
    float x, float y, float width, float height,
    Action<IAutoShape> configure)
{
    var shape = slide.Shapes.AddAutoShape(shapeType, x, y, width, height);
    configure(shape);
    return shape;
}

// 使用例
var titleShape = AddConfiguredShape(
    slide, 
    ShapeType.Rectangle, 
    50, 50, 600, 100,
    shape =>
    {
        shape.TextFrame.Text = "Title";
        shape.FillFormat.FillType = FillType.Solid;
        shape.FillFormat.SolidFillColor.Color = Color.Blue;
    });

一般的なタスクパターン

テンプレートからプレゼンテーションを作成

using var presentation = new Presentation("template.pptx");

// プレースホルダーテキストを入力
foreach (var slide in presentation.Slides)
{
    foreach (var shape in slide.Shapes.OfType<IAutoShape>())
    {
        if (shape.Placeholder != null)
        {
            var placeholderType = shape.Placeholder.Type;
            shape.TextFrame.Text = placeholderType switch
            {
                PlaceholderType.Title => "Dynamic Title",
                PlaceholderType.Body => "Dynamic Content",
                _ => shape.TextFrame.Text
            };
        }
    }
}

presentation.Save("output.pptx", SaveFormat.Pptx);

データを含むテーブルを追加

// テーブルの寸法を定義
var columnWidths = new[] { 100.0, 150.0, 200.0 };
var rowHeights = new[] { 50.0, 40.0, 40.0, 40.0 };

var table = slide.Shapes.AddTable(
    x: 50, 
    y: 50, 
    columnWidths, 
    rowHeights);

// ヘッダーを入力
var headers = new[] { "Name", "Value", "Description" };
for (int col = 0; col < headers.Length; col++)
{
    table[col, 0].TextFrame.Text = headers[col];
    table[col, 0].CellFormat.FillFormat.FillType = FillType.Solid;
    table[col, 0].CellFormat.FillFormat.SolidFillColor.Color = 
        Color.FromArgb(68, 114, 196);
    table[col, 0].TextFrame.Paragraphs[0].Portions[0].PortionFormat
        .FillFormat.SolidFillColor.Color = Color.White;
}

// データ行を入力
var data = new[]
{
    new[] { "Item 1", "100", "First item" },
    new[] { "Item 2", "200", "Second item" },
    new[] { "Item 3", "300", "Third item" }
};

for (int row = 0; row < data.Length; row++)
{
    for (int col = 0; col < data[row].Length; col++)
    {
        table[col, row + 1].TextFrame.Text = data[row][col];
    }
}

グラフを作成

// スライドにグラフを追加
var chart = slide.Shapes.AddChart(
    ChartType.ClusteredColumn,
    x: 50,
    y: 50,
    width: 500,
    height: 400);

// デフォルトデータをクリア
chart.ChartData.Series.Clear();
chart.ChartData.Categories.Clear();

// カテゴリを設定
var categories = new[] { "Q1", "Q2", "Q3", "Q4" };
foreach (var category in categories)
{
    chart.ChartData.Categories.Add(
        chart.ChartData.ChartDataWorkbook.GetCell(0, 0, 0, category));
}

// データシリーズを追加
var series1 = chart.ChartData.Series.Add(
    chart.ChartData.ChartDataWorkbook.GetCell(0, 0, 1, "Sales"),
    chart.Type);

var salesData = new[] { 120, 150, 180, 160 };
for (int i = 0; i < salesData.Length; i++)
{
    series1.DataPoints.AddDataPointForBarSeries(
        chart.ChartData.ChartDataWorkbook.GetCell(0, i + 1, 1, salesData[i]));
}

// グラフをスタイル
series1.Format.Fill.FillType = FillType.Solid;
series1.Format.Fill.SolidFillColor.Color = Color.FromArgb(68, 114, 196);
chart.HasTitle = true;
chart.ChartTitle.AddTextFrameForOverriding("Quarterly Sales");

書式設定を保持したテキスト置換

void ReplaceTextPreservingFormat(
    IPresentation presentation, 
    string searchText, 
    string replacementText)
{
    foreach (var slide in presentation.Slides)
    {
        foreach (var shape in slide.Shapes.OfType<IAutoShape>())
        {
            if (shape.TextFrame == null) continue;

            foreach (var paragraph in shape.TextFrame.Paragraphs)
            {
                foreach (var portion in paragraph.Portions)
                {
                    if (portion.Text.Contains(searchText))
                    {
                        portion.Text = portion.Text.Replace(
                            searchText, 
                            replacementText);
                    }
                }
            }
        }
    }
}

画像を操作

// ファイルから画像を追加
using var image = Image.FromFile("logo.png");
var ppImage = presentation.Images.AddImage(image);

var pictureFrame = slide.Shapes.AddPictureFrame(
    ShapeType.Rectangle,
    x: 100,
    y: 100,
    width: 200,
    height: 150,
    ppImage);

// プレゼンテーション内のすべての画像を抽出
var imageIndex = 0;
foreach (var slide in presentation.Slides)
{
    foreach (var shape in slide.Shapes.OfType<IPictureFrame>())
    {
        var image = shape.PictureFormat.Picture.Image.SystemImage;
        image.Save($"extracted_image_{imageIndex++}.png");
    }
}

JSON データ入力パターン

データドリブンプレゼンテーションの場合、宣言的アプローチを使用します:

public class SlideDataModel
{
    public string Title { get; set; }
    public List<BulletPoint> BulletPoints { get; set; }
    public TableData TableData { get; set; }
    public ChartData ChartData { get; set; }
}

void PopulateSlideFromJson(ISlide slide, SlideDataModel data)
{
    // タイトルを更新
    var titleShape = slide.Shapes
        .OfType<IAutoShape>()
        .FirstOrDefault(s => s.Placeholder?.Type == PlaceholderType.Title);
    
    if (titleShape != null && data.Title != null)
    {
        titleShape.TextFrame.Text = data.Title;
    }

    // 箇条書きを更新
    var bodyShape = slide.Shapes
        .OfType<IAutoShape>()
        .FirstOrDefault(s => s.Placeholder?.Type == PlaceholderType.Body);
    
    if (bodyShape != null && data.BulletPoints != null)
    {
        bodyShape.TextFrame.Paragraphs.Clear();
        
        foreach (var bullet in data.BulletPoints)
        {
            var paragraph = new Paragraph();
            paragraph.Text = bullet.Text;
            paragraph.ParagraphFormat.Bullet.Type = BulletType.Symbol;
            bodyShape.TextFrame.Paragraphs.Add(paragraph);
        }
    }

    // テーブルが存在する場合は入力
    if (data.TableData != null)
    {
        PopulateTable(slide, data.TableData);
    }

    // グラフが存在する場合は入力
    if (data.ChartData != null)
    {
        PopulateChart(slide, data.ChartData);
    }
}

パフォーマンスに関する考慮事項

大規模プレゼンテーションのメモリ管理

// 大規模プレゼンテーション用に BlobManagementOptions を使用
var blobOptions = new BlobManagementOptions
{
    PresentationLockingBehavior = PresentationLockingBehavior.KeepLocked,
    IsTemporaryFilesAllowed = true,
    TempFilesRootPath = Path.GetTempPath()
};

var loadOptions = new LoadOptions { BlobManagementOptions = blobOptions };
using var presentation = new Presentation("large.pptx", loadOptions);

効率的なバッチ処理

async Task ProcessPresentationsAsync(IEnumerable<string> files)
{
    var processingTasks = files.Select(async file =>
    {
        using var presentation = new Presentation(file);
        
        // プレゼンテーションを処理
        await Task.Run(() => ProcessSlides(presentation));
        
        var outputPath = Path.ChangeExtension(file, ".processed.pptx");
        presentation.Save(outputPath, SaveFormat.Pptx);
    });

    await Task.WhenAll(processingTasks);
}

エラーハンドリングパターン

堅牢なプレゼンテーション処理

Result<Presentation> LoadPresentationSafely(string path)
{
    try
    {
        var presentation = new Presentation(path);
        return Result<Presentation>.Success(presentation);
    }
    catch (Exception ex) when (ex is InvalidOperationException or IOException)
    {
        return Result<Presentation>.Failure($"Failed to load presentation: {ex.Message}");
    }
}

// パターンマッチングを使用した使用例
var result = LoadPresentationSafely("presentation.pptx");

result switch
{
    { IsSuccess: true } => ProcessPresentation(result.Value),
    { IsSuccess: false } => LogError(result.Error)
};

エクスポートと変換

オプション付き PDF エクスポート

var pdfOptions = new PdfOptions
{
    Compliance = PdfCompliance.Pdf15,
    JpegQuality = 90,
    TextCompression = PdfTextCompression.Flate,
    EmbedFullFonts = true,
    DrawSlidesFrame = false
};

// PDF にノートを含める
pdfOptions.NotesCommentsLayouting.NotesPosition = NotesPositions.BottomFull;

presentation.Save("output.pdf", SaveFormat.Pdf, pdfOptions);

HTML エクスポート

var htmlOptions = new HtmlOptions
{
    EmbedImages = true,
    HtmlFormatter = HtmlFormatter.CreateDocumentFormatter(string.Empty, false)
};

presentation.Save("output.html", SaveFormat.Html, htmlOptions);

各スライドの画像エクスポート

foreach (var slide in presentation.Slides)
{
    using var bitmap = slide.GetThumbnail(2.0f, 2.0f); // 2 倍スケール
    bitmap.Save(
        $"slide_{slide.SlideNumber}.png", 
        System.Drawing.Imaging.ImageFormat.Png);
}

ベストプラクティス

1. 適切な用途

  • 一貫した設計を保つためにテンプレートを使用
  • 直接的な図形作成よりもプレースホルダー操作を優先
  • スライド設計時にエクスポート形式の要件を考慮
  • ビジュアル品質とファイルサイズのバランスを取る

2. 宣言的設定

  • 繰り返される設定をヘルパーメソッドに抽出
  • オブジェクト初期化子とコレクション初期化子を使用
  • コレクション変換に LINQ を活用
  • 単純な操作には式形式のメンバーを優先

3. 型安全性

  • 強く型付けされた列挙型を使用(ShapeType、PlaceholderType など)
  • マジックナンバーと文字列を避ける
  • 測定用のドメイン固有の値オブジェクトを作成
  • イミュータブルなデータ転送オブジェクトにはレコードを使用

4. 保守性

  • データをプレゼンテーションロジックから分離
  • 一般的なスライドパターン用に再利用可能なコンポーネントを作成
  • 図形の命名規則を一貫させる
  • 複雑な図形階層はドキュメント化

5. テスト

  • 検証用に最小限のテストプレゼンテーションを作成
  • プレゼンテーションプロパティで変更を検証
  • テスト可能な純粋関数を抽出
  • ラウンドトリップテスト(保存/読み込み/検証)を検討

一般的な問題のトラブルシューティング

問題: 図形の配置が一貫していない

解決策: スライドサイズを基準として使用

var slideWidth = presentation.SlideSize.Size.Width;
var slideHeight = presentation.SlideSize.Size.Height;

// 図形を中央に配置
var shape = slide.Shapes.AddAutoShape(
    ShapeType.Rectangle,
    x: (slideWidth - shapeWidth) / 2,
    y: (slideHeight - shapeHeight) / 2,
    width: shapeWidth,
    height: shapeHeight);

問題: 図形内のテキストがオーバーフローする

解決策: 自動フィットを有効にするか図形サイズを調整

var textFrame = shape.TextFrame;
textFrame.TextFrameFormat.AutofitType = TextAutofitType.Shape;
// または
textFrame.TextFrameFormat.AutofitType = TextAutofitType.Normal;

問題: フォントが埋め込まれていない

解決策: フォントを明示的に埋め込む

var fontData = File.ReadAllBytes("customfont.ttf");
presentation.FontsManager.AddEmbeddedFont(fontData, EmbedFontCharacters.All);

問題: グラフデータが更新されない

解決策: グラフデータワークブックを更新

chart.ChartData.ChartDataWorkbook.Clear(0);
// データを再入力

リソース検出戦略

Aspose.Slides 機能の実装時:

  1. 名前空間階層を確認 - Aspose.Slides の型はドメインで論理的に整理されています
  2. インターフェイスコントラクトを確認 - ほとんどの機能はインターフェイスを通じて公開されています(IPresentation、ISlide など)
  3. 列挙型を確認 - Aspose は包括的な列挙型をオプションと型に使用しています
  4. XML ドキュメントを参照 - IntelliSense は詳細な API ドキュメントを提供します
  5. GitHub サンプルを参照 - 特定のシナリオに対する実際の使用パターン
  6. 型推論を活用 - コンパイラーが有効な操作をガイドします

サンプル駆動開発

目的のある状態から作業を開始して逆算します:

// 目的: JSON からデータドリブンプレゼンテーションを作成

// 1. データ構造を定義
var slideData = JsonSerializer.Deserialize<PresentationData>(jsonContent);

// 2. プレゼンテーションを読み込むか新規作成
using var presentation = LoadTemplate("template.pptx") 
    ?? CreateNewPresentation();

// 3. スライドにデータを適用
foreach (var (slide, data) in presentation.Slides.Zip(slideData.Slides))
{
    ApplyDataToSlide(slide, data);
}

// 4. 適切なオプション付きで保存
SavePresentation(presentation, "output.pptx", slideData.ExportOptions);

まとめ

このスキルは Claude Code がモダン C# パターンで Aspose.Slides を使用して PowerPoint プレゼンテーションを操作できるようにします。次の点に注目してください:

  • スライド操作への宣言的で関数型のアプローチ
  • using ステートメントを使用した適切なリソース管理
  • 包括的なオブジェクトモデルを使用した型安全な操作
  • データドリブンプレゼンテーション生成
  • 大規模プレゼンテーションの効率的な処理

新しいタスクに取り組む場合、オブジェクト階層を理解し、コレクション操作に LINQ を活用し、複雑な命令型コードより構成を優先します。

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
alanben
リポジトリ
alanben/ClaudeSkills
ライセンス
MIT
最終更新
2026/1/8

Source: https://github.com/alanben/ClaudeSkills / ライセンス: MIT

本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: alanben · alanben/ClaudeSkills · ライセンス: MIT