【C#】Excel-COMをレイトバインドして,Excelファイルを保存してみる
関連記事
- 【#CSHARP】ソリューション内でサービス,Winformアプリを混在で作成させ,バイナリ出力先を同じにするとサービスが起動しない 【2024年02月08日(木)】
- 【#PHP】謎な #Laravel 案件 引き渡したじ 【2024年01月11日(木)】
- 【C#】謎な改造アプリ,SIMD命令を導入して高速化しようか,思案中 【2023年11月14日(火)】
- Javaの”やらかし”でC#と人気逆転か 激変プログラミング言語人気ランキング 【2023年10月18日(水)】
- Microsoft、「Python in Excel」を発表 ~Windows向けベータ版でテスト開始 【2023年08月23日(水)】
【追記】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); } } } }
コメント
【地震】日向灘でM4.4の地震
【#第三次世界大戦】ウクライナ空軍 “ICBM1発がロシア南部から発射された”
司法省 “グーグルはクローム売却を” 裁判所に要求へ 米報道
最近,仕事がずっと激しい...ドロドロドロ
今日は謎の宴会らしい...スーツが入るのかっ!?(GRB爆
「侍ジャパン」宮崎県入り 「プレミア12」向け きょうから合宿
【#総選挙】 衆議院選挙 きょう投票 ...ドロドロドロ(24/10/27)
【#線状降水帯】宮崎 延岡「土砂崩れで家がつぶれている」通報 1人不明(24/10/23)
【冬】お~日本海に筋雲が出ちょる!冬がキター
【#寒冷前線】13時頃30℃の気温が今は25℃無いぞー