robust_excel_ole 0.4 → 0.5

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.
Files changed (47) hide show
  1. data/.gitignore +1 -0
  2. data/Changelog +15 -0
  3. data/README.rdoc +128 -63
  4. data/README_detail.rdoc +130 -60
  5. data/examples/edit_sheets/example_access_sheets_and_cells.rb +1 -1
  6. data/examples/edit_sheets/example_adding_sheets.rb +2 -2
  7. data/examples/edit_sheets/example_copying.rb +1 -1
  8. data/examples/edit_sheets/example_expanding.rb +1 -1
  9. data/examples/edit_sheets/example_ranges.rb +1 -1
  10. data/examples/edit_sheets/example_saving.rb +2 -2
  11. data/examples/open_save_close/example_control_to_excel.rb +1 -1
  12. data/examples/open_save_close/example_if_obstructed_closeifsaved.rb +2 -2
  13. data/examples/open_save_close/example_if_obstructed_save.rb +2 -2
  14. data/examples/open_save_close/example_if_unsaved_accept.rb +1 -1
  15. data/examples/open_save_close/example_if_unsaved_forget.rb +2 -2
  16. data/examples/open_save_close/example_if_unsaved_forget_more.rb +3 -3
  17. data/examples/open_save_close/example_read_only.rb +1 -1
  18. data/examples/open_save_close/example_rename_cells.rb +1 -1
  19. data/examples/open_save_close/example_simple.rb +1 -1
  20. data/examples/open_save_close/example_unobtrusively.rb +3 -3
  21. data/lib/robust_excel_ole.rb +1 -0
  22. data/lib/robust_excel_ole/book.rb +249 -193
  23. data/lib/robust_excel_ole/bookstore.rb +1 -1
  24. data/lib/robust_excel_ole/cell.rb +1 -1
  25. data/lib/robust_excel_ole/excel.rb +125 -4
  26. data/lib/robust_excel_ole/general.rb +1 -92
  27. data/lib/robust_excel_ole/range.rb +1 -1
  28. data/lib/robust_excel_ole/reo_common.rb +37 -0
  29. data/lib/robust_excel_ole/sheet.rb +77 -24
  30. data/lib/robust_excel_ole/version.rb +1 -1
  31. data/spec/book_spec.rb +112 -82
  32. data/spec/book_specs/book_close_spec.rb +44 -1
  33. data/spec/book_specs/book_misc_spec.rb +97 -92
  34. data/spec/book_specs/book_open_spec.rb +40 -8
  35. data/spec/book_specs/book_save_spec.rb +77 -7
  36. data/spec/book_specs/book_sheet_spec.rb +290 -66
  37. data/spec/book_specs/book_unobtr_spec.rb +99 -73
  38. data/spec/bookstore_spec.rb +1 -1
  39. data/spec/cell_spec.rb +2 -2
  40. data/spec/data/another_workbook.xls +0 -0
  41. data/spec/data/workbook.xls +0 -0
  42. data/spec/excel_spec.rb +174 -23
  43. data/spec/general_spec.rb +3 -18
  44. data/spec/range_spec.rb +3 -3
  45. data/spec/reo_common_spec.rb +104 -0
  46. data/spec/sheet_spec.rb +101 -60
  47. metadata +6 -4
@@ -1,3 +1,3 @@
1
1
  module RobustExcelOle
2
- VERSION = "0.4"
2
+ VERSION = "0.5"
3
3
  end
@@ -261,7 +261,7 @@ describe Book do
261
261
 
262
262
  before do
263
263
  @book = Book.open(@simple_file)
264
- @sheet = @book[0]
264
+ @sheet = @book.sheet(1)
265
265
  @book.add_sheet(@sheet, :as => 'a_name')
266
266
  end
267
267
 
@@ -285,7 +285,7 @@ describe Book do
285
285
  @new_book.should == @book
286
286
  end
287
287
 
288
- context "with :if_unsaved => :alert" do
288
+ context "with :if_unsaved => :alert or :if_unsaved => :excel" do
289
289
  before do
