RubyXL
rubyでexcelを操作するライブラリ
書き込みができる
罫線が引ける
シートのコピーができる
poiに比べるとできることは限られる
javaが必要になる
railsとrubyで完結したい場合は選択肢の一つとなるかも
サンプルをForkしてきて、ちょっといじった
Fixed #1 別のサイトのサンプル追加 by kkanazaw · Pull Request #2 · kkanazaw/rubyxl_sample
チェックマークが出力できるか確認
https://github.com/kkanazaw/rubyxl_sample/pull/4/files
シートのコピーを使うことで、RubyXLで直接指定できない項目を使うことができる
印刷設定範囲とか
あらかじめ印刷設定をいれたシートを作っておいて、コピーして使う
ただし
シートのオブジェクトをディープコピーしようとして、marshal.load(marshal.dump(obj))している箇所でエラーになる。
code:ruby
copy_sheet.rb:10:in `dump': no _dump_data is defined for class Nokogiri::XML::Namespace (TypeError)
from copy_sheet.rb:10:in `<main>'
https://github.com/weshatheleopard/rubyXL/issues/236
シートが内部で参照しているオブジェクトが、marshal.dump(シリアライズ)不可能なためと思われる。
浅いコピーだと、2つのシートが同じxmlのオブジェクトを参照してしまう。
片方を編集するともう片方にも反映されてしまう。
出力時に、コピー元のシートが壊れる(xslt情報が欠損する?)
暫定的な解決方法
トリッキーだが、ファイルをコピー用と保存用に2回読み込んで
コピー用のシートを浅いコピーして、保存用のファイルに追加すると正しく保存できる。
1シートをコピーするごとに、ファイルを読み直す必要があるのでパフォーマンス悪そう
workbook.xmlのsheet要素がおかしくなる
sheet_idを指定してもridが1から始まらない
sheet_dataメソッドを使ってコピーする方法を発見
rubyXLでシートをコピーしたりシートを削除したりする - blog.beaglesoft.net
でもこれだとシートのスタイルとかが抜け落ちてしまう(印刷範囲指定とか、セルの幅とか)
上記のサイトを参考にサンプル作成
code:ruby
require 'rubyXL'
# あらかじめページにあわせるを設定したworkbookを読み込む
# rubyXLで生成できない部分をあらかじめ設定しておく
template = RubyXL::Parser.parse('input/fit_to_page.xlsx')
# 同じシートを複数コピーする場合は別変数に開いておく
template2 = RubyXL::Parser.parse('input/fit_to_page.xlsx')
# 出力用に同じファイルを読み込む (templateと同じスタイルとかの情報が含まれている)
output = RubyXL::Parser.parse('input/fit_to_page.xlsx')
add_sheet.worksheet = template0
add_sheet.sheet_name = 'コピーシート名'
add_sheet.workbook = output
add_sheet.sheet_id = output.worksheets.map(&:sheet_id).max + 1
add_sheet.add_cell(1, 0, "Hoge") #同じオブジェクトを参照しているので、template側も書き換わってしまう
# これで追加されるはずだけど、関連する式とか画像とかスタイルがあるとファイルが壊れる
# 修復すると読めるようにはなる
output.worksheets << add_sheet #追加した後もtemplate
output.worksheets"コピーシート名".add_cell(2, 0, "Fuga") #同じオブジェクトを参照しているので、template側も書き換わってしまう
output.write("output/hoge.xlsx")
#template側は保存せずに捨てる
修復後のファイルと比較してみると,worksheet.xmlとxl/_rels/workbook.xml.relsのrId属性がおかしくなる。
出力サンプル消しちゃったのであとで載せるかも
2018/3/8一応解決した
2018/3/9 削除も成功した
画像(オートシェイプ入り)のも一応できた