module Roo::Formatters::CSV
Public Instance Methods
to_csv(filename = nil, separator = ",", sheet = default_sheet)
click to toggle source
# File lib/roo/formatters/csv.rb, line 4 def to_csv(filename = nil, separator = ",", sheet = default_sheet) if filename File.open(filename, "w") do |file| write_csv_content(file, sheet, separator) end true else sio = ::StringIO.new write_csv_content(sio, sheet, separator) sio.rewind sio.read end end
Private Instance Methods
cell_to_csv(row, col, sheet)
click to toggle source
The content of a cell in the csv output
# File lib/roo/formatters/csv.rb, line 37 def cell_to_csv(row, col, sheet) return "" if empty?(row, col, sheet) onecell = cell(row, col, sheet) case celltype(row, col, sheet) when :string %("#{onecell.gsub('"', '""')}") unless onecell.empty? when :boolean # TODO: this only works for excelx onecell = self.sheet_for(sheet).cells[[row, col]].formatted_value %("#{onecell.gsub('"', '""').downcase}") when :float, :percentage if onecell == onecell.to_i onecell.to_i.to_s else onecell.to_s end when :formula case onecell when String %("#{onecell.gsub('"', '""')}") unless onecell.empty? when Integer onecell.to_s when Float if onecell == onecell.to_i onecell.to_i.to_s else onecell.to_s end when Date, DateTime, TrueClass, FalseClass onecell.to_s else fail "unhandled onecell-class #{onecell.class}" end when :date, :datetime onecell.to_s when :time integer_to_timestring(onecell) when :link %("#{onecell.url.gsub('"', '""')}") else fail "unhandled celltype #{celltype(row, col, sheet)}" end || "" end
write_csv_content(file = nil, sheet = nil, separator = ",")
click to toggle source
Write all cells to the csv file. File can be a filename or nil. If the file argument is nil the output goes to STDOUT
# File lib/roo/formatters/csv.rb, line 22 def write_csv_content(file = nil, sheet = nil, separator = ",") file ||= STDOUT return unless first_row(sheet) # The sheet is empty 1.upto(last_row(sheet)) do |row| 1.upto(last_column(sheet)) do |col| # TODO: use CSV.generate_line file.print(separator) if col > 1 file.print cell_to_csv(row, col, sheet) end file.print("\n") end end