50
40

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 3 years have passed since last update.

rubyXL で Excel 生成したいときの Tips 集

Last updated at Posted at 2017-07-30

始めに

今どき Excel で読み書きしようとしている時点で方針が間違っています。引き返しましょう。

install するには?

gem i rubyXL

Hello World するには?

require "rubyxl"
@workbook = RubyXL::Workbook.new
@sheet = @workbook.first
@sheet.add_cell(0, 0, "Hello World")
@workbook.write("out.xlsx")
`open out.xlsx`

上の Hello World ができないときは?

面倒なことに、バージョン 3.4.0 以降は、便利メソッドが別のファイルに分けられてデフォルトでは require されていないので↓が必要だそうです

require 'rubyXL/convenience_methods'

たぶん、↑をしておかないと、↓のコードもほとんど動かないでしょう

直接バイナリーで欲しいときは?

@workbook.stream.read

Rails で send_data するとき用

既存のファイルを読むには?

@workbook = RubyXL::Parser.parse("file.xlsx")

1つめのシートを参照するには?

@sheet = @workbook.first

2つ目のシートを作るには?

@sheet = @workbook.add_worksheet("2つめのシートの名前")

既存のシートの名前を変更するには?

@sheet.sheet_name = "シートの名前"

A列の横幅を変更するには?

@sheet.change_column_width(0, 1.0) # よくわからないが 1.0 で1文字分ぐらいの幅だった

座標の扱いは?

  • 横(x)も、縦(y)も、 0 が基点
  • (x, y) はすべて逆の (y, x) で指定

(x, y) のセルを取得するには? (なければ作る)

@cell = @sheet.add_cell(y, x, "", nil, false)

左よせ・センタリング・右よせ するには?

@cell.change_horizontal_alignment("left")
@cell.change_horizontal_alignment("center")
@cell.change_horizontal_alignment("right")

3桁毎のカンマ区切りにするには?

@cell.set_number_format('#, ##0') # 書式はよくわかってない

セルの文字色を赤にするには?

@cell.change_font_color("FF0000")

セルの背景を灰色にするには?

@cell.change_fill("EEEEEE")

(x1, y1) から (x2, y2) の範囲でセルを結合するには?

@sheet.merge_cells(y1, x1, y2, x2)

アンダーラインを引くには? (ボーダーの下だけに線)

@cell.change_border(:bottom, "medium")

アンダーラインの色を赤にするには? (下ボーダーの色変更)

@cell.change_border_color(:bottom, "FF0000")

1つのセルだけにボーダーを描くには?

[:top, :bottom, :left, :right].each do |e|
   @cell.change_border(e, "medium")
end

ボーダーの線を細くするには?

medium のかわりに thin を指定

セル結合した範囲や、広範囲にボーダーを描くには?

x, y 順で (1, 1) から (3, 2) の地点までボーダーを描く場合

x1, y1 = [1, 1]
x2, y2 = [3, 2]

(y1..y2).each do |y|
  (x1..x2).each do |x|
    list = []
    if y == y1
      list << :top
    end
    if y == y2
      list << :bottom
    end
    if x == x1
      list << :left
    end
    if x == x2
      list << :right
    end
    list.each do |e|
      cell = @sheet.add_cell(y, x, "", nil, false)
      cell.change_border(e, "medium")
    end
  end
end

セル結合している場合は左上のセルに設定したボーダーが、セル結合した範囲にも自動的に広がってくれると思ったらそうはならないようです。

常識的に考えてこんな冗長なコードを使う側が書く必要はないと思うので、何か他の方法がある気がするんですが見つけられませんでした。とりあえず自力でボーダーを引くようにしてみましたが正しい方法があったら教えてください。

50
40
4

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
50
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?