290
290
  @key_sender = IO.popen 'ruby "' + File.join(File.dirname(__FILE__), '/helpers/key_sender.rb') + '" "Microsoft Office Excel" ' , "w"
291
291
  end
@@ -315,6 +315,29 @@ describe Book do
315
315
  }.to raise_error(ExcelErrorOpen, "open: user canceled or open error")
316
316
  @book.should be_alive
317
317
  end
318
+
319
+ it "should open the new book and close the unsaved book, if user answers 'yes'" do
320
+ # "Yes" is the default. --> language independent
321
+ @key_sender.puts "{enter}"
322
+ @new_book = Book.open(@simple_file, :if_unsaved => :excel)
323
+ @new_book.should be_alive
324
+ @new_book.filename.downcase.should == @simple_file.downcase
325
+ @book.should_not be_alive
326
+ end
327
+
328
+ it "should not open the new book and not close the unsaved book, if user answers 'no'" do
329
+ # "No" is right to "Yes" (the default). --> language independent
330
+ # strangely, in the "no" case, the question will sometimes be repeated three times
331
+ #@book.excel.Visible = true
332
+ @key_sender.puts "{right}{enter}"
333
+ @key_sender.puts "{right}{enter}"
334
+ @key_sender.puts "{right}{enter}"
335
+ expect{
336
+ Book.open(@simple_file, :if_unsaved => :excel)
337
+ }.to raise_error(ExcelErrorOpen, "open: user canceled or open error")
338
+ @book.should be_alive
339
+ end
340
+
318
341
  end
319
342
  end
320
343
 
@@ -324,14 +347,14 @@ describe Book do
324
347
 
325
348
  context "with and without reopen" do
326
349
 
327
- before do
350
+ before do
328
351
  if i == 1 then
329
352
  book_before = Book.open(@simple_file)
330
353
  book_before.close
331
354
  end
332
355
  @book = Book.open(@simple_file_other_path)
333
356
  @sheet_count = @book.ole_workbook.Worksheets.Count
334
- @sheet = @book[0]
357
+ @sheet = @book.sheet(1)
335
358
  @book.add_sheet(@sheet, :as => 'a_name')
336
359
  end
337
360
 
@@ -354,7 +377,7 @@ describe Book do
354
377
  if :if_obstructed is :close_if_saved" do
355
378
  expect{
356
379
  @new_book = Book.open(@simple_file, :if_obstructed => :close_if_saved)
357
- }.to raise_error(ExcelErrorOpen, /workbook with the same name in a different path is unsaved: "workbook.xls"/)
380
+ }.to raise_error(ExcelErrorOpen, /workbook with the same name in a different path is unsaved/)
358
381
  @book.save
359
382
  @new_book = Book.open(@simple_file, :if_obstructed => :close_if_saved)
360
383
  @book.should_not be_alive
@@ -392,7 +415,7 @@ describe Book do
392
415
  book = Book.open(@simple_file, :read_only => true)
393
416
  book.ReadOnly.should be_true
394
417
  book.should be_alive
395
- sheet = book[0]
418
+ sheet = book.sheet(1)
396
419
  old_cell_value = sheet[1,1].value
397
420
  sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
398
421
  book.Saved.should be_false
@@ -401,7 +424,7 @@ describe Book do
401
424
  new_book.should be_alive
402
425
  book.should be_alive
403
426
  new_book.should == book
404
- new_sheet = new_book[0]
427
+ new_sheet = new_book.sheet(1)
405
428
  new_cell_value = new_sheet[1,1].value
406
429
  new_cell_value.should == old_cell_value
407
430
  end
@@ -467,7 +490,7 @@ describe Book do
467
490
  def unobtrusively_ok? # :nodoc: #
468
491
  Book.unobtrusively(@simple_file) do |book|
469
492
  book.should be_a Book
470
- sheet = book[0]
493
+ sheet = book.sheet(1)
471
494
  sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
472
495
  book.should be_alive
473
496
  book.Saved.should be_false
@@ -548,17 +571,17 @@ describe Book do
548
571
  it "should let a saved book saved" do
549
572
  @book.Saved.should be_true
550
573
  @book.should be_alive
