robust_excel_ole 1.31 → 1.32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog +20 -1
  3. data/README.rdoc +118 -18
  4. data/___dummy_workbook.xls +0 -0
  5. data/benchmarking/creek_example.rb +1 -1
  6. data/benchmarking/roo_example.rb +1 -1
  7. data/benchmarking/simple_xlsx_reader_example.rb +1 -1
  8. data/benchmarking/spreadsheet_example.rb +1 -1
  9. data/docs/README_excel.rdoc +16 -24
  10. data/docs/README_listobjects.rdoc +176 -0
  11. data/docs/README_open.rdoc +12 -12
  12. data/docs/README_ranges.rdoc +72 -55
  13. data/docs/README_save_close.rdoc +3 -3
  14. data/docs/README_sheet.rdoc +18 -13
  15. data/examples/example_ruby_library.rb +2 -2
  16. data/examples/introductory_examples/example_range.rb +2 -2
  17. data/examples/modifying_sheets/example_access_sheets_and_cells.rb +6 -6
  18. data/examples/modifying_sheets/example_add_names.rb +1 -1
  19. data/examples/modifying_sheets/example_concating.rb +1 -1
  20. data/examples/modifying_sheets/example_copying.rb +2 -2
  21. data/examples/modifying_sheets/example_listobjects.rb +86 -0
  22. data/examples/modifying_sheets/example_naming.rb +1 -1
  23. data/examples/modifying_sheets/example_ranges.rb +1 -1
  24. data/examples/open_save_close/example_control_to_excel.rb +1 -1
  25. data/examples/open_save_close/example_if_obstructed_closeifsaved.rb +1 -1
  26. data/examples/open_save_close/example_if_obstructed_save.rb +3 -3
  27. data/examples/open_save_close/example_if_unsaved_accept.rb +1 -1
  28. data/examples/open_save_close/example_if_unsaved_forget.rb +3 -3
  29. data/examples/open_save_close/example_if_unsaved_forget_more.rb +4 -4
  30. data/examples/open_save_close/example_read_only.rb +1 -1
  31. data/examples/open_save_close/example_simple.rb +1 -1
  32. data/examples/open_save_close/example_unobtrusively.rb +3 -3
  33. data/lib/robust_excel_ole/address_tool.rb +54 -44
  34. data/lib/robust_excel_ole/base.rb +4 -6
  35. data/lib/robust_excel_ole/bookstore.rb +2 -16
  36. data/lib/robust_excel_ole/cell.rb +16 -21
  37. data/lib/robust_excel_ole/excel.rb +131 -186
  38. data/lib/robust_excel_ole/general.rb +82 -55
  39. data/lib/robust_excel_ole/list_object.rb +182 -109
  40. data/lib/robust_excel_ole/list_row.rb +65 -38
  41. data/lib/robust_excel_ole/range.rb +125 -93
  42. data/lib/robust_excel_ole/range_owners.rb +52 -66
  43. data/lib/robust_excel_ole/version.rb +1 -1
  44. data/lib/robust_excel_ole/workbook.rb +168 -176
  45. data/lib/robust_excel_ole/worksheet.rb +177 -141
  46. data/robust_excel_ole.gemspec +4 -3
  47. data/spec/bookstore_spec.rb +2 -3
  48. data/spec/cell_spec.rb +9 -9
  49. data/spec/data/more_data/workbook.xls +0 -0
  50. data/spec/excel_spec.rb +132 -85
  51. data/spec/general_spec.rb +47 -15
  52. data/spec/list_object_spec.rb +258 -145
  53. data/spec/list_row_spec.rb +218 -0
  54. data/spec/range_spec.rb +76 -29
  55. data/spec/spec_helper.rb +15 -1
  56. data/spec/workbook_spec.rb +75 -34
  57. data/spec/workbook_specs/workbook_all_spec.rb +2 -1
  58. data/spec/workbook_specs/workbook_misc_spec.rb +20 -13
  59. data/spec/workbook_specs/workbook_open_spec.rb +47 -45
  60. data/spec/workbook_specs/workbook_save_spec.rb +21 -22
  61. data/spec/workbook_specs/workbook_sheet_spec.rb +3 -3
  62. data/spec/workbook_specs/workbook_unobtr_spec.rb +303 -303
  63. data/spec/worksheet_spec.rb +522 -318
  64. metadata +37 -2
data/spec/general_spec.rb CHANGED
@@ -11,6 +11,7 @@ module RobustExcelOle
11
11
 
12
12
  using StringRefinement
13
13
  using ToReoRefinement
14
+ using FindAllIndicesRefinement
14
15
 
15
16
  describe General do
16
17
 
@@ -45,15 +46,25 @@ module RobustExcelOle
45
46
  rm_tmp(@dir)
46
47
  end
47
48
 
