僕たち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 >>>