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
@@ -24,7 +24,7 @@ describe Worksheet do
24
24
  @blank_file = @dir + '/book_with_blank.xls'
25
25
  @merge_file = @dir + '/merge_cells.xls'
26
26
  @listobject_file = @dir + '/workbook_listobjects.xlsx'
27
- @book = Workbook.open(@simple_file)
27
+ @book = Workbook.open(@simple_file, v: true)
28
28
  @sheet = @book.sheet(1)
29
29
  end
30
30
 
@@ -119,55 +119,352 @@ describe Worksheet do
119
119
 
120
120
  end
121
121
 
122
- describe "access sheet name" do
123
- describe "#name" do
124
- it 'get sheet1 name' do
125
- @sheet.name.should eq 'Sheet1'
126
- end
122
+ describe "get and access sheet name" do
123
+
124
+ it 'get sheet1 name' do
125
+ @sheet.name.should eq 'Sheet1'
126
+ end
127
+
128
+ it 'change sheet1 name to foo' do
129
+ @sheet.name = 'foo'
130
+ @sheet.name.should eq 'foo'
127
131
  end
128
132
 
129
- describe "#name=" do
130
-
131
- it 'change sheet1 name to foo' do
132
- @sheet.name = 'foo'
133
- @sheet.name.should eq 'foo'
133
+ it "should raise error when adding the same name" do
134
+ @sheet.name = 'foo'
135
+ @sheet.name.should eq 'foo'
136
+ new_sheet = @book.add_sheet @sheet
137
+ expect{
138
+ new_sheet.name = 'foo'
139
+ }.to raise_error(NameAlreadyExists, /sheet name "foo" already exists/)
140
+ end
141
+
142
+ it "should get and set name with umlaut" do
143
+ @sheet.name = "Straße"
144
+ @sheet.name.should == "Straße"
145
+ end
146
+
147
+ it "should set and get numbers as name" do
148
+ @sheet.name = 1
149
+ @sheet.name.should == "1"
150
+ end
151
+
152
+ end
153
+
154
+ describe "#[]" do
155
+
156
+ it "should yield values of a rectangular range [1..2,1..3]" do
157
+ value1 = [["foo", "workbook", "sheet1"], ["foo", nil, "foobaaa"]]
158
+ @sheet[1..2,1..3].should == value1
159
+ @sheet[1..2, "A".."C"].should == value1
160
+ @sheet["A1:C2"].should == value1
161
+ @sheet["Z1S1:Z2S3"].should == value1
162
+ end
163
+
164
+ it "should yield values of a range [1,1..3]" do
165
+ @sheet[1,1..3].should == [["foo", "workbook", "sheet1"]]
166
+ end
167
+
168
+ it "should yield values of range [1..2,1]" do
169
+ @sheet[1..2,1].should == [["foo"], ["foo"]]
170
+ end
171
+
172
+ it "should yield values of row 1" do
173
+ @sheet[1].should == [["foo", "workbook", "sheet1"]]
174
+ end
175
+
176
+ it "should yield value of a cell [1,2]" do
177
+ @sheet[1,2].should == "workbook"
178
+ @sheet["Z1S2"].should == @sheet[1,2]
179
+ @sheet["B1"].should == @sheet[1,2]
180
+ end
181
+
182
+ it "should a range with relative r1c1-reference" do
183
+ @sheet.range([1,1]).Select
184
+ @sheet["Z1S[3]:Z[2]S8"].should == @sheet["Z1S4:Z3S8"]
185
+ end
186
+
187
+ it "should a range with relative integer-range-reference" do
188
+ @sheet.range([1,1]).Select
189
+ @sheet[1..[2],[3]..8].should == @sheet["Z1S4:Z3S8"]
190
+ end
191
+
192
+ it "should return value of a defined name" do
193
+ @book2 = Workbook.open(@dir + '/another_workbook.xls')
194
+ @sheet2 = @book2.sheet(1)
195
+ @sheet2["firstcell"].should == "foo"
196
+ @sheet2["new"].should == "foo"
197
+ @sheet2["one"].should == 1.0
198
+ @sheet2["four"].should == [[1,2],[3,4]]
199
+ @sheet2["firstrow"].should == [[1,2]]
200
+ @sheet2["another"].should == nil
201
+ expect {
202
+ @sheet2["foo"]
203
+ }.to raise_error(RangeNotCreated)
204
+ @book2.close(:if_unsaved => :forget)
205
+ end
206
+
207
+ end
208
+
209
+ describe "#[]=" do
210
+
211
+ before do
212
+ @book1 = Workbook.open(@dir + '/another_workbook.xls')
213
+ @sheet1 = @book1.sheet(1)
214
+ end
215
+
216
+ after do
217
+ @book1.close(:if_unsaved => :forget)
218
+ end
219
+
220
+ it "should set value of a defined name" do
221
+ @sheet1["firstcell"].should == "foo"
222
+ @sheet1["firstcell"] = "bar"
223
+ @sheet1["firstcell"].should == "bar"
224
+ end
225
+
226
+ it "should set value of a defined name with several values" do
227
+ @sheet1["four"].should == [[1,2],[3,4]]
228
+ @sheet1["four"] = [[4,3],[2,1]]
229
+ @sheet1["four"].should == [[4,3],[2,1]]
230
+ end
231
+
232
+ it "should set value of a defined name with one value" do
233
+ @sheet1["four"].should == [[1,2],[3,4]]
234
+ @sheet1["four"] = 2
235
+ @sheet1["four"].should == [[2,2],[2,2]]
236
+ end
237
+
238
+ it "should set value given an address" do
239
+ @sheet1[1..2,1..3].should == [["foo", "workbook", "sheet1"], ["foo", 1.0, 2.0]]
240
+ @sheet1[1..2,1..3] = [["foo", 1.0, 2.0], ["foo", "workbook", "sheet1"]]
241
+ @sheet1[1..2,1..3].should == [["foo", 1.0, 2.0], ["foo", "workbook", "sheet1"]]
242
+ end
243
+
244
+ it "should return nil for a range with empty contents" do
245
+ @sheet1["another"].should == nil
246
+ end
247
+
248
+ #it "should evaluate named formula" do
249
+ # @sheet1["named_formula"].should == 4
250
+ #end
251
+
252
+ #it "should evaluate a formula" do
253
+ # @sheet1["another_formula"].should == 5
254
+ #end
255
+
256
+ it "should raise an error if name not defined" do
257
+ expect {
258
+ @sheet1["foo"]
259
+ }.to raise_error(RangeNotCreated, /cannot find name or address "foo"/)
134
260
  end
