&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;
}
}
}
}}