551
- sheet = @book[0]
574
+ sheet = @book.sheet(1)
552
575
  old_cell_value = sheet[1,1].value
553
576
  unobtrusively_ok?
554
577
  @book.Saved.should be_true
555
578
  @book.should be_alive
556
- sheet = @book[0]
579
+ sheet = @book.sheet(1)
557
580
  sheet[1,1].value.should_not == old_cell_value
558
581
  end
559
582
 
560
583
  it "should let the unsaved book unsaved" do
561
- sheet = @book[0]
584
+ sheet = @book.sheet(1)
562
585
  sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
563
586
  old_cell_value = sheet[1,1].value
564
587
  @book.Saved.should be_false
@@ -567,7 +590,7 @@ describe Book do
567
590
  @book.Saved.should be_false
568
591
  @book.close(:if_unsaved => :forget)
569
592
  @book2 = Book.open(@simple_file)
570
- sheet2 = @book2[0]
593
+ sheet2 = @book2.sheet(1)
571
594
  sheet2[1,1].value.should_not == old_cell_value
572
595
  end
573
596
  end
@@ -583,21 +606,21 @@ describe Book do
583
606
  end
584
607
 
585
608
  it "should let the closed book closed by default" do
586
- sheet = @book[0]
609
+ sheet = @book.sheet(1)
587
610
  old_cell_value = sheet[1,1].value
588
611
  @book.close
589
612
  @book.should_not be_alive
590
613
  unobtrusively_ok?
591
614
  @book.should_not be_alive
592
615
  @book = Book.open(@simple_file)
593
- sheet = @book[0]
616
+ sheet = @book.sheet(1)
594
617
  sheet[1,1].Value.should_not == old_cell_value
595
618
  end
596
619
 
597
620
  # The bold reanimation of the @book
598
621
  it "should use the excel of the book and keep open the book" do
599
622
  excel = Excel.new(:reuse => false)
600
- sheet = @book[0]
623
+ sheet = @book.sheet(1)
601
624
  old_cell_value = sheet[1,1].value
602
625
  @book.close
603
626
  @book.should_not be_alive
@@ -605,7 +628,7 @@ describe Book do
605
628
  book.should be_a Book
606
629
  book.excel.should == @book.excel
607
630
  book.excel.should_not == excel
608
- sheet = book[0]
631
+ sheet = book.sheet(1)
609
632
  cell = sheet[1,1]
610
633
  sheet[1,1] = cell.value == "foo" ? "bar" : "foo"
611
634
  book.Saved.should be_false
@@ -613,14 +636,14 @@ describe Book do
613
636
  @book.should be_alive
614
637
  @book.close
615
638
  new_book = Book.open(@simple_file)
616
- sheet = new_book[0]
639
+ sheet = new_book.sheet(1)
617
640
  sheet[1,1].value.should_not == old_cell_value
618
641
  end
619
642
 
620
643
  # book shall be reanimated even with :hidden
621
644
  it "should use the excel of the book and keep open the book" do
622
645
  excel = Excel.new(:reuse => false)
623
- sheet = @book[0]
646
+ sheet = @book.sheet(1)
624
647
  old_cell_value = sheet[1,1].value
625
648
  @book.close
626
649
  @book.should_not be_alive
@@ -629,14 +652,14 @@ describe Book do
629
652
  book.should be_alive
630
653
  book.excel.should_not == @book.excel
631
654
  book.excel.should_not == excel
632
- sheet = book[0]
655
+ sheet = book.sheet(1)
633
656
  cell = sheet[1,1]
634
657
  sheet[1,1] = cell.value == "foo" ? "bar" : "foo"
635
658
  book.Saved.should be_false
636
659
  end
637
660
  @book.should_not be_alive
638
661
  new_book = Book.open(@simple_file)
639
- sheet = new_book[0]
662
+ sheet = new_book.sheet(1)
640
663
  sheet[1,1].value.should_not == old_cell_value
641
664
  end
642
665
  end
@@ -679,13 +702,13 @@ describe Book do
679
702
  book2 = Book.open(@simple_file, :force_excel => :new, :read_only => true)
