14
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RubyXLで起きたトラブルまとめ

Last updated at Posted at 2019-03-04

概要

現在、テンプレートのxlsxファイルを元に、新しくcellを追加したり、既存のcellをコピーしたりしながらxlsxファイルを生成するプロジェクトを担当しています。

技術的にはRubyXLが使われているのですが、そこでなんども想定外の挙動に見舞われました・・・。
英語・日本語共に検索しても全く情報が出てこず苦労したので、ぶち当たった問題についてまとめていきたいと思います。

問題1. add_cellしたcellにchange_font_nameが効かない

内容

このようにadd_cellでセルを追加し、change_font_nameでフォント名を変更したとします。

book[0].add_cell(0, 0, 'セルを追加します。')
book[0][0][0].change_font_name('MS 明朝')

cellのfont_nameを見たら、しっかり変更されています。

book[0][0][0].font_name
-> "MS 明朝"

しかし実際にexcelファイルを開くと、フォントが変更されていません・・・。

解決法

font.schemanilにすれば動作しました。

book[0].map { |row| row&.cells&.map { |cell| cell&.change_font_name('MS 明朝') } } |
book.fonts.map { |font| font.scheme = nil } |

問題2. 既存のCellのフォントカラーから取得し、他のセルに適用できない

fill_color、font_color共に正しく取得からの適用ができないことが多々あります。

new_cell = sheet.add_cell(x, y, cell)
new_cell.change_fill(cell.fill_color)
new_cell.change_font_color(cell.font_color)

原因1 Theme Colorはfont_colorfill_colorだとnilになる

Theme Colorsで設定した色はCellのfont_colorやfill_colorでnilになってしまいます・・・
Screen Shot 2562-03-04 at 17.45.43.png

pry(main)> book.fonts.map(&:color)
=> [#<RubyXL::Color:0x007fbb8dd87ea8 @auto=nil, @indexed=nil, @local_namespaces=[], @rgb=nil, @theme=1, @tint=nil>,
...

原因2 それ以外の方法で指定した色はRubyXL::Colorで弾かれる

それ以外の方法で色を指定すると、8桁のカラーコード(ARGB)で入れられます。

pry(main)> book[1].map{|row| row.cells.map{|cell| cell&.font_color}}
=> [["FFFFFFFF", "FFFFFFFF"],
 ["FFFFFFFF", "FFFFFFFF"],
...

これがRubyXL::Colorのvalidationに引っかかってしまうため、change_font_color(cell.font_color)などでエラーになってしまいます。

rubyXL/objects/color.rb
module RubyXL
  class Color < OOXMLObject
    COLOR_REGEXP = /\A([a-f]|[A-F]|[0-9]){6}\Z/

    ...

    def self.validate_color(color)
      if color =~ COLOR_REGEXP
        return true
      else
        raise 'invalid color'
      end
    end
  ...

問題3 既存のExcelファイルをparseし、writeしたときに、Excelファイルが壊れる

Excelファイルを開いて、保存したときに壊れることがあります。

parser = RubyXL::Parser.parse('test.xlsx')
parser.write # -> test.xlsxが壊れる

原因1 チェックボックスがあると壊れる

こういうのがあると壊れます。
Screen Shot 2562-03-04 at 18.05.40.png

原因2 DefinedNameの中身次第で壊れる

不要なDefinedNameは極力消しましょう。
Screen Shot 2562-03-04 at 18.06.42.png

ただエクセル上では見えないDefinedNameがあったりするので注意です。
(見る方法はあるかもしれませんが・・・)

原因3 merge_cellsされてる箇所をmerge_cellsする

当たり前といえば当たり前ですが、自動化してると気づかずやってしまうことがあります。

問題4 印刷範囲を変えたい

defined_nameで指定されてるため、あれば既存のシートの中身を修正、なければdefinedNameを追加します。

book.defined_names.each do |defined_name|
  defined_name.reference = "Sheet1!$A$1:$B$#{@parser.book[1].count}" if defined_name.reference.start_with?('Sheet1')
end

問題5 日付をchange_contentsしても適用されない

過去記事参照) RubyXLで日付をchange_contentsしても適用されない問題

問題6 cell.change_horizontal_alignment, cell.change_vertical_alignmentが効かない

原因調査中

問題7 ページごとの印刷範囲を変えたい

方法調査中

おわりに

ExcelのバージョンやOSなどにも依存するかと思いますが、RubyXLで起きたトラブルについてまとめてみました。
ただでさえ業務がらつかわないのに、ブラックボックスな他社ツールに依存した作業はなかなかつらみがありますね・・・。

14
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?