roo 0.5.0 → 0.5.1
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.
- data/History.txt +9 -1
- data/Manifest.txt +3 -0
- data/Rakefile +2 -1
- data/examples/roo_soap_client.rb +2 -2
- data/lib/roo/excel.rb +94 -20
- data/lib/roo/google.rb +104 -92
- data/lib/roo/openoffice.rb +152 -107
- data/lib/roo/version.rb +1 -1
- data/test/bode-v1.xls.zip +0 -0
- data/test/numbers1.ods +0 -0
- data/test/only_one_sheet.ods +0 -0
- data/test/only_one_sheet.xls +0 -0
- data/test/test_roo.rb +605 -547
- data/website/index.html +19 -2
- data/website/index.txt +11 -0
- metadata +16 -4
data/History.txt
CHANGED
@@ -1,5 +1,13 @@
|
|
1
|
+
== 0.5.1 2007-08-26
|
2
|
+
* 4 enhancements:
|
3
|
+
* Openoffice: Exception if an illegal sheet-name is selected
|
4
|
+
* Openoffice/Excel: no need to set a default_sheet if there is only one in
|
5
|
+
the document
|
6
|
+
* Excel: can now read zip-ed files
|
7
|
+
* Excel: can now read files from http://-URL over the net
|
8
|
+
|
1
9
|
== 0.5.0 2007-07-20
|
2
|
-
*
|
10
|
+
* 3 enhancements:
|
3
11
|
* Excel-objects: the methods default_sheet= and sheets can now handle names instead of numbers
|
4
12
|
* changed the celltype methods to return symbols, not strings anymore (possible values are :formula, :float, :string, :date, :percentage (if you need strings you can convert it with .to_s)
|
5
13
|
* tests can now run on the client machine (not only my machine), if there are not public released files involved these tests are skipped
|
data/Manifest.txt
CHANGED
data/Rakefile
CHANGED
@@ -14,7 +14,7 @@ require File.join(File.dirname(__FILE__), 'lib', 'roo', 'version')
|
|
14
14
|
|
15
15
|
AUTHOR = 'Thomas Preymesser' # can also be an array of Authors
|
16
16
|
EMAIL = "thopre@gmail.com"
|
17
|
-
DESCRIPTION = "roo can access the contents of OpenOffice-Spreadsheets"
|
17
|
+
DESCRIPTION = "roo can access the contents of OpenOffice-Spreadsheets and Excel-Spreadsheets"
|
18
18
|
GEM_NAME = 'roo' # what ppl will type to install your gem
|
19
19
|
|
20
20
|
@config_file = "~/.rubyforge/user-config.yml"
|
@@ -79,6 +79,7 @@ hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
79
79
|
['rubyzip', '>= 0.9.1'],
|
80
80
|
['hpricot', '>= 0.5'],
|
81
81
|
['hoe', '>= 0.0.0'],
|
82
|
+
['GData', '>= 0.0.3'],
|
82
83
|
]
|
83
84
|
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
84
85
|
end
|
data/examples/roo_soap_client.rb
CHANGED
@@ -45,9 +45,9 @@ puts "last column: #{proxy.last_column}"
|
|
45
45
|
puts "cell: #{proxy.cell('C',8)}"
|
46
46
|
puts "cell: #{proxy.cell('F',12)}"
|
47
47
|
puts "officeversion: #{proxy.officeversion}"
|
48
|
-
puts "
|
48
|
+
puts "Berlin:"
|
49
49
|
|
50
|
-
ferien_fuer_region(proxy, "
|
50
|
+
ferien_fuer_region(proxy, "Berlin")
|
51
51
|
|
52
52
|
|
53
53
|
|
data/lib/roo/excel.rb
CHANGED
@@ -1,18 +1,37 @@
|
|
1
1
|
require 'rubygems'
|
2
|
+
gem 'parseexcel', '>= 0.5.2'
|
2
3
|
require 'parseexcel'
|
4
|
+
require 'pp'
|
3
5
|
|
4
6
|
class Excel < Openoffice
|
5
7
|
|
6
|
-
def initialize(filename)
|
8
|
+
def initialize(filename, packed = nil)
|
9
|
+
@tmpdir = "oo_"+$$.to_s
|
10
|
+
unless File.exists?(@tmpdir)
|
11
|
+
FileUtils::mkdir(@tmpdir)
|
12
|
+
end
|
13
|
+
filename = open_from_uri(filename) if filename[0,7] == "http://"
|
14
|
+
filename = unzip(filename) if packed and packed == :zip
|
7
15
|
if filename[-4..-1] != ".xls"
|
8
16
|
warn "are you sure, this is an excel file?"
|
9
17
|
end
|
10
18
|
@filename = filename
|
19
|
+
p filename
|
11
20
|
@workbook = Spreadsheet::ParseExcel.parse(filename)
|
12
21
|
@default_sheet = nil
|
22
|
+
# no need to set default_sheet if there is only one sheet in the document
|
23
|
+
if self.sheets.size == 1
|
24
|
+
@default_sheet = self.sheets.first
|
25
|
+
end
|
13
26
|
@first_row = @last_row = @first_column = @last_column = nil
|
14
27
|
end
|
15
28
|
|
29
|
+
def remove_tmp
|
30
|
+
if File.exists?(@tmpdir)
|
31
|
+
FileUtils::rm_r(@tmpdir)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
16
35
|
def sheets
|
17
36
|
#if DateTime.now < Date.new(2007,6,10)
|
18
37
|
# return ["Tabelle1", "Name of Sheet 2", "Sheet3"]
|
@@ -29,19 +48,15 @@ class Excel < Openoffice
|
|
29
48
|
end
|
30
49
|
|
31
50
|
# sets the working sheet (1,2,3,..)
|
32
|
-
#--
|
33
|
-
# im Excel-Bereich muesste man wahrscheinlich intern mit Nummern arbeiten
|
34
|
-
# von aussen arbeite ich mit (1,2,3... intern wird Index 0,1,2,...
|
35
|
-
# verwendet.
|
36
51
|
def default_sheet=(n)
|
37
|
-
if
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
@default_sheet = n-1
|
42
|
-
else
|
52
|
+
if n.kind_of?(Fixnum)
|
53
|
+
@default_sheet = n #-1
|
54
|
+
elsif n.kind_of?(String)
|
55
|
+
raise RangeError if ! self.sheets.include?(n)
|
43
56
|
# parseexcel supports now the name of a sheet
|
44
57
|
@default_sheet = n
|
58
|
+
else
|
59
|
+
raise TypeError, "what are you trying to set as default sheet?"
|
45
60
|
end
|
46
61
|
@first_row = @last_row = @first_column = @last_column = nil
|
47
62
|
@cells_read = false
|
@@ -106,11 +121,8 @@ class Excel < Openoffice
|
|
106
121
|
when :text then result << cell.to_s('utf-8')
|
107
122
|
when :date then result << cell.date
|
108
123
|
else
|
109
|
-
#p cell.type
|
110
124
|
return result << cell.to_s('utf-8')
|
111
125
|
end
|
112
|
-
|
113
|
-
#result << cell.value
|
114
126
|
}
|
115
127
|
return result
|
116
128
|
end
|
@@ -152,6 +164,37 @@ class Excel < Openoffice
|
|
152
164
|
false
|
153
165
|
end
|
154
166
|
|
167
|
+
def open_from_uri(uri)
|
168
|
+
require 'open-uri' ;
|
169
|
+
|
170
|
+
script = nil ;
|
171
|
+
result = nil ;
|
172
|
+
#uri = "/home/tp/ruby-test/roo/test/numbers1.xls"
|
173
|
+
|
174
|
+
#begin ;
|
175
|
+
# result = open(page) {|w| script = w.readlines } ;
|
176
|
+
#rescue => e ;
|
177
|
+
# puts "e=#{e}, e.class=#{e.class}" ;
|
178
|
+
# result = [] ;
|
179
|
+
#end ;
|
180
|
+
#
|
181
|
+
# puts "result class=#{result.class}, count=#{result.length}" ; #,
|
182
|
+
# data=#{result}" ;
|
183
|
+
# puts "result[0] =>#{result[0].chomp}<=" if result[0] ;
|
184
|
+
|
185
|
+
tempfilename = File.join(@tmpdir, File.basename(uri))
|
186
|
+
f = File.open( File.join(@tmpdir, File.basename(uri)),"w")
|
187
|
+
begin
|
188
|
+
open(uri) do |net|
|
189
|
+
f.write(net.read)
|
190
|
+
end
|
191
|
+
rescue
|
192
|
+
raise "could not open #{uri}"
|
193
|
+
end
|
194
|
+
f.close
|
195
|
+
File.join(@tmpdir, File.basename(uri))
|
196
|
+
end
|
197
|
+
|
155
198
|
private
|
156
199
|
|
157
200
|
# check if default_sheet was set
|
@@ -170,18 +213,13 @@ private
|
|
170
213
|
if row_par
|
171
214
|
row_par.each_with_index {|cell,i|
|
172
215
|
# nicht beruecksichtigen, wenn nil und vorher noch nichts war
|
173
|
-
|
174
|
-
if !cell
|
175
|
-
# nix
|
176
|
-
else
|
216
|
+
if cell
|
177
217
|
fc = [fc, i+1].min
|
178
218
|
lc = [lc, i+1].max
|
179
219
|
fr = [fr, line].min
|
180
220
|
lr = [lr, line].max
|
181
221
|
end
|
182
222
|
}
|
183
|
-
else
|
184
|
-
#???
|
185
223
|
end
|
186
224
|
line += 1
|
187
225
|
}
|
@@ -204,4 +242,40 @@ private
|
|
204
242
|
end
|
205
243
|
raise StandardError, "sheet '#{name}' not found"
|
206
244
|
end
|
245
|
+
|
246
|
+
def process_zipfile(zip, path='')
|
247
|
+
ret=nil
|
248
|
+
if zip.file.file? path
|
249
|
+
#puts %{#{path}: "#{zip.read(path)}"}
|
250
|
+
puts %{#{path}: }
|
251
|
+
# extract and return filename
|
252
|
+
@tmpdir = "oo_"+$$.to_s
|
253
|
+
unless File.exists?(@tmpdir)
|
254
|
+
FileUtils::mkdir(@tmpdir)
|
255
|
+
end
|
256
|
+
#file = File.new(File.join(@tmpdir, path))
|
257
|
+
file = File.open(File.join(@tmpdir, path),"w")
|
258
|
+
file.write(zip.read(path))
|
259
|
+
file.close
|
260
|
+
p File.join(@tmpdir, path)
|
261
|
+
return File.join(@tmpdir, path)
|
262
|
+
else
|
263
|
+
unless path.empty?
|
264
|
+
path += '/'
|
265
|
+
puts path
|
266
|
+
end
|
267
|
+
zip.dir.foreach(path) do |filename|
|
268
|
+
ret = process_zipfile(zip, path + filename)
|
269
|
+
end
|
270
|
+
end
|
271
|
+
ret
|
272
|
+
end
|
273
|
+
|
274
|
+
def unzip(filename)
|
275
|
+
ret = nil
|
276
|
+
Zip::ZipFile.open(filename) do |zip|
|
277
|
+
ret = process_zipfile zip
|
278
|
+
end
|
279
|
+
ret
|
280
|
+
end
|
207
281
|
end
|
data/lib/roo/google.rb
CHANGED
@@ -1,112 +1,124 @@
|
|
1
1
|
|
2
|
-
require 'net/http'
|
3
|
-
require 'net/https'
|
4
|
-
require 'uri'
|
2
|
+
#require 'net/http'
|
3
|
+
#require 'net/https'
|
4
|
+
#require 'uri'
|
5
5
|
require 'rubygems'
|
6
|
-
require 'hpricot'
|
6
|
+
#require 'hpricot'
|
7
7
|
require 'timeout'
|
8
|
-
|
8
|
+
#require 'GData'
|
9
|
+
require 'gdata'
|
9
10
|
|
10
11
|
# Make it easy to use some of the convenience methods using https
|
11
12
|
#
|
12
|
-
module Net class HTTPS < HTTP
|
13
|
-
def initialize(address, port = nil)
|
14
|
-
super(address, port)
|
15
|
-
self.use_ssl = true
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
class GoogleSpreadSheet
|
21
|
-
GOOGLE_LOGIN_URL = URI.parse('https://www.google.com/accounts/ClientLogin')
|
22
|
-
|
23
|
-
def initialize(spreadsheet_key)
|
24
|
-
@spreadsheet_key = spreadsheet_key
|
25
|
-
@headers = nil
|
26
|
-
@default_sheet = nil
|
27
|
-
end
|
28
|
-
|
29
|
-
def default_sheet=(numberofsheet)
|
30
|
-
@default_sheet = numberofsheet
|
31
|
-
end
|
32
|
-
|
33
|
-
def authenticate(email, password)
|
34
|
-
$VERBOSE = nil
|
35
|
-
response = Net::HTTPS.post_form(GOOGLE_LOGIN_URL,
|
36
|
-
{'Email' => email,
|
37
|
-
'Passwd' => password,
|
38
|
-
'source' => "formula",
|
39
|
-
'service' => 'wise' })
|
40
|
-
@headers = { 'Authorization' => "GoogleLogin auth=#{response.body.split(/=/).last}",
|
41
|
-
'Content-Type' => 'application/atom+xml'
|
42
|
-
}
|
43
|
-
end
|
44
|
-
|
45
|
-
def evaluate_cell(cell)
|
46
|
-
path = "/feeds/cells/#{@spreadsheet_key}/#{@default_sheet}/#{@headers ? "private" : "public"}/basic/#{cell}"
|
47
|
-
|
48
|
-
doc = Hpricot(request(path))
|
49
|
-
result = (doc/"content[@type='text']").inner_html
|
50
|
-
end
|
51
|
-
|
52
|
-
def set_entry(entry)
|
53
|
-
path = "/feeds/cells/#{@spreadsheet_key}/#{@default_sheet}/#{@headers ? 'private' : 'public'}/full"
|
54
|
-
|
55
|
-
post(path, entry)
|
56
|
-
end
|
57
|
-
|
58
|
-
def entry(formula, row=1, col=1)
|
59
|
-
<<XML
|
60
|
-
|
61
|
-
|
62
|
-
<gs:cell row='#{row}' col='#{col}' inputValue='=#{formula}' />
|
63
|
-
|
64
|
-
XML
|
65
|
-
end
|
66
|
-
|
67
|
-
def add_to_cell(formula) #puts entry(formula)
|
68
|
-
set_entry(entry(formula))
|
69
|
-
end
|
70
|
-
|
71
|
-
private
|
72
|
-
def request(path)
|
73
|
-
response, data = get_http.get(path, @headers)
|
74
|
-
data
|
75
|
-
end
|
76
|
-
|
77
|
-
def post(path, entry)
|
78
|
-
get_http.post(path, entry, @headers)
|
79
|
-
end
|
80
|
-
|
81
|
-
def get_http
|
82
|
-
http = Net::HTTP.new('spreadsheets.google.com', 80)
|
83
|
-
#http.set_debug_output $stderr
|
84
|
-
http
|
85
|
-
end
|
86
|
-
end
|
13
|
+
#module Net class HTTPS < HTTP
|
14
|
+
# def initialize(address, port = nil)
|
15
|
+
# super(address, port)
|
16
|
+
# self.use_ssl = true
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
#end
|
20
|
+
#
|
21
|
+
#class GoogleSpreadSheet
|
22
|
+
# GOOGLE_LOGIN_URL = URI.parse('https://www.google.com/accounts/ClientLogin')
|
23
|
+
#
|
24
|
+
# def initialize(spreadsheet_key)
|
25
|
+
# @spreadsheet_key = spreadsheet_key
|
26
|
+
# @headers = nil
|
27
|
+
# @default_sheet = nil
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# def default_sheet=(numberofsheet)
|
31
|
+
# @default_sheet = numberofsheet
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# def authenticate(email, password)
|
35
|
+
# $VERBOSE = nil
|
36
|
+
# response = Net::HTTPS.post_form(GOOGLE_LOGIN_URL,
|
37
|
+
# {'Email' => email,
|
38
|
+
# 'Passwd' => password,
|
39
|
+
# 'source' => "formula",
|
40
|
+
# 'service' => 'wise' })
|
41
|
+
# @headers = { 'Authorization' => "GoogleLogin auth=#{response.body.split(/=/).last}",
|
42
|
+
# 'Content-Type' => 'application/atom+xml'
|
43
|
+
# }
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# def evaluate_cell(cell)
|
47
|
+
# path = "/feeds/cells/#{@spreadsheet_key}/#{@default_sheet}/#{@headers ? "private" : "public"}/basic/#{cell}"
|
48
|
+
#
|
49
|
+
# doc = Hpricot(request(path))
|
50
|
+
# result = (doc/"content[@type='text']").inner_html
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# def set_entry(entry)
|
54
|
+
# path = "/feeds/cells/#{@spreadsheet_key}/#{@default_sheet}/#{@headers ? 'private' : 'public'}/full"
|
55
|
+
#
|
56
|
+
# post(path, entry)
|
57
|
+
# end
|
58
|
+
#
|
59
|
+
# def entry(formula, row=1, col=1)
|
60
|
+
# <<XML
|
61
|
+
#<?xml version='1.0' ?>
|
62
|
+
#<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gs='http://schemas.google.com/spreadsheets/2006'>
|
63
|
+
# <gs:cell row='#{row}' col='#{col}' inputValue='=#{formula}' />
|
64
|
+
#</entry>
|
65
|
+
#XML
|
66
|
+
# end
|
67
|
+
#
|
68
|
+
# def add_to_cell(formula) #puts entry(formula)
|
69
|
+
# set_entry(entry(formula))
|
70
|
+
# end
|
71
|
+
#
|
72
|
+
# private
|
73
|
+
# def request(path)
|
74
|
+
# response, data = get_http.get(path, @headers)
|
75
|
+
# data
|
76
|
+
# end
|
77
|
+
#
|
78
|
+
# def post(path, entry)
|
79
|
+
# get_http.post(path, entry, @headers)
|
80
|
+
# end
|
81
|
+
#
|
82
|
+
# def get_http
|
83
|
+
# http = Net::HTTP.new('spreadsheets.google.com', 80)
|
84
|
+
# #http.set_debug_output $stderr
|
85
|
+
# http
|
86
|
+
# end
|
87
|
+
#end
|
87
88
|
|
88
89
|
class Google < Openoffice
|
89
90
|
|
90
91
|
TIMEOUT_IN_SECONDS = 2
|
91
92
|
|
92
|
-
def initialize(user, password, spreadsheetkey)
|
93
|
+
def initialize(user, password, spreadsheetkey, spreadsheetname)
|
93
94
|
@cells_read = false
|
94
95
|
@cell = Hash.new
|
95
96
|
@cell_type = Hash.new
|
96
|
-
Timeout.timeout(TIMEOUT_IN_SECONDS) {
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
}
|
97
|
+
#Timeout.timeout(TIMEOUT_IN_SECONDS) {
|
98
|
+
# @gs = GoogleSpreadSheet.new(spreadsheetkey)
|
99
|
+
# @gs.authenticate(user, password)
|
100
|
+
# @default_sheet = nil
|
101
|
+
#}
|
102
|
+
# alle eigenen Spreadsheets bei Google
|
103
|
+
# @spreadsheets= GData::Spreadsheet.spreadsheets("emmanuel.pirsch@gmail.com", "secret") # funktioniert anscheinend noch nicht!!!!!!!!!
|
104
|
+
# ein einzelnes Spreadsheet bei Google
|
105
|
+
# @spreadsheet= spreadsheet[spreadsheetname]
|
106
|
+
|
107
|
+
#gb = GData::Base.new
|
108
|
+
#gb.authenticate("thopre@gmail.com","nora3033")
|
109
|
+
|
110
|
+
g = GData::Spreadsheet.new("ttt")
|
111
|
+
@default_sheet = nil
|
101
112
|
end
|
102
113
|
|
103
114
|
def sheets
|
104
|
-
# http://spreadsheets.google.com/feeds/worksheets/ptu6bbahNZpYrdGHwteUNCw/private/full
|
105
|
-
if DateTime.now < Date.new(2007,6,15)
|
106
|
-
|
107
|
-
else
|
108
|
-
|
109
|
-
end
|
115
|
+
# http://spreadsheets.google.com/feeds/worksheets/ptu6bbahNZpYrdGHwteUNCw/private/full
|
116
|
+
#if DateTime.now < Date.new(2007,6,15)
|
117
|
+
# return ["Sheet eins","Sheet zwei","Sheet drei"]
|
118
|
+
#else
|
119
|
+
# return []
|
120
|
+
#end
|
121
|
+
@spreadsheet
|
110
122
|
end
|
111
123
|
|
112
124
|
def default_sheet=(numberofsheet)
|
data/lib/roo/openoffice.rb
CHANGED
@@ -4,7 +4,7 @@ require 'rexml/document'
|
|
4
4
|
require 'fileutils'
|
5
5
|
require 'zip/zipfilesystem'
|
6
6
|
require 'date'
|
7
|
-
require 'llip'
|
7
|
+
#require 'llip'
|
8
8
|
require 'base64'
|
9
9
|
|
10
10
|
#require 'lib/roo/spreadsheetparser'
|
@@ -16,13 +16,13 @@ class Openoffice
|
|
16
16
|
# initialization and opening of a spreasheet file
|
17
17
|
# file will be created if 'create' is true
|
18
18
|
# and the file does not exist
|
19
|
-
def initialize(filename, create = false)
|
19
|
+
def initialize(filename, packed=nil) #, create = false)
|
20
20
|
if filename[-4..-1] != ".ods"
|
21
21
|
warn "are you sure, this is an openoffice file?"
|
22
22
|
end
|
23
|
-
if create and ! File.exists?(filename)
|
24
|
-
|
25
|
-
end
|
23
|
+
#if create and ! File.exists?(filename)
|
24
|
+
# self.create_openoffice(filename)
|
25
|
+
#end
|
26
26
|
@cells_read = false
|
27
27
|
@filename = filename
|
28
28
|
@tmpdir = "oo_"+$$.to_s
|
@@ -38,15 +38,19 @@ class Openoffice
|
|
38
38
|
@cell = Hash.new
|
39
39
|
@cell_type = Hash.new
|
40
40
|
@formula = Hash.new
|
41
|
-
if ENV["roo_local"] != "thomas-p"
|
41
|
+
#if ENV["roo_local"] != "thomas-p"
|
42
42
|
FileUtils::rm_r(@tmpdir)
|
43
|
-
end
|
43
|
+
#end
|
44
44
|
@default_sheet = nil
|
45
|
+
# no need to set default_sheet if there is only one sheet in the document
|
46
|
+
if self.sheets.size == 1
|
47
|
+
@default_sheet = self.sheets.first
|
48
|
+
end
|
45
49
|
@first_column = @last_column = nil
|
46
50
|
@first_row = @last_row = nil
|
47
|
-
trap('INT') {
|
48
|
-
FileUtils::rm_r(@tmpdir)
|
49
|
-
}
|
51
|
+
# trap('INT') {
|
52
|
+
# FileUtils::rm_r(@tmpdir)
|
53
|
+
# }
|
50
54
|
end
|
51
55
|
|
52
56
|
# creates a new empty openoffice-spreadsheet file
|
@@ -61,33 +65,32 @@ class Openoffice
|
|
61
65
|
f.close
|
62
66
|
end
|
63
67
|
|
64
|
-
#
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
83
|
-
end
|
68
|
+
#if false
|
69
|
+
#def reload
|
70
|
+
# @cells_read = false
|
71
|
+
# @tmpdir = "oo_"+$$.to_s
|
72
|
+
# unless File.exists?(@tmpdir)
|
73
|
+
# FileUtils::mkdir(@tmpdir)
|
74
|
+
# end
|
75
|
+
# extract_content
|
76
|
+
# file = File.new(File.join(@tmpdir, @file_nr.to_s+"_roo_content.xml"))
|
77
|
+
# @doc = REXML::Document.new file
|
78
|
+
# file.close
|
79
|
+
# @cell = Hash.new
|
80
|
+
# @cell_type = Hash.new
|
81
|
+
# FileUtils::rm_r(@tmpdir)
|
82
|
+
# @default_sheet = nil
|
83
|
+
# @first_column = @last_column = nil
|
84
|
+
# @first_row = @last_row = nil
|
85
|
+
#end
|
86
|
+
#end
|
84
87
|
|
88
|
+
# reopens and read a spreadsheet document
|
85
89
|
def reload
|
86
90
|
default_sheet = @default_sheet
|
87
91
|
initialize(@filename)
|
88
92
|
self.default_sheet = default_sheet
|
89
|
-
|
90
|
-
|
93
|
+
@first_row = @last_row = @first_column = @last_column = nil
|
91
94
|
end
|
92
95
|
|
93
96
|
# returns the content of a spreadsheet-cell
|
@@ -177,13 +180,17 @@ class Openoffice
|
|
177
180
|
end
|
178
181
|
|
179
182
|
# set the working sheet in the document
|
180
|
-
def default_sheet=(
|
181
|
-
|
183
|
+
def default_sheet=(sheet)
|
184
|
+
if ! sheet.kind_of?(String)
|
185
|
+
raise TypeError, "what are you trying to set as default sheet?"
|
186
|
+
end
|
187
|
+
@default_sheet = sheet
|
182
188
|
@first_row = @last_row = @first_column = @last_column = nil
|
183
189
|
@cells_read = false
|
184
190
|
@cell = Hash.new
|
185
191
|
@cell_type = Hash.new
|
186
192
|
@formula = Hash.new
|
193
|
+
check_default_sheet
|
187
194
|
end
|
188
195
|
|
189
196
|
alias set_default_sheet default_sheet=
|
@@ -191,7 +198,8 @@ class Openoffice
|
|
191
198
|
# version of the openoffice document
|
192
199
|
# at 2007 this is always "1.0"
|
193
200
|
def officeversion
|
194
|
-
read_cells(
|
201
|
+
# read_cells(false) unless @cells_read
|
202
|
+
oo_version
|
195
203
|
@officeversion
|
196
204
|
end
|
197
205
|
|
@@ -324,9 +332,9 @@ class Openoffice
|
|
324
332
|
parser = SpreadsheetParser.new
|
325
333
|
visitor = Visitor.new
|
326
334
|
#puts cell(row,col)
|
327
|
-
puts formula(row,col)
|
335
|
+
#puts formula(row,col)
|
328
336
|
formula = formula(row,col)[1..-1] # .downcase
|
329
|
-
puts formula
|
337
|
+
# puts formula
|
330
338
|
#eval formula
|
331
339
|
#parser.parse(formula)
|
332
340
|
parser.parse(formula).accept(visitor)
|
@@ -371,15 +379,21 @@ class Openoffice
|
|
371
379
|
end
|
372
380
|
|
373
381
|
private
|
382
|
+
# read the version of the OO-Version
|
383
|
+
def oo_version
|
384
|
+
sheet_found = false
|
385
|
+
@doc.each_element do |oo_document|
|
386
|
+
@officeversion = oo_document.attributes['version']
|
387
|
+
end
|
388
|
+
end
|
374
389
|
|
375
390
|
# read all cells in the selected sheet
|
376
|
-
def read_cells
|
377
|
-
|
378
|
-
|
379
|
-
end
|
391
|
+
def read_cells
|
392
|
+
sheet_found = false
|
393
|
+
raise ArgumentError, "Error: default_sheet not set" if @default_sheet == nil
|
380
394
|
oo_document_count = 0
|
381
395
|
@doc.each_element do |oo_document|
|
382
|
-
@officeversion = oo_document.attributes['version']
|
396
|
+
# @officeversion = oo_document.attributes['version']
|
383
397
|
oo_document_count += 1
|
384
398
|
oo_element_count = 0
|
385
399
|
oo_document.each_element do |oo_element|
|
@@ -390,73 +404,73 @@ private
|
|
390
404
|
be.each_element do |se|
|
391
405
|
if se.name == "table"
|
392
406
|
if se.attributes['name']==@default_sheet
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
407
|
+
sheet_found = true
|
408
|
+
x=1
|
409
|
+
y=1
|
410
|
+
se.each_element do |te|
|
411
|
+
if te.name == "table-column"
|
412
|
+
rep = te.attributes["number-columns-repeated"]
|
413
|
+
elsif te.name == "table-row"
|
414
|
+
if te.attributes['number-rows-repeated']
|
415
|
+
skip_y = te.attributes['number-rows-repeated'].to_i
|
416
|
+
y = y + skip_y - 1 # minus 1 because this line will be counted as a line element
|
417
|
+
end
|
418
|
+
te.each_element do |tr|
|
419
|
+
if tr.name == 'table-cell'
|
420
|
+
skip = tr.attributes['number-columns-repeated']
|
421
|
+
formula = tr.attributes['formula']
|
422
|
+
vt = tr.attributes['value-type']
|
423
|
+
v = tr.attributes['value']
|
424
|
+
if vt == 'string'
|
425
|
+
tr.each_element do |str|
|
426
|
+
if str.name == 'p'
|
427
|
+
v = str.text
|
428
|
+
end
|
429
|
+
end
|
430
|
+
end
|
431
|
+
if skip
|
432
|
+
if v == nil
|
433
|
+
x += (skip.to_i - 1)
|
434
|
+
else
|
435
|
+
0.upto(skip.to_i-1) do |i|
|
436
|
+
@cell_type["#{y},#{x+i}"] = Openoffice.oo_type_2_roo_type(vt)
|
437
|
+
@formula["#{y},#{x+i}"] = formula if formula
|
438
|
+
if @cell_type["#{y},#{x+i}"] == :float
|
439
|
+
@cell["#{y},#{x+i}"] = v.to_f
|
440
|
+
elsif @cell_type["#{y},#{x+i}"] == :string
|
441
|
+
@cell["#{y},#{x+i}"] = v
|
442
|
+
elsif @cell_type["#{y},#{x+i}"] == :date
|
443
|
+
@cell["#{y},#{x+i}"] = tr.attributes['date-value']
|
444
|
+
else
|
445
|
+
@cell["#{y},#{x+i}"] = v
|
446
|
+
end
|
447
|
+
end
|
448
|
+
x += 1
|
449
|
+
end
|
450
|
+
end # if skip
|
451
|
+
@formula["#{y},#{x}"] = formula if formula
|
452
|
+
@cell_type["#{y},#{x}"] = Openoffice.oo_type_2_roo_type(vt)
|
453
|
+
if @cell_type["#{y},#{x}"] == :float
|
454
|
+
@cell["#{y},#{x}"] = v.to_f
|
455
|
+
elsif @cell_type["#{y},#{x}"] == :string
|
456
|
+
tr.each_element do |str|
|
457
|
+
if str.name == 'p'
|
458
|
+
@cell["#{y},#{x}"] = str.text
|
459
|
+
end
|
460
|
+
end
|
461
|
+
elsif @cell_type["#{y},#{x}"] == :date
|
462
|
+
@cell["#{y},#{x}"] = tr.attributes['date-value']
|
463
|
+
else
|
464
|
+
@cell["#{y},#{x}"] = v
|
465
|
+
end
|
466
|
+
x += 1
|
467
|
+
end
|
453
468
|
end
|
469
|
+
y += 1
|
470
|
+
x = 1
|
454
471
|
end
|
455
|
-
y += 1
|
456
|
-
x = 1
|
457
472
|
end
|
458
|
-
end
|
459
|
-
end # sheet
|
473
|
+
end # sheet
|
460
474
|
end
|
461
475
|
end
|
462
476
|
end
|
@@ -464,11 +478,42 @@ private
|
|
464
478
|
end
|
465
479
|
end
|
466
480
|
end
|
481
|
+
if sheet_found == false
|
482
|
+
raise RangeError
|
483
|
+
end
|
467
484
|
@cells_read = true
|
468
485
|
end
|
469
486
|
|
487
|
+
# Checks if the default_sheet exists. If not an RangeError exception is
|
488
|
+
# raised
|
489
|
+
def check_default_sheet
|
490
|
+
sheet_found = false
|
491
|
+
raise ArgumentError, "Error: default_sheet not set" if @default_sheet == nil
|
492
|
+
@doc.each_element do |oo_document|
|
493
|
+
oo_element_count = 0
|
494
|
+
oo_document.each_element do |oo_element|
|
495
|
+
oo_element_count += 1
|
496
|
+
if oo_element.name == "body"
|
497
|
+
oo_element.each_element do |be|
|
498
|
+
if be.name == "spreadsheet"
|
499
|
+
be.each_element do |se|
|
500
|
+
if se.name == "table"
|
501
|
+
if se.attributes['name'] == @default_sheet
|
502
|
+
sheet_found = true
|
503
|
+
end # sheet
|
504
|
+
end
|
505
|
+
end
|
506
|
+
end
|
507
|
+
end
|
508
|
+
end
|
509
|
+
end
|
510
|
+
end
|
511
|
+
if ! sheet_found
|
512
|
+
raise RangeError, "sheet '#{@default_sheet}' not found"
|
513
|
+
end
|
514
|
+
end
|
515
|
+
|
470
516
|
def process_zipfile(zip, path='')
|
471
|
-
#p path
|
472
517
|
if zip.file.file? path
|
473
518
|
if path == "content.xml"
|
474
519
|
open(@tmpdir+'/'+@file_nr.to_s+'_roo_content.xml','w') {|f|
|