RubyでExcel三昧
その後半年は、ひたすらこれを使い倒しました。
ちょうど仕事でピボットテーブルを量産しないといけなかったので、そのためのラッパークラスをごりごり書いたりしてました。ピボットテーブルは使い込むと便利なのですが、なかなか期待通りの動作をしなかったりでコーディングは結構大変でした。おかげで人に見せられる完成度にはなってないのですが…。
ところで、Excelに書き込みをする際、100x10000セルの書き込み、なんてのをセルごとにやると非常に遅くなるんです。当たり前ですけど。WIN32OLE関連でいろいろ検索してみましたが、なかなか高速化方法は見つかりませんでした。そこで、クリップボードを経由して一括張り付ける方法にしてみたところ、非常に高速化できました。ここでは、このコードを紹介しておきます。
require 'excel_lib' require 'win32/clipboard' class Excel class Range < Excel_Wrapper def copy_value self.copy value = Win32::Clipboard.data Win32::Clipboard.empty # 内容を消しておく value.split("\r\n").map do |s| s.split("\t") end end def paste_value(aa) Win32::Clipboard.set_data((aa.map do |a| a.join("\t") end).join("\r\n")) self.worksheet.paste('Destination' => @raw_object) Win32::Clipboard.empty # 内容を消しておく end end end
win32/clipboardを使い、配列の配列を引数として渡すと一括読み出し、一括書き込みができます。セル内容に改行が含まれる場合は各要素を""で囲めばOKです。