このBlogは移転しました。今後は aish.dev を御覧ください。

僕たちPythonistaは、プログラミングに、Excelを使います!

みんな、Excel使ってますか!?もちろん使ってますね!?休暇届も、作業日報も、見積書も、スケジュール表も、みーんなExcelですね!? もちろん、プログラミングだってExcelですね!? 当然です!みんなそうやって仕事してるんです! Excel版のTwitter公式クライアントはまだリリースされないんでしょうか!?

だけど、Excelでコーディングしてると、ときどきちょっとだけ不便に感じることがありますね!いちいちテキストファイルに落としてから実行しなければならないからです!テキストファイルなんて低級なフォーマットには関わりたくないですね!

でもPythonなら!Pythonなら大丈夫!Pythonなら直接Excelファイルを実行できます!Pythonにはパッケージの配布フォーマットとしてeggという形式が普及していますが、eggはもう古いですね! これからはxls形式を使いましょう!xlsフォーマットでスクリプトを配布、実行しましょう!

使い方は簡単!まず、次のコードをexcelimporter.pyという名前で保存します!

import os, sys, imp
import win32com.client

sys.path_importer_cache.clear()
xl = win32com.client.Dispatch("Excel.Application")

class ExcelImp:
    @classmethod
    def get_importer(cls, path):
        if os.path.splitext(path)[1] in ('.xls', '.xlsx'):
            ret = cls()
            ret.wb = xl.workbooks.Open(path)
            return ret
        else:
            raise ImportError

    def __del__(self):
        if self.wb:
            self.wb = None
            
    def find_module(self, fullname, path=None):
        for name in self.wb.names:
            name, ext = os.path.splitext(name.name)
            if name == fullname and ext == '.py':
                return self

    def load_module(self, fullname):
        code = self._readcode(fullname)
        mod = sys.modules.setdefault(fullname, imp.new_module(fullname))
        mod.__file__ = "<%s>" % self.__class__.__name__
        mod.__loader__ = self
        exec code in mod.__dict__
        return mod

    def _readcode(self, fullname):
        name = self.wb.names[fullname+'.py']
        ret = []
        for row in name.RefersToRange.value:
            row = "".join(("\t" if s is None else s) for s in row)
            ret.append(row)
        return "\n".join(ret)

sys.path_hooks.append(ExcelImp.get_importer)

保存したexcelimporter.pyを、環境変数PYTHONSTARTUPに指定します!こんな感じですね!

set PYTHONSTARTUP=c:\script\excelimporter.py

次にExcelファイルを用意しましょう!ワークシートにスクリプトを書き、スクリプトのセル範囲に名前を付けます!この時、名前は末尾に「.py」を付けてください!「excelmodule.py」みたいな感じです!

Excelファイルが出来たら、このファイルを今度は環境変数PYTHONPATHに指定します!

set PYTHONPATH=c:\script\fib.xls

これで準備OK!実行してみましょう!

>>> import fib1   # fib.xlsファイルから、fib1モジュールをインポート
>>> fib1.fib1(10) # 実行!
89
>>>

素晴らしい!もうテキストファイルなんかとはおさらばです!レッツエンジョイ!エンジョイExcelライフ!