粗茶でございます日本語 プログラミング 言語 「なでしこ」 大好き 

このページの記事目次 (tag: プラグイン の検索結果)

スポンサーサイト

   ↑  --/--/-- (--)  カテゴリー: スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

(記事編集) http://nadesocha.blog.fc2.com/?overture" target="_new

--/--/-- | Comment (-) | ホーム | ↑ ページ先頭へ ↑ |

エクセルプラグインの作成

   ↑  2012/04/29 (日)  カテゴリー: なでしこ全般
 現在、なでしこ2.0向けのエクセルプラグインを作成中なのですが、これがなかなか手強くて、また私の勉強不足もあって、うまい解決がみつかりません。

 現在のところ、実装しているのは次の命令です。

' アプリケーション
・エクセルインストールチェック Excelがインストールされているか調べる。(1:インストールされている、0:インストールされていない)
・エクセル起動 FLAGで|FLAGに|FLAGへ Excelを起動する。(FLAG=1:可視、FLAG=0:不可視で起動)
・エクセル終了 Excelを終了する。ブックは保存しない。
・エクセル起動取得 Excelが起動しているか調べる。(1:起動している、0:起動していない)
・エクセルバージョン取得 Excelのバージョンを取得する。
・エクセル可視設定 FLAGで|FLAGに|FLAGへ Excelの可視を設定する。(FLAG=1:可視、FLAG=0:不可視)
・エクセル可視取得 Excelの可視を取得する。(1:可視、0:不可視で起動)
・エクセル警告設定 FLAGで|FLAGに|FLAGへ Excelの警告表示を設定する。(FLAG=1:警告あり、FLAG=0:警告なし)
・エクセル警告取得 Excelの警告表示を取得する。(1:警告あり、0:警告なし)
・エクセル窓設定 STATEで|STATEに|STATEへ Excelのウィンドウ状態を設定する。(STATE=『最大化|最小化|標準』)
・エクセル窓取得 Excelのウィンドウ状態を取得する。(『最大化|最小化|標準』)
・エクセルタイトル設定 TITLEで|TITLEに|TITLEへ ExcelのウィンドウタイトルをTITLEに設定する。
・エクセルタイトル取得 Excelのウィンドウタイトルを取得する。
・エクセルステータスバー設定 STRINGで|STRINGに|STRINGへ ExcelのステータスバーをSTRINGに設定する。STRING=「」の時、ステータスバーを標準にする。
・エクセルステータスバー取得 Excelのステータスバーを取得する。
・エクセルステータスバー可視設定 FLAGで|FLAGに|FLAGへ Excelのステータスバーの可視を設定する。(FLAG=1:可視、FLAG=0:不可視)
・エクセルステータスバー可視取得 Excelのステータスバーの可視を取得する。
・エクセル画面更新設定 FLAGで|FLAGに|FLAGへ Excelの画面更新を設定する。(FLAG=1:画面更新あり、FLAG=0:画面更新なし)
・エクセル画面更新取得 Excelの画面更新を取得する。(1:画面更新あり、0:画面更新なし)
' ブック
・エクセルブック追加 Excelに新規ブックを追加する。
・エクセルブック開く FILEを|FILEの|FILEで|FILEから Excelにファイル名を指定してブックを開く。
・エクセルブック保存 FILEを|FILEの|FILEで|FILEへ|FILEに ファイル名を指定して現在のブックを保存する。FILEを省略すると現在のブックを上書き保存する。
・エクセルブックマクロ可能取得 アクティブブックでなでしこからマクロ(VBA)が利用できるか調べる。(1:利用可能、0:利用不可)
・エクセルブック閉じる アクティブブックを保存しないで閉じる。
・エクセルブック保存後閉じる アクティブブックを上書き保存して閉じる。
・エクセルブック変更保存設定 FLAGへ|FLAGに|FLAGで アクティブブックを変更後保存したか設定する。(FLAG=1:変更していないか変更して保存した、FLAG=0:変更したが保存していない)
・エクセルブック変更保存取得 アクティブブックを変更後保存したか取得する。(1:変更していないか変更して保存した、0:変更したが保存していない)
・エクセルブック列挙 開いているブック名を列挙する。
・エクセルブックアクティブ設定 BOOKを|BOOKの|BOOKへ|BOOKで ブックをアクティブにする。(BOOK:ブック名)
・エクセルブックアクティブ取得 アクティブなブック名を取得する。
' シート
・エクセルシート枠線可視設定 FLAGで|FLAGに|FLAGへ Excelのシートの枠線の可視を設定する。(FLAG=1:可視、FLAG=0:不可視)
・エクセルシート枠線可視取得 Excelのシートの枠線の可視を取得する。(1:可視、0:不可視)
' セル
・エクセルセルA1形式変換 CELLSの|CELLSを|CELLSで|CELLSから 「row,col」をA1形式のセル番地に変換する。(row:行番号、col:列番号)
・エクセルセル行番号取得 RANGEの|RANGEを|RANGEで|RANGEから セル番地「RANGE」の行番号を取得する。(RANGE:A1形式のセル番地)
・エクセルセル列番号取得 RANGEの|RANGEを|RANGEで|RANGEから セル番地「RANGE」の列番号を取得する。(RANGE:A1形式のセル番地)
・エクセルセル値取得 RANGEの|RANGEを|RANGEで|RANGEから セル番地「RANGE」の値を取得する。範囲指定しても左上のセルのみが対象。(RANGE:A1形式のセル番地)
・エクセルセル値設定 RANGEへ|RANGEにVALUEを|VALUEで セル番地「RANGE」にVALUEを設定する。範囲指定しても左上のセルのみが対象。(RANGE:A1形式のセル番地)
・エクセルセル式取得 RANGEの|RANGEを|RANGEで|RANGEから セル番地「RANGE」の式を取得する。範囲指定しても左上のセルのみが対象。(RANGE:A1形式のセル番地)
・エクセルセル式設定 RANGEへ|RANGEにEXPを|EXPで セル番地「RANGE」に式「EXP」を設定する。範囲指定しても左上のセルのみが対象。(RANGE:A1形式のセル番地)
・エクセルセル文字取得 RANGEの|RANGEを|RANGEで|RANGEから セル番地「RANGE」の値を文字列として取得する。値を表示形式のまま取得する。範囲指定しても左上のセルのみが対象。(RANGE:A1形式のセル番地)
・エクセルセル文字設定 RANGEへ|RANGEにTEXTを|TEXTで セル番地「RANGE」に文字列「TEXT」を設定する。文字列の前に「'」が付く。範囲指定しても左上のセルのみが対象。(RANGE:A1形式のセル番地)
・エクセルセルシリアル値取得 RANGEの|RANGEを|RANGEで|RANGEから セル番地「RANGE」のシリアル値を取得する。範囲指定しても左上のセルのみが対象。(RANGE:A1形式のセル番地)
・エクセルセルシリアル値設定 RANGEへ|RANGEにVALUEを|VALUEで セル番地「RANGE」にシリアル値「VALUE」を設定する。範囲指定しても左上のセルのみが対象。(RANGE:A1形式のセル番地)
・エクセルセル値範囲取得 RANGE_LTから|RANGE_LTよりRANGE_RBまで|RANGE_RBへ|RANGE_RBを|RANGE_RBの|RANGE_RBで セル番地「RANGE_LT:RANGE_RB」の値を範囲取得する。(RANGE_LT:A1形式の左上セル番地、RANGE_RB:A1形式の右下セル番地)
・エクセルセル値範囲設定 RANGEへ|RANGEにVALUEを|VALUEで セル番地「RANGE」にVALUEを範囲設定する。(RANGE:A1形式のセル番地、VALUE:配列)
・エクセルセル式範囲取得 RANGE_LTから|RANGE_LTよりRANGE_RBまで|RANGE_RBへ|RANGE_RBを|RANGE_RBの|RANGE_RBで セル番地「RANGE_LT:RANGE_RB」の式を取得する。(RANGE_LT:A1形式の左上セル番地、RANGE_RB:A1形式の右下セル番地)
・エクセルセル式範囲設定 RANGEへ|RANGEにEXPを|EXPで セル番地「RANGE」に式「EXP」を設定する。(RANGE:A1形式のセル番地、EXP:配列)
・エクセルセル文字範囲取得 RANGE_LTから|RANGE_LTよりRANGE_RBまで|RANGE_RBへ|RANGE_RBを|RANGE_RBの|RANGE_RBで セル番地「RANGE_LT:RANGE_RB」の式を取得する。(RANGE_LT:A1形式の左上セル番地、RANGE_RB:A1形式の右下セル番地)
・エクセルセル文字範囲設定 RANGEへ|RANGEにTEXTを|TEXT セル番地「RANGE」に文字列「TEXT」を設定する。(RANGE:A1形式のセル番地、TEXT:配列)

 とりあえず、かんたんなものから実装していますが、下記の問題が未解決です。

