Techioz Blog

日付付きのrubyXL – 仕様は機能しますが、実際の使用は機能しません

概要

RubyXL を使用して日付付きの xlsx ファイルを処理します。日付処理の仕様は合格していますが、それを独自のスクリプトで複製しようとすると、機能しません。代わりに、日付を浮動小数点/数値として残します (これが Excel での日付の保存方法です)。 Github から RubyXL ソースをダウンロードし、仕様を実行しました。日付に関連するすべてが過ぎました。ただし、仕様ファイルの外で次のコードを実行すると、誤った動作が発生します。

require 'rubyXL'

workbook = RubyXL::Workbook.new
worksheet = RubyXL::Worksheet.new(workbook)
workbook.worksheets << worksheet

worksheet.add_cell(0, 0, "0:0")
cell = worksheet[0][0]

date = Date.parse("January 20, 2011")
cell.change_contents(date)

puts cell.is_date? # false -- spec says it should be true
puts cell.value == date # false -- spec says it should be true
puts date # 2011-01-20
puts cell.value # 40563/1 <-- should be a date object

これを RubyXL 仕様テストと比較してください (セルは上に示したものとまったく同じように始まります)。

it 'should return the value of a date' do
      date = Date.parse('January 1, 2011')
      @cell.change_contents(date)
      @cell.should_receive(:is_date?).any_number_of_times.and_return(true)
      @cell.value.should == date
    end

実際に動作していることを確認するために、いくつかの put ステートメントを追加しました。実際に動作していることを確認します (2011-01-01 のようなものが出力されます)。また、不足している設定がないか確認するために、spec フォルダー内の cell_spec.rb を除くすべてのファイルを削除してみました。それでも何も変わりませんでした。

この時点で私は当惑していますが、単純な何かが欠けているに違いないと確信しています。仕様の動作を通常のコードで再現できない理由がわかりません。

解決策

値は実際にはエポックです。Time.at(cell.value) を使用してみてください。