48
- describe "relace_umlauts, underscore" do
49
-
50
- it "should" do
51
- "ä".replace_umlauts.should == "ae"
49
+ describe "find_all_indices" do
50
+
51
+ it "should find all occurrences" do
52
+ [1,2,3,1].find_all_indices(1).should == [0,3]
53
+ [1,2,3,1].find_all_indices(4).should be_empty
54
+ ["a","b","c","a"].find_all_indices("a").should == [0,3]
55
+ ["a","b","c","a"].find_all_indices("d").should be_empty
56
+ ["a","ö","ß","a"].find_all_indices("a").should == [0,3]
57
+ ["a","b","c","d"].find_all_indices("ä").should be_empty
58
+ ["ä","ö","ß","ä"].find_all_indices("ä").should == [0,3]
59
+ ["stück","öl","straße","stück"].find_all_indices("stück").should == [0,3]
52
60
  end
53
61
 
62
+ end
63
+
64
+ describe "relace_umlauts, underscore" do
65
+
54
66
  it "should replace umlauts" do
55
- new_word = "BeforeÄÖÜäöüßAfter".replace_umlauts
56
- new_word.should == "BeforeAeOeUeaeoeuessAfter"
67
+ "BeforeÄÖÜäöüß²³After".replace_umlauts.should == "BeforeAeOeUeaeoeuess23After"
57
68
  end
58
69
 
59
70
  it "should underscore" do
@@ -69,14 +80,25 @@ module RobustExcelOle
69
80
  @book2 = Workbook.open(@listobject_file)
70
81
  end
71
82
 
83
+ it "should type-lift an ListRow" do
84
+ worksheet = @book2.sheet(3)
85
+ ole_table = worksheet.ListObjects.Item(1)
86
+ table = Table.new(ole_table)
87
+ listrow = table[1]
88
+ listrow.values.should == [3.0, "John", 50.0, 0.5, 30.0]
89
+ type_lifted_listrow = listrow.ole_tablerow.to_reo
90
+ type_lifted_listrow.should be_a ListRow
91
+ type_lifted_listrow.values.should == [3.0, "John", 50.0, 0.5, 30.0]
92
+ end
93
+
72
94
  it "should type-lift an ListObject" do
73
95
  worksheet = @book2.sheet(3)
74
96
  ole_table = worksheet.ListObjects.Item(1)
75
97
  table = Table.new(ole_table)
76
98
  table.Name.should == "table3"
77
99
  table.HeaderRowRange.Value.first.should == ["Number","Person","Amount","Time","Price"]
78
- table.ListRows.Count.should == 6
79
- worksheet[3,4].Value.should == "Number"
100
+ table.ListRows.Count.should == 13
101
+ worksheet[3,4].should == "Number"
80
102
  end
81
103
 
82
104
  it "should type-lift an Excel" do
@@ -114,6 +136,15 @@ module RobustExcelOle
114
136
  @book1.sheet(1).to_reo.should == @book1.sheet(1)
115
137
  @book1.excel.to_reo.should == @book1.excel
116
138
  @book1.sheet(1).range([1,1]).to_reo.should == @book1.sheet(1).range([1,1])
139
+ @book2.sheet(3).table(1).to_reo.should == @book2.sheet(3).table(1)
140
+ @book2.sheet(3).table(1).should == @book2.sheet(3).table(1)
141
+ @book2.sheet(3).table(1)[1].to_reo.should == @book2.sheet(3).table(1)[1]
142
+ end
143
+
144
+ it "should raise error" do
145
+ expect{
146
+ WIN32OLE.new('WScript.Network').to_reo
147
+ }.to raise_error(TypeREOError)
117
148
  end
118
149
 
119
150
  end
@@ -124,6 +155,14 @@ module RobustExcelOle
124
155
  @book1 = Workbook.open(@simple_file, :visible => true)
125
156
  end
126
157
 
158
+ it "should not overwrite methods" do
159
+ RobustExcelOle::Excel.define_method(:ComputerName){ "computer" }
160
+ network = WIN32OLE.new('WScript.Network')
161
+ computername = network.ComputerName
162
+ General.init_reo_for_win32ole
163
+ network.ComputerName.should == computername
164
+ end
165
+
127
166
  it "should apply reo-methods to win32ole objects" do
128
167
  ole_book1 = @book1.ole_workbook
129
168
  sheet1 = ole_book1.sheet(1)
@@ -270,13 +309,6 @@ module RobustExcelOle
270
309
  canonize("this../.i.s/.../..the/..../pa.th/").should == "this../.i.s/.../..the/..../pa.th"
271
310
  end
272
311
 
273
- =begin
274
- it "should downcase" do
275
- canonize("/This/IS/tHe/path").should == "/this/is/the/path"
276
- canonize("///THIS/.///./////iS//the/../PatH/////").should == "/this/is/path"
277
- end
278
- =end
279
-
280
312
  it "should raise an error for no strings" do
