Microsoft.Office.Interop.Excelで複数Excelファイルの一括編集


まず実行結果を確認したい  →  実行結果

開発環境

  • Microsoft Visual Studio Community 2019
  • Microsoft .NET Framework 4.8.04084
  • Microsoft Excel 2016

開発言語

  • C#

1.新しいプロジェクトの作成

「C#コンソールアプリケーション」プロジェクトを作成します。
作成方法は下記を参照してください。
Visual Studio での新しいプロジェクトの作成

2.参照の追加

「Microsoft Excel 16.0 Object Library」COM参照を追加します。
追加方法は下記を参照してください。
.NET 5プロジェクトでのCOM参照の追加

3.ソースコード

Program.cs
using System.IO;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;

namespace ExcelEdit
{
    class Program
    {
        static void Main(string[] args)
        {
            // 色んなオブジェクトの定義
            Excel.Application excel = null;
            Excel.Workbooks books = null;
            Excel.Workbook book = null;
            Excel.Sheets sheets = null;
            Excel.Worksheet sheet = null;
            Excel.Range cells = null;
            Excel.Range range = null;
            // フォルダの取得
            string folderPath = @"C:\Users\xyy\Desktop\Folder";
            // フォルダの中の拡張子が.xlsxのファイルの取得
            string[] files = Directory.GetFiles(Path.GetFullPath(folderPath), "*.xlsx");
            try
            {
                // Excelを起動する
                excel = new Excel.Application();
                // ブック一覧の定義
                books = excel.Workbooks;
                // 各ファイルに対して下記処理を繰り返し行う
                foreach (string file in files)
                {
                    try
                    {
                        // ブックを開く
                        book = books.Open(file);
                        // シート一覧の定義
                        sheets = book.Worksheets;
                        // 最初のシートの選択
                        sheet = sheets[1];
                        // セル一覧の定義
                        cells = sheet.Cells; 
                        // セル[2,1]の選択
                        // range = sheet.Cells[2, 1] という書き方だと、sheet.Cellsとsheet.Cells[2, 1]という二つのExcel.Rangeオブジェクトが隠れて、
                        // オブジェクトの解放漏れが発生するので、注意してください。    
                        range = cells[2, 1];
                        // セル[2,1]の値をtestに設定する
                        range.Value = "test";
                        // ブックを保存して閉じる
                        book.Close(true);
                        // Excelを終了する
                        excel.Quit();
                    }
                    finally
                    {
                        // 定義されたオブジェクトの解放、ループのたびに毎回解放しないとExcelのプロセスが残り続ける
                        Marshal.FinalReleaseComObject(range);
                        Marshal.FinalReleaseComObject(cells);
                        Marshal.FinalReleaseComObject(sheet);
                        Marshal.FinalReleaseComObject(sheets);
                        Marshal.FinalReleaseComObject(book);
                    }
                }
            }
            finally
            {
                // ブック一覧とExcelオブジェクトの解放は最後に一回行っていい
                Marshal.FinalReleaseComObject(books);
                Marshal.FinalReleaseComObject(excel);
            }
        }
    }
}

4.編集対象とするファイルの作成

5.実行結果

実行前            実行後
Book1 & Book2         Book1 & Book2
      

6.異常時対応

実行中のプログラムを強制終了させる場合、オブジェクトの解放ができなくて、Excelのプロセスが残り続けます。
プログラムを再実行したら、エラーが発生する可能性が高いです。
対応方法について、タスクマネージャーで残り続けるExcelプロセスを終了させてからプログラムの再実行してください。

7.値の編集以外の機能

7.1.列の挿入

Program.cs
// 列一覧の定義
cells = sheet.Columns;
// 2列目の選択
range = cells[2];
// 3列を挿入する
for (int i = 0; i < 3; i++)
{
    range.Insert();
}                                               

実行前                  
 
実行後    

7.2.セルの結合

Program.cs
// セル一覧の定義
cells = sheet.Cells;
// セル[2, 2]の選択
range1 = cells[2, 2];
// セル[2, 4]の選択
range2 = cells[2, 4];
// セル[2, 2]から[2, 4]までの範囲の選択
range3 = sheet.Range[range1,range2];
// セルの結合
range3.Merge();                                           

もしくは

Program.cs
// セル[B2]から[D2]までの範囲の選択
range = sheet.Range["B2:D2"];
// セルの結合
range.Merge();                                                                  

実行前                  



実行後

7.3.文字色の変更

Program.cs
// フォントオブジェクトの定義
Excel.Font font = null;    
// ... 略
// セル一覧の定義
cells = sheet.Cells;
// セル[2,1]の選択
range = cells[2, 1];
// セル[2,1]のフォントの選択
font = range.Font;
// 文字色を赤にする
font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red);                                                            

実行前         実行後
      

7.4.罫線の設定

Program.cs
// 罫線オブジェクトの定義
Excel.Borders border = null;  
// ... 略
// セル一覧の定義
cells = sheet.Cells;
// セル[2,2]の選択
range = cells[2, 2];
// セル[2,2]の罫線選択
border = range.Borders;
// 罫線を実線に設定する
border.LineStyle = Excel.XlLineStyle.xlContinuous;
// 罫線の太さの設定
border.Weight = 2d;                                                          

実行前               実行後
     

参考文献

この記事は以下の情報を参考にして執筆しました。

最後に

在日中国人エンジニアです。技術的な指摘もしくは日本語の指摘がございましたら、教えてください。