用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/runceel/ai-dev-template --skill office-document-analyzer命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
Provides up-to-date information about ASP.NET Core 10 and Blazor .NET 10 new features. Use when the user asks about Blazor .NET 10 capabilities, ASP.NET Core 10 features, OpenAPI, Minimal APIs, SignalR, or needs guidance on ASP.NET Core/Blazor .NET 10 specific features.
Design Azure infrastructure using natural language, or analyze existing Azure resources to auto-generate architecture diagrams, refine them through conversation, and deploy with Bicep. When to use this skill: - "Create X on Azure", "Set up a RAG architecture" (new design) - "Analyze my current Azure infrastructure", "Draw a diagram for rg-xxx" (existing analysis) - "Foundry is slow", "I want to reduce costs", "Strengthen security" (natural language modification) - Azure resource deployment, Bicep template generation, IaC code generation - Microsoft Foundry, AI Search, OpenAI, Fabric, ADLS Gen2, Databricks, and all Azure services
Modular Monolith + Clean Architecture の設計ガイド。新しいモジュールの作成、画面の実装、機能追加を行う際には、必ずこのスキルを参照して従ってください。
基于 SOC 职业分类
| name | office-document-analyzer |
| description | Office ドキュメント(Excel / PowerPoint 等)の設計書を解析するためのガイド。設計書の内容を読み取り・理解する際には、必ずこのスキルを参照して従ってください。 |
このスキルは、Excel / PowerPoint などの Office ドキュメントで書かれた設計書を読み取り、 内容を理解するための手順とパターンを提供します。
1. 解析対象のドキュメントファイルを確認する
2. scripting-guide に従いスクリプトでファイルを解析する
3. 解析結果から仕様・内容を理解する
4. 理解した内容に基づいて必要な作業を行う
重要: ファイル解析には scripting-guide スキルの規則に従い、dotnet run - にパイプして実行してください。
まずファイル全体の構造を把握します。
@'
#:package ClosedXML@0.105.0
using ClosedXML.Excel;
var filePath = args[0];
using var workbook = new XLWorkbook(filePath);
Console.WriteLine($"=== {Path.GetFileName(filePath)} ===");
Console.WriteLine($"シート数: {workbook.Worksheets.Count}");
foreach (var ws in workbook.Worksheets)
{
Console.WriteLine($"\n--- シート: {ws.Name} ---");
var range = ws.RangeUsed();
if (range == null) { Console.WriteLine("(空)"); continue; }
Console.WriteLine($"使用範囲: {range.RangeAddress}");
Console.WriteLine($"行数: {range.RowCount()}, 列数: {range.ColumnCount()}");
Console.WriteLine($"マージセル数: {ws.MergedRanges.Count}");
Console.WriteLine($"画像数: {ws.Pictures.Count}");
}
'@ | dotnet run - -- "<ファイルパス>"
構造を把握したら、全セルのデータを読み取ります。
@'
#:package ClosedXML@0.105.0
using ClosedXML.Excel;
var filePath = args[0];
using var workbook = new XLWorkbook(filePath);
foreach (var ws in workbook.Worksheets)
{
Console.WriteLine($"--- シート: {ws.Name} ---");
// マージセル情報
foreach (var m in ws.MergedRanges)
Console.WriteLine($"[マージ] {m.RangeAddress} = \"{m.FirstCell().Value}\"");
// 全行データ
foreach (var row in ws.RowsUsed())
{
var cells = new List<string>();
foreach (var cell in row.CellsUsed())
{
var val = cell.Value.ToString();
if (!string.IsNullOrWhiteSpace(val))
cells.Add($"{cell.Address}={val}");
}
if (cells.Count > 0)
Console.WriteLine(string.Join(" | ", cells));
}
}
'@ | dotnet run - -- "<ファイルパス>"
Excel に埋め込まれた画像(スクリーンショットやレイアウト図)を抽出します。
@'
#:package ClosedXML@0.105.0
using ClosedXML.Excel;
var filePath = args[0];
var outputDir = args.Length > 1 ? args[1] : "extracted_images";
Directory.CreateDirectory(outputDir);
using var workbook = new XLWorkbook(filePath);
foreach (var ws in workbook.Worksheets)
{
int i = 0;
foreach (var pic in ws.Pictures)
{
i++;
var ext = pic.Format switch
{
ClosedXML.Excel.Drawings.XLPictureFormat.Png => "png",
ClosedXML.Excel.Drawings.XLPictureFormat.Jpeg => "jpg",
ClosedXML.Excel.Drawings.XLPictureFormat.Bmp => "bmp",
_ => "png"
};
var fileName = $"{ws.Name}_{i}.{ext}";
var path = Path.Combine(outputDir, fileName);
using var stream = File.Create(path);
pic.ImageStream.CopyTo(stream);
Console.WriteLine($"保存: {path} ({pic.OriginalWidth}x{pic.OriginalHeight})");
}
}
'@ | dotnet run - -- "<ファイルパス>" "<出力先ディレクトリ>"
罫線やフォントの情報が設計上重要な場合に使用します。
@'
#:package ClosedXML@0.105.0
using ClosedXML.Excel;
var filePath = args[0];
using var workbook = new XLWorkbook(filePath);
var ws = workbook.Worksheet(1);
foreach (var row in ws.RowsUsed())
{
foreach (var cell in row.CellsUsed())
{
var style = cell.Style;
var bold = style.Font.Bold ? " [太字]" : "";
var bg = style.Fill.BackgroundColor.HasValue
? $" [背景:{style.Fill.BackgroundColor.Color}]" : "";
var val = cell.Value.ToString();
if (!string.IsNullOrWhiteSpace(val))
Console.WriteLine($"{cell.Address}: {val}{bold}{bg}");
}
}
'@ | dotnet run - -- "<ファイルパス>"
@'
#:package DocumentFormat.OpenXml@3.3.0
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;
using A = DocumentFormat.OpenXml.Drawing;
var filePath = args[0];
using var ppt = PresentationDocument.Open(filePath, false);
var presentationPart = ppt.PresentationPart!;
var slideIds = presentationPart.Presentation.SlideIdList!
.ChildElements.OfType<SlideId>();
Console.WriteLine($"=== {System.IO.Path.GetFileName(filePath)} ===");
Console.WriteLine($"スライド数: {slideIds.Count()}");
int slideNum = 0;
foreach (var slideId in slideIds)
{
slideNum++;
var slidePart = (SlidePart)presentationPart.GetPartById(slideId.RelationshipId!);
Console.WriteLine($"\n--- スライド {slideNum} ---");
// テキスト抽出
var texts = slidePart.Slide.Descendants<A.Text>()
.Select(t => t.Text)
.Where(t => !string.IsNullOrWhiteSpace(t));
Console.WriteLine("テキスト:");
foreach (var text in texts)
Console.WriteLine($" {text}");
// 図形
var shapes = slidePart.Slide.Descendants<Shape>().Count();
Console.WriteLine($"図形数: {shapes}");
// 画像
var imageParts = slidePart.ImageParts.Count();
Console.WriteLine($"画像数: {imageParts}");
}
'@ | dotnet run - -- "<ファイルパス>"
各図形の名前・位置・テキストを取得し、画面レイアウトを把握します。
@'
#:package DocumentFormat.OpenXml@3.3.0
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;
using A = DocumentFormat.OpenXml.Drawing;
var filePath = args[0];
using var ppt = PresentationDocument.Open(filePath, false);
var presentationPart = ppt.PresentationPart!;
var slideIds = presentationPart.Presentation.SlideIdList!
.ChildElements.OfType<SlideId>();
int slideNum = 0;
foreach (var slideId in slideIds)
{
slideNum++;
var slidePart = (SlidePart)presentationPart.GetPartById(slideId.RelationshipId!);
Console.WriteLine($"--- スライド {slideNum} ---");
var shapeTree = slidePart.Slide.CommonSlideData?.ShapeTree;
if (shapeTree == null) continue;
foreach (var shape in shapeTree.Elements<Shape>())
{
var name = shape.NonVisualShapeProperties?.NonVisualDrawingProperties?.Name ?? "(無名)";
var text = string.Join("", shape.Descendants<A.Text>().Select(t => t.Text));
// 位置・サイズ (EMU 単位: 1 cm = 360000 EMU)
var xfrm = shape.ShapeProperties?.Transform2D;
var pos = xfrm != null
? $"({xfrm.Offset?.X ?? 0}, {xfrm.Offset?.Y ?? 0})"
: "(不明)";
var size = xfrm != null
? $"{xfrm.Extents?.Cx ?? 0}x{xfrm.Extents?.Cy ?? 0}"
: "(不明)";
Console.WriteLine($" 図形: {name} | テキスト: {text} | 位置: {pos} | サイズ: {size}");
}
}
'@ | dotnet run - -- "<ファイルパス>"
@'
#:package DocumentFormat.OpenXml@3.3.0
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;
var filePath = args[0];
var outputDir = args.Length > 1 ? args[1] : "extracted_images";
Directory.CreateDirectory(outputDir);
using var ppt = PresentationDocument.Open(filePath, false);
var presentationPart = ppt.PresentationPart!;
var slideIds = presentationPart.Presentation.SlideIdList!
.ChildElements.OfType<SlideId>();
int slideNum = 0;
foreach (var slideId in slideIds)
{
slideNum++;
var slidePart = (SlidePart)presentationPart.GetPartById(slideId.RelationshipId!);
int imgNum = 0;
foreach (var imagePart in slidePart.ImageParts)
{
imgNum++;
var ext = imagePart.ContentType switch
{
"image/png" => "png",
"image/jpeg" => "jpg",
"image/bmp" => "bmp",
"image/gif" => "gif",
_ => "png"
};
var fileName = $"slide{slideNum}_img{imgNum}.{ext}";
var path = System.IO.Path.Combine(outputDir, fileName);
using var stream = imagePart.GetStream();
using var fileStream = File.Create(path);
stream.CopyTo(fileStream);
Console.WriteLine($"保存: {path}");
}
}
'@ | dotnet run - -- "<ファイルパス>" "<出力先ディレクトリ>"
#:package ディレクティブではバージョンを明示してください。
#:package ClosedXML@0.105.0 // Excel
#:package DocumentFormat.OpenXml@3.3.0 // PowerPoint / Word
DocumentFormat.OpenXml.Drawing には Path や Text など、System.IO や System と衝突する型があります。エイリアスを使ってください。
using A = DocumentFormat.OpenXml.Drawing; // Drawing 名前空間はエイリアスで参照
// Path → System.IO.Path を使う場合はフルパスで指定
画像はテキストとして読み取れないため、抽出してファイルに保存してから内容を確認してください。 画面レイアウト図が含まれている場合は、図形のテキストや位置情報からレイアウトを推測します。