1.関数(命令)の名前が冗長すぎる
 ごらんのとおり、関数はかならず「エクセル」で始まります。次に対象のオブジェクト「シート」や「セル」が続いて、処理名となります。そのため、「エクセルセル値取得」のように、どうしても長い名前になってしまいます。
 すっきりさせるために、省略形を使ったり、命名ルールを無視するようなことはしたくありません。
2.プロパティとしての関数がほしい
 たとえば、「エクセルセル値取得」と「エクセルセル値設定」の関数のように、データを取得する関数と、データを設定する関数の2種類が必要です。
 ほんとうは、
   「A1」のエクセルセル値を表示
   「A1」のエクセルセル値は「愛」
 という感じに、ひとつの関数で取得と設定を行いたいのですが、プロパティ的な関数の作成方法がわかりません。
3.二次元配列の未実装
 なでしこ2.0には、まだ二次元配列が実装されていません。
 セルの範囲設定や範囲取得がもっと効率よくできればいいのですが。

 このうち、2と3はクジラさんに要望していますが、1だけは頭がイタイところです。
 関数名のわかりやすさを取るか、キータイプのしやすさを取るか、あなたならどっち!?

 なお、開発中のエクセルプラグインのVBプロジェクトはこちらです。VisualStudio2010で開発していますプラグインの様式変更により使用できません。
スポンサーサイト

この記事に含まれるtag : なでしこ2.0 プラグイン Excel 

FC2スレッドテーマ : プログラミング (ジャンル : コンピュータ

(記事編集) http://nadesocha.blog.fc2.com/blog-entry-144.html

2012/04/29 | Comment (0) | Trackback (0) | ホーム | ↑ ページ先頭へ ↑ |

Excelプラグイン途中経過

   ↑  2011/01/29 (土)  カテゴリー: なでしこ全般
 Excel関係のプラグインをちまちまと作っていますが、いまのところここまでしかできていません。ひとつの命令をつくるたびに、いろいろとテストしていますので、結構時間がかかったりしています。
using System;
using System.Collections.Generic;
using System.Text;

using NakoPlugin;
using NakoExcel = Microsoft.Office.Interop.Excel;
using VBIDE = Microsoft.Vbe.Interop;

using System.Windows.Forms; //動作チェック用のダイアログ表示に使用

namespace NakoPluginOfficeExcel
{
public class NakoPluginOfficeExcel : INakoPlugin
{
//--- プラグインの宣言 ---
string _description = "エクセル命令 by 粗茶";
double _version = 1.0; //2011.1.7より作業開始
//--- プラグイン共通の部分 ---
public double TargetNakoVersion { get { return 2.0; } }
public bool Used { get; set; }
public string Name { get { return this.GetType().FullName; } }
public double PluginVersion { get { return _version; } }
public string Description { get { return _description; } }
//--- プラグインの初期化処理 ---
public void PluginInit(INakoInterpreter runner) { }
//--- プラグインの終了処理 ---
public void PluginFin(INakoInterpreter runner) { NakoExcelEnd(); }
//--- 変数の定義 ---
NakoExcel._Application xlApp; //Excelアプリケーション
NakoExcel.Workbooks xlBooks;
NakoExcel._Workbook xlBook;
NakoExcel.Sheets xlSheets;
NakoExcel._Worksheet xlSheet;
NakoExcel.Range xlRange;
VBIDE.VBComponents xlModules;

//--- 関数の定義 ---
public void DefineFunction(INakoPluginBank bank)
{
//エクセル
#region アプリケーション関係
//+アプリケーション
bank.AddFunc("エクセル起動", "FLAGで|FLAGに|FLAGへ", NakoVarType.Void, _xlStart, "エクセルを起動する。FLAG=1:可視、FLAG=0:不可視で起動。", "えくせるきどう");
bank.AddFunc("エクセル終了", "", NakoVarType.Void, _xlEnd, "エクセルを終了する。", "えくせるしゅうりょう");
bank.AddFunc("エクセル起動状態", "", NakoVarType.Int, _xlStarted, "エクセルが起動しているか確認する。1:起動している。0:起動していない。", "えくせるきどうじょうたい");
bank.AddFunc("エクセルバージョン", "", NakoVarType.String, _xlVer, "エクセルのバージョンを取得して返す。", "えくせるばーじょん");
bank.AddFunc("エクセル可視変更", "FLAGで|FLAGに|FLAGへ", NakoVarType.Void, _xlVisibleSet, "エクセルの可視を変更する。FLAG=1:可視、FLAG=0:不可視", "えくせるかしへんこう");
bank.AddFunc("エクセル可視状態", "", NakoVarType.Int, _xlVisibleGet, "エクセルの可視を取得して返す。1:可視、0:不可視。", "えくせるかしじょうたい");
bank.AddFunc("エクセル警告変更", "FLAGで|FLAGに|FLAGへ", NakoVarType.Void, _xlAlertSet, "エクセルの警告を変更する。FLAG=1:警告有り、FLAG=0:警告無視。", "えくせるけいこくへんこう");
bank.AddFunc("エクセル警告状態", "", NakoVarType.Int, _xlAlertGet, "エクセルの警告を取得して返す。1:警告有り、0:警告無視。", "えくせるけいこくじょうたい");
bank.AddFunc("エクセル窓変更", "STATEで|STATEに|STATEへ", NakoVarType.Void, _xlWindowStateSet, "エクセルのウインドウを最大化・最小化する。STATE=「最大化|最小化|標準」", "えくせるまどへんこう");
bank.AddFunc("エクセル窓状態", "", NakoVarType.String, _xlWindowStateGet, "エクセルのウインドウ状態を取得して返す。「最大化|最小化|標準」", "えくせるまどじょうたい");
bank.AddFunc("エクセルタイトル変更", "TITLEで|TITLEに|TITLEへ", NakoVarType.Void, _xlTitleSet, "エクセルのウインドウタイトルをTITLEに変更する。", "えくせるたいとるへんこう");
bank.AddFunc("エクセルタイトル状態", "", NakoVarType.String, _xlTitleGet, "エクセルのウインドウタイトルを取得して返す。", "えくせるたいとるじょうたい");
bank.AddFunc("エクセルステータスバー変更", "MSGで|MSGに|MSGへ", NakoVarType.Void, _xlStatusbarTextSet, "エクセルのステータスバーの内容をMSGに変更する。", "えくせるすてーたすばーへんこう");
bank.AddFunc("エクセルステータスバー状態", "", NakoVarType.String, _xlStatusbarTextGet, "エクセルのステータスバーの内容を取得して返す。", "えくせるすてーたすばーじょうたい");
bank.AddFunc("エクセルステータスバー標準", "", NakoVarType.Void, _xlStatusbarTextNormal, "エクセルのステータスバーの内容を元に戻す。", "えくせるすてーたすばーひょうじゅん");
bank.AddFunc("エクセルステータスバー可視変更", "FLAGで|FLAGに|FLAGへ", NakoVarType.Void, _xlStatusbarVisibleSet, "エクセルのステータスバーの表示を変更する。FLAG=1:表示、FLAG=0:非表示。", "えくせるすてーたすばーかしへんこう");
bank.AddFunc("エクセルステータスバー可視状態", "", NakoVarType.Int, _xlStatusbarVisibleGet, "エクセルのステータスバーの表示状態を取得して返す。1:表示、0:非表示。", "えくせるすてーたすばーかしじょうたい");
bank.AddFunc("エクセル枠線表示変更", "FLAGで|FLAGに|FLAGへ", NakoVarType.Void, _xlGridlineVisibleSet, "エクセルのセル枠線の表示を変更する。FLAG=1:表示、FLAG=0:非表示。", "えくせるわくせんひょうじへんこう");
bank.AddFunc("エクセル枠線表示状態", "", NakoVarType.Int, _xlGridlineVisibleGet, "エクセルのセル枠線の表示を取得して返す。1:表示、0:非表示。", "えくせるわくせんひょうじじょうたい");

#endregion
#region ブック関係
//+ブック
bank.AddFunc("エクセルブック追加", "", NakoVarType.Void, _xlBookAdd, "エクセルに新規ブックを追加。", "えくせるぶっくついか");
bank.AddFunc("エクセルブック開く", "FILEを|FILEで|FILEから", NakoVarType.Void, _xlBookOpen, "エクセルにFILE(ブックのパス)を開く。", "えくせるぶっくひらく");
bank.AddFunc("エクセルブック保存", "FILEを|FILEで|FILEに|FILEへ", NakoVarType.Void, _xlBookSaveAs, "", "");

#endregion
}
//--- Define Method ---
#region アプリケーション関係
//エクセル起動
public Object _xlStart(INakoFuncCallInfo info)
{
if (xlApp == null)
{
long arg = info.StackPopAsInt();
xlApp = new NakoExcel.Application { Visible = (arg != 0) }; //arg:0以外はtrue
xlBooks = xlApp.Workbooks;
}
return null;
}
//エクセル終了
public Object _xlEnd(INakoFuncCallInfo info)
{
NakoExcelEnd();
return null;
}
void NakoExcelEnd()
{
if (xlApp != null)
{
xlApp.DisplayAlerts = false;
xlApp.Quit(); //Excel終了
xlApp = null;
//GC.Collect();
}
}
//エクセル起動状態
public Object _xlStarted(INakoFuncCallInfo info)
{
int i = (xlApp != null) ? 1 : 0;
return i;
}
//エクセルバージョン
public Object _xlVer(INakoFuncCallInfo info)
{
if (xlApp != null) return xlApp.Version;
return "-1"; //Excelが起動していない
}
//エクセル可視変更
public Object _xlVisibleSet(INakoFuncCallInfo info)
{
if (xlApp != null)
{
long arg = info.StackPopAsInt();
xlApp.Visible = (arg != 0); //arg:0以外はtrue
}
return null;
}
//エクセル可視状態
public Object _xlVisibleGet(INakoFuncCallInfo info)
{
int i = (xlApp != null && xlApp.Visible == true) ? 1 : 0;
return i;
}
//エクセル警告変更
public Object _xlAlertSet(INakoFuncCallInfo info)
{
if (xlApp != null)
{
long arg = info.StackPopAsInt();
xlApp.DisplayAlerts = (arg != 0); //arg:0以外はtrue
}
return null;
}
//エクセル警告状態
public Object _xlAlertGet(INakoFuncCallInfo info)
{
int i = (xlApp != null && xlApp.DisplayAlerts == true) ? 1 : 0;
return i;
}
//エクセル窓変更
public Object _xlWindowStateSet(INakoFuncCallInfo info)
{
if (xlApp != null)
{
string arg = info.StackPopAsString();
NakoExcel.XlWindowState state = NakoExcel.XlWindowState.xlNormal;
switch (arg)
{
case "最大化":
state = NakoExcel.XlWindowState.xlMaximized;
break;
case "最小化":
state = NakoExcel.XlWindowState.xlMinimized;
break;
case "標準":
state = NakoExcel.XlWindowState.xlNormal;
break;
default:
state = xlApp.WindowState; //現在の状態
//throw new NakoPluginRuntimeException("エクセル窓変更の引数に「最大化|最小化|標準」以外の文字列が指定されました。");
break;
}
xlApp.WindowState = state;
}
return null;
}
//エクセル窓状態
public Object _xlWindowStateGet(INakoFuncCallInfo info)
{
if (xlApp != null)
{
NakoExcel.XlWindowState state = xlApp.WindowState;
switch (state)
{
case NakoExcel.XlWindowState.xlMaximized:
return "最大化";
case NakoExcel.XlWindowState.xlMinimized:
return "最小化";
case NakoExcel.XlWindowState.xlNormal:
return "標準";
}
}
return "-1"; //Excelが起動していない
}
//タイトル変更
public Object _xlTitleSet(INakoFuncCallInfo info)
{
if (xlApp != null && xlBooks != null)
{
xlApp.ActiveWindow.Caption = info.StackPopAsString();
}
return null;
}
//タイトル状態
public Object _xlTitleGet(INakoFuncCallInfo info)
{
if (xlApp != null && xlBooks != null)
{
return xlApp.ActiveWindow.Caption;
}
return "-1"; //Excelが起動していない or Bookがひとつもない
}
//ステータスバー変更
public Object _xlStatusbarTextSet(INakoFuncCallInfo info)
{
if (xlApp != null)
{
string arg = info.StackPopAsString();
xlApp.StatusBar = arg;
}
return null;
}
//ステータスバー状態
public Object _xlStatusbarTextGet(INakoFuncCallInfo info)
{
if (xlApp != null) { return xlApp.StatusBar; }
return "";
}
//ステータスバー標準
public Object _xlStatusbarTextNormal(INakoFuncCallInfo info)
{
if (xlApp != null)
{
xlApp.StatusBar = false;
}
return null;
}
//ステータスバー可視変更
public Object _xlStatusbarVisibleSet(INakoFuncCallInfo info)
{
if (xlApp != null)
{
long arg = info.StackPopAsInt();
xlApp.DisplayStatusBar = (arg != 0); //arg:0以外はtrue
}
return null;
}
//ステータスバー可視状態
public Object _xlStatusbarVisibleGet(INakoFuncCallInfo info)
{
int i = (xlApp != null && xlApp.DisplayStatusBar == true) ? 1 : 0;
return i;
}
//枠線表示変更
public Object _xlGridlineVisibleSet(INakoFuncCallInfo info)
{
if (xlApp != null && xlBooks != null)
{
long arg = info.StackPopAsInt();
xlApp.ActiveWindow.DisplayGridlines = (arg != 0); //arg:0以外はtrue
}
return null;
}
//枠線表示状態
public Object _xlGridlineVisibleGet(INakoFuncCallInfo info)
{
int i = (xlApp != null && xlBooks != null && xlApp.ActiveWindow.DisplayGridlines == true) ? 1 : 0;
return i;
}
#endregion
#region ブック関係
//ブック追加
public Object _xlBookAdd(INakoFuncCallInfo info)
{
if (xlApp != null)
{
xlBooks.Add();
AfterBookOpen();
}
return null;
}
//ブック開く
public Object _xlBookOpen(INakoFuncCallInfo info)
{
if (xlApp != null)
{
string filename = info.StackPopAsString();
if (!System.IO.File.Exists(filename))
{ throw new NakoPluginRuntimeException("ファイル『" + filename + "』は存在しません。"); }
xlBooks.Open(filename);
AfterBookOpen();
}
return null;
}
void AfterBookOpen()
{
xlBook = xlBooks[xlBooks.Count];
xlBook.Activate();
xlSheets = xlBook.Worksheets;
xlSheet = xlSheets[1];
xlSheet.Activate();
}
//ブック保存
public Object _xlBookSaveAs(INakoFuncCallInfo info)
{
if (xlApp != null && xlBook != null)
{
bool flag = xlApp.DisplayAlerts;
string filename = info.StackPopAsString();
object format = NakoExcel.XlFileFormat.xlWorkbookNormal;
xlApp.DisplayAlerts = false;
if (filename == "")
{
xlBook.Save(); //ファイル名指定なければ上書き保存
xlApp.DisplayAlerts = flag;
return null;
}
string ext = System.IO.Path.GetExtension(filename);
ext = ext.ToLower();
switch (ext)
{
case ".xlsx":
if (double.Parse(xlApp.Version) < 12.0)
{ throw new NakoPluginRuntimeException("Excel2007以上でなければ拡張子.xlsx形式で保存できません。"); }
//マクロを含んだBookをxlsx形式で保存すれば、マクロを削除して保存する仕様です。
//次の2行のコメントを外すと、自動的にxlsm形式(マクロあり)で保存します。
//xlModules = xlBook.VBProject.VBComponents;
//if (xlModules != null) goto case ".xlsm"; //マクロを含んでいれば.xlsm
format = NakoExcel.XlFileFormat.xlOpenXMLWorkbook;
break;
case ".xls":
if (double.Parse(xlApp.Version) < 12.0) { format = NakoExcel.XlFileFormat.xlExcel9795; }
else { format = NakoExcel.XlFileFormat.xlExcel8; } //Excel2007以上の場合
break;
case ".xlsm":
if (double.Parse(xlApp.Version) < 12.0)
{ throw new NakoPluginRuntimeException("Excel2007以上でなければ拡張子.xlsm形式で保存できません。"); }
format = NakoExcel.XlFileFormat.xlOpenXMLWorkbookMacroEnabled;
ext = ".xlsm";
break;
case ".csv":
format = NakoExcel.XlFileFormat.xlCSV;
break;
case ".txt":
format = NakoExcel.XlFileFormat.xlUnicodeText;
break;
case ".pdf":
if (double.Parse(xlApp.Version) < 12.0)
{ throw new NakoPluginRuntimeException("Excel2007以上でなければ拡張子.pdf形式で保存できません。"); }
break;
default:
throw new NakoPluginRuntimeException("保存形式が無効です。");
}
filename = System.IO.Path.ChangeExtension(filename, ext);
if (ext == ".pdf") { xlSheet.ExportAsFixedFormat(NakoExcel.XlFixedFormatType.xlTypePDF, filename); }
else { xlBook.SaveAs(filename, format); }
xlApp.DisplayAlerts = flag;
}
return null;
}
#endregion

/*
* --- マクロを扱う命令は、ユーザー側がExcelで次の設定が必要 ---
* (Excel2002、2003の場合)
* ツール>マクロ>セキュリティ>信頼できる発行元>Visual Basicプロジェクトへのアクセスを信頼するをオン
* (Excel2007、2010の場合)
* リボンの「開発」タブ>マクロのセキュリティ>VBAプロジェクトオブジェクトモデルへのアクセスを信頼するをオン
* ※「プログラミングによるVisual Basicプロジェクトへのアクセスは信頼性に欠けます」というエラーメッセージが出ないようになる。
*/
}
}

この記事に含まれるtag : なでしこ2.0 プラグイン C# Excel 

FC2スレッドテーマ : プログラミング (ジャンル : コンピュータ

(記事編集) http://nadesocha.blog.fc2.com/blog-entry-139.html

2011/01/29 | Comment (0) | Trackback (0) | ホーム | ↑ ページ先頭へ ↑ |

C#とエクセル

   ↑  2010/10/31 (日)  カテゴリー: C#

プラグインでエクセル起動


 プラグインからエクセルを操作してみました。

 通常、C#からエクセルを操作するには、COMオブジェクトを利用するわけですが、COMオブジェクトはアンマネージドであり、アプリケーションの終了時に参照カウントを解放(メモリ解放)しなければ、プロセスに残ってしまうという問題があります。

 C#とCOM連携についてインターネットで検索すると、皆さんこの参照カウントの解放に苦労されています。しかしながら、Visual Studio 2010になり、フレームワークが.NET Framework 4になったことにより、どうやら自動的にメモリ解放されるようで、開発時にCOMオブジェクトの参照カウントを意識しなくても良いらしいです。(本当のところはわかりませんので、詳しい方は教えて下さい)

COMオブジェクトの実例


 Visual C# 2010 Expressにおいて、対象のフレームワークを「.NET Framework 4」に設定し、次のプロジェクトをビルドして実行します。デバッグのままだと、参照カウントが残ってしまいますので注意です。

プロジェクト名:NakoPluginSocha3
参 照 設 定:Libnako、Microsoft.CSharp、Microsoft.Office.Interop.Excel、System、System.Windows.Forms
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using NakoPlugin;
using Excel = Microsoft.Office.Interop.Excel;
//using System.Runtime.InteropServices;

namespace NakoPluginSocha3
{
public class NakoPluginSocha3 : INakoPlugin
{
//--- プラグインの宣言 ---
string _description = "エクセル操作テスト by 粗茶";
double _version = 1.0;
//--- プラグイン共通の部分 ---
public double TargetNakoVersion { get { return 2.0; } }
public bool Used { get; set; }
public string Name { get { return this.GetType().FullName; } }
public double PluginVersion { get { return _version; } }
public string Description { get { return _description; } }
//--- 関数の定義 ---
public void DefineFunction(INakoPluginBank bank)
{
bank.AddFunc("エクセル処理", "", NakoVarType.Void, _xl, "エクセルを開いてセルの値を取得する", "えくせるしょり");
}
// プラグインの初期化処理
public void PluginInit(INakoInterpreter runner)
{
}
// プラグインの終了処理
public void PluginFin(INakoInterpreter runner)
{
}
// Define Method
public Object _xl(INakoFuncCallInfo info)
{
dynamic xlApp = new Excel.Application { Visible = true };
var xlBooks = xlApp.Workbooks;
var xlBook = xlBooks.Open(@"Sample.xlsx"); //ファイルをフルパスで指定
var xlSheets = xlBook.Worksheets;
var xlSheet = xlSheets[1];
var xlCells = xlSheet.Cells;
var xlRange = xlCells[1, 1];

var a1val = xlRange.Value2;

//--- COMオブジェクト解放 ---
//Marshal.ReleaseComObject(xlRange);
//Marshal.ReleaseComObject(xlCells);
//Marshal.ReleaseComObject(xlSheet);
//Marshal.ReleaseComObject(xlSheets);

xlBook.Close(false);

//--- COMオブジェクト解放 ---
//Marshal.ReleaseComObject(xlBook);
//Marshal.ReleaseComObject(xlBooks);

xlApp.Quit();

//--- COMオブジェクト解放 ---
//Marshal.ReleaseComObject(xlApp);

MessageBox.Show(a1val.ToString());

return null;
}
}
}

なでしこプログラム


エクセル処理。

 実行すると、エクセルを起動し、指定したブックを開いて、最初のシートにあるA1セルの値を取得します。

 実行後は、DemoCNako2のProgram.csにより、コンソールが開いたままとなります。この時点ではまだ、プロセスにEXCEL.EXEが残っています。

 Enterキーを押してコンソールを終了します。この時点で、プロセスにEXCEL.EXEが残っていないことが確認できました。

COM解放を検証してみる

この記事に含まれるtag : なでしこ2.0 プラグイン C# Excel 

FC2スレッドテーマ : プログラミング (ジャンル : コンピュータ

(記事編集) http://nadesocha.blog.fc2.com/blog-entry-138.html

2010/10/31 | Comment (0) | Trackback (0) | ホーム | ↑ ページ先頭へ ↑ |

なでしこ2.0のプラグイン作成2

   ↑  2010/10/16 (土)  カテゴリー: なでしこ全般
 プラグインの中に変数を作成し、値を保持してみました。

プラグインのプログラム


using System;
using System.Text;

using NakoPlugin;
using System.Windows.Forms;

namespace NakoPluginSocha2
{
public class NakoPluginSocha2 : INakoPlugin
{
//--- プラグインの宣言 ---
string _description = "粗茶テストプラグイン2";
double _version = 1.0;
//--- プラグイン共通の部分 ---
public double TargetNakoVersion { get { return 2.0; } }
public string Name { get { return this.GetType().FullName; } }
public double PluginVersion { get { return _version; } }
public string Description { get { return _description; } }
public bool Used { get; set; }
//--- 関数の定義 ---
public void DefineFunction(INakoPluginBank bank)
{
bank.AddFunc("加算", "Numを", NakoVarType.Int, _add, "Num加える", "かさん");
bank.AddFunc("減算", "Numを", NakoVarType.Int, _sub, "Num減らす", "げんさん");
}

// Define Method 実際の動作を定義する
long myInt = 0;
string myTitle = "";

public Object _add(INakoFuncCallInfo info)
{
long myValue = info.StackPopAsInt();
myInt += myValue;
myTitle = myTitle + "+" + myValue;
MessageBox.Show(myInt.ToString(),myTitle);
return myInt;
}

public Object _sub(INakoFuncCallInfo info)
{
long myValue = info.StackPopAsInt();
myInt -= myValue;
myTitle = myTitle + "-" + myValue;
MessageBox.Show(myInt.ToString(), myTitle);
return myInt;
}

// アプリ開始時に実行する処理
public void PluginInit(INakoInterpreter runner)
{
}

// アプリ終了時に実行する処理(メモリの解放など)
public void PluginFin(INakoInterpreter runner)
{
}
}
}

 myIntとmyTitleは、命令ごとの処理が終了してもそのままの値を保持しています。

なでしこプログラム部分


"1を加算。2を加算。"+
"3を加算。4を減算。"+
"それを言う。";

この記事に含まれるtag : なでしこ2.0 プラグイン C# 

FC2スレッドテーマ : プログラミング (ジャンル : コンピュータ

(記事編集) http://nadesocha.blog.fc2.com/blog-entry-137.html

2010/10/16 | Comment (0) | Trackback (0) | ホーム | ↑ ページ先頭へ ↑ |

なでしこ2.0のプラグイン作成

   ↑  2010/10/02 (土)  カテゴリー: なでしこ全般

プラグインの実装


 なでしこ2.0が開発中ですが、現在プラグインが実装されましたので、自由に命令を追加することができるようになりました。

プラグインを作ってみる


 そこで、ちょっとテスト的に簡単なプラグインを作ってみました。
 ビルドしてみたところ、きちんと動作しました。感動!!
using System;
using System.Collections.Generic;
using System.Text;

using NakoPlugin;
using System.Windows.Forms;

namespace NakoPluginSocha
{
public class NakoPluginSocha : INakoPlugin
{
//--- プラグインの宣言 ---
string _description = "粗茶テストプラグイン";
double _version = 1.0;
//--- プラグイン共通の部分 ---
public double TargetNakoVersion { get { return 2.0; } }
public string Name { get { return this.GetType().FullName; } }
public double PluginVersion { get { return _version; } }
public string Description { get { return _description; } }
public bool Used { get; set; }
//--- 関数の定義 ---
public void DefineFunction(INakoPluginBank bank)
{
//引数なし、戻り値なし
bank.AddFunc("粗茶する", "", NakoVarType.Void, _sochaMethod, "自己紹介す。", "そちゃする");
//引数あり、戻り値(文字列)
bank.AddFunc("飛行机する", "SとAを", NakoVarType.String, _kujiraMethod, "S(文字列)にA(数値)を連結して、結果を「それ」に返す。", "ひこうづくえする");
}

// Define Method 実際の動作を定義する
public Object _sochaMethod(INakoFuncCallInfo info)
{
string myName;
myName = "私の名前は粗茶です。";
MessageBox.Show(myName, "これはテストです。", MessageBoxButtons.OK);
return null;
}

public Object _kujiraMethod(INakoFuncCallInfo info)
{
string s = info.StackPopAsString();
string a = info.StackPopAsString();
return s + a;
}

// アプリ開始時に実行する処理
public void PluginInit(INakoInterpreter runner)
{
}


// アプリ終了時に実行する処理(メモリの解放など)
public void PluginFin(INakoInterpreter runner)
{
}
}
}


プラグインの作り方


Visual Studio 2010の場合


 プロジェクトを開くと、Visual Studio 変換ウィザードが開きます。
 これは、なでしこ2.0が.NET Frameworkの古いバージョン(3.5)で作成されているためです。ウィザードの画面では「完了」をクリックします。

プロジェクトを作成する


 プロジェクトを作成または追加します。dllを作成するので、クラスライブラリを選択します。
 プロジェクト名はプラグイン名にします。
NakoPluginSocha

ファイル名を変更する


 ファイル名がデフォルトのままならば、プラグイン名と同じに変更します。
NakoPluginSocha.cs

参照設定を変更する


 参照設定で不要なものを削除します。
 参照の追加などで、必要なものを追加します。(Libnakoは必須です)
 プログラムの先頭にあるusingを編集します。
using System;
using System.Collections.Generic;
using System.Text;

using NakoPlugin;
using System.Windows.Forms;

クラスにインターフェースを継承する


 クラスにINakoPlugin(インターフェース)を継承します。
    public class NakoPluginSocha : INakoPlugin

TargetNakoVersionプロパティ


 対応プラグインのバージョン番号。なでしこのどのバージョン用のプラグインかを表します。なでしこ2.0用のプラグインですので、return 2.0とします。(読み取り専用)
    	public double TargetNakoVersion { get { return 2.0; } }

Nameプロパティ


 クラスの名前を返すプロパティです。次の通りそのまま記入します。(読み取り専用)
        public string Name { get { return this.GetType().FullName; } }

PluginVersionプロパティ


 このプラグインのバージョンを返すプロパティです。任意の値をreturnの後に設定します。(読み取り専用)
    	double _version = 1.0;
public double PluginVersion { get { return _version; } }

Descriptionプロパティ


 このプラグインの説明を返すプロパティです。(読み取り専用)
    	string _description = "粗茶テストプラグイン";
public string Description { get { return _description; } }

Usedプロパティ


 プラグインが利用されたかどうかを判別するのに使用されます。次の通りそのまま記入します。
        public bool Used { get; set; }

命令の登録


 命令の名前や引数、プログラムなどをシステムに登録します。
 public void DefineFunction(INakoPluginBank bank)の中に、bank.AddFuncで「命令の名前、引数の定義、関数の戻り値、実際に処理を行うC#のデリゲート、関数の説明、命令のよみがな」の順に記述します。
        public void DefineFunction(INakoPluginBank bank)
{
//引数なし、戻り値なし
bank.AddFunc("粗茶する", "", NakoVarType.Void, _sochaMethod, "自己紹介する。", "そちゃする");
//引数あり、戻り値(文字列)
bank.AddFunc("飛行机する", "SとAを", NakoVarType.String, _kujiraMethod, "S(文字列)にA(数値)を連結して、結果を「それ」に返す。", "ひこうづくえする");
}

 引数が不要な場合は、""とします。
 戻り値が無い場合は、NakoVarType.Voidとします。
 NakoVarType.Stringは、戻り値が文字列であることを表します。戻り値は「それ」に入ります。

命令の定義


 実際に命令の挙動を定義します。
 public Object 命令(INakoFuncCallInfo info)の中に記述します。
        public Object _sochaMethod(INakoFuncCallInfo info)
{
string myName;
myName = "私の名前は粗茶です。";
MessageBox.Show(myName, "これはテストです。", MessageBoxButtons.OK);
return null;
}

 「粗茶する」命令は、挨拶のダイアログを表示します。
 戻り値が無い場合は、return nullとします。
        public Object _kujiraMethod(INakoFuncCallInfo info)
{
string s = info.StackPopAsString();
string a = info.StackPopAsString();
return s + a;
}

 「飛行机する」命令は、ふたつの引数を連結して返します。
 引数は、info.StackPopAsString()で、第1引数から順に取り出します。この場合は文字列として取り出します。

エラー処理


 プラグインの中でエラーが発生したことを伝えるには、次のようにエラーメッセージを投げることができます。
throw new NakoPluginRuntimeException("エラーメッセージ");

プラグインの初期化


 最初にプラグインが呼び出された時に実行する部分です。INakoInterpreterを引数にとることで、複数のなでしこエディタを起動している場合に、どのエディタから呼び出されたのか判断できます。
 今回は何もしませんので、空っぽのままです。
        // アプリ開始時に実行する処理
public void PluginInit(INakoInterpreter runner)
{
}

プラグインの終了


 プログラムが終了するときに実行する部分です。オブジェクトを手動で開放するなど、安全に終了できるようにします。
 今回は何もしませんので、空っぽのままです。
        // アプリ終了時に実行する処理(メモリの解放など)
public void PluginFin(INakoInterpreter runner)
{
}

メインプログラム


 メインプログラムで、なでしこプログラムを書きます。(現在は、DemoCNako2のprogram.csに書きます。)
            compiler.DirectSource =
"粗茶する。" +
"「日本語」と「プログラミング」を飛行机する。" +
"それを言う。";

 また、メインプログラムの参照設定にプロジェクトNakoPluginSochaを追加します。

ビルド


 ビルド(デバッグではない)してバイナリを作成します。
 メインプログラムのフォルダに、bin\Debug\フォルダがあり、その中にプログラム(exe)とプラグイン(dll)が作成されているはずです。

実行結果


20101013235939.gif
20101013235938.gif
20101013235936.gif



この記事に含まれるtag : なでしこ2.0 C# プラグイン 

FC2スレッドテーマ : プログラミング (ジャンル : コンピュータ

(記事編集) http://nadesocha.blog.fc2.com/blog-entry-136.html

2010/10/02 | Comment (0) | Trackback (0) | ホーム | ↑ ページ先頭へ ↑ |
申し訳ありません。 お探しの記事は現在、この ユーザーtag (Keyword) を設定していない可能性があります。 右の検索BOXで 再度用語を短めに入力していただくと記事が見つかる場合があります。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。