[rubyXL]Rubyでxlsxファイルを読み込み・出力してみる
業務で使ったところをかいつまんでまとめていきます。
使ったgemはこちら。
xlsx系のgemをざっと調べた感じ、読み込み・出力と両対応しているものでポピュラーそうだったので。
書き出し
インスタンスを作成して、書き込みをする。
workbook = RubyXL::Workbook.new
workbook.write("path/to/desired/Excel/file.xlsx")
データ入力
シートを取得してそのシートにセルを追加することでデータを入力することができます。
workbookインスタンス作成時にデフォルトでシートが一つ存在しているのでそのシートを取得して、行と列を指定して'A1'を入力します。
worksheet = workbook[0]
worksheet.add_cell(0, 0, 'A1')
折返し
以下のように長文を入力したときに
workbook = RubyXL::Workbook.new
worksheet = workbook[0]
worksheet.add_cell(0, 0, 'A')
worksheet.add_cell(0, 1, 'B')
worksheet.add_cell(0, 2, 'C')
worksheet.add_cell(1, 0, 'A1')
worksheet.add_cell(1, 1, 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもも')
workbook.write("sample.xlsx")
このように横に長くなるのでそれを折り返したくなりました。
Readmeを読んだ感じ、cell.change_text_wrap(true)
でいけそうです。
add_cell
の返り値がCellクラスなので、
worksheet
.add_cell(1, 1, 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもも')
.change_text_wrap(true)
とやってみるが以下のエラー。
NoMethodError: undefined method `change_text_wrap' for #<RubyXL::Cell(1,1): "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもも", datatype="str", style_index=0>
change_text_wrap
メソッドがないと言われる。
結論から言うと、
require 'rubyXL/convenience_methods/cell'
require 'rubyXL/convenience_methods/workbook'
を追加する必要があります。
change_text_wrap
メソッドがどこで定義されているかコードを探して見ると、
# lib/rubyXL/convenience_methods/cell.rb
module RubyXL
module CellConvenienceMethods
def change_text_wrap(wrap = false)
validate_worksheet
self.style_index = workbook.modify_alignment(self.style_index) { |a| a.wrap_text = wrap }
end
end
end
CellConvenienceMethodsモジュールはデフォルトでは読み込まれてないので、必要なら各自でincludeして使うみたいです。
require 'rubyXL/convenience_methods/cell
して再度試してみると今度は以下のエラー。
undefined method `modify_alignment' for #<RubyXL::Workbook:0x000055fbb8abb918 省略
modify_alignment
メソッドを探してみると
にあるので、
require 'rubyXL/convenience_methods/workbook'
も必要ということでした。
これで無事折返しが設定できました。
require 'rubyXL/convenience_methods/cell'
require 'rubyXL/convenience_methods/workbook'
workbook = RubyXL::Workbook.new
worksheet = workbook[0]
worksheet.add_cell(0, 0, 'A')
worksheet.add_cell(0, 1, 'B')
worksheet.add_cell(0, 2, 'C')
worksheet.add_cell(1, 0, 'A1')
worksheet
.add_cell(1, 1, 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもも')
.change_text_wrap(true)
workbook.write("sample.xlsx")
列の横幅
列の横幅指定はchange_column_width
メソッド。
B列の横幅を指定してみます。
require 'rubyXL/convenience_methods/worksheet'
が必要です。
require 'rubyXL/convenience_methods/cell'
require 'rubyXL/convenience_methods/workbook'
require 'rubyXL/convenience_methods/worksheet'
workbook = RubyXL::Workbook.new
worksheet = workbook[0]
worksheet.change_column_width(1, 30)
worksheet.add_cell(0, 0, 'A')
worksheet.add_cell(0, 1, 'B')
worksheet.add_cell(0, 2, 'C')
worksheet.add_cell(1, 0, 'A1')
worksheet
.add_cell(1, 1, 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもも')
.change_text_wrap(true)
workbook.write("sample.xlsx")
文字を上端にそろえる
セル内の文字を上端に揃えたくなりました。
その場合はchange_row_vertical_alignment
メソッド。
セルのみ指定や、行での指定もできます。
今回はA, B, C列を上端揃えに。
require 'rubyXL/convenience_methods/cell'
require 'rubyXL/convenience_methods/workbook'
require 'rubyXL/convenience_methods/worksheet'
workbook = RubyXL::Workbook.new
worksheet = workbook[0]
worksheet.change_row_vertical_alignment(0, 'top')
worksheet.change_row_vertical_alignment(1, 'top')
worksheet.change_row_vertical_alignment(2, 'top')
worksheet.change_column_width(1, 30)
worksheet.add_cell(0, 0, 'A')
worksheet.add_cell(0, 1, 'B')
worksheet.add_cell(0, 2, 'C')
worksheet.add_cell(1, 0, 'A1')
worksheet
.add_cell(1, 1, 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもも')
.change_text_wrap(true)
workbook.write("sample.xlsx")
top以外はどう指定するんだろうとコードを追ってみると、ここに使える文字列が定義してありました。
top center bottom justify distributed
が使えるよう。
編集不可(ロック)
それようのメソッドはない模様。
が、少し試してみたがロックできず。。
読みこみ
既存ファイルの読み込みは、
workbook = RubyXL::Parser.parse("path/to/Excel/file.xlsx")
workbookのインスタンスが生成されるので、あとはこれまで書いてきたようにデータの追加編集などできて保存できます。
その他
出力する文章に改行以外の制御文字が含まれていると処理がスキップされました。
エラーは発生せず正常に終了するが、該当の行以降は出力されていない。
出力時に
text.gsub(/[[:cntrl:]]/, ''))
として制御文字を削除することで対応しました。
Discussion