281
313
  expect{
282
314
  canonize(1)
@@ -10,7 +10,7 @@ include General
10
10
  describe ListObject do
11
11
 
12
12
  before(:all) do
13
- excel = Excel.new(:reuse => true)
13
+ excel = Excel.new(reuse: true)
14
14
  open_books = excel == nil ? 0 : excel.Workbooks.Count
15
15
  puts "*** open books *** : #{open_books}" if open_books > 0
16
16
  Excel.kill_all
@@ -19,16 +19,30 @@ describe ListObject do
19
19
  before do
20
20
  @dir = create_tmpdir
21
21
  @listobject_file = @dir + '/workbook_listobjects.xlsx'
22
- @book = Workbook.open(@listobject_file, :visible => true)
22
+ @book = Workbook.open(@listobject_file, visible: true)
23
23
  @sheet = @book.sheet(3)
24
24
  end
25
25
 
26
26
  after do
27
- @book.close(:if_unsaved => :forget)
27
+ @book.close(if_unsaved: :forget)
28
28
  Excel.kill_all
29
29
  rm_tmp(@dir)
30
30
  end
31
31
 
32
+ describe "accessing a table" do
33
+
34
+ it "should access a table via its number" do
35
+ table = @sheet.table(1)
36
+ table.Name.should == "table3"
37
+ end
38
+
39
+ it "should access a table via its name" do
40
+ table = @sheet.table("table3")
41
+ table.Name.should == "table3"
42
+ end
43
+
44
+ end
45
+
32
46
  describe "creating" do
33
47
 
34
48
  context "with standard" do
@@ -38,7 +52,15 @@ describe ListObject do
38
52
  table.Name.should == "table_name"
39
53
  table.HeaderRowRange.Value.first.should == ["Person","Amount"]
40
54
  table.ListRows.Count.should == 3
41
- @sheet[1,1].Value.should == "Person"
55
+ @sheet[1,1].should == "Person"
56
+ end
57
+
58
+ it "should create a new table with umlauts" do
59
+ table = Table.new(@sheet, "lösung", [1,1], 3, ["Verkäufer","Straße"])
60
+ table.Name.encode_value.should == "lösung"
61
+ table.HeaderRowRange.Value.first.encode_value.should == ["Verkäufer","Straße"]
62
+ table.ListRows.Count.should == 3
63
+ @sheet[1,1].encode_value.should == "Verkäufer"
42
64
  end
43
65
 
44
66
  it "should do the idempotence" do
@@ -53,8 +75,9 @@ describe ListObject do
53
75
  table = Table.new(ole_table)
54
76
  table.Name.should == "table3"
55
77
  table.HeaderRowRange.Value.first.should == ["Number","Person","Amount","Time","Price"]
56
- table.ListRows.Count.should == 6
57
- @sheet[3,4].Value.should == "Number"
78
+ table.ListRows.Count.should == 13
79
+ @sheet[3,4].should == "Number"
80
+ table.position.should == [3,4]
58
81
  end
59
82
 
60
83
  it "should type-lift a Win32ole list object into a RobustExcelOle list object with table name" do
@@ -62,8 +85,8 @@ describe ListObject do
62
85
  table = Table.new(@sheet, "table3")
63
86
  table.Name.should == "table3"
64
87
  table.HeaderRowRange.Value.first.should == ["Number","Person","Amount","Time","Price"]
65
- table.ListRows.Count.should == 6
66
- @sheet[3,4].Value.should == "Number"
88
+ table.ListRows.Count.should == 13
89
+ @sheet[3,4].should == "Number"
67
90
  end
68
91
 
69
92
  it "should type-lift a Win32ole list object into a RobustExcelOle list object with item number" do
@@ -71,8 +94,8 @@ describe ListObject do
71
94
  table = Table.new(@sheet, 1)
72
95
  table.Name.should == "table3"
73
96
  table.HeaderRowRange.Value.first.should == ["Number","Person","Amount","Time","Price"]
74
- table.ListRows.Count.should == 6
75
- @sheet[3,4].Value.should == "Number"
97
+ table.ListRows.Count.should == 13
98
+ @sheet[3,4].should == "Number"
76
99
  end
77
100
 
78
101
  it "should simply create a new table from a ole-worksheet" do
@@ -80,7 +103,7 @@ describe ListObject do
80
103
  table.Name.should == "table_name"
81
104
  table.HeaderRowRange.Value.first.should == ["Person","Amount"]
82
105
  table.ListRows.Count.should == 3
83
- @sheet[1,1].Value.should == "Person"
106
+ @sheet[1,1].should == "Person"
84
107
  end
85
108
 
86
109
  it "should type-lift a Win32ole list object into a RobustExcelOle list object with table name" do
@@ -88,8 +111,8 @@ describe ListObject do
88
111
  table = Table.new(@sheet.ole_worksheet, "table3")
89
112
  table.Name.should == "table3"
90
113
  table.HeaderRowRange.Value.first.should == ["Number","Person","Amount","Time","Price"]
91
- table.ListRows.Count.should == 6
92
- @sheet[3,4].Value.should == "Number"
114
+ table.ListRows.Count.should == 13
115
+ @sheet[3,4].should == "Number"
93
116
  end
94
117
 
95
118
  it "should type-lift a Win32ole list object into a RobustExcelOle list object with item number" do
@@ -97,125 +120,151 @@ describe ListObject do
97
120
  table = Table.new(@sheet.ole_worksheet, 1)
98
121
  table.Name.should == "table3"
99
122
  table.HeaderRowRange.Value.first.should == ["Number","Person","Amount","Time","Price"]
100
- table.ListRows.Count.should == 6
101
- @sheet[3,4].Value.should == "Number"
123
+ table.ListRows.Count.should == 13
124
+ @sheet[3,4].should == "Number"
102
125
  end
103
126
 
104
127
  end
105
128
 
106
129
  end
107
130
 
108
- describe "getting and setting values" do
109
-
110
- context "with various column names" do
111
-
112
- context "with standard" do
113
-
114
- before do
115
- @table = Table.new(@sheet, "table_name", [12,1], 3, ["Person1","Win/Sales", "xiq-Xs", "OrderID", "YEAR", "length in m", "Amo%untSal___es"])
116
- @table_row1 = @table[1]
117
- end
118
-
119
- it "should read and set values via alternative column names" do
120
- @table_row1.person1.should be nil
121
- @table_row1.person1 = "John"
122
- @table_row1.person1.should == "John"
123
- @sheet[13,1].Value.should == "John"
124
- @table_row1.Person1 = "Herbert"
125
- @table_row1.Person1.should == "Herbert"
126
- @sheet[13,1].Value.should == "Herbert"
127
- @table_row1.win_sales.should be nil
128
- @table_row1.win_sales = 42
129
- @table_row1.win_sales.should == 42
130
- @sheet[13,2].Value.should == 42
131
- @table_row1.Win_Sales = 80
132
- @table_row1.Win_Sales.should == 80
133
- @sheet[13,2].Value.should == 80
134
- @table_row1.xiq_xs.should == nil
135
- @table_row1.xiq_xs = 90
136
- @table_row1.xiq_xs.should == 90
137
- @sheet[13,3].Value.should == 90
138
- @table_row1.xiq_Xs = 100
139
- @table_row1.xiq_Xs.should == 100
140
- @sheet[13,3].Value.should == 100
141
- @table_row1.order_id.should == nil
142
- @table_row1.order_id = 1
143
- @table_row1.order_id.should == 1
144
- @sheet[13,4].Value.should == 1
145
- @table_row1.OrderID = 2
146
- @table_row1.OrderID.should == 2
147
- @sheet[13,4].Value.should == 2
148
- @table_row1.year = 1984
149
- @table_row1.year.should == 1984
150
- @sheet[13,5].Value.should == 1984
151
- @table_row1.YEAR = 2020
152
- @table_row1.YEAR.should == 2020
153
- @sheet[13,5].Value.should == 2020
154
- @table_row1.length_in_m.should == nil
155
- @table_row1.length_in_m = 20
156
- @table_row1.length_in_m.should == 20
157
- @sheet[13,6].Value.should == 20
158
- @table_row1.length_in_m = 40
159
- @table_row1.length_in_m.should == 40
160
- @sheet[13,6].Value.should == 40
161
- @table_row1.amo_unt_sal___es.should == nil
162
- @table_row1.amo_unt_sal___es = 80
163
- @table_row1.amo_unt_sal___es.should == 80
164
- @sheet[13,7].Value.should == 80
165
- end
131
+ describe "each" do
132
+
133
+ before do
134
+ @table1 = @sheet.table(1)
135
+ end
166
136
 
137
+ it "should traverse through list rows" do
138
+ @table1.each.with_index do |listrow, i|
139
+ listrow.values.should == [3.0, "John", 50.0, 0.5, 30] if i == 0
140
+ listrow.values.should == [2.0, "Fred", nil, 0.5416666666666666, 40] if i == 1
141
+ listrow.values.should == [nil, nil, nil, nil, nil] if i == 2
167
142
  end
143
+ end
168
144
 
169
- context "with umlauts" do
170
-
171
- before do
172
- @table = Table.new(@sheet, "table_name", [1,1], 3, ["Verkäufer", "Straße", "area in m²"])
173
- @table_row1 = @table[1]
174
- end
175
-
176
- it "should read and set values via alternative column names" do
177
- @table_row1.verkaeufer.should be nil
178
- @table_row1.verkaeufer = "John"
179
- @table_row1.verkaeufer.should == "John"
180
- @sheet[2,1].Value.should == "John"
181
- @table_row1.Verkaeufer = "Herbert"
182
- @table_row1.Verkaeufer.should == "Herbert"
183
- @sheet[2,1].Value.should == "Herbert"
184
- @table_row1.strasse.should be nil
185
- @table_row1.strasse = 42
186
- @table_row1.strasse.should == 42
187
- @sheet[2,2].Value.should == 42
188
- @table_row1.Strasse = 80
189
- @table_row1.Strasse.should == 80
190
- @sheet[2,2].Value.should == 80
191
- @table_row1.area_in_m3.should be nil
192
- @table_row1.area_in_m3 = 10
193
- @table_row1.area_in_m3.should == 10
194
- @sheet[2,3].Value.should == 10
195
- end
145
+ end
146
+
147
+ describe "benchmarking for accessing a listrow" do
196
148
 
149
+ it "should access the last row" do
150
+ rows = 150
151
+ table = Table.new(@sheet.ole_worksheet, "table_name", [20,1], rows, ["Index","Person", "Time", "Price", "Sales", "Length", "Size", "Width", "Weight", "Income", "Outcome", "Holiday", "Gender", "Sex", "Tallness", "Kindness", "Music", "Activity", "Goal", "Need"])
152
+ (1..rows).each do |row|
153
+ table[row].values = [12345678, "Johnason", 12345678, "Johnason", 12345678, "Johnason", 12345678, "Johnason", 12345678, "Johnason", 12345678, "Johnason", 12345678, "Johnason", 12345678, "Johnason", 12345678, "Johnason", 12345678, "Johnason"]
197
154
  end
155
+ table[rows].values = [12345123, "Peterson", 12345678, "Johnason", 12345678, "Johnason", 12345678, "Johnason", 12345678, "Johnason", 12345678, "Johnason", 12345678, "Johnason", 12345678, "Johnason", 12345678, "Johnason", 12345678, "Johnason"]
156
+ sleep 1
157
+ start_time = Time.now
158
+ listrow = table[{"Index" => 12345123, "Person" => "Peterson"}]
159
+ end_time = Time.now
160
+ duration = end_time - start_time
161
+ puts "duration: #{duration}"
162
+ puts "listrow.values: #{listrow.values}"
163
+ end
198
164
 
165
+ end
166
+
167
+ describe "accessing a listrow" do
168
+
169
+ before do
170
+ @table1 = @sheet.table(1)
199
171
  end
200
172
 
201
- context "with type-lifted ole list object" do
173
+ it "should access a listrow given its number" do
174
+ listrow = @table1[2]
175
+ listrow.should be_a ListRow
176
+ listrow.values.should == [2.0, "Fred", nil, 0.5416666666666666, 40]
177
+ end
202
178
 
203
- before do
204
- ole_table = @sheet.ListObjects.Item(1)
205
- @table = Table.new(ole_table)
206
- @table_row1 = @table[1]
207
- end
179
+ it "should access a listrow via a multiple-column key" do
180
+ listrow = @table1[{"Number" => 3, "Person" => "Angel"}]
181
+ listrow.should be_a ListRow
182
+ listrow.values.should == [3.0, "Angel", 100, 0.6666666666666666, 60]
183
+ end
208
184
 
209
- it "should set and read values" do
210
- @table_row1.number.should == 3
211
- @table_row1.number = 1
212
- @table_row1.number.should == 1
213
- @sheet[4,4].Value.should == 1
214
- @table_row1.person.should == "John"
215
- @table_row1.person = "Herbert"
216
- @table_row1.person.should == "Herbert"
217
- @sheet[4,5].Value.should == "Herbert"
218
- end
185
+ it "should access a listrow with key not case-sensitive or symbol" do
186
+ @table1[{"Person" => "Angel"}].values.should == [3.0, "Angel", 100, 0.6666666666666666, 60]
187
+ @table1[{"PERSON" => "Angel"}].values.should == [3.0, "Angel", 100, 0.6666666666666666, 60]
188
+ @table1[{"person" => "Angel"}].values.should == [3.0, "Angel", 100, 0.6666666666666666, 60]
189
+ @table1[{:person => "Angel"}].values.should == [3.0, "Angel", 100, 0.6666666666666666, 60]
190
+ end
191
+
192
+ it "should yield nil if there is no match" do
193
+ @table1[{"Number" => 5, "Person" => "Angel"}].should == nil
194
+ @table1[{"Number" => 5, "Person" => "Angel"}, limit: :first].should == nil
195
+ end
196
+
197
+ it "should yield nil if there is no match" do
198
+ @table1[{"Number" => 5, "Person" => "Angel"}, limit: 1].should == []
199
+ end
200
+
201
+ #it "should raise an error if the key contains no existing columns" do
202
+ # expect{
203
+ # @table1[{"Number" => 3, "Persona" => "Angel"}]
204
+ # }.to raise_error(TableError)
205
+ #end
206
+
207
+ it "should access one matching listrow" do
208
+ @table1[{"Number" => 3}, limit: :first].values.should == [3.0, "John", 50.0, 0.5, 30]
209
+ end
210
+
211
+ it "should access one matching listrow" do
212
+ @table1[{"Number" => 3}, limit: 1].map{|l| l.values}.should == [[3.0, "John", 50.0, 0.5, 30]]
213
+ end
214
+
215
+ it "should access two matching listrows" do
216
+ @table1[{"Number" => 3}, limit: 2].map{|l| l.values}.should == [[3.0, "John", 50.0, 0.5, 30],[3.0, "Angel", 100, 0.6666666666666666, 60]]
217
+ end
218
+
219
+ it "should access four matching listrows" do
220
+ @table1[{"Number" => 3}, limit: 4].map{|l| l.values}.should == [[3.0, "John", 50.0, 0.5, 30],[3.0, "Angel", 100, 0.6666666666666666, 60],
221
+ [3.0, "Eiffel", 50.0, 0.5, 30], [3.0, "Berta", nil, 0.5416666666666666, 40]]
222
+ end
223
+
224
+ it "should access all matching listrows" do
225
+ @table1[{"Number" => 3}, limit: nil].map{|l| l.values}.should == [[3.0, "John", 50.0, 0.5, 30],
226
+ [3.0, "Angel", 100, 0.6666666666666666, 60],
227
+ [3.0, "Eiffel", 50.0, 0.5, 30],
228
+ [3.0, "Berta", nil, 0.5416666666666666, 40],
229
+ [3.0, "Martha", nil, nil, nil],
230
+ [3.0, "Paul", 40.0, 0.5, 80]]
231
+ end
232
+
233
+ it "should access listrows containing umlauts" do
234
+ #@table1[1].values = [1, "Sören", 20.0, 0.1, 40]
235
+ #@table1[{"Number" => 1, "Person" => "Sören"}].values.encode_value.should == [1, "Sören", 20.0, 0.1, 40]
236
+ @table1.add_column("Straße", 3, ["ä","ö","ü","ß","²","³","g","h","i","j","k","l","m"])
237
+ @table1[1].values = [1, "Sören", "Lösung", 20.0, 0.1, 40]
238
+ @table1[1].values.should == [1, "Sören", "Lösung", 20.0, 0.1, 40]
239
+ @table1[{"Number" => 1, "Person" => "Sören"}].values.encode_value.should == [1, "Sören", "Lösung", 20.0, 0.1, 40]
240
+ @table1[{"Number" => 1, "Straße" => "Lösung"}].values.encode_value.should == [1, "Sören", "Lösung", 20.0, 0.1, 40]
241
+ end
242
+
243
+ end
244
+
245
+ describe "#value" do
246
+
247
+ before do
248
+ @table1 = @sheet.table(1)
249
+ end
250
+
251
+ it "should return values" do
252
+ table_value = [
253
+ ["Number", "Person", "Amount", "Time", "Price"],
254
+ [3.0, "John", 50.0, 0.5, 30.0],
255
+ [2.0, "Fred", nil, 0.5416666666666666, 40.0],
256
+ [nil, nil, nil, nil, nil],
257
+ [3.0, "Angel", 100.0, 0.6666666666666666, 60.0],
258
+ [nil, nil, nil, nil, nil],
259
+ [1.0, "Werner", 40.0, 0.5, 80.0],
260
+ [3.0, "Eiffel", 50.0, 0.5, 30.0],
261
+ [3.0, "Berta", nil, 0.5416666666666666, 40.0],
262
+ [nil, nil, nil, nil, nil],
263
+ [nil, nil, nil, nil, nil],
264
+ [3.0, "Martha", nil, nil, nil],
265
+ [3.0, "Paul", 40.0, 0.5, 80.0],
266
+ [1.0, "Napoli", 20.0, 0.4166666666666667, 70.0]]
267
+ @table1.value.should == table_value
219
268
  end
220
269
 
221
270
  end
@@ -228,17 +277,17 @@ describe ListObject do
228
277
  end
229
278
 
230
279
  it "should read contents of a column" do
231
- @table.column_values("Person").should == ["John","Fred",nil,"Angel",nil,"Werner"]
280
+ @table.column_values("Person").should == ["John","Fred",nil,"Angel",nil,"Werner","Eiffel","Berta",nil,nil,"Martha","Paul","Napoli"]
232
281
  expect{
233
282
  @table.column_values("P")
234
283
  }.to raise_error(TableError)
235
284
  end
236
285
 
237
286
  it "should set contents of a column" do
238
- @table.set_column_values("Person",["H",nil,nil,nil,"G","W"])
239
- @table.ListColumns.Item(2).Range.Value.should == [["Person"],["H"],[nil],[nil],[nil],["G"],["W"]]
287
+ @table.set_column_values("Person",["H",nil,nil,nil,"G","W",nil,nil,nil,nil,nil,nil,nil])
288
+ @table.ListColumns.Item(2).Range.Value.should == [["Person"],["H"],[nil],[nil],[nil],["G"],["W"],[nil],[nil],[nil],[nil],[nil],[nil],[nil]]
240
289
  @table.set_column_values("Person",["T","Z"])
241
- @table.ListColumns.Item(2).Range.Value.should == [["Person"],["T"],["Z"],[nil],[nil],["G"],["W"]]
290
+ @table.ListColumns.Item(2).Range.Value.should == [["Person"],["T"],["Z"],[nil],[nil],["G"],["W"],[nil],[nil],[nil],[nil],[nil],[nil],[nil]]
242
291
  expect{
243
292
  @table.set_column_values("P",["H",nil,nil,nil,"G","W"])
244
293
  }.to raise_error(TableError)
@@ -248,7 +297,7 @@ describe ListObject do
248
297
  @table.row_values(1).should == [3.0, "John", 50.0, 0.5, 30]
249
298
  @table[1].values.should == [3.0, "John", 50.0, 0.5, 30]
250
299
  expect{
251
- @table.row_values(9)
300
+ @table.row_values(14)
252
301
  }.to raise_error(TableError)
253
302
  end
254
303
 
@@ -261,10 +310,21 @@ describe ListObject do
261
310
  @table[1].set_values([4, "John"])
262
311
  @table.ListRows.Item(1).Range.Value.first.should == [4, "John", 20.0, 0.1, 40]
263
312
  expect{
264
- @table.set_row_values(9, [5, "George", 30.0, 0.2, 50])
313
+ @table.set_row_values(14, [5, "George", 30.0, 0.2, 50])
265
314
  }.to raise_error(TableError)
266
315
  end
267
316
 
317
+ it "should set contents of an incomplete row " do
318
+ @table[1].values = [2, "Merlin", 20.0, 0.1, 40]
319
+ @table[1].values = [4, "John"]
320
+ @table.ListRows.Item(1).Range.Value.first.should == [4, "John", 20.0, 0.1, 40]
321
+ end
322
+
323
+ it "should set contents of a row with umlauts" do
324
+ @table[1].values = [1, "Sören", 20.0, 0.1, 40]
325
+ @table.ListRows.Item(1).Range.Value.first.encode_value.should == [1, "Sören", 20.0, 0.1, 40]
326
+ end
327
+
268
328
  end
269
329
 
270
330
  describe "renaming, adding and deleting columns and rows" do
@@ -297,9 +357,15 @@ describe ListObject do
297
357
  end
298
358
 
299
359
  it "should add a column with contents" do
300
- @table.add_column("column_name", 3, ["a","b","c","d","e","f"])
360
+ @table.add_column("column_name", 3, ["a","b","c","d","e","f","g","h","i","j","k","l","m"])
301
361
  column_names = @table.HeaderRowRange.Value.first.should == ["Number","Person","column_name","Amount","Time","Price"]
302
- @table.ListColumns.Item(3).Range.Value.should == [["column_name"],["a"],["b"],["c"],["d"],["e"],["f"]]
362
+ @table.ListColumns.Item(3).Range.Value.should == [["column_name"],["a"],["b"],["c"],["d"],["e"],["f"],["g"],["h"],["i"],["j"],["k"],["l"],["m"]]
363
+ end
364
+
365
+ it "should add a column with umlauts" do
366
+ @table.add_column("Sören", 3, ["ä","ö","ü","ß","²","³","g","h","i","j","k","l","m"])
367
+ column_names = @table.HeaderRowRange.Value.first.encode_value.should == ["Number","Person","Sören","Amount","Time","Price"]
368
+ @table.ListColumns.Item(3).Range.Value.map{|v| v.encode_value}.should == [["Sören"],["ä"],["ö"],["ü"],["ß"],["²"],["³"],["g"],["h"],["i"],["j"],["k"],["l"],["m"]]
303
369
  end
304
370
 
305
371
  it "should delete a column" do
@@ -323,7 +389,7 @@ describe ListObject do
323
389
  listrows.Item(2).Range.Value.first.should == [nil,nil,nil,nil,nil]
324
390
  listrows.Item(3).Range.Value.first.should == [2.0, "Fred", nil, 0.5416666666666666, 40]
325
391
  expect{
326
- @table.add_row(9)
392
+ @table.add_row(16)
327
393
  }.to raise_error(TableError)
328
394
  end
329
395
 
@@ -335,24 +401,29 @@ describe ListObject do
335
401
  listrows.Item(3).Range.Value.first.should == [2.0, "Fred", nil, 0.5416666666666666, 40]
336
402
  end
337
403
 
404
+ it "should add a row with contents with umlauts" do
405
+ @table.add_row(1, [2.0, "Sören", 30.0, 0.25, 40])
406
+ @table.ListRows.Item(1).Range.Value.first.encode_value.should == [2.0, "Sören", 30.0, 0.25, 40]
407
+ end
408
+
338
409
  it "should delete a row" do
339
410
  @table.delete_row(4)
340
411
  listrows = @table.ListRows
341
412
  listrows.Item(5).Range.Value.first.should == [1,"Werner",40,0.5, 80]
342
413
  listrows.Item(4).Range.Value.first.should == [nil,nil,nil,nil,nil]
343
414
  expect{
344
- @table.delete_row(8)
415
+ @table.delete_row(15)
345
416
  }.to raise_error(TableError)
346
417
  end
347
418
 
348
419
  it "should delete the contents of a column" do
349
- @table.ListColumns.Item(3).Range.Value.should == [["Amount"],[50],[nil],[nil],[100],[nil],[40]]
420
+ @table.ListColumns.Item(3).Range.Value.should == [["Amount"],[50],[nil],[nil],[100],[nil],[40],[50],[nil],[nil],[nil],[nil],[40],[20]]
350
421
  @table.delete_column_values(3)
351
422
  @table.HeaderRowRange.Value.first.should == ["Number","Person", "Amount", "Time","Price"]
352
- @table.ListColumns.Item(3).Range.Value.should == [["Amount"],[nil],[nil],[nil],[nil],[nil],[nil]]
353
- @table.ListColumns.Item(1).Range.Value.should == [["Number"],[3],[2],[nil],[3],[nil],[1]]
423
+ @table.ListColumns.Item(3).Range.Value.should == [["Amount"],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil]]
424
+ @table.ListColumns.Item(1).Range.Value.should == [["Number"],[3],[2],[nil],[3],[nil],[1],[3],[3],[nil],[nil],[3],[3],[1]]
354
425
  @table.delete_column_values("Number")