680
703
  @book.ReadOnly.should be_true
681
704
  book2.Readonly.should be_true
682
- sheet = @book[0]
705
+ sheet = @book.sheet(1)
683
706
  cell_value = sheet[1,1].value
684
707
  Book.unobtrusively(@simple_file, :hidden) do |book|
685
708
  book.should be_a Book
686
709
  book.excel.should_not == book2.excel
687
710
  book.excel.should_not == @book.excel
688
- sheet = book[0]
711
+ sheet = book.sheet(1)
689
712
  sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
690
713
  book.should be_alive
691
714
  book.Saved.should be_false
@@ -695,7 +718,7 @@ describe Book do
695
718
  @book.close
696
719
  book2.close
697
720
  book3 = Book.open(@simple_file)
698
- new_sheet = book3[0]
721
+ new_sheet = book3.sheet(1)
699
722
  new_sheet[1,1].value.should_not == cell_value
700
723
  book3.close
701
724
  end
@@ -749,7 +772,7 @@ describe Book do
749
772
  @book2 = Book.open(@simple_file, :force_excel => :new)
750
773
  @book1.Readonly.should == false
751
774
  @book2.Readonly.should == true
752
- old_sheet = @book1[0]
775
+ old_sheet = @book1.sheet(1)
753
776
  @old_cell_value = old_sheet[1,1].value
754
777
  @book1.close
755
778
  @book2.close
@@ -762,13 +785,13 @@ describe Book do
762
785
  book.excel.should == @book2.excel
763
786
  book.excel.should_not == @book1.excel
764
787
  book.ReadOnly.should == false
765
- sheet = book[0]
788
+ sheet = book.sheet(1)
766
789
  cell = sheet[1,1]
767
790
  sheet[1,1] = cell.value == "foo" ? "bar" : "foo"
768
791
  book.Saved.should be_false
769
792
  end
770
793
  new_book = Book.open(@simple_file)
771
- sheet = new_book[0]
794
+ sheet = new_book.sheet(1)
772
795
  sheet[1,1].value.should_not == @old_cell_value
773
796
  end
774
797
 
@@ -777,13 +800,13 @@ describe Book do
777
800
  book.excel.should_not == @book2.excel
778
801
  book.excel.should_not == @book1.excel
779
802
  book.ReadOnly.should == false
780
- sheet = book[0]
803
+ sheet = book.sheet(1)
781
804
  cell = sheet[1,1]
782
805
  sheet[1,1] = cell.value == "foo" ? "bar" : "foo"
783
806
  book.Saved.should be_false
784
807
  end
785
808
  new_book = Book.open(@simple_file)
786
- sheet = new_book[0]
809
+ sheet = new_book.sheet(1)
787
810
  sheet[1,1].Value.should_not == @old_cell_value
788
811
  end
789
812
  end
@@ -821,7 +844,7 @@ describe Book do
821
844
 
822
845
  before do
823
846
  @book = Book.open(@simple_file)
824
- sheet = @book[0]
847
+ sheet = @book.sheet(1)
825
848
  @old_cell_value = sheet[1,1].value
826
849
  @book.close
827
850
  end
@@ -831,21 +854,21 @@ describe Book do
831
854
  book.should be_a Book
832
855
  book.should be_alive
833
856
  book.Saved.should be_true
834
- sheet = book[0]
857
+ sheet = book.sheet(1)
835
858
  cell = sheet[1,1]
836
859
  sheet[1,1] = cell.value == "foo" ? "bar" : "foo"
837
860
  book.Saved.should be_false
838
861
  book.excel.should == @book.excel
839
862
  end
840
863
  new_book = Book.open(@simple_file, :visible => true)
841
- sheet = new_book[0]
864
+ sheet = new_book.sheet(1)
842
865
  sheet[1,1].Value.should == @old_cell_value
843
866
  end
844
867
 
845
868
  it "should not change the value and use the hidden Excel instance" do
846
869
  new_excel = Excel.new(:reuse => false)
847
870
  Book.for_reading(@simple_file, :hidden) do |book|
