###まず実行結果を確認したい → 実行結果
##開発環境
- 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.ソースコード
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.列の挿入
// 列一覧の定義
cells = sheet.Columns;
// 2列目の選択
range = cells[2];
// 3列を挿入する
for (int i = 0; i < 3; i++)
{
range.Insert();
}
// セル一覧の定義
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();
もしくは
// セル[B2]から[D2]までの範囲の選択
range = sheet.Range["B2:D2"];
// セルの結合
range.Merge();
// フォントオブジェクトの定義
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);
// 罫線オブジェクトの定義
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;
##参考文献
この記事は以下の情報を参考にして執筆しました。
- C#: Excelファイルを読み書きする (COM)
- c#でExcelをOpenするとプロセスが残る(Microsoft.Office.Interop.Excel使用)
- Microsoft.Office.Interop.Excel: How to Apply a border to ONE CELL
##最後に
在日中国人エンジニアです。技術的な指摘もしくは日本語の指摘がございましたら、教えてください。