Open3
macでopen xml sdkを使う
.net をインストールする。
以下参照
.NETをダウンロードして手で入れた
プロジェクトの作成
dotnet new console -n OpenXmlWordSample
cd OpenXmlWordSample
パッケージの追加
dotnet add package DocumentFormat.OpenXml
パッケージの確認
dotnet list package
パッケージの削除
dotnet remove package DocumentFormat.OpenXml
指定のファイルを開いて、指定の文字を検索してコメントを付与する例
class Program
{
static void Main(string[] args)
{
// コマンドライン引数の検証
if (args.Length < 3)
{
Console.WriteLine("使用方法: dotnet run <ファイルパス> <検索文字列> <コメント内容>");
return;
}
string filePath = args[0];
string targetText = args[1];
string commentText = args[2];
// ファイルの存在確認
if (!File.Exists(filePath))
{
Console.WriteLine($"指定されたファイルが存在しません: {filePath}");
return;
}
try
{
// Wordファイルを開く
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(filePath, true))
{
var mainPart = wordDoc.MainDocumentPart;
var doc = mainPart.Document;
// コメントパーツがなければ追加
if (mainPart.WordprocessingCommentsPart == null)
mainPart.AddNewPart<WordprocessingCommentsPart>();
var commentsPart = mainPart.WordprocessingCommentsPart;
// コメント一覧を取得または作成
Comments comments = commentsPart.Comments ?? new Comments();
commentsPart.Comments = comments;
// コメントIDを生成
int commentId = comments.Elements<Comment>().Count() + 1;
// コメントを作成
var comment = new Comment
{
Id = commentId.ToString(),
Author = "コメント作成者",
Date = DateTime.Now
};
comment.AppendChild(new Paragraph(new Run(new Text(commentText))));
comments.AppendChild(comment);
// ドキュメント内で指定文字列を検索
foreach (var textElement in doc.Descendants<Text>().Where(t => t.Text.Contains(targetText)))
{
var parentRun = textElement.Parent as Run;
var parentParagraph = parentRun?.Parent as Paragraph;
if (parentRun == null || parentParagraph == null)
continue;
// コメント範囲を作成
var commentRangeStart = new CommentRangeStart { Id = commentId.ToString() };
var commentRangeEnd = new CommentRangeEnd { Id = commentId.ToString() };
var commentRef = new Run(new CommentReference { Id = commentId.ToString() });
// コメントを挿入
parentParagraph.InsertBefore(commentRangeStart, parentRun);
parentParagraph.InsertAfter(commentRangeEnd, parentRun);
parentParagraph.InsertAfter(commentRef, commentRangeEnd);
}
// 保存
doc.Save();
}
Console.WriteLine($"コメントを追加しました: {filePath}");
}
catch (Exception ex)
{
Console.WriteLine($"エラーが発生しました: {ex.Message}");
}
}
}
dotnet run Sample.docx foo コメントだ