848
- sheet = book[0]
871
+ sheet = book.sheet(1)
849
872
  cell = sheet[1,1]
850
873
  sheet[1,1] = cell.value == "foo" ? "bar" : "foo"
851
874
  book.excel.should_not == @book.excel
@@ -854,19 +877,19 @@ describe Book do
854
877
  book.excel.displayalerts.should be_false
855
878
  end
856
879
  new_book = Book.open(@simple_file, :visible => true)
857
- sheet = new_book[0]
880
+ sheet = new_book.sheet(1)
858
881
  sheet[1,1].Value.should == @old_cell_value
859
882
  end
860
883
 
861
884
  it "should change the value" do
862
885
  Book.for_modifying(@simple_file) do |book|
863
- sheet = book[0]
886
+ sheet = book.sheet(1)
864
887
  cell = sheet[1,1]
865
888
  sheet[1,1] = cell.value == "foo" ? "bar" : "foo"
866
889
  book.excel.should == @book.excel
867
890
  end
868
891
  new_book = Book.open(@simple_file, :visible => true)
869
- sheet = new_book[0]
892
+ sheet = new_book.sheet(1)
870
893
  sheet[1,1].Value.should_not == @old_cell_value
871
894
  end
872
895
  end
@@ -889,49 +912,56 @@ describe Book do
889
912
  end
890
913
  end
891
914
 
892
- describe "nvalue, set_nvalue, rename_range" do
893
-
894
- context "nvalue, book[<name>]" do
895
-
896
- before do
897
- @book1 = Book.open(@another_simple_file)
898
- end
915
+ describe "nameval, set_nameval, [], []=" do
916
+
917
+ before do
918
+ @book1 = Book.open(@another_simple_file)
919
+ end
899
920
 
900
- after do
901
- @book1.close(:if_unsaved => :forget)
902
- end
903
-
904
- it "should return value of a range" do
905
- @book1.nvalue("new").should == "foo"
906
- @book1.nvalue("one").should == 1
907
- @book1.nvalue("firstrow").should == [[1,2]]
908
- @book1.nvalue("four").should == [[1,2],[3,4]]
909
- @book1.nvalue("firstrow").should_not == "12"
910
- @book1.nvalue("firstcell").should == "foo"
911
- @book1["new"].should == "foo"
912
- @book1["one"].should == 1
913
- @book1["firstrow"].should == [[1,2]]
914
- @book1["four"].should == [[1,2],[3,4]]
915
- @book1["firstcell"].should == "foo"
916
- end
921
+ after do
922
+ @book1.close(:if_unsaved => :forget)
923
+ end
924
+
925
+ it "should return value of a range" do
926
+ @book1.nameval("new").should == "foo"
927
+ @book1.nameval("one").should == 1
928
+ @book1.nameval("firstrow").should == [[1,2]]
929
+ @book1.nameval("four").should == [[1,2],[3,4]]
930
+ @book1.nameval("firstrow").should_not == "12"
931
+ @book1.nameval("firstcell").should == "foo"
917
932
  end
918
933
 
919
- context "set_nvalue, book[<name>]=" do
920
-
921
- before do
922
- @book1 = Book.open(@another_simple_file)
923
- end
934
+ it "should return value of a range via []" do
935
+ @book1["new"].should == "foo"
936
+ @book1["one"].should == 1
937
+ @book1["firstrow"] == [[1,2]]
938
+ @book1["four"].should == [[1,2],[3,4]]
939
+ @book1["firstrow"].should_not == "12"
940
+ @book1["firstcell"].should == "foo"
941
+ end
924
942
 
925
- after do
926
- @book1.close(:if_unsaved => :forget)
927
- end
943
+ it "should set value of a range" do
944
+ @book1.set_nameval("new", "bar")
945
+ @book1.nameval("new").should == "bar"
946
+ end
928
947
 
929
- it "should set value of a range" do
930
- @book1.nvalue("new").should == "foo"
931
- @book1["new"] = "bar"
932
- @book1.nvalue("new").should == "bar"
933
- end
948
+ it "should set value of a range via []=" do
949
+ @book1["new"] = "bar"
950
+ @book1.nameval("new").should == "bar"
951
+ end
952
+
953
+ it "should evaluate a formula" do
954
+ @book1.nameval("named_formula").should == 4
934
955
  end
