rubyXLでシートをコピーしたりシートを削除したりする

RailsでExcelを扱うときには weshatheleopard/rubyXL が一番手軽です。弊社でもExcelを扱う場合にはいつもにお世話になっています。

この rubyXL ですが、シートのコピーや削除の仕方がいまいち理解できず、これまでできないものと勘違いしていました。具体的にExcelの利用方法を考えたときには、

  1. テンプレートシートを作成してコピーする
  2. 余計なシートを削除する

といったような利用方法が多く考えられます。ところが、これらのことができないのかとあきらめて Java での実装を検討していたときにあらためて rubyXL のソースコードを読むことで解決しました。

具体的には以下のようなコードで特定のシートをコピーして名称を変更後、元のシートを削除するということが可能です。

require 'rubyXL'

# ワークブックの読込
workbook = RubyXL::Parser.parse('excels/beaglesoft_template2.xlsx')

# こちらは動作しないため修正
# add_sheet = Marshal.load(Marshal.dump(workbook['テストシート名']))
# add_sheet.sheet_name = 'コピーシート名'
# add_sheet.workbook = workbook2

# テストシートをコピーしてブックに追加
# workbook2.worksheets << add_sheet

worksheet = workbook.add_worksheet
worksheet.sheet_data = workbook['テストシート名'].sheet_data

# ブックの内容を列挙する
workbook.worksheets.each do |worksheet|
  p "シートのクラス名:#{worksheet.class.name}"
  p "シート名:#{worksheet.sheet_name}"
end

# 元から存在するシートを削除する
# workbook.worksheets.delete_at(0)

# outputsディレクトリに保存する
file_name = "beaglesoft_template_#{Time.now.strftime('%Y%m%d%H%M%s')}.xlsx"
workbook.write("outputs/#{file_name}")

コピーや削除についてメソッドが提供されていなかったのでできないと思っていたのですが、ふつうに配列のデータを扱えば良いだけなので簡単でした。(なぜ気づかなかった…)

※12/17追記 以前のものだとExcelを開いたときに「ファイルが壊れているため修復を…」というダイアログが表示されるため修正しました。

いろいろと設定など面倒なこともあると思いますので、以下のリポジトリから一式動作するソースコードを取得できます。

yoichiro-manabe/rubyxl_sample

または、以下の通りcloneすれば取得できます。

cd /path/to/clone/path
git clone https://github.com/yoichiro-manabe/rubyxl_sample.git

Enjoy coding!

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例