【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.5と推定(25/9/13)
台風一過なのに今日も猛暑予想.秋が来ないぞい
【霧島山】新燃岳が噴火 噴煙高度火口上5500m(25/8/28)
日産「GT-R」生産終了 スポーツカーの開発環境 厳しさ増す
火球か?隕石か?「夜なのに明るく」「カメラが真っ白になるほどの光」九州や西日本各地で目撃あいつぐ 空気の振動も観測
ひょっとして,大規模にやらかしてました?ぎんゆぅ~さん,落ちてた模様(爆