956
+
957
+ it "should evaluate a formula via []" do
958
+ @book1["named_formula"].should == 4
959
+ end
960
+
961
+ it "should return default value if name not defined" do
962
+ @book1.nameval("foo", :default => 2).should == 2
963
+ end
964
+
935
965
  end
936
966
 
937
967
  describe "close" do
@@ -958,7 +988,7 @@ describe Book do
958
988
  @book = Book.open(@simple_file)
959
989
  @sheet_count = @book.ole_workbook.Worksheets.Count
960
990
  @book.add_sheet(@sheet, :as => 'a_name')
961
- @sheet = @book[0]
991
+ @sheet = @book.sheet(1)
962
992
  end
963
993
 
964
994
  after do
@@ -1091,7 +1121,7 @@ describe Book do
1091
1121
  end
1092
1122
 
1093
1123
  it "should activate a book" do
1094
- sheet = @book[1]
1124
+ sheet = @book.sheet(2)
1095
1125
  sheet.Activate
1096
1126
  sheet[2,3].Activate
1097
1127
  sheet2 = @book2[2]
@@ -1115,7 +1145,7 @@ describe Book do
1115
1145
  describe "#add_sheet" do
1116
1146
  before do
1117
1147
  @book = Book.open(@simple_file)
1118
- @sheet = @book[0]
1148
+ @sheet = @book.sheet(1)
1119
1149
  end
1120
1150
 
1121
1151
  after do
@@ -1139,9 +1169,9 @@ describe Book do
1139
1169
 
1140
1170
  context "with first argument" do
1141
1171
 
1142
- context "with second argument is {:before => @book[2], :after => @sheet}" do
1172
+ context "with second argument is {:before => @book.sheet(3), :after => @sheet}" do
1143
1173
  it "should arguments in the first is given priority" do
1144
- @book.add_sheet(@sheet, :before => @book[2], :after => @sheet).name.should eq @book[2].name
1174
+ @book.add_sheet(@sheet, :before => @book.sheet(3), :after => @sheet).name.should eq @book.sheet(3).name
1145
1175
  end
1146
1176
  end
1147
1177
  end
@@ -1155,13 +1185,13 @@ describe Book do
1155
1185
 
1156
1186
  context "second argument is {:before => @sheet}" do
1157
1187
  it "should add the first sheet" do
1158
- @book.add_sheet(:before => @sheet).name.should eq @book[0].name
1188
+ @book.add_sheet(:before => @sheet).name.should eq @book.sheet(1).name
1159
1189
  end
1160
1190
  end
1161
1191
 
1162
1192
  context "second argument is {:after => @sheet}" do
1163
1193
  it "should add the second sheet" do
1164
- @book.add_sheet(:after => @sheet).name.should eq @book[1].name
1194
+ @book.add_sheet(:after => @sheet).name.should eq @book.sheet(2).name
1165
1195
  end
1166
1196
  end
1167
1197
  end
@@ -1188,11 +1218,11 @@ describe Book do
1188
1218
  context "standard" do
1189
1219
 
1190
1220
  it 'with sheet name' do
1191
- @book['Sheet1'].should be_kind_of Sheet
1221
+ @book.sheet('Sheet1').should be_kind_of Sheet
1192
1222
  end
1193
1223
 
1194
1224
  it 'with integer' do
1195
- @book[0].should be_kind_of Sheet
1225
+ @book.sheet(1).should be_kind_of Sheet
1196
1226
  end
1197
1227
 
1198
1228
  it 'with block' do
@@ -1205,7 +1235,7 @@ describe Book do
1205
1235
  context 'open with block' do
1206
1236
  it {
1207
1237
  Book.open(@simple_file) do |book|
1208
- book['Sheet1'].should be_a Sheet
1238
+ book.sheet('Sheet1').should be_a Sheet
1209
1239
  end
1210
1240
  }
1211
1241
  end