355
- @table.ListColumns.Item(1).Range.Value.should == [["Number"],[nil],[nil],[nil],[nil],[nil],[nil]]
426
+ @table.ListColumns.Item(1).Range.Value.should == [["Number"],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil]]
356
427
  expect{
357
428
  @table.delete_column_values("N")
358
429
  }.to raise_error(TableError)
@@ -366,13 +437,13 @@ describe ListObject do
366
437
  @table[1].delete_values
367
438
  @table.ListRows.Item(1).Range.Value.first.should == [nil,nil,nil,nil,nil]
368
439
  expect{
369
- @table.delete_row_values(9)
440
+ @table.delete_row_values(14)
370
441
  }.to raise_error(TableError)
371
442
  end
372
443
 
373
444
  it "should delete empty rows" do
374
445
  @table.delete_empty_rows
375
- @table.ListRows.Count.should == 4
446
+ @table.ListRows.Count.should == 9
376
447
  @table.ListRows.Item(1).Range.Value.first.should == [3.0, "John", 50.0, 0.5, 30]
377
448
  @table.ListRows.Item(2).Range.Value.first.should == [2.0, "Fred", nil, 0.5416666666666666, 40]
378
449
  @table.ListRows.Item(3).Range.Value.first.should == [3, "Angel", 100, 0.6666666666666666, 60]
