始めに
今どき 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
セル結合している場合は左上のセルに設定したボーダーが、セル結合した範囲にも自動的に広がってくれると思ったらそうはならないようです。
常識的に考えてこんな冗長なコードを使う側が書く必要はないと思うので、何か他の方法がある気がするんですが見つけられませんでした。とりあえず自力でボーダーを引くようにしてみましたが正しい方法があったら教えてください。