-
Notifications
You must be signed in to change notification settings - Fork 502
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #364 from roo-rb/feature/roo_formatters
Feature/roo formatters
- Loading branch information
Showing
6 changed files
with
237 additions
and
163 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
module Roo | ||
module Formatters | ||
module Base | ||
# converts an integer value to a time string like '02:05:06' | ||
def integer_to_timestring(content) | ||
h = (content / 3600.0).floor | ||
content -= h * 3600 | ||
m = (content / 60.0).floor | ||
content -= m * 60 | ||
s = content | ||
Kernel.format("%02d:%02d:%02d", h, m, s) | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
module Roo | ||
module Formatters | ||
module CSV | ||
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 | ||
|
||
# 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 | ||
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 | ||
|
||
|
||
# The content of a cell in the csv output | ||
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 DateTime | ||
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 | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
module Roo | ||
module Formatters | ||
module Matrix | ||
# returns a matrix object from the whole sheet or a rectangular area of a sheet | ||
def to_matrix(from_row = nil, from_column = nil, to_row = nil, to_column = nil, sheet = default_sheet) | ||
require 'matrix' | ||
|
||
return ::Matrix.empty unless first_row | ||
|
||
from_row ||= first_row(sheet) | ||
to_row ||= last_row(sheet) | ||
from_column ||= first_column(sheet) | ||
to_column ||= last_column(sheet) | ||
|
||
::Matrix.rows(from_row.upto(to_row).map do |row| | ||
from_column.upto(to_column).map do |col| | ||
cell(row, col, sheet) | ||
end | ||
end) | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
# returns an XML representation of all sheets of a spreadsheet file | ||
module Roo | ||
module Formatters | ||
module XML | ||
def to_xml | ||
Nokogiri::XML::Builder.new do |xml| | ||
xml.spreadsheet do | ||
sheets.each do |sheet| | ||
self.default_sheet = sheet | ||
xml.sheet(name: sheet) do |x| | ||
if first_row && last_row && first_column && last_column | ||
# sonst gibt es Fehler bei leeren Blaettern | ||
first_row.upto(last_row) do |row| | ||
first_column.upto(last_column) do |col| | ||
next if empty?(row, col) | ||
|
||
x.cell(cell(row, col), | ||
row: row, | ||
column: col, | ||
type: celltype(row, col)) | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end.to_xml | ||
end | ||
end | ||
end | ||
end |
Oops, something went wrong.