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です。

RubyExcel」の作者の方には、本当に感謝しています。^^;