&tag(CSharp, Office連携);
*目次 [#ge93756d]
#contents
*参考情報 [#i1777c5a]

*EXCELを操作する [#y6f4767d]
-COMインターフェイスを通してEXCELを操作する場合、参照の解放がめんどくさい。
-厳密に制御するには、[[C# - COM オブジェクトの参照カウントを解放する:http://jeanne.wankuma.com/tips/csharp/programming/releasecom.html]]のようにメソッドチェーンを利用せず1つずつ解放するようにしないといけないらしい。
-解放を自動で行うライブラリを探して使う方法もありそう([[C#からExcelを操作するライブラリ Ver2 - goungoun技術系雑記帳:http://goungoun.dip.jp/app/fswiki/wiki.cgi/devnotebook?page=C%23%A4%AB%A4%E9Excel%A4%F2%C1%E0%BA%EE%A4%B9%A4%EB%A5%E9%A5%A4%A5%D6%A5%E9%A5%EA+Ver2]])。
-単にxlsファイルをEXCELで開きたい場合、Process.Start()を使ったほうが簡単。

-[[システム管理者さんの憂鬱 : [C#] MicrosoftOfficeのバージョンに依存しないExcel作成プログラミング:http://blog.livedoor.jp/underzonez/archives/6600694.html]]のようにdynamicを使って完結に表記することもできる。
**EXCELシートに含まれるマクロを実行する例 [#c4080268]
#pre{{
        public static object CreateObject(string progId, string serverName)
        {
            Type t;
            if (serverName == null || serverName.Length == 0)
                t = Type.GetTypeFromProgID(progId);
            else
                t = Type.GetTypeFromProgID(progId, serverName, true);
            if (t == null)
            {
                return null;
            }
            return Activator.CreateInstance(t);
        }

        public static object CreateObject(string progId)
        {
            return CreateObject(progId, null);
        }

        private static void ShowError(Exception ex)
        {
            string title = ex.Message;
            string content = ex.Message;
            if (ex.InnerException != null)
            {
                content = ex.InnerException.Message;
            }
            MessageBox.Show(content, title);
        }

        public static void RunMacro(string xlsPath, string macroName, string argFileName)
        {
            // 指定されたマクロに引数を渡して起動するメソッド(今回はボツ)

            object excel = null;
            object books = null;
            object book = null;
            try
            {
                // Excel操作用COMオブジェクトを生成する
                excel = CreateObject("Excel.Application");
                if (excel == null)
                {
                    throw new ApplicationException("Excelのインスタンス生成に失敗しました");
                }
                //ワークブックコレクションオブジェクトを生成する。
                books = excel.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, excel, null);
                //Excelファイルのオープン
                book = books.GetType().InvokeMember(
                                      "Open", BindingFlags.InvokeMethod, null,
                                      books, new object[] {
                                                       xlsPath
                                                     , Type.Missing
                                                     , Type.Missing
                                                     , Type.Missing
                                                     , Type.Missing
                                                     , Type.Missing
                                                     , Type.Missing
                                                     , Type.Missing
                                                     , Type.Missing
                                                     , Type.Missing
                                                     , Type.Missing
                                                     , Type.Missing
                                                     , Type.Missing
                                                                 });

                // Excelファイルの表示
                excel.GetType().InvokeMember("Visible", BindingFlags.SetProperty, null, excel, new object[] { true });

                //マクロ実行(Testというサブプロシージャを実行する)
                excel.GetType().InvokeMember("Run", BindingFlags.InvokeMethod, null, excel, new object[] { macroName, argFileName });

                //閉じる
                excel.GetType().InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, excel, null);
            }
            catch (Exception ex)
            {
                ShowError(ex);
            }
            finally
            {
                if (book != null)
                {
                    Marshal.FinalReleaseComObject(book);
                    book = null;
                }
                if (books != null)
                {
                    Marshal.FinalReleaseComObject(books);
                    books = null;
                }
                if (excel != null)
                {
                    Marshal.FinalReleaseComObject(excel);
                    excel = null;
                }
            }
        }
}}

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS