開発」カテゴリーアーカイブ

Excel のマクロを Python で書く。

みむらです。IronPython ってのがあるので、ちょちょいと。

仕組みとしては、Visual Studio の VSTO (Visual Studio Tools for Office) を使って、
Office 向けのアドインを作って、その中で IronPython を動かそうーってこと。

359870206

結果としてはこんな感じ!

とりあえず、VSTO の書き方とかは割愛して。

ソースはここに:
https://github.com/mimura1133/mm_Python_for_Excel

using Microsoft.Scripting.Hosting;
using IronPython.Hosting;

namespace ExcelAddIn1
{
    public partial class ThisAddIn
    {
        public static string Code = "";

        static ScriptEngine _python;
        static ScriptScope _python_scope;

        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            _python = Python.CreateEngine();
            _python_scope = _python.CreateScope();
            _python_scope.SetVariable("Application", Application);
            _python_scope.SetVariable("Function", Application.WorksheetFunction);
            _python_scope.SetVariable("Cells", Application.Cells);
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        public static void Run()
        {
            var cc =_python.CreateScriptSourceFromString(Code);
            cc.Execute(_python_scope);
        }

        #region VSTO generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }

        #endregion
    }
}

メインソースはこんな感じ!

Python.CreateEngine() で、 Python のエンジン作って、

Scope に対して、 SetVariable を使って、参照をがしがし。( python で言うところの、 import )

あと、どこかから Run が実行されたらコンパイルして実行する仕掛け。

動作例ですと、「Run」 ボタンですね。

これ使った場合、 Function 以下に、Excel の関数が存在していて、

Cells 以下に、各セル情報が入っているので、キー入力を捕まえてくれば、Python によるマクロも可能かも。

制作時間30分だから、とっても汚くて、実装がふざけた感じになっているけど、許してね。

github によるソースコード開示。

みむらです。

制作したソフトウェアは、私が作成した物に関してはすべてソースコードは公開可能なものとして、
以前から要求があった際にはいつでも開示していました。

ただ、github を始めとする、ソースコードを共有するためのツールが近年発展しているのを受け、
こちらでも github を活用したソースコード開示を行う事としました。

ただし、特に昔制作したソフトウェアに関して、2バイト文字をファイル名として利用しているケース、
また、内部に公開出来ない部分が含まれている場合(ライセンス、ソースコードが汚すぎる場合など)に関しては、
公には開示せず、今まで通りの方法を採ることとしました。

随時公開可能となった物に関しては、公開予定でいますが、
別途連絡を頂ければ、いつでも公開可能です。

github : https://github.com/mimura1133/

ではでは。

Python + pywin32 で COM 叩いてしゃべらせる。

どうもみむらです。
普段は SUA (UNIX 互換環境) 上で叩いているのですが、
今日は堂々と Windows 上で叩いてみます。

PyWin32 ってのをつかって、 COM コントロールを叩いてみます。

とりあえず。COM コントロールとは。

Microsoft社が提唱する、部品化されたプログラムを作成・利用するための基盤となる技術仕様。特定の機能のみを持つプログラム部品を組み合わせることでアプリケーションソフトの開発が容易になる。この仕様に基づいてデータのやりとりができるプログラム部品のことをCOMコンポーネントと呼ぶ。

COMとは【Component Object Model】 – 意味-解説-説明-定義 : IT用語辞典

だそーです! (ぉ

夢のある話をすると、COM コントロールを使うことで、
音声認識や音声合成、各種 Office アプリケーションの制御、その他 COM コンポーネントが提供する機能を
使うことが出来ます。


1.Python の導入

http://www.python.jp/Zope/download/pythoncore
上記URL から、 Python 2.x 系をインストールします。

えーと、Python 3.x 系はいろいろと変わったようで。でも動くのかなぁ。うーん

2.Python for Windows extensions の導入

http://sourceforge.net/projects/pywin32/files/pywin32/
ここから最新ビルド(一覧の 「Build???」 の数字が一番大きい物を選択)のうちの、
上で導入したバージョンと同じ物(無ければ近いバージョン)をインストール。

3.叩く。

ばんばん! ちがいます。
スタートメニューから Python を立ち上げて、

image

このように立ち上げておきます。

続けて、

import win32com.client

とタイプ。

image

今回は音声合成ということで、「Sapi.SpVoice」を使って、

Speak メソッドを叩いてしゃべらせます。

もし今回使う、「Microsoft Speech API」が気になる人は、

http://msdn.microsoft.com/en-us/library/ms723602(v=VS.85).aspx

この辺の資料を参考にして下さい。

speech = win32com.client.Dispatch("Sapi.SpVoice")
speech.Speak("Hello Python World!")

実行しますと、Win7 / Vista 環境では、多分、米国英語のおねいさんが

しゃべってくれると思います。

XP 環境ですと、なんか相当声のしゃくれたおっちゃんがしゃべってくれた気がします。

・・試してないですが。

とりあえずこんな感じでー。

WPConnect を自動的に立ち上げる。

Windows Phone 7 で MediaElement でごにょりたいときとか。

Zune を終了して、WPConnect を立ち上げる作業、
毎回の開発時に行うのは実に面倒くさい。
ということで、バッチファイルを書いてみました。

32bit 用 : [WPConnect_x86.bat]
64bit 用 : [WPConnect_x64.bat]

ダウンロードして、デバイスを接続し、起動してください。
立ち上げると、自動的に Zune を強制終了し、 WPConnect を立ち上げます。

なにげに Windows Phone の MediaElement は拡張子を見る。

MediaElement にファイルを指定する場合、

this._media.Source = new Uri(“http://mimumimu.net/hello.mp4”);

だったり、

var stream = new IsolatedStorageFileStream(“hoge.mp4”,FileMode.Open,IsolatedStorageFile.GetUserStoreForApplication());
this._media.SetSource(stream);

なんていう方法をとるわけですが、

ここで、一部の形式のファイルに関しては、拡張子を見てファイル形式を判定するようで、
特に mp4 の場合、拡張子の最後が .mp4 でないと、動いてくれません。

もちろんこれは、 Source = new Uri(); とする場合はもちろんのこと、
SetSource(); する場合でも、拡張子を参照するようです。

ブレークポイントを設定して眺めてみますと、
image

ってことで、ばっちりファイルパスが格納されてますし、
Name プロパティで取得出来るので、絶対判断基準に使ってます。

ってことで、Windows Phone 7 で MediaElement が絶対対応している形式なのに、
読んでくれないっていうことがあれば、拡張子が原因の可能性があります。 ということで。