【C#】Excel-COMをレイトバインドして,Excelファイルを保存してみる
関連記事
- なんと!今週の土曜日も仕事してますた.来週の土曜日も仕事臭い.TCPソケット通信をゴリゴリ書いてる 【2025年08月30日(土)】
- 【ChatGPT o4】祝日なのに仕事ーバテすぎー今夜こそ絶命だーモルモルモル 【2025年03月20日(木)】
- 【#CSharp】制御系が動き出したべ 【2025年02月20日(木)】
- 【#CSharp】ひっさしぶりにガッツリなC#案件をやっているぞー 【2025年02月19日(水)】
- 今週もひたすらモノ書き #JAVA 祭りがまだまだ続く そろそろC#を書かせろー 【2024年12月04日(水)】
【追記】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);
}
}
}
}

コメント
【クマ】クマによる人的被害、生活圏7割 環境省まとめ、出没は最多2万件
「ニュウハクシミ」紙を食べる害虫 生息19都道府県に拡大
文化の日な祭日らしい.文化的に休むもうず?
【#HTVX】新型宇宙輸送船HTV-X 油井さんがロボットアームでキャッチ
【冬】来週11℃予想とか出てきてる.秋があったのか,今年(25/10/23)
【ツル】出水平野に冬の訪れを告げるツル第一陣・今季初飛来 鹿児島(25/10/21)
都城でプロ野球・ロッテ1軍が春季キャンプ実施へ
山形で開催の映画祭 監督など国内外の参加者が“芋煮”味わう
連休なんで生駒高原でコスモスを愛でてきた
連休の中日ですの.天気は良くなる方向じゃげ