@@ -391,21 +462,58 @@ describe ListObject do
391
462
 
392
463
  describe "find all cells of a given value" do
393
464
 
394
- before do
395
- ole_table = @sheet.ListObjects.Item(1)
396
- @table = Table.new(ole_table)
465
+ context "with standard" do
466
+
467
+ before do
468
+ ole_table = @sheet.ListObjects.Item(1)
469
+ @table = Table.new(ole_table)
470
+ end
471
+
472
+ it "should find all cells" do
473
+ cells = @table.find_cells(40)
474
+ cells[0].Row.should == 5
475
+ cells[0].Column.should == 8
476
+ cells[1].Row.should == 9
477
+ cells[1].Column.should == 6
478
+ end
479
+
397
480
  end
398
481
 
399
- it "should find all cells" do
400
- cells = @table.find_cells(40)
401
- cells[0].Row.should == 5
402
- cells[0].Column.should == 8
403
- cells[1].Row.should == 9
404
- cells[1].Column.should == 6
482
+ context "with umlauts" do
483
+
484
+ before do
485
+ @table = Table.new(@sheet, "lösung", [1,1], 3, ["Verkäufer","Straße"])
486
+ @table[1].values = ["sören", "stück"]
487
+ @table[2].values = ["stück", "glück"]
488
+ @table[3].values = ["soße", "stück"]
489
+ end
490
+
491
+ it "should find all cells" do
492
+ cells = @table.find_cells("stück")
493
+ cells[0].Row.should == 2
494
+ cells[0].Column.should == 2
495
+ cells[1].Row.should == 3
496
+ cells[1].Column.should == 1
497
+ cells[2].Row.should == 4
498
+ cells[2].Column.should == 2
499
+ end
500
+
405
501
  end
