roo 1.13.2 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.codeclimate.yml +17 -0
- data/.github/ISSUE_TEMPLATE +10 -0
- data/.gitignore +11 -0
- data/.simplecov +4 -0
- data/.travis.yml +17 -0
- data/CHANGELOG.md +626 -0
- data/Gemfile +17 -12
- data/Gemfile_ruby2 +30 -0
- data/Guardfile +23 -0
- data/LICENSE +3 -1
- data/README.md +285 -0
- data/Rakefile +23 -23
- data/examples/roo_soap_client.rb +28 -31
- data/examples/roo_soap_server.rb +4 -6
- data/examples/write_me.rb +9 -10
- data/lib/roo/base.rb +298 -495
- data/lib/roo/constants.rb +5 -0
- data/lib/roo/csv.rb +127 -113
- data/lib/roo/errors.rb +11 -0
- data/lib/roo/excelx/cell/base.rb +94 -0
- data/lib/roo/excelx/cell/boolean.rb +27 -0
- data/lib/roo/excelx/cell/date.rb +28 -0
- data/lib/roo/excelx/cell/datetime.rb +111 -0
- data/lib/roo/excelx/cell/empty.rb +19 -0
- data/lib/roo/excelx/cell/number.rb +87 -0
- data/lib/roo/excelx/cell/string.rb +19 -0
- data/lib/roo/excelx/cell/time.rb +43 -0
- data/lib/roo/excelx/cell.rb +106 -0
- data/lib/roo/excelx/comments.rb +55 -0
- data/lib/roo/excelx/coordinate.rb +12 -0
- data/lib/roo/excelx/extractor.rb +21 -0
- data/lib/roo/excelx/format.rb +64 -0
- data/lib/roo/excelx/relationships.rb +25 -0
- data/lib/roo/excelx/shared.rb +32 -0
- data/lib/roo/excelx/shared_strings.rb +157 -0
- data/lib/roo/excelx/sheet.rb +112 -0
- data/lib/roo/excelx/sheet_doc.rb +211 -0
- data/lib/roo/excelx/styles.rb +64 -0
- data/lib/roo/excelx/workbook.rb +59 -0
- data/lib/roo/excelx.rb +376 -602
- data/lib/roo/font.rb +17 -0
- data/lib/roo/formatters/base.rb +15 -0
- data/lib/roo/formatters/csv.rb +84 -0
- data/lib/roo/formatters/matrix.rb +23 -0
- data/lib/roo/formatters/xml.rb +31 -0
- data/lib/roo/formatters/yaml.rb +40 -0
- data/lib/roo/libre_office.rb +4 -0
- data/lib/roo/link.rb +34 -0
- data/lib/roo/open_office.rb +626 -0
- data/lib/roo/spreadsheet.rb +22 -23
- data/lib/roo/tempdir.rb +21 -0
- data/lib/roo/utils.rb +78 -0
- data/lib/roo/version.rb +3 -0
- data/lib/roo.rb +23 -24
- data/roo.gemspec +21 -204
- data/spec/helpers.rb +5 -0
- data/spec/lib/roo/base_spec.rb +229 -3
- data/spec/lib/roo/csv_spec.rb +38 -11
- data/spec/lib/roo/excelx/format_spec.rb +7 -6
- data/spec/lib/roo/excelx_spec.rb +510 -11
- data/spec/lib/roo/libreoffice_spec.rb +16 -6
- data/spec/lib/roo/openoffice_spec.rb +30 -8
- data/spec/lib/roo/spreadsheet_spec.rb +60 -12
- data/spec/lib/roo/utils_spec.rb +106 -0
- data/spec/spec_helper.rb +7 -6
- data/test/all_ss.rb +12 -11
- data/test/excelx/cell/test_base.rb +63 -0
- data/test/excelx/cell/test_boolean.rb +36 -0
- data/test/excelx/cell/test_date.rb +38 -0
- data/test/excelx/cell/test_datetime.rb +45 -0
- data/test/excelx/cell/test_empty.rb +7 -0
- data/test/excelx/cell/test_number.rb +74 -0
- data/test/excelx/cell/test_string.rb +28 -0
- data/test/excelx/cell/test_time.rb +30 -0
- data/test/formatters/test_csv.rb +119 -0
- data/test/formatters/test_matrix.rb +76 -0
- data/test/formatters/test_xml.rb +74 -0
- data/test/formatters/test_yaml.rb +20 -0
- data/test/roo/test_csv.rb +52 -0
- data/test/roo/test_excelx.rb +186 -0
- data/test/roo/test_libre_office.rb +9 -0
- data/test/roo/test_open_office.rb +126 -0
- data/test/test_helper.rb +73 -53
- data/test/test_roo.rb +1211 -2292
- metadata +119 -298
- data/CHANGELOG +0 -417
- data/Gemfile.lock +0 -78
- data/README.markdown +0 -126
- data/VERSION +0 -1
- data/lib/roo/excel.rb +0 -355
- data/lib/roo/excel2003xml.rb +0 -300
- data/lib/roo/google.rb +0 -292
- data/lib/roo/openoffice.rb +0 -496
- data/lib/roo/roo_rails_helper.rb +0 -83
- data/lib/roo/worksheet.rb +0 -18
- data/scripts/txt2html +0 -67
- data/spec/lib/roo/excel2003xml_spec.rb +0 -15
- data/spec/lib/roo/excel_spec.rb +0 -17
- data/spec/lib/roo/google_spec.rb +0 -64
- data/test/files/1900_base.xls +0 -0
- data/test/files/1900_base.xlsx +0 -0
- data/test/files/1904_base.xls +0 -0
- data/test/files/1904_base.xlsx +0 -0
- data/test/files/Bibelbund.csv +0 -3741
- data/test/files/Bibelbund.ods +0 -0
- data/test/files/Bibelbund.xls +0 -0
- data/test/files/Bibelbund.xlsx +0 -0
- data/test/files/Bibelbund.xml +0 -62518
- data/test/files/Bibelbund1.ods +0 -0
- data/test/files/Pfand_from_windows_phone.xlsx +0 -0
- data/test/files/bad_excel_date.xls +0 -0
- data/test/files/bbu.ods +0 -0
- data/test/files/bbu.xls +0 -0
- data/test/files/bbu.xlsx +0 -0
- data/test/files/bbu.xml +0 -152
- data/test/files/bode-v1.ods.zip +0 -0
- data/test/files/bode-v1.xls.zip +0 -0
- data/test/files/boolean.csv +0 -2
- data/test/files/boolean.ods +0 -0
- data/test/files/boolean.xls +0 -0
- data/test/files/boolean.xlsx +0 -0
- data/test/files/boolean.xml +0 -112
- data/test/files/borders.ods +0 -0
- data/test/files/borders.xls +0 -0
- data/test/files/borders.xlsx +0 -0
- data/test/files/borders.xml +0 -144
- data/test/files/bug-numbered-sheet-names.xlsx +0 -0
- data/test/files/bug-row-column-fixnum-float.xls +0 -0
- data/test/files/bug-row-column-fixnum-float.xml +0 -127
- data/test/files/comments.ods +0 -0
- data/test/files/comments.xls +0 -0
- data/test/files/comments.xlsx +0 -0
- data/test/files/csvtypes.csv +0 -1
- data/test/files/datetime.ods +0 -0
- data/test/files/datetime.xls +0 -0
- data/test/files/datetime.xlsx +0 -0
- data/test/files/datetime.xml +0 -142
- data/test/files/datetime_floatconv.xls +0 -0
- data/test/files/datetime_floatconv.xml +0 -148
- data/test/files/dreimalvier.ods +0 -0
- data/test/files/emptysheets.ods +0 -0
- data/test/files/emptysheets.xls +0 -0
- data/test/files/emptysheets.xlsx +0 -0
- data/test/files/emptysheets.xml +0 -105
- data/test/files/excel2003.xml +0 -21140
- data/test/files/false_encoding.xls +0 -0
- data/test/files/false_encoding.xml +0 -132
- data/test/files/file_item_error.xlsx +0 -0
- data/test/files/formula.ods +0 -0
- data/test/files/formula.xls +0 -0
- data/test/files/formula.xlsx +0 -0
- data/test/files/formula.xml +0 -134
- data/test/files/formula_parse_error.xls +0 -0
- data/test/files/formula_parse_error.xml +0 -1833
- data/test/files/formula_string_error.xlsx +0 -0
- data/test/files/html-escape.ods +0 -0
- data/test/files/link.xls +0 -0
- data/test/files/link.xlsx +0 -0
- data/test/files/matrix.ods +0 -0
- data/test/files/matrix.xls +0 -0
- data/test/files/named_cells.ods +0 -0
- data/test/files/named_cells.xls +0 -0
- data/test/files/named_cells.xlsx +0 -0
- data/test/files/no_spreadsheet_file.txt +0 -1
- data/test/files/numbers1.csv +0 -18
- data/test/files/numbers1.ods +0 -0
- data/test/files/numbers1.xls +0 -0
- data/test/files/numbers1.xlsx +0 -0
- data/test/files/numbers1.xml +0 -312
- data/test/files/numeric-link.xlsx +0 -0
- data/test/files/only_one_sheet.ods +0 -0
- data/test/files/only_one_sheet.xls +0 -0
- data/test/files/only_one_sheet.xlsx +0 -0
- data/test/files/only_one_sheet.xml +0 -67
- data/test/files/paragraph.ods +0 -0
- data/test/files/paragraph.xls +0 -0
- data/test/files/paragraph.xlsx +0 -0
- data/test/files/paragraph.xml +0 -127
- data/test/files/prova.xls +0 -0
- data/test/files/ric.ods +0 -0
- data/test/files/simple_spreadsheet.ods +0 -0
- data/test/files/simple_spreadsheet.xls +0 -0
- data/test/files/simple_spreadsheet.xlsx +0 -0
- data/test/files/simple_spreadsheet.xml +0 -225
- data/test/files/simple_spreadsheet_from_italo.ods +0 -0
- data/test/files/simple_spreadsheet_from_italo.xls +0 -0
- data/test/files/simple_spreadsheet_from_italo.xml +0 -242
- data/test/files/so_datetime.csv +0 -7
- data/test/files/style.ods +0 -0
- data/test/files/style.xls +0 -0
- data/test/files/style.xlsx +0 -0
- data/test/files/style.xml +0 -154
- data/test/files/time-test.csv +0 -2
- data/test/files/time-test.ods +0 -0
- data/test/files/time-test.xls +0 -0
- data/test/files/time-test.xlsx +0 -0
- data/test/files/time-test.xml +0 -131
- data/test/files/type_excel.ods +0 -0
- data/test/files/type_excel.xlsx +0 -0
- data/test/files/type_excelx.ods +0 -0
- data/test/files/type_excelx.xls +0 -0
- data/test/files/type_openoffice.xls +0 -0
- data/test/files/type_openoffice.xlsx +0 -0
- data/test/files/whitespace.ods +0 -0
- data/test/files/whitespace.xls +0 -0
- data/test/files/whitespace.xlsx +0 -0
- data/test/files/whitespace.xml +0 -184
- data/test/rm_sub_test.rb +0 -12
- data/test/rm_test.rb +0 -7
- data/test/test_generic_spreadsheet.rb +0 -259
- data/website/index.html +0 -385
- data/website/index.txt +0 -423
- data/website/javascripts/rounded_corners_lite.inc.js +0 -285
- data/website/stylesheets/screen.css +0 -130
- data/website/template.rhtml +0 -48
data/lib/roo/font.rb
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Roo
|
|
2
|
+
module Formatters
|
|
3
|
+
module Base
|
|
4
|
+
# converts an integer value to a time string like '02:05:06'
|
|
5
|
+
def integer_to_timestring(content)
|
|
6
|
+
h = (content / 3600.0).floor
|
|
7
|
+
content -= h * 3600
|
|
8
|
+
m = (content / 60.0).floor
|
|
9
|
+
content -= m * 60
|
|
10
|
+
s = content
|
|
11
|
+
Kernel.format("%02d:%02d:%02d", h, m, s)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
module Roo
|
|
2
|
+
module Formatters
|
|
3
|
+
module CSV
|
|
4
|
+
def to_csv(filename = nil, separator = ",", sheet = default_sheet)
|
|
5
|
+
if filename
|
|
6
|
+
File.open(filename, "w") do |file|
|
|
7
|
+
write_csv_content(file, sheet, separator)
|
|
8
|
+
end
|
|
9
|
+
true
|
|
10
|
+
else
|
|
11
|
+
sio = ::StringIO.new
|
|
12
|
+
write_csv_content(sio, sheet, separator)
|
|
13
|
+
sio.rewind
|
|
14
|
+
sio.read
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
# Write all cells to the csv file. File can be a filename or nil. If the
|
|
21
|
+
# file argument is nil the output goes to STDOUT
|
|
22
|
+
def write_csv_content(file = nil, sheet = nil, separator = ",")
|
|
23
|
+
file ||= STDOUT
|
|
24
|
+
return unless first_row(sheet) # The sheet is empty
|
|
25
|
+
|
|
26
|
+
1.upto(last_row(sheet)) do |row|
|
|
27
|
+
1.upto(last_column(sheet)) do |col|
|
|
28
|
+
# TODO: use CSV.generate_line
|
|
29
|
+
file.print(separator) if col > 1
|
|
30
|
+
file.print cell_to_csv(row, col, sheet)
|
|
31
|
+
end
|
|
32
|
+
file.print("\n")
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# The content of a cell in the csv output
|
|
37
|
+
def cell_to_csv(row, col, sheet)
|
|
38
|
+
return "" if empty?(row, col, sheet)
|
|
39
|
+
|
|
40
|
+
onecell = cell(row, col, sheet)
|
|
41
|
+
|
|
42
|
+
case celltype(row, col, sheet)
|
|
43
|
+
when :string
|
|
44
|
+
%("#{onecell.gsub('"', '""')}") unless onecell.empty?
|
|
45
|
+
when :boolean
|
|
46
|
+
# TODO: this only works for excelx
|
|
47
|
+
onecell = self.sheet_for(sheet).cells[[row, col]].formatted_value
|
|
48
|
+
%("#{onecell.gsub('"', '""').downcase}")
|
|
49
|
+
when :float, :percentage
|
|
50
|
+
if onecell == onecell.to_i
|
|
51
|
+
onecell.to_i.to_s
|
|
52
|
+
else
|
|
53
|
+
onecell.to_s
|
|
54
|
+
end
|
|
55
|
+
when :formula
|
|
56
|
+
case onecell
|
|
57
|
+
when String
|
|
58
|
+
%("#{onecell.gsub('"', '""')}") unless onecell.empty?
|
|
59
|
+
when Integer
|
|
60
|
+
onecell.to_s
|
|
61
|
+
when Float
|
|
62
|
+
if onecell == onecell.to_i
|
|
63
|
+
onecell.to_i.to_s
|
|
64
|
+
else
|
|
65
|
+
onecell.to_s
|
|
66
|
+
end
|
|
67
|
+
when Date, DateTime, TrueClass, FalseClass
|
|
68
|
+
onecell.to_s
|
|
69
|
+
else
|
|
70
|
+
fail "unhandled onecell-class #{onecell.class}"
|
|
71
|
+
end
|
|
72
|
+
when :date, :datetime
|
|
73
|
+
onecell.to_s
|
|
74
|
+
when :time
|
|
75
|
+
integer_to_timestring(onecell)
|
|
76
|
+
when :link
|
|
77
|
+
%("#{onecell.url.gsub('"', '""')}")
|
|
78
|
+
else
|
|
79
|
+
fail "unhandled celltype #{celltype(row, col, sheet)}"
|
|
80
|
+
end || ""
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Roo
|
|
2
|
+
module Formatters
|
|
3
|
+
module Matrix
|
|
4
|
+
# returns a matrix object from the whole sheet or a rectangular area of a sheet
|
|
5
|
+
def to_matrix(from_row = nil, from_column = nil, to_row = nil, to_column = nil, sheet = default_sheet)
|
|
6
|
+
require 'matrix'
|
|
7
|
+
|
|
8
|
+
return ::Matrix.empty unless first_row
|
|
9
|
+
|
|
10
|
+
from_row ||= first_row(sheet)
|
|
11
|
+
to_row ||= last_row(sheet)
|
|
12
|
+
from_column ||= first_column(sheet)
|
|
13
|
+
to_column ||= last_column(sheet)
|
|
14
|
+
|
|
15
|
+
::Matrix.rows(from_row.upto(to_row).map do |row|
|
|
16
|
+
from_column.upto(to_column).map do |col|
|
|
17
|
+
cell(row, col, sheet)
|
|
18
|
+
end
|
|
19
|
+
end)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# returns an XML representation of all sheets of a spreadsheet file
|
|
2
|
+
module Roo
|
|
3
|
+
module Formatters
|
|
4
|
+
module XML
|
|
5
|
+
def to_xml
|
|
6
|
+
Nokogiri::XML::Builder.new do |xml|
|
|
7
|
+
xml.spreadsheet do
|
|
8
|
+
sheets.each do |sheet|
|
|
9
|
+
self.default_sheet = sheet
|
|
10
|
+
xml.sheet(name: sheet) do |x|
|
|
11
|
+
if first_row && last_row && first_column && last_column
|
|
12
|
+
# sonst gibt es Fehler bei leeren Blaettern
|
|
13
|
+
first_row.upto(last_row) do |row|
|
|
14
|
+
first_column.upto(last_column) do |col|
|
|
15
|
+
next if empty?(row, col)
|
|
16
|
+
|
|
17
|
+
x.cell(cell(row, col),
|
|
18
|
+
row: row,
|
|
19
|
+
column: col,
|
|
20
|
+
type: celltype(row, col))
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end.to_xml
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Roo
|
|
2
|
+
module Formatters
|
|
3
|
+
module YAML
|
|
4
|
+
# returns a rectangular area (default: all cells) as yaml-output
|
|
5
|
+
# you can add additional attributes with the prefix parameter like:
|
|
6
|
+
# oo.to_yaml({"file"=>"flightdata_2007-06-26", "sheet" => "1"})
|
|
7
|
+
def to_yaml(prefix = {}, from_row = nil, from_column = nil, to_row = nil, to_column = nil, sheet = default_sheet)
|
|
8
|
+
# return an empty string if there is no first_row, i.e. the sheet is empty
|
|
9
|
+
return "" unless first_row
|
|
10
|
+
|
|
11
|
+
from_row ||= first_row(sheet)
|
|
12
|
+
to_row ||= last_row(sheet)
|
|
13
|
+
from_column ||= first_column(sheet)
|
|
14
|
+
to_column ||= last_column(sheet)
|
|
15
|
+
|
|
16
|
+
result = "--- \n"
|
|
17
|
+
from_row.upto(to_row) do |row|
|
|
18
|
+
from_column.upto(to_column) do |col|
|
|
19
|
+
next if empty?(row, col, sheet)
|
|
20
|
+
|
|
21
|
+
result << "cell_#{row}_#{col}: \n"
|
|
22
|
+
prefix.each do|k, v|
|
|
23
|
+
result << " #{k}: #{v} \n"
|
|
24
|
+
end
|
|
25
|
+
result << " row: #{row} \n"
|
|
26
|
+
result << " col: #{col} \n"
|
|
27
|
+
result << " celltype: #{celltype(row, col, sheet)} \n"
|
|
28
|
+
value = cell(row, col, sheet)
|
|
29
|
+
if celltype(row, col, sheet) == :time
|
|
30
|
+
value = integer_to_timestring(value)
|
|
31
|
+
end
|
|
32
|
+
result << " value: #{value} \n"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
result
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
data/lib/roo/link.rb
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'uri'
|
|
2
|
+
|
|
3
|
+
module Roo
|
|
4
|
+
class Link < String
|
|
5
|
+
# FIXME: Roo::Link inherits from String. A link cell is_a?(Roo::Link). **It is
|
|
6
|
+
# the only situation where a cells `value` is always a String**. Link
|
|
7
|
+
# cells have a nifty `to_uri` method, but this method isn't easily
|
|
8
|
+
# reached. (e.g. `sheet.sheet_for(nil).cells[[row,column]]).value.to_uri`;
|
|
9
|
+
# `sheet.hyperlink(row, column)` doesn't use `to_uri`).
|
|
10
|
+
#
|
|
11
|
+
# 1. Add different types of links (String, Numeric, Date, DateTime, etc.)
|
|
12
|
+
# 2. Remove Roo::Link.
|
|
13
|
+
# 3. Don't inherit the string and pass the cell's value.
|
|
14
|
+
#
|
|
15
|
+
# I don't know the historical reasons for the Roo::Link, but right now
|
|
16
|
+
# it seems uneccessary. I'm in favor of keeping it just in case.
|
|
17
|
+
#
|
|
18
|
+
# I'm also in favor of passing the cell's value to Roo::Link. The
|
|
19
|
+
# cell.value's class would still be Roo::Link, but the value itself
|
|
20
|
+
# would depend on what type of cell it is (Numeric, Date, etc.).
|
|
21
|
+
#
|
|
22
|
+
attr_reader :href
|
|
23
|
+
alias_method :url, :href
|
|
24
|
+
|
|
25
|
+
def initialize(href = '', text = href)
|
|
26
|
+
super(text)
|
|
27
|
+
@href = href
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def to_uri
|
|
31
|
+
URI.parse href
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|