2018年9月15日土曜日

Ruby で Excel を操作 (axlsx 編)

概要

axlsx は Ruby で Excel を操作するためのライブラリです
今回は Mac で使ってみました

環境

  • macOS 10.13.6
  • Numbers 5.1
  • Ruby 2.5.1p57
  • axlsx 2.0.1

インストール

  • bundle init
  • vim Gemfile
gem "axlsx"
  • bundle install --path vendor

とりあえずサンプル

axlsx の公式にもあるサンプルです
円グラフを表示するサンプルです

  • vim test1.rb
require 'axlsx'

Axlsx::Package.new do |p|
  p.workbook.add_worksheet(:name => "Pie Chart") do |sheet|
    sheet.add_row ["Simple Pie Chart"]
    %w(first second third).each { |label| sheet.add_row [label, rand(24)+1] }
    sheet.add_chart(Axlsx::Pie3DChart, :start_at => [0,5], :end_at => [10, 20], :title => "example 3: Pie Chart") do |chart|
      chart.add_series :data => sheet["B2:B4"], :labels => sheet["A2:A4"],  :colors => ['FF0000', '00FF00', '0000FF']
    end
  end
  p.serialize('simple.xlsx')
end
  • bundle exec ruby test1.rb

これで実行すると以下のようなエクセルが確認できました

axlsx1.png

シートを作成する

require 'axlsx'

p = Axlsx::Package.new
wb = p.workbook
wb.add_worksheet(:name => "test")
p.serialize('simple.xlsx')

sample.xlsx というファイルに test というシートができます

指定のセルに値を追加する

require 'axlsx'

p = Axlsx::Package.new
wb = p.workbook
sheet = wb.add_worksheet(:name => "test")
sheet.add_row ['', '', '', '']
sheet.rows[0].cells[1].value = 5
p.serialize('simple.xlsx')

axlsx2.png

これが意外と曲者でした
一度セルに対して何か値を入れないとそのセルを指定して値を入れることはできないのです
上であれば 1 行目の左から 4 セルに空白を入れてその後で 1 行目の 2 セル目に 5 という値を入れています
参考

足し算する

require 'axlsx'

p = Axlsx::Package.new
wb = p.workbook
sheet = wb.add_worksheet(:name => "test")
1.upto(10) { |i| sheet.add_row [i] }
sheet.add_row ["=sum(A1:A10)"]
p.serialize('simple.xlsx')

axlsx3.png

単純に Excel で使っている式を文字列として追加するだけで OK です
SUM 以外の式に関しても同様のことが言えます

セルのスタイルを返る

require 'axlsx'

p = Axlsx::Package.new
wb = p.workbook
sheet = wb.add_worksheet(:name => "test")
1.upto(10) { |i| 
  style = sheet.styles.add_style(:bg_color => "%06x" % (rand * 0xffffff), :fg_color => "FFFFFF")
  sheet.add_row [i], :style => style
}
p.serialize('simple.xlsx')

axlsx4.png

シートからスタイル情報を生成し add_row するときに style 変数を指定します
今回はランダムで RGB 値を出していますが工夫すればグラデーション的なこともできると思います

最後に

Ruby で Excel を操作してみました
Office がなかったので Numbers で確認しました
もしかすると多少フォーマットが変わっているかもしれません

注意が必要なのは axlsx は書き込みしかできません
エクセルからデータを読み込む場合は roo などを使いましょう

これ以外にもいろいろなことができます
以下に記載したページにサンプルもたくさんあるので参考にしながら記載してみるといいと思います

参考サイト

0 件のコメント:

コメントを投稿