406
502
 
407
503
  end
408
504
 
505
+ describe "==" do
506
+
507
+ it "should yield true" do
508
+ (@sheet.table(1) == @sheet.table(1)).should be true
509
+ end
510
+
511
+ it "should yield false" do
512
+ table2 = Table.new(@sheet, "lösung", [1,1], 3, ["Verkäufer","Straße"])
513
+ (table2 == @sheet.table(1)).should be false
514
+ end
515
+ end
516
+
409
517
  describe "sort the table" do
410
518
 
411
519
  before do
@@ -415,10 +523,15 @@ describe ListObject do
415
523
 
416
524
  it "should sort the table according to first table" do
417
525
  @table.sort("Number")
418
- @table.ListRows.Item(1).Range.Value.first.should == [1,"Werner",40,0.5, 80]
419
- @table.ListRows.Item(2).Range.Value.first.should == [2, "Fred", nil, 0.5416666666666666, 40]
420
- @table.ListRows.Item(3).Range.Value.first.should == [3, "John", 50.0, 0.5, 30]
421
- @table.ListRows.Item(4).Range.Value.first.should == [3, "Angel", 100, 0.6666666666666666, 60]
526
+ @table.ListRows.Item(1).Range.Value.first.should == [1, "Werner",40,0.5, 80]
527
+ @table.ListRows.Item(2).Range.Value.first.should == [1, "Napoli", 20.0, 0.4166666666666667, 70.0]
528
+ @table.ListRows.Item(3).Range.Value.first.should == [2, "Fred", nil, 0.5416666666666666, 40]
529
+ @table.ListRows.Item(4).Range.Value.first.should == [3, "John", 50.0, 0.5, 30]
530
+ @table.ListRows.Item(5).Range.Value.first.should == [3, "Angel", 100, 0.6666666666666666, 60]
531
+ @table.ListRows.Item(6).Range.Value.first.should == [3, "Eiffel", 50.0, 0.5, 30]
532
+ @table.ListRows.Item(7).Range.Value.first.should == [3, "Berta", nil, 0.5416666666666666, 40]
533
+ @table.ListRows.Item(8).Range.Value.first.should == [3, "Martha", nil, nil, nil]
534
+ @table.ListRows.Item(9).Range.Value.first.should == [3, "Paul", 40.0, 0.5, 80]
422
535
  end
423
536
 
424
537
  end