このブログ「吟遊詩人の戯言」 の記事検索...

【C#】Excel-COMをレイトバインドして,Excelファイルを保存してみる

関連記事



【追記】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);
            }
        }
    }
}

 
 
 
 

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img localsrc="" alt="">