135
261
 
136
- it "should raise error when adding the same name" do
137
- @sheet.name = 'foo'
138
- @sheet.name.should eq 'foo'
139
- new_sheet = @book.add_sheet @sheet
262
+ it "should set a range to a value" do
263
+ @sheet1[1,1].should == "foo"
264
+ @sheet1["firstcell"] = "bar"
265
+ @sheet1[1,1].should == "bar"
266
+ @sheet1["new"] = "bar"
267
+ @sheet1["new"].should == "bar"
268
+ end
269
+
270
+ it "should raise an error if name cannot be evaluated" do
140
271
  expect{
141
- new_sheet.name = 'foo'
142
- }.to raise_error(NameAlreadyExists, /sheet name "foo" already exists/)
272
+ @sheet1["foo"] = 1
273
+ }.to raise_error(RangeNotEvaluatable, /cannot assign value to range with name or address "foo"/)
143
274
  end
144
275
  end
145
- end
146
276
 
147
- describe 'access cell' do
277
+ describe 'access values of cells' do
148
278
 
149
279
  describe "#[,]" do
150
280
 
151
- context "access [1,1]" do
281
+ context "access values of [1,1]" do
152
282
 
153
- it { @sheet[1, 1].should be_kind_of Cell }
154
- it { @sheet[1, 1].Value.should eq 'foo' }
283
+ it { @sheet[1, 1].should eq 'foo' }
155
284
  end
156
285
 
157
- context "access [1, 1], [1, 2], [3, 1]" do
286
+ context "access values of [1, 1], [1, 2], [3, 1]" do
158
287
  it "should get every values" do
159
- @sheet[1, 1].Value.should eq 'foo'
160
- @sheet[1, 2].Value.should eq 'workbook'
161
- @sheet[3, 1].Value.should eq 'matz'
288
+ @sheet[1, 1].should eq 'foo'
289
+ @sheet[1, 2].should eq 'workbook'
290
+ @sheet[3, 1].should eq 'matz'
162
291
  end
163
292
  end
164
293
 
