Open3

macでopen xml sdkを使う

mima_itamima_ita

プロジェクトの作成

dotnet new console -n OpenXmlWordSample
cd OpenXmlWordSample

パッケージの追加

dotnet add package DocumentFormat.OpenXml

パッケージの確認

dotnet list package

パッケージの削除

dotnet remove package DocumentFormat.OpenXml
mima_itamima_ita

指定のファイルを開いて、指定の文字を検索してコメントを付与する例

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 コメントだ