書き込み
ファイルを指定して読み込み、ワークブックの選択とシートの選択までは読み込みのと同じですが、セルを指定して書き込む部分が少し異なります。
ソースコード(書き込み)
次のような環境で実行しています。
・Visual Studio 2019
・Excel 2019
使用しているファイルは読み込みと同じファイルに、値の追記とシートを追加して値を書き込む動作をしています。
ヘッダへの追加は読み込みと同じなので省略します。
メインソースコード
※① 1シート目に値を2カ所書き込み
② 1シート目の後に”新しく追加したシート”という名称のシートを追加して、値を1カ所書き込み
③保存して終了
Type typProgID;
object oExcel;
object oWBooks;
object oWBook;
object oWSheets;
object oSheet;
object oRange;
string FilePath = @"C:\tmp\Excel遅延バインド.xlsx"; //読み込みたいファイルのパス
object[] Params; //いろいろな場所で使うが、一時的なのでパラメータとして宣言しておく
//Excelを利用する
typProgID = Type.GetTypeFromProgID("Excel.Application");
oExcel = Activator.CreateInstance(typProgID);
oWBooks = oExcel.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, oExcel, null);
//ファイルパスを配列の頭に指定する。何故これだけの配列にするかは調べて下さい。
Params = new object[15] {FilePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing };
//ファイルを開いて、シートを開く準備
oWBook = oWBooks.GetType().InvokeMember("Open", BindingFlags.GetProperty, null, oWBooks, Params);
oWSheets = oWBook.GetType().InvokeMember("Worksheets", BindingFlags.GetProperty, null, oWBook, null);
//シートの番号を指定してシートを開いて、セルを読み込む準備 ※シート番号は0からではなく、1から
Params = new object[1] { 1 }; //1シート目を指定
oSheet = oWSheets.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, oWSheets, Params);
//
//ここまでは読み込みとほとんど同じです。
//
//セルを指定して、値を設定する ※セルの指定は読み取りの時とは異なり"R1C1"形式ではなく、"A1"といった形式で指定する
Params = new object[2];
Params[0] = "A4";
Params[1] = Missing.Value;
oRange = oSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, oSheet, Params);
Params = new object[1];
Params[0] = "1シート目のA4へ書き込み";
oRange.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, oRange, Params);
Marshal.ReleaseComObject(oRange);
oRange = null;
//R1C1形式でセルを指定して書き込む
//5列目、5行目を指定
int col = 5;
Params = new object[2];
Params[0] = Convert.ToChar(col + 64).ToString() + "5"; //ASIIコードから5列目の文字を算出する
Params[1] = Missing.Value;
oRange = oSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, oSheet, Params);
Params = new object[1];
Params[0] = "5列目、5行目への書き込み";
oRange.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, oRange, Params);
Marshal.ReleaseComObject(oRange);
oRange = null;
//現在操作しているシートの後に新たなシートを追加する
Params = new object[4];
Params[0] = Type.Missing;
Params[1] = oSheet;
Params[2] = 1;
Params[3] = Type.Missing;
oSheet = oWSheets.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, oWSheets, Params);
//追加した後でシート名を変更する
string SheetName = "新しく追加したシート";
Params = new object[1];
Params[0] = SheetName;
oSheet.GetType().InvokeMember("Name", BindingFlags.SetProperty, null, oSheet, Params);
//シートを変更
object Name;
int SheetNo = 0;
//各シートのシート名を比較して対象を探す
foreach (object sheet in (IEnumerable)oWSheets)
{
SheetNo++;
Name = sheet.GetType().InvokeMember("Name", BindingFlags.GetProperty, null, sheet, null);
if (SheetName == Name.ToString())
{
break;
}
}
Params = new object[1] { SheetNo }; //新しく追加したシートを選択する
oSheet = oWSheets.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, oWSheets, Params);
Params = new object[2];
Params[0] = "A2";
Params[1] = Missing.Value;
oRange = oSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, oSheet, Params);
Params = new object[1];
Params[0] = "新しく追加したシートのA2への書き込み";
oRange.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, oRange, Params);
Marshal.ReleaseComObject(oRange);
oRange = null;
//最終処理
Params = new object[1];
Params[0] = false; //保存時に確認メッセージを出さない
oExcel.GetType().InvokeMember("Visible", BindingFlags.SetProperty, null, oExcel, Params);
oExcel.GetType().InvokeMember("DisplayAlerts", BindingFlags.SetProperty, null, oExcel, Params);
oExcel.GetType().InvokeMember("UserControl", BindingFlags.SetProperty, null, oExcel, Params);
//これを忘れると、プロセス上にいつまでもExcelのプロセスが残ります
Params = new object[2];
Params[0] = true; //保存するかどうかを設定します。 true:保存、false:保存しない
Params[1] = FilePath;
oWBook.GetType().InvokeMember("Close", BindingFlags.InvokeMethod, null, oWBook, Params); //WorkBookのClose
oWBooks.GetType().InvokeMember("Close", BindingFlags.InvokeMethod, null, oWBooks, null); //WorkBooksのClose
oExcel.GetType().InvokeMember("Quit", BindingFlags.InvokeMethod, null, oExcel, null); //Excel.ApplicationのClose
//使ったものを解放
Marshal.ReleaseComObject(oSheet);
oSheet = null;
Marshal.ReleaseComObject(oWSheets);
oWSheets = null;
Marshal.ReleaseComObject(oWBook);
oWBook = null;
Marshal.ReleaseComObject(oWBooks);
oWBooks = null;
Marshal.ReleaseComObject(oExcel);
oExcel = null;
GC.Collect();
※このソースコードはご自由にご利用していただいて問題ありませんが、各自の責任でお願いします。問題や不利益等が発生したとしても当サイトは関知しません。
結果
基本的な書き込みだけでしたら、これくらいで大体は事足りるかと思います。
その他、罫線や最大行、最大列については次に書きたいと思います。
< 読み込み編
その他の機能 >
複数のExcelのバージョンに対応する ~遅延バインディング①~
複数のExcelのバージョンに対応する ~遅延バインディング②~ このページ
複数のExcelのバージョンに対応する ~遅延バインディング③~
複数のExcelのバージョンに対応する ~遅延バインディングまとめ~