RailsでExcelを扱うときには weshatheleopard/rubyXL が一番手軽です。弊社でもExcelを扱う場合にはいつもにお世話になっています。
この rubyXL ですが、シートのコピーや削除の仕方がいまいち理解できず、これまでできないものと勘違いしていました。具体的にExcelの利用方法を考えたときには、
- テンプレートシートを作成してコピーする
- 余計なシートを削除する
といったような利用方法が多く考えられます。ところが、これらのことができないのかとあきらめて 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を開いたときに「ファイルが壊れているため修復を…」というダイアログが表示されるため修正しました。
いろいろと設定など面倒なこともあると思いますので、以下のリポジトリから一式動作するソースコードを取得できます。
または、以下の通りcloneすれば取得できます。
cd /path/to/clone/path git clone https://github.com/yoichiro-manabe/rubyxl_sample.git
Enjoy coding!
Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例
- 作者: るびきち,佐々木拓郎
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/08/25
- メディア: 大型本
- この商品を含むブログ (8件) を見る