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;
参考文献
この記事は以下の情報を参考にして執筆しました。
- C#: Excelファイルを読み書きする (COM)
- c#でExcelをOpenするとプロセスが残る(Microsoft.Office.Interop.Excel使用)
- Microsoft.Office.Interop.Excel: How to Apply a border to ONE CELL
最後に
在日中国人エンジニアです。技術的な指摘もしくは日本語の指摘がございましたら、教えてください。
Author And Source
この問題について(Microsoft.Office.Interop.Excelで複数Excelファイルの一括編集), 我々は、より多くの情報をここで見つけました https://qiita.com/xyypublic/items/5509d44202f695fc0969著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .