Skip to content

Instantly share code, notes, and snippets.

@nerdinand
Created June 13, 2012 13:40
Show Gist options
  • Save nerdinand/2924130 to your computer and use it in GitHub Desktop.
Save nerdinand/2924130 to your computer and use it in GitHub Desktop.
Class for dealing with ranges of cells (2-dimensional) in spreadsheet gem
class SpreadSheetRange
BORDER_EDGES=[:bottom, :top, :right, :left]
def initialize(worksheet, row_range, col_range)
@worksheet = worksheet
@row_range = row_range
@col_range = col_range
end
def draw_border(where = :all, color = nil)
if where == :all
border_top(color)
border_bottom(color)
border_left(color)
border_right(color)
else
send("draw_border_#{where.to_s}", color)
end
end
private
def draw_border_top(color)
format_cell_border(@row_range.first..@row_range.first, @col_range, :top, color)
end
def draw_border_bottom(color)
format_cell_border(@row_range.last..@row_range.last, @col_range, :bottom, color)
end
def draw_border_left(color)
format_cell_border(@row_range, @col_range.first..@col_range.first, :left, color)
end
def draw_border_right(color)
format_cell_border(@row_range, @col_range.last..@col_range.last, :right, color)
end
def format_cell_border(row_range, col_range, border, color)
border_array = Array.new 4, false
border_array[BORDER_EDGES.index border] = true
row_range.each do |row|
col_range.each do |col|
old_format = @worksheet.rows[row].format(col)
old_border_array = old_format.border
new_border_array = merge_border_arrays(old_border_array, border_array)
format = Spreadsheet::Format.new
if color
format.border_color=color
end
BORDER_EDGES.each do |edge|
border_boolean = new_border_array.shift
format.send("#{edge}=", border_boolean)
end
@worksheet.rows[row].set_format(col, format)
end
end
end
def merge_border_arrays(old_border, new_border)
new_border_copy = new_border.dup
merged_border = old_border.collect do |entry|
new_border_copy.shift || entry
end
merged_border
end
end
# create a new book and sheet
book = Spreadsheet::Workbook.new
sheet = book.create_worksheet
range = SpreadSheetRange.new(sheet, 1..5, 1..5)
range.draw_border(:bottom, :blue)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment