【C#】Excel-COMをレイトバインドして,Excelファイルを保存してみる
関連記事
- 【#CSharp】C#が2025年「プログラミング言語オブ・ザ・イヤー」獲得 【2026年01月16日(金)】
- なんと!今週の土曜日も仕事してますた.来週の土曜日も仕事臭い.TCPソケット通信をゴリゴリ書いてる 【2025年08月30日(土)】
- 【ChatGPT o4】祝日なのに仕事ーバテすぎー今夜こそ絶命だーモルモルモル 【2025年03月20日(木)】
- 【#CSharp】制御系が動き出したべ 【2025年02月20日(木)】
- 【#CSharp】ひっさしぶりにガッツリなC#案件をやっているぞー 【2025年02月19日(水)】
【追記】C#なExcel-COM活用編を追記していく,はず?
1.【C#,Excel-COM】指定セルのフォントサイズと,折り返しを設定
2.【C#,Excel-COM】ExcelアドインをC#使って自動登録/解除
お客さんの依頼で,postgre-SQLから抜き出した結果セットを
Excelに落としてくれ,と
参照設定で,Excel-COMをアーリー(事前)バインドするのが手っ取り早いけど,これ,Excelのバージョン依存になるぞぉ
ってなると,レイト(遅延)バインドして,あ~たらこ~たらするのがいいかな?ってなるんじゃけど
VBあたりだと,CreateObject()あたりで,始まるんじゃが,これが,C#には,ない 😯
調べていったら,Activator.CreateInstance()を使え!って解って
さらに調べたら,マイクロソフトのサンプルまで行き着いたけど...
このサンプル,Excelのプロセスがメモリ上に残るゾォ(汗
ってことで,メモリ上にゾンビプロセスが残らないように修正して
ついでに,Excelファイルの自動保存機能まで,付けてみた
ここまで出来れば,あとはExcelに対して,やりたい放題出来るはず?
いつものように,バグっていたらスマンです,ってことで♥
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection; //<---これの追加をお忘れなく
namespace ExcelSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string fname = "z:\\" + DateTime.Now.ToString("hhmmss")+".xlsx";
object objApp_Late;
object objBook_Late;
object objBooks_Late;
object objSheets_Late;
object objSheet_Late;
object objRange_Late;
object[] Parameters;
try
{
// Get the class type and instantiate Excel.
Type objClassType;
objClassType = Type.GetTypeFromProgID("Excel.Application");
objApp_Late = Activator.CreateInstance(objClassType);
//Get the workbooks collection.
objBooks_Late = objApp_Late.GetType().InvokeMember( "Workbooks", BindingFlags.GetProperty, null, objApp_Late, null );
//Add a new workbook.
objBook_Late = objBooks_Late.GetType().InvokeMember( "Add", BindingFlags.InvokeMethod, null, objBooks_Late, null );
//Get the worksheets collection.
objSheets_Late = objBook_Late.GetType().InvokeMember( "Worksheets", BindingFlags.GetProperty, null, objBook_Late, null );
//Get the first worksheet.
Parameters = new Object[1];
Parameters[0] = 1;
objSheet_Late = objSheets_Late.GetType().InvokeMember( "Item", BindingFlags.GetProperty, null, objSheets_Late, Parameters );
//Get a range object that contains cell A1.
Parameters = new Object[2];
Parameters[0] = "A1";
Parameters[1] = Missing.Value;
objRange_Late = objSheet_Late.GetType().InvokeMember( "Range", BindingFlags.GetProperty, null, objSheet_Late, Parameters );
//Write "Hello, World!" in cell A1.
Parameters = new Object[1];
Parameters[0] = "Hello, World!";
objRange_Late.GetType().InvokeMember( "Value", BindingFlags.SetProperty, null, objRange_Late, Parameters );
ExcelObjDestroy(objRange_Late); //インスタンス破棄
Parameters = new Object[2];
Parameters[0] = "A2";
Parameters[1] = Missing.Value;
objRange_Late = objSheet_Late.GetType().InvokeMember( "Range", BindingFlags.GetProperty, null, objSheet_Late, Parameters );
//時間をA2セルに入れてみる
Parameters = new Object[1];
Parameters[0] = DateTime.Now.ToString("hh:mm:ss");
objRange_Late.GetType().InvokeMember( "Value", BindingFlags.SetProperty, null, objRange_Late, Parameters );
ExcelObjDestroy(objRange_Late); //インスタンス破棄
//Return control of Excel to the user.
Parameters = new Object[1];
Parameters[0] = true;
objApp_Late.GetType().InvokeMember( "Visible", BindingFlags.SetProperty, null, objApp_Late, Parameters );
objApp_Late.GetType().InvokeMember( "UserControl", BindingFlags.SetProperty, null, objApp_Late, Parameters );
//objSheets_Late.GetType().InvokeMember("Close", System.Reflection.BindingFlags.InvokeMethod, null, objSheets_Late, null);
//自動保存を行う
Parameters = new Object[2];
Parameters[0] = true;
Parameters[1] = fname;
objBook_Late.GetType().InvokeMember("Close", System.Reflection.BindingFlags.InvokeMethod, null, objBook_Late, Parameters);
objBooks_Late.GetType().InvokeMember("Close", System.Reflection.BindingFlags.InvokeMethod, null, objBooks_Late, null);
objApp_Late.GetType().InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, objApp_Late, null);
//全てのEXCEL-COMの参照を破棄
ExcelObjDestroy(objSheet_Late);
ExcelObjDestroy(objSheets_Late);
ExcelObjDestroy(objBook_Late);
ExcelObjDestroy(objBooks_Late);
ExcelObjDestroy(objApp_Late);
//念のためNULL
objRange_Late = null;
objSheet_Late = null;
objSheets_Late = null;
objBook_Late = null;
objBooks_Late = null;
objApp_Late = null;
}
catch( Exception theException )
{
String errorMessage;
errorMessage = "Error: ";
errorMessage = String.Concat( errorMessage, theException.Message );
errorMessage = String.Concat( errorMessage, " Line: " );
errorMessage = String.Concat( errorMessage, theException.Source );
MessageBox.Show( errorMessage, "Error" );
}
}
private void ExcelObjDestroy(object obj)
{
if (obj == null)
{
return;
}
if (System.Runtime.InteropServices.Marshal.IsComObject(obj) == true)
{
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj);
}
}
}
}

コメント
広島カープの羽月隆太郎容疑者、「ゾンビたばこ」使用の疑いで逮捕
【#総選挙】衆議院選挙 きょう公示 12日間の選挙戦へ
青森 スノーモービル乗るため入山の約10人と連絡取れず 遭難か
【#不発弾】宮崎市中心部の不発弾 17日に処理 避難指示や交通規制予定(26/1/17)
【総選挙】立民 公明 衆院選に向け新党結成で合意(26/1/15)
【大雪】大雪と雷及び突風に関する全般気象情報 第3号(26/1/1)
ブルーレイはオワコン? ソニー生産終了が意味する「次世代メディア」の失敗
ビジネスホテルで火事 1人遺体で見つかる 宿泊客4人けが 水戸
【#ドラセナ】御神木たる幸福の木(ドラセナ):花芽がほころびだした!すごい香りで部屋が満たされてる!