RubyXL
書き込みができる
罫線が引ける
シートのコピーができる
サンプルをForkしてきて、ちょっといじった
チェックマークが出力できるか確認
シートのコピーを使うことで、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>'
シートが内部で参照しているオブジェクトが、marshal.dump(シリアライズ)不可能なためと思われる。
浅いコピーだと、2つのシートが同じxmlのオブジェクトを参照してしまう。
片方を編集するともう片方にも反映されてしまう。
出力時に、コピー元のシートが壊れる(xslt情報が欠損する?)
暫定的な解決方法
トリッキーだが、ファイルをコピー用と保存用に2回読み込んで
コピー用のシートを浅いコピーして、保存用のファイルに追加すると正しく保存できる。
1シートをコピーするごとに、ファイルを読み直す必要があるのでパフォーマンス悪そう
workbook.xmlのsheet要素がおかしくなる
sheet_idを指定してもridが1から始まらない
sheet_dataメソッドを使ってコピーする方法を発見
でもこれだとシートのスタイルとかが抜け落ちてしまう(印刷範囲指定とか、セルの幅とか)
上記のサイトを参考にサンプル作成
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
# これで追加されるはずだけど、関連する式とか画像とかスタイルがあるとファイルが壊れる
# 修復すると読めるようにはなる
output.write("output/hoge.xlsx")
修復後のファイルと比較してみると,worksheet.xmlとxl/_rels/workbook.xml.relsのrId属性がおかしくなる。
出力サンプル消しちゃったのであとで載せるかも
画像(オートシェイプ入り)のも一応できた