h1. roo h2. What This gem allows you to access the content of * Open-office spreadsheets (.ods) * Excel spreadsheets (.xls) and * Google (online) spreadsheets h2. Installing
[sudo] gem install rooh2. The basics Currently only read-access is implemented. Google spreadsheets can be read and written. Please note that the upper left cell of a table is numbered (1,1) or (1,'A') (not 0,0). h2. Demonstration of usage Supposed you have created this spreadsheet: which includes the amount of work you have done for a customer. You can now process this spreadsheet with the following sample code.
1 require 'rubygems'
2 require 'roo'
3
4 HOURLY_RATE = 123.45
5
6 oo = Openoffice.new("simple_spreadsheet.ods")
7 oo.default_sheet = oo.sheets.first
8 4.upto(12) do |line|
9 date = oo.cell(line,'A')
10 start_time = oo.cell(line,'B')
11 end_time = oo.cell(line,'C')
12 pause = oo.cell(line,'D')
13 sum = (end_time - start_time) - pause
14 comment = oo.cell(line,'F')
15 amount = sum * HOURLY_RATE
16 if date
17 puts "#{date}\t#{sum}\t#{amount}\t#{comment}"
18 end
19 end
which produces this output
2007-05-07 1.0 123.45 Task 1
2007-05-07 1.75 216.0375 Task 1
2007-05-07 1.0 123.45 Task 2
2007-05-08 1.0 123.45 Task 2
2007-05-08 1.0 123.45 Task 3
2007-05-08 0.5 61.725 Task 3
2007-05-14 0.5 61.725 Task 3
2007-05-14 0.5 61.725 Task 3
2007-05-15 1.0 123.45 Task 3
With the methods
first_column
,
last_column
,
first_row
and
last_row
you can change line 8 from
4.upto(12) do |line|
to
4.upto(oo.last_row) do |line|
h3. Cell Types
oo.*celltype*(row,col) returns the type of a cell. Currently these types will be
returned:
* :float
* :string
* :date
* :percentage
* :formula
* :time
h3. Write access
Cells in a google spreadsheet can be read or written.
To write to a cell use the method call:
oo.set_value(row, col, value)
There is an example in the examples folder which illustrates write access.
h3. Formulas
Formulas in Openoffice- and Google-Spreadsheets can be handled.
oo.*celltype*(row,col) returns :formula if there is a formula in this cell.
oo.*formula?*(row,col) returns true if there is a formula
oo.*formula*(row,col) returns the formula in this cell in a string variable (like "=SUM([.A1:.M13])"). You can do whatever you want with this expression.
If there is no formula in this cell nil is returned.
oo.*cell*(row,col) returns the computed result of the formula (as it was saved in the file, no recalculation is done in this Gem).
oo.*formulas* returns all formulas in the selected spreadsheet in an array like this:
[[1,2,"=SUM(.A1:.B1)"],
[1,3,"=SIN(.C3)"],
[1,4,"=COS(.D4)"]]
Each entry consists of the elements row, col, formula.
Note: oo.*cell*(row,col) is the same for ordinary cells and formulas. So you can use the computated value of a formula. If you have to distinguish if a cell is a formula use #*formula*?
Please note: formulas in Excel-Spreadsheets cannot be handled (this is another gem, see: "Thanks")
h3. YAML-Output
You can generate YAML-Output from your spreadsheet data. The method is called:
oo.to_yaml # => produces YAML output from the entire default spreadsheet
oo.to_yaml({"myattribute1" => "myvalue1", "myattribute2" => "myvalue2")
# => YAML output with additional attributes
oo.to_yaml({..}, 2,10, 300,10) # => only the rectangle from row 2, column 10 to row 300, column 10 will be returned
If you omit one or more parameters the maximum boundaries of your spreadsheet will be used.
With the YAML output you can import your data in a Ruby on Rails application in a manner that spreadsheet data can accessed in a Rails application.
This is not limited to a Rails application - you can also do further evaluations with your data.
h3. CSV-Output
You can generate output in csv-format with
oo.to_csv
to write to the standard output or
oo.to_csv("somefile.txt")
to write to a file.
h3. Using MS-Excel spreadsheets
You can also access MS-Excel spreadsheat.
Replace Openoffice with
oo = Excel.new("simple_spreadsheet.xls").
All methode are the same for OpenOffice-, Excel- and Google-objects.
oo = Excel.new("http://www.somedomain.com/simple_spreadsheet.xls").
oo = Openoffice.new("http://www.somedomain.com/simple_spreadsheet.ods").
or a zipped file:
oo = Excel.new("http://www.somedomain.com/simple_spreadsheet.xls.zip",:zip).
oo = Openoffice.new("http://www.somedomain.com/simple_spreadsheet.ods.zip",:zip).
after working with a spreadsheet from the web you have to call
oo.remove_tmp
to delete the temporary local copy of the spreadsheet file. If you dont call
this method you will have subdirectories names 'oo_xxxxx' which you can remove manually.
Calling remove_tmp is not the best solution to clean temporary files - i will
provide a better solution in the next releases.
h3. Remote Access
You can even access your spreadsheet data from a remote machine via SOAP. The examples directory shows a little example how to do this. If you like, you can extend these functions or restrict the access to certain cells.
Remote access with SOAP is nothing specific to roo, you can do this with every Rub object, but i thought it would nice to give an example what could be done with roo.
h3. Excel spreadsheets / Openoffice spreadsheets / Google spreadsheets with Ruby on Rails
There is a simple helper method to display a spreadsheet at your application page:
* in your controller, add "require 'roo'" and "@rspreadsheet = Openoffice.new("numbers1.ods")" or
"@rspreadsheet = Openoffice.new("http://www.somehost.com/data/numbers1.od s")" to get access to your spreadsheet file
* use it in any view of your application with "<%= spreadsheet @rspreadsheet, ["Tabelle"] %>svn://rubyforge.org/var/svn/gorank/trunk
for anonymous access.