165
- # context "supplying nil as parameter" do
166
- # it "should access [1,1]" do
167
- # @sheet[1, nil].Value.should eq 'foo'
168
- # @sheet[nil, 1].Value.should eq 'foo'
169
- # end
170
- # end
294
+ end
295
+
296
+ describe "namevalue_global, set_namevalue_global" do
297
+
298
+ before do
299
+ @book1 = Workbook.open(@dir + '/another_workbook.xls')
300
+ @sheet1 = @book1.sheet(1)
301
+ end
302
+
303
+ after do
304
+ @book1.close(:if_unsaved => :forget)
305
+ end
306
+
307
+ it "should return value of a defined name" do
308
+ @sheet1.namevalue_global("firstcell").should == "foo"
309
+ end
310
+
311
+ #it "should evaluate a formula" do
312
+ # @sheet1.namevalue_global("another_formula").should == 5
313
+ #end
314
+
315
+ it "should raise an error if name not defined" do
316
+ expect {
317
+ @sheet1.namevalue_global("foo")
318
+ }.to raise_error(NameNotFound, /name "foo" not in/)
319
+ end
320
+
321
+ it "should raise an error of coordinates are given instead of a defined name" do
322
+ expect {
323
+ @sheet1.namevalue_global("A1")
324
+ }.to raise_error(NameNotFound, /name "A1" not in/)
325
+ end
326
+
327
+ it "should return default value for a range with empty contents" do
328
+ @sheet1.namevalue_global("another", :default => 2) == 2
329
+ end
330
+
331
+ it "should set a range to a value" do
332
+ @sheet1.namevalue_global("firstcell").should == "foo"
333
+ @sheet1[1,1].should == "foo"
334
+ @sheet1.set_namevalue_global("firstcell","bar")
335
+ @sheet1.namevalue_global("firstcell").should == "bar"
336
+ @sheet1[1,1].should == "bar"
337
+ end
338
+
339
+ it "should raise an error if name cannot be evaluated" do
340
+ expect{
341
+ @sheet1.set_namevalue_global("foo", 1)
342
+ }.to raise_error(RangeNotEvaluatable, /cannot assign value/)
343
+ end
344
+
345
+ it "should color the cell (deprecated)" do
346
+ @sheet1.set_namevalue_global("new", "bar")
347
+ @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == -4142
348
+ @sheet1.set_namevalue_global("new", "bar", :color => 4)
349
+ @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == 4
350
+ end
351
+
352
+ it "should color the cell" do
353
+ @sheet1.set_namevalue_global("new", "bar")
354
+ @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == -4142
355
+ @sheet1.set_namevalue_global("new", "bar", :color => 4)
356
+ @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == 4
357
+ end
358
+
359
+ it "should set a range to a value with umlauts" do
360
+ @sheet1.add_name("lösung", [1,1])
361
+ @sheet1.namevalue_global("lösung").should == "foo"
362
+ @sheet1[1,1].should == "foo"
363
+ @sheet1.set_namevalue_global("lösung","bar")
364
+ @sheet1.namevalue_global("lösung").should == "bar"
365
+ @sheet1[1,1].should == "bar"
366
+ end
367
+
368
+ end
369
+
370
+ describe "namevalue, set_namevalue" do
371
+
372
+ before do
373
+ @book1 = Workbook.open(@dir + '/another_workbook.xls')
374
+ @sheet1 = @book1.sheet(1)
375
+ @sheet2 = @book1.sheet(2)
376
+ end
377
+
378
+ after do
379
+ @book1.close(:if_unsaved => :forget)
380
+ end
381
+
382
+ it "should return value of a locally defined name" do
383
+ @sheet1.namevalue("firstcell").should == "foo"
384
+ end
385
+
386
+ it "should return value of a name with coordinates" do
387
+ @sheet1.namevalue("A1").should == "foo"
388
+ end
389
+
390
+ it "should return nil for a range with empty contents" do
391
+ @sheet1.namevalue("another").should == nil
392
+ end
393
+
394
+ it "should return value of a defined name" do
395
+ @sheet1.namevalue("new").should == "foo"
396
+ @sheet1.namevalue("one").should == 1.0
397
+ @sheet1.namevalue("four").should == [[1,2],[3,4]]
398
+ @sheet1.namevalue("firstrow").should == [[1,2]]
399
+ end
400
+
401
+ it "should return default value if name not defined and default value is given" do
402
+ @sheet1.namevalue("foo", :default => 2).should == 2
403
+ end
404
+
405
+ it "should raise an error if name not defined for the sheet" do
406
+ expect {
407
+ @sheet1.namevalue("foo")
408
+ }.to raise_error(NameNotFound, /name "foo" not in #<Worksheet: Sheet1/)
409
+ expect {
410
+ @sheet1.namevalue("named_formula")
411
+ }.to raise_error(NameNotFound, /name "named_formula" not in #<Worksheet: Sheet1/)
412
+ expect {
413
+ @sheet2.namevalue("firstcell")
414
+ }.to raise_error(NameNotFound, /name "firstcell" not in #<Worksheet: Sheet2/)
415
+ end
416
+
417
+ it "should set a range to a value" do
418
+ @sheet1.namevalue("firstcell").should == "foo"
419
+ @sheet1[1,1].should == "foo"
420
+ @sheet1.set_namevalue("firstcell","bar")
421
+ @sheet1.namevalue("firstcell").should == "bar"
422
+ @sheet1[1,1].should == "bar"
423
+ end
424
+
425
+ it "should set a range to a value with umlauts" do
426
+ @sheet1.add_name("lösung", [1,1])
427
+ @sheet1.namevalue("lösung").should == "foo"
428
+ @sheet1[1,1].should == "foo"
429
+ @sheet1.set_namevalue("lösung","bar")
430
+ @sheet1.namevalue("lösung").should == "bar"
431
+ @sheet1[1,1].should == "bar"
432
+ end
433
+
434
+ it "should raise an error if name cannot be evaluated" do
435
+ expect{
436
+ @sheet1.set_namevalue_global("foo", 1)
437
+ }.to raise_error(RangeNotEvaluatable, /cannot assign value/)
438
+ end
439
+
440
+ it "should raise an error if name not defined and default value is not provided" do
441
+ expect {
442
+ @sheet1.namevalue("foo", :default => nil)
443
+ }.to_not raise_error
444
+ expect {
445
+ @sheet1.namevalue("foo", :default => :__not_provided)
446
+ }.to raise_error(NameNotFound, /name "foo" not in #<Worksheet: Sheet1/)
447
+ expect {
448
+ @sheet1.namevalue("foo")
449
+ }.to raise_error(NameNotFound, /name "foo" not in #<Worksheet: Sheet1/)
450
+ @sheet1.namevalue("foo", :default => nil).should be_nil
451
+ @sheet1.namevalue("foo", :default => 1).should == 1
452
+ @sheet1.namevalue_global("empty", :default => 1).should be_nil
453
+ end
454
+
455
+ it "should color the cell (depracated)" do
456
+ @sheet1.set_namevalue("new", "bar")
457
+ @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == -4142
458
+ @sheet1.set_namevalue("new", "bar", :color => 4)
459
+ @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == 4
460
+ end
461
+
462
+ it "should color the cell" do
463
+ @sheet1.set_namevalue("new", "bar")
464
+ @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == -4142
465
+ @sheet1.set_namevalue("new", "bar", :color => 4)
466
+ @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == 4
467
+ end
171
468
 
172
469
  end
173
470
 
@@ -180,18 +477,18 @@ describe Worksheet do
180
477
 
181
478
  it "change a cell to 'bar'" do
182
479
  @sheet[1, 1] = 'bar'
183
- @sheet[1, 1].Value.should eq 'bar'
480
+ @sheet[1, 1].should eq 'bar'
184
481
  end
185
482
 
186
483
  it "should change a cell to nil" do
187
484
  @sheet[1, 1] = nil
188
- @sheet[1, 1].Value.should eq nil
485
+ @sheet[1, 1].should eq nil
189
486
  end
190
487
 
191
488
  it "should raise error for bad ranges" do
192
489
  expect{
193
490
  @sheet[0,0]
194
- }.to raise_error(RangeNotEvaluatable, "cannot read cell (0,0)")
491
+ }.to raise_error(RangeNotCreated, /cannot find name or address 0, 0/)
195
492
  expect{
196
493
  @sheet[0,0] = "foo"
197
494
  }.to raise_error(RangeNotEvaluatable, /cannot assign value/)
@@ -202,16 +499,97 @@ describe Worksheet do
202
499
  it "should set color" do
203
500
  @sheet.set_cellval(1,1,"foo",:color => 42)
204
501
  @sheet.cellval(1,1).should == "foo"
205
- @sheet[1,1].Interior.ColorIndex.should == 42
502
+ @sheet.range([1,1]).Interior.ColorIndex.should == 42
206
503
  end
207
504
  end
208
505
 
209
- describe "range" do
506
+ describe "#range" do
507
+
508
+ it "should access a rectangular range [1..2,1..3]" do
509
+ range1 = @sheet.range(1..2,1..3)
510
+ range1.should be_kind_of RobustExcelOle::Range
511
+ range1.Address.should == "$A$1:$C$2"
512
+ range1.Value.should == [["foo", "workbook", "sheet1"], ["foo", nil, "foobaaa"]]
513
+ range2 = @sheet.range(1..2, "A".."C")
514
+ range2.Address.should == range1.Address
515
+ range3 = @sheet.range("A1:C2")
516
+ range3.Address.should == range1.Address
517
+ range4 = @sheet.range(["A1:C2"])
518
+ range4.Address.should == range1.Address
519
+ range5 = @sheet.range("Z1S1:Z2S3")
520
+ range5.Address.should == range1.Address
521
+ range6 = @sheet.range([1..2,1..3])
522
+ range6.should be_kind_of RobustExcelOle::Range
523
+ range6.Address.should == "$A$1:$C$2"
524
+ range6.Value.should == [["foo", "workbook", "sheet1"], ["foo", nil, "foobaaa"]]
525
+ range7 = @sheet.range([1..2, "A".."C"])
526
+ range7.Address.should == range1.Address
527
+ end
528
+
529
+ it "should access a range [1,1..3]" do
530
+ range1 = @sheet.range(1,1..3)
531
+ range1.should be_kind_of RobustExcelOle::Range
532
+ range1.Address.should == "$A$1:$C$1"
533
+ range1.Value.should == [["foo", "workbook", "sheet1"]]
534
+ range2 = @sheet.range([1,1..3])
535
+ range2.Address.should == range1.Address
536
+ end
537
+
538
+ it "should access a range [1..2,1]" do
539
+ range1 = @sheet.range(1..2,1)
540
+ range1.should be_kind_of RobustExcelOle::Range
541
+ range1.Address.should == "$A$1:$A$2"
542
+ range1.Value.should == [["foo"], ["foo"]]
543
+ range2 = @sheet.range([1..2,1])
544
+ range2.Address.should == range1.Address
545
+ end
546
+
547
+ it "should access a row 1" do
548
+ range1 = @sheet.range(1)
549
+ range1.should be_kind_of RobustExcelOle::Range
550
+ range1.Address.should == "$1:$1"
551
+ range1.Value.first.size.should == 256
552
+ range1.value.should == [["foo", "workbook", "sheet1"]]
553
+ range2 = @sheet.range([1])
554
+ range2.Address.should == range1.Address
555
+ end
556
+
557
+ it "should access several rows" do
558
+ @sheet.range([1..3]).Address.should == "$1:$3"
559
+ @sheet.range(1..3).Address.should == "$1:$3"
560
+ @sheet.range([1..3,nil]).Address.should == "$1:$3"
561
+ @sheet.range(1..3,nil).Address.should == "$1:$3"
562
+ end
563
+
564
+ it "should access several columns" do
565
+ @sheet.range([nil,2..4]).Address.should == "$B:$D"
566
+ @sheet.range(nil,2..4).Address.should == "$B:$D"
567
+ @sheet.range([nil,"B".."D"]).Address.should == "$B:$D"
568
+ @sheet.range(nil,"B".."D").Address.should == "$B:$D"
569
+ end
570
+
571
+ it "should create infinite ranges" do
572
+ @sheet.range("1:3").Address.should == "$1:$3"
573
+ @sheet.range("B:D").Address.should == "$B:$D"
574
+ end
575
+
576
+ it "should access a cell [1,2]" do
577
+ cell1 = @sheet.range(1,2)
578
+ cell1.should be_kind_of Cell
579
+ cell1.Address.should == "$B$1"
580
+ cell1.Value.should == "workbook"
581
+ cell2 = @sheet.range("B1")
582
+ cell1.should be_kind_of Cell
583
+ cell2.Address.should == cell1.Address
584
+ cell3 = @sheet.range("Z1S2")
585
+ cell1.should be_kind_of Cell
586
+ cell3.Address.should == cell1.Address
587
+ end
210
588
 
211
589
  it "should a range with relative r1c1-reference" do
212
590
  @sheet.range([1,1]).Select
213
- @sheet.range(["Z1S[3]:Z[2]S8"]).Address.should == "$D$1:$H$3"
214
- @sheet.range(["Z1S3:Z2S8"]).Address.should == "$C$1:$H$2"
591
+ @sheet.range("Z1S[3]:Z[2]S8").Address.should == "$D$1:$H$3"
592
+ @sheet.range("Z1S3:Z2S8").Address.should == "$C$1:$H$2"
215
593
  end
216
594
 
217
595
  it "should a range with relative integer-range-reference" do
@@ -219,39 +597,42 @@ describe Worksheet do
219
597
  @sheet.range([1..[2],[3]..8]).Address.should == "$D$1:$H$3"
220
598
  end
221
599
 
222
- it "should create a range of one cell" do
223
- @sheet.range([1,2]).values.should == ["workbook"]
224
- @sheet.range(["B1"]).values.should == ["workbook"]
225
- @sheet.range("B1").values.should == ["workbook"]
226
- @sheet.range(["Z1S2"]).values.should == ["workbook"]
227
- @sheet.range("Z1S2").values.should == ["workbook"]
600
+ it "should raise an error" do
601
+ expect{
602
+ @sheet.range([0,0])
603
+ }.to raise_error(RangeNotCreated, /cannot find/)
604
+ expect{
605
+ @sheet.range([0..3,4])
606
+ }.to raise_error(RangeNotCreated, /cannot find/)
607
+ end
608
+
609
+ it "should return value of a defined name" do
610
+ @book2 = Workbook.open(@dir + '/another_workbook.xls')
611
+ @sheet2 = @book2.sheet(1)
612
+ range1 = @sheet2.range("firstcell")
613
+ range1.should be_kind_of Cell
614
+ range1.Value.should == "foo"
615
+ @sheet2.range("new").Value.should == "foo"
616
+ @sheet2.range("one").Value.should == 1.0
617
+ @sheet2.range("four").Value.should == [[1,2],[3,4]]
618
+ @sheet2.range("firstrow").Value.should == [[1,2]]
619
+ @sheet2.range("another").Value.should == nil
620
+ expect {
621
+ @sheet2.range("foo")
622
+ }.to raise_error(RangeNotCreated)
623
+ @book2.close(:if_unsaved => :forget)
228
624
  end
229
625
 
230
626
  it "should create a rectangular range" do
231
627
  @sheet.range([1..3,2..4]).values.should == ["workbook", "sheet1", nil, nil, "foobaaa", nil, "is", "nice", nil]
232
628
  @sheet.range([1..3, "B".."D"]).values.should == ["workbook", "sheet1", nil, nil, "foobaaa", nil, "is", "nice", nil]
233
- @sheet.range(["B1:D3"]).values.should == ["workbook", "sheet1", nil, nil, "foobaaa", nil, "is", "nice", nil]
234
629
  @sheet.range("B1:D3").values.should == ["workbook", "sheet1", nil, nil, "foobaaa", nil, "is", "nice", nil]
235
- @sheet.range(["Z1S2:Z3S4"]).values.should == ["workbook", "sheet1", nil, nil, "foobaaa", nil, "is", "nice", nil]
236
630
  @sheet.range("Z1S2:Z3S4").values.should == ["workbook", "sheet1", nil, nil, "foobaaa", nil, "is", "nice", nil]
237
631
  end
238
-
239
- it "should accept old interface" do
240
- @sheet.range(1..3,2..4).values.should == ["workbook", "sheet1", nil, nil, "foobaaa", nil, "is", "nice", nil]
241
- @sheet.range(1..3, "B".."D").values.should == ["workbook", "sheet1", nil, nil, "foobaaa", nil, "is", "nice", nil]
242
- end
243
-
244
- it "should create infinite ranges" do
245
- @sheet.range([1..3,nil]).Address.should == "$1:$3"
246
- @sheet.range(nil,"B".."D").Address.should == "$B:$D"
247
- @sheet.range("1:3").Address.should == "$1:$3"
248
- @sheet.range("B:D").Address.should == "$B:$D"
249
- end
250
-
251
- it "should raise an error" do
252
- expect{
253
- @sheet.range([0,0])
254
- }.to raise_error(RangeNotCreated, /cannot create/)
632
+
633
+ it "should accept old interface" do
634
+ @sheet.range(1..3,2..4).values.should == ["workbook", "sheet1", nil, nil, "foobaaa", nil, "is", "nice", nil]
635
+ @sheet.range(1..3, "B".."D").values.should == ["workbook", "sheet1", nil, nil, "foobaaa", nil, "is", "nice", nil]
255
636
  end
256
637
 
257
638
  end
@@ -267,16 +648,23 @@ describe Worksheet do
267
648
  table = @sheet.table(1)
268
649
  table.Name.should == "table3"
269
650
  table.HeaderRowRange.Value.first.should == ["Number","Person","Amount","Time","Price"]
270
- table.ListRows.Count.should == 6
271
- @sheet[3,4].Value.should == "Number"
651
+ table.ListRows.Count.should == 13
652
+ @sheet[3,4].should == "Number"
272
653
  end
273
654
 
274
655
  it "should yield table given name" do
275
656
  table = @sheet.table("table3")
276
657
  table.Name.should == "table3"
277
658
  table.HeaderRowRange.Value.first.should == ["Number","Person","Amount","Time","Price"]
278
- table.ListRows.Count.should == 6
279
- @sheet[3,4].Value.should == "Number"
659
+ table.ListRows.Count.should == 13
660
+ @sheet[3,4].should == "Number"
661
+ end
662
+
663
+ it "should yield table given name with umlauts" do
664
+ table = Table.new(@sheet, "lösung", [1,1], 3, ["Verkäufer","Straße"])
665
+ table2 = @sheet.table("lösung")
666
+ table2.Name.encode_value.should == "lösung"
667
+ table2.HeaderRowRange.Value.first.encode_value.should == ["Verkäufer","Straße"]
280
668
  end
281
669
 
282
670
  it "should raise error" do
@@ -287,9 +675,10 @@ describe Worksheet do
287
675
 
288
676
  end
289
677
 
290
- describe '#each' do
678
+ describe '#each_cell' do
679
+
291
680
  it "should sort line in order of column" do
292
- @sheet.each_with_index do |cell, i|
681
+ @sheet.each_cell.with_index do |cell, i|
293
682
  case i
294
683
  when 0
295
684
  cell.Value.should eq 'foo'
@@ -311,7 +700,7 @@ describe Worksheet do
311
700
  include_context "sheet 'open book with blank'"
312
701
 
313
702
  it 'should get from ["A1"]' do
314
- @sheet_with_blank.each_with_index do |cell, i|
703
+ @sheet_with_blank.each_cell.with_index do |cell, i|
315
704
  case i
316
705
  when 5
317
706
  cell.Value.should be_nil
@@ -328,6 +717,16 @@ describe Worksheet do
328
717
  end
329
718
  end
330
719
 
720
+ it "should access each cell" do
721
+ cells = []
722
+ @sheet.each_cell do |cell|
723
+ cells << cell
724
+ end
725
+ cells.should == [@sheet.range(1,1), @sheet.range(1,2), @sheet.range(1,3),
726
+ @sheet.range(2,1), @sheet.range(2,2), @sheet.range(2,3),
727
+ @sheet.range(3,1), @sheet.range(3,2), @sheet.range(3,3)]
728
+ end
729
+
331
730
  end
332
731
 
333
732
  describe "#values" do
@@ -338,6 +737,35 @@ describe Worksheet do
338
737
 
339
738
  end
340
739
 
740
+ describe "#names" do
741
+
742
+ before do
743
+ @book1 = Workbook.open(@dir + '/another_workbook.xls')
744
+ @sheet1 = @book1.sheet(1)
745
+ end
746
+
747
+ it "should yield defined names" do
748
+ @sheet1.names.should == ["Sheet1!another_formula", "Sheet1!firstcell", "Sheet1!localname", "Sheet1!simple"]
749
+ end
750
+
751
+ end
752
+
753
+ describe "#each" do
754
+
755
+ it "should yield rows" do
756
+ @sheet.each.with_index do |row, i|
757
+ row.should == ["foo", "workbook", "sheet1"] if i == 0
758
+ row.should == ["foo", nil, "foobaaa"] if i == 1
759
+ row.should == ["matz", "is", "nice"] if i == 2
760
+ end
761
+ end
762
+
763
+ it "should do map" do
764
+ @sheet.map{|r| r}.should == [["foo", "workbook", "sheet1"], ["foo", nil, "foobaaa"], ["matz", "is", "nice"]]
765
+ end
766
+
767
+ end
768
+
341
769
  describe "#each_rowvalue" do
342
770
 
343
771
  it "should yield arrays" do
@@ -415,9 +843,9 @@ describe Worksheet do
415
843
 
416
844
  end
417
845
 
418
- describe "#each_row_with_index" do
846
+ describe "#each_row.with_index" do
419
847
  it "should read with index" do
420
- @sheet.each_row_with_index do |rows, idx|
848
+ @sheet.each_row.with_index do |rows, idx|
421
849
  case idx
422
850
  when 0
423
851
  rows.values.should eq ['foo', 'workbook', 'sheet1']
@@ -429,22 +857,10 @@ describe Worksheet do
429
857
  end
430
858
  end
431
859
 
432
- context "with argument 1" do
433
- it "should read from second row, index is started 0" do
434
- @sheet.each_row_with_index(1) do |rows, idx|
435
- case idx
436
- when 0
437
- rows.values.should eq ['foo', nil, 'foobaaa']
438
- when 1
439
- rows.values.should eq ['matz', 'is', 'nice']
440
- end
441
- end
442
- end
443
- end
444
-
445
860
  end
446
861
 
447
862
  describe "#each_column" do
863
+
448
864
  it "items should RobustExcelOle::Range" do
449
865
  @sheet.each_column do |columns|
450
866
  columns.should be_kind_of RobustExcelOle::Range
@@ -511,8 +927,9 @@ describe Worksheet do
511
927
  end
512
928
 
513
929
  describe "#each_column_with_index" do
930
+
514
931
  it "should read with index" do
515
- @sheet.each_column_with_index do |columns, idx|
932
+ @sheet.each_column.with_index do |columns, idx|
516
933
  case idx
517
934
  when 0
518
935
  columns.values.should eq ['foo', 'foo', 'matz']
@@ -523,19 +940,6 @@ describe Worksheet do
523
940
  end
524
941
  end
525
942
  end
526
-
527
- context "with argument 1" do
528
- it "should read from second column, index is started 0" do
529
- @sheet.each_column_with_index(1) do |column_range, idx|
530
- case idx
531
- when 0
532
- column_range.values.should eq ['workbook', nil, 'is']
533
- when 1
534
- column_range.values.should eq ['sheet1', 'foobaaa', 'nice']
535
- end
536
- end
537
- end
538
- end
539
943
  end
540
944
 
541
945
  describe "#row_range" do
@@ -587,222 +991,7 @@ describe Worksheet do
587
991
  end
588
992
  end
589
993
 
590
- describe "[], []=" do
591
- before do
592
- @book1 = Workbook.open(@dir + '/another_workbook.xls')
593
- @sheet1 = @book1.sheet(1)
594
- end
595
-
596
- after do
597
- @book1.close(:if_unsaved => :forget)
598
- end
599
-
600
- it "should return value of a defined name" do
601
- @sheet1["firstcell"].should == "foo"
602
- end
603
-
604
- it "should return value of a defined name" do
605
- @sheet1["new"].should == "foo"
606
- @sheet1["one"].should == 1.0
607
- @sheet1["four"].should == [[1,2],[3,4]]
608
- @sheet1["firstrow"].should == [[1,2]]
609
- end
610
-
611
- it "should return value of a name with coordinates" do
612
- @sheet1["A1"].should == "foo"
613
- end
614
-
615
- it "should return nil for a range with empty contents" do
616
- @sheet1["another"].should == nil
617
- end
618
-
619
- #it "should evaluate named formula" do
620
- # @sheet1["named_formula"].should == 4
621
- #end
622
-
623
- #it "should evaluate a formula" do
624
- # @sheet1["another_formula"].should == 5
625
- #end
626
-
627
- it "should raise an error if name not defined" do
628
- expect {
629
- @sheet1["foo"]
630
- }.to raise_error(NameNotFound, /name "foo" not in #<Worksheet: Sheet1/)
631
- end
632
-
633
- it "should set a range to a value" do
634
- @sheet1[1,1].Value.should == "foo"
635
- @sheet1["firstcell"] = "bar"
636
- @sheet1[1,1].Value.should == "bar"
637
- @sheet1["new"] = "bar"
638
- @sheet1["new"].should == "bar"
639
- end
640
-
641
- it "should raise an error if name cannot be evaluated" do
642
- expect{
643
- @sheet1["foo"] = 1
644
- }.to raise_error(NameNotFound, /name "foo" not in #<Worksheet: Sheet1/)
645
- end
646
- end
647
-
648
- describe "namevalue_global, set_namevalue_global" do
649
-
650
- before do
651
- @book1 = Workbook.open(@dir + '/another_workbook.xls')
652
- @sheet1 = @book1.sheet(1)
653
- end
654
-
655
- after do
656
- @book1.close(:if_unsaved => :forget)
657
- end
658
-
659
- it "should return value of a defined name" do
660
- @sheet1.namevalue_global("firstcell").should == "foo"
661
- end
662
-
663
- #it "should evaluate a formula" do
664
- # @sheet1.namevalue_global("another_formula").should == 5
665
- #end
666
-
667
- it "should raise an error if name not defined" do
668
- expect {
669
- @sheet1.namevalue_global("foo")
670
- }.to raise_error(NameNotFound, /name "foo" not in/)
671
- end
672
-
673
- it "should raise an error of coordinates are given instead of a defined name" do
674
- expect {
675
- @sheet1.namevalue_global("A1")
676
- }.to raise_error(NameNotFound, /name "A1" not in/)
677
- end
678
-
679
- it "should return default value for a range with empty contents" do
680
- @sheet1.namevalue_global("another", :default => 2) == 2
681
- end
682
-
683
- it "should set a range to a value" do
684
- @sheet1.namevalue_global("firstcell").should == "foo"
685
- @sheet1[1,1].Value.should == "foo"
686
- @sheet1.set_namevalue_global("firstcell","bar")
687
- @sheet1.namevalue_global("firstcell").should == "bar"
688
- @sheet1[1,1].Value.should == "bar"
689
- end
690
-
691
- it "should raise an error if name cannot be evaluated" do
692
- expect{
693
- @sheet1.set_namevalue_global("foo", 1)
694
- }.to raise_error(RangeNotEvaluatable, /cannot assign value/)
695
- end
696
-
697
- it "should color the cell (deprecated)" do
698
- @sheet1.set_namevalue_global("new", "bar")
699
- @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == -4142
700
- @sheet1.set_namevalue_global("new", "bar", :color => 4)
701
- @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == 4
702
- end
703
-
704
- it "should color the cell" do
705
- @sheet1.set_namevalue_global("new", "bar")
706
- @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == -4142
707
- @sheet1.set_namevalue_global("new", "bar", :color => 4)
708
- @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == 4
709
- end
710
-
711
- end
712
-
713
- describe "namevalue, set_namevalue" do
714
-
715
- before do
716
- @book1 = Workbook.open(@dir + '/another_workbook.xls')
717
- @sheet1 = @book1.sheet(1)
718
- @sheet2 = @book1.sheet(2)
719
- end
720
-
721
- after do
722
- @book1.close(:if_unsaved => :forget)
723
- end
724
-
725
- it "should return value of a locally defined name" do
726
- @sheet1.namevalue("firstcell").should == "foo"
727
- end
728
-
729
- it "should return value of a name with coordinates" do
730
- @sheet1.namevalue("A1").should == "foo"
731
- end
732
-
733
- it "should return nil for a range with empty contents" do
734
- @sheet1.namevalue("another").should == nil
735
- end
736
-
737
- it "should return value of a defined name" do
738
- @sheet1.namevalue("new").should == "foo"
739
- @sheet1.namevalue("one").should == 1.0
740
- @sheet1.namevalue("four").should == [[1,2],[3,4]]
741
- @sheet1.namevalue("firstrow").should == [[1,2]]
742
- end
743
-
744
- it "should return default value if name not defined and default value is given" do
745
- @sheet1.namevalue("foo", :default => 2).should == 2
746
- end
747
-
748
- it "should raise an error if name not defined for the sheet" do
749
- expect {
750
- @sheet1.namevalue("foo")
751
- }.to raise_error(NameNotFound, /name "foo" not in #<Worksheet: Sheet1/)
752
- expect {
753
- @sheet1.namevalue("named_formula")
754
- }.to raise_error(NameNotFound, /name "named_formula" not in #<Worksheet: Sheet1/)
755
- expect {
756
- @sheet2.namevalue("firstcell")
757
- }.to raise_error(NameNotFound, /name "firstcell" not in #<Worksheet: Sheet2/)
758
- end
759
-
760
- it "should set a range to a value" do
761
- @sheet1.namevalue("firstcell").should == "foo"
762
- @sheet1[1,1].Value.should == "foo"
763
- @sheet1.set_namevalue("firstcell","bar")
764
- @sheet1.namevalue("firstcell").should == "bar"
765
- @sheet1[1,1].Value.should == "bar"
766
- end
767
-
768
- it "should raise an error if name cannot be evaluated" do
769
- expect{
770
- @sheet1.set_namevalue_global("foo", 1)
771
- }.to raise_error(RangeNotEvaluatable, /cannot assign value/)
772
- end
773
-
774
- it "should raise an error if name not defined and default value is not provided" do
775
- expect {
776
- @sheet1.namevalue("foo", :default => nil)
777
- }.to_not raise_error
778
- expect {
779
- @sheet1.namevalue("foo", :default => :__not_provided)
780
- }.to raise_error(NameNotFound, /name "foo" not in #<Worksheet: Sheet1/)
781
- expect {
782
- @sheet1.namevalue("foo")
783
- }.to raise_error(NameNotFound, /name "foo" not in #<Worksheet: Sheet1/)
784
- @sheet1.namevalue("foo", :default => nil).should be_nil
785
- @sheet1.namevalue("foo", :default => 1).should == 1
786
- @sheet1.namevalue_global("empty", :default => 1).should be_nil
787
- end
788
-
789
- it "should color the cell (depracated)" do
790
- @sheet1.set_namevalue("new", "bar")
791
- @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == -4142
792
- @sheet1.set_namevalue("new", "bar", :color => 4)
793
- @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == 4
794
- end
795
-
796
- it "should color the cell" do
797
- @sheet1.set_namevalue("new", "bar")
798
- @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == -4142
799
- @sheet1.set_namevalue("new", "bar", :color => 4)
800
- @book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == 4
801
- end
802
-
803
- end
804
-
805
- describe "add_name, delete_name, rename_range" do
994
+ describe "add_name, delete_name, rename_name" do
806
995
 
807
996
  context "adding, renaming, deleting the name of a range" do
808
997
 
@@ -833,7 +1022,7 @@ describe Worksheet do
833
1022
  end
834
1023
 
835
1024
  it "should rename an already named range with a giving address" do
836
- @sheet1[1,1].Name.Name.should == "Sheet1!firstcell"
1025
+ @sheet1.range([1,1]).Name.Name.should == "Sheet1!firstcell"
837
1026
  @sheet1.add_name("foo",[1..2,3..4])
838
1027
  @sheet1.Range("foo").Address.should == "$C$1:$D$2"
839
1028
  end
@@ -846,10 +1035,17 @@ describe Worksheet do
846
1035
 
847
1036
  it "should rename a range" do
848
1037
  @sheet1.add_name("foo",[1,1])
849
- @sheet1.rename_range("foo","bar")
1038
+ @sheet1.rename_name("foo","bar")
850
1039
  @sheet1.namevalue_global("bar").should == "foo"
851
1040
  end
852
1041
 
1042
+ it "should rename a range with umlauts" do
1043
+ @sheet1.add_name("lösung",[1,1])
1044
+ @sheet1.rename_name("lösung","bär")
1045
+ @sheet1.namevalue_global("bär").should == "foo"
1046
+ end
1047
+
1048
+
853
1049
  it "should delete a name of a range" do
854
1050
  @sheet1.add_name("foo",[1,1])
855
1051
  @sheet1.delete_name("foo")
@@ -858,6 +1054,14 @@ describe Worksheet do
858
1054
  }.to raise_error(NameNotFound, /name "foo"/)
859
1055
  end
860
1056
 
1057
+ it "should delete a name of a range with umlauts" do
1058
+ @sheet1.add_name("lösung",[1,1])
1059
+ @sheet1.delete_name("lösung")
1060
+ expect{
1061
+ @sheet1.namevalue_global("lösung")
1062
+ }.to raise_error(NameNotFound, /name/)
1063
+ end
1064
+
861
1065
  it "should add a name of a rectangular range" do
862
1066
  @sheet1.add_name("foo",[1..3,1..4])
863
1067
  @sheet1["foo"].should == [["foo", "workbook", "sheet1", nil], ["foo", 1.0, 2.0, 4.0], ["matz", 3.0, 4.0, 4.0]]