robust_excel_ole 0.6.2 → 1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +140 -175
- data/lib/robust_excel_ole/book.rb +3 -2
- data/lib/robust_excel_ole/excel.rb +162 -142
- data/lib/robust_excel_ole/reo_common.rb +2 -2
- data/lib/robust_excel_ole/version.rb +1 -1
- data/robust_excel_ole.gemspec +7 -2
- data/spec/book_spec.rb +2 -2
- data/spec/book_specs/book_open_spec.rb +5 -2
- data/spec/book_specs/book_save_spec.rb +5 -24
- data/spec/book_specs/book_sheet_spec.rb +1 -1
- data/spec/data/another_workbook.xls +0 -0
- data/spec/data/different_workbook.xls +0 -0
- data/spec/data/workbook.xls +0 -0
- data/spec/excel_spec.rb +232 -272
- data/spec/reo_common_spec.rb +1 -1
- metadata +12 -10
- data/README_detail.rdoc +0 -810
@@ -853,7 +853,7 @@ describe Book do
|
|
853
853
|
@key_sender.puts "{right}{enter}"
|
854
854
|
expect{
|
855
855
|
Book.open(@simple_file1, :if_unsaved => :alert)
|
856
|
-
}.to raise_error(
|
856
|
+
}.to raise_error(ExcelError, "user canceled or runtime error")
|
857
857
|
@book.should be_alive
|
858
858
|
end
|
859
859
|
end
|
@@ -885,7 +885,7 @@ describe Book do
|
|
885
885
|
@key_sender.puts "{right}{enter}"
|
886
886
|
expect{
|
887
887
|
Book.open(@simple_file1, :if_unsaved => :excel)
|
888
|
-
}.to raise_error(
|
888
|
+
}.to raise_error(ExcelError, "user canceled or runtime error")
|
889
889
|
@book.should be_alive
|
890
890
|
end
|
891
891
|
end
|
@@ -1074,6 +1074,8 @@ describe Book do
|
|
1074
1074
|
end
|
1075
1075
|
end
|
1076
1076
|
|
1077
|
+
=begin
|
1078
|
+
# work in progress
|
1077
1079
|
context "with :update_links" do
|
1078
1080
|
|
1079
1081
|
it "should set update_links to :alert" do
|
@@ -1100,6 +1102,7 @@ describe Book do
|
|
1100
1102
|
end
|
1101
1103
|
|
1102
1104
|
end
|
1105
|
+
=end
|
1103
1106
|
|
1104
1107
|
context "with :read_only" do
|
1105
1108
|
|
@@ -34,7 +34,7 @@ describe Book do
|
|
34
34
|
|
35
35
|
after do
|
36
36
|
Excel.kill_all
|
37
|
-
|
37
|
+
# rm_tmp(@dir)
|
38
38
|
end
|
39
39
|
|
40
40
|
describe "save" do
|
@@ -379,9 +379,7 @@ describe Book do
|
|
379
379
|
@key_sender.puts "{enter}"
|
380
380
|
@key_sender.puts "{enter}"
|
381
381
|
#@key_sender.puts "%{n}" #, :initial_wait => 0.2, :if_target_missing=>"Excel window not found")
|
382
|
-
|
383
|
-
@book.save_as(@simple_save_file1, :if_exists => :alert)
|
384
|
-
}.to raise_error(WorkbookError, "not saved or canceled by user")
|
382
|
+
@book.save_as(@simple_save_file1, :if_exists => :alert)
|
385
383
|
File.exist?(@simple_save_file1).should be_true
|
386
384
|
File.size?(@simple_save_file1).should == @garbage_length
|
387
385
|
@book.excel.DisplayAlerts.should == displayalert_value
|
@@ -394,20 +392,7 @@ describe Book do
|
|
394
392
|
@key_sender.puts "{right}{enter}"
|
395
393
|
@key_sender.puts "{right}{enter}"
|
396
394
|
#@key_sender.puts "%{n}" #, :initial_wait => 0.2, :if_target_missing=>"Excel window not found")
|
397
|
-
|
398
|
-
@book.save_as(@simple_save_file1, :if_exists => :alert)
|
399
|
-
}.to raise_error(WorkbookError, "not saved or canceled by user")
|
400
|
-
File.exist?(@simple_save_file1).should be_true
|
401
|
-
File.size?(@simple_save_file1).should == @garbage_length
|
402
|
-
@book.excel.DisplayAlerts.should == displayalert_value
|
403
|
-
end
|
404
|
-
|
405
|
-
it "should report save errors and leave DisplayAlerts unchanged" do
|
406
|
-
#@key_sender.puts "{left}{enter}" #, :initial_wait => 0.2, :if_target_missing=>"Excel window not found")
|
407
|
-
@book.ole_workbook.Close
|
408
|
-
expect{
|
409
|
-
@book.save_as(@simple_save_file1, :if_exists => :alert)
|
410
|
-
}.to raise_error(ObjectNotAlive, "workbook is not alive")
|
395
|
+
@book.save_as(@simple_save_file1, :if_exists => :alert)
|
411
396
|
File.exist?(@simple_save_file1).should be_true
|
412
397
|
File.size?(@simple_save_file1).should == @garbage_length
|
413
398
|
@book.excel.DisplayAlerts.should == displayalert_value
|
@@ -449,9 +434,7 @@ describe Book do
|
|
449
434
|
@key_sender.puts "{enter}"
|
450
435
|
@key_sender.puts "{enter}"
|
451
436
|
#@key_sender.puts "%{n}" #, :initial_wait => 0.2, :if_target_missing=>"Excel window not found")
|
452
|
-
|
453
|
-
@book.save_as(@simple_save_file1, :if_exists => :excel)
|
454
|
-
}.to raise_error(WorkbookError, "not saved or canceled by user")
|
437
|
+
@book.save_as(@simple_save_file1, :if_exists => :excel)
|
455
438
|
File.exist?(@simple_save_file1).should be_true
|
456
439
|
File.size?(@simple_save_file1).should == @garbage_length
|
457
440
|
@book.excel.DisplayAlerts.should == displayalert_value
|
@@ -464,9 +447,7 @@ describe Book do
|
|
464
447
|
@key_sender.puts "{right}{enter}"
|
465
448
|
@key_sender.puts "{right}{enter}"
|
466
449
|
#@key_sender.puts "%{n}" #, :initial_wait => 0.2, :if_target_missing=>"Excel window not found")
|
467
|
-
|
468
|
-
@book.save_as(@simple_save_file1, :if_exists => :excel)
|
469
|
-
}.to_not raise_error
|
450
|
+
@book.save_as(@simple_save_file1, :if_exists => :excel)
|
470
451
|
File.exist?(@simple_save_file1).should be_true
|
471
452
|
File.size?(@simple_save_file1).should == @garbage_length
|
472
453
|
@book.excel.DisplayAlerts.should == displayalert_value
|
Binary file
|
Binary file
|
data/spec/data/workbook.xls
CHANGED
Binary file
|
data/spec/excel_spec.rb
CHANGED
@@ -371,79 +371,58 @@ module RobustExcelOle
|
|
371
371
|
|
372
372
|
it "should close one Excel instance" do
|
373
373
|
excel1 = Excel.create
|
374
|
-
Excel.close_all
|
374
|
+
result = Excel.close_all
|
375
375
|
sleep 0.2
|
376
376
|
excel1.should_not be_alive
|
377
|
-
|
377
|
+
result.should == [1,0]
|
378
378
|
end
|
379
379
|
|
380
380
|
it "should close two Excel instances" do
|
381
381
|
excel1 = Excel.create
|
382
382
|
excel2 = Excel.create
|
383
|
-
Excel.close_all
|
383
|
+
result = Excel.close_all
|
384
384
|
sleep 0.2
|
385
385
|
excel1.should_not be_alive
|
386
386
|
excel2.should_not be_alive
|
387
|
-
|
387
|
+
result.should == [2,0]
|
388
388
|
end
|
389
389
|
end
|
390
390
|
|
391
391
|
context "with unsaved workbooks" do
|
392
392
|
|
393
|
-
context "with
|
394
|
-
|
395
|
-
before do
|
396
|
-
@book1 = Book.open(@simple_file1, :force_excel => :new)
|
397
|
-
@book2 = Book.open(@another_simple_file, :force_excel => :new)
|
398
|
-
@book3 = Book.open(@different_file, :force_excel => :new)
|
399
|
-
end
|
393
|
+
context "with one Excel instance" do
|
400
394
|
|
401
|
-
|
402
|
-
|
403
|
-
@
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
@book1.excel.should be_alive
|
409
|
-
@book2.excel.should_not be_alive
|
410
|
-
@book3.excel.should_not be_alive
|
411
|
-
@book1.should be_alive
|
412
|
-
@book2.should_not be_alive
|
413
|
-
@book3.should_not be_alive
|
395
|
+
before do
|
396
|
+
book1 = Book.open(@simple_file1, :visible => true)
|
397
|
+
@excel1 = book1.excel
|
398
|
+
sheet1 = book1.sheet(1)
|
399
|
+
@old_cell_value1 = sheet1[1,1].value
|
400
|
+
sheet1[1,1] = sheet1[1,1].value == "foo" ? "bar" : "foo"
|
401
|
+
book1.Saved.should be_false
|
414
402
|
end
|
415
403
|
|
416
|
-
it "should
|
417
|
-
|
418
|
-
@book2.sheet(1)[1,1] = old_cell_value2 == "foo" ? "bar" : "foo"
|
419
|
-
expect{
|
420
|
-
Excel.close_all(:if_unsaved => :raise)
|
421
|
-
}.to raise_error(UnsavedWorkbooks, "Excel contains unsaved workbooks")
|
404
|
+
it "should save the unsaved workbook" do
|
405
|
+
result = Excel.close_all(:if_unsaved => :save)
|
422
406
|
sleep 0.2
|
423
|
-
@
|
424
|
-
@
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
407
|
+
@excel1.should_not be_alive
|
408
|
+
new_book1 = Book.open(@simple_file1)
|
409
|
+
new_sheet1 = new_book1.sheet(1)
|
410
|
+
new_sheet1[1,1].value.should_not == @old_cell_value1
|
411
|
+
new_book1.close
|
412
|
+
result.should == [1,0]
|
429
413
|
end
|
430
414
|
|
431
|
-
it "should
|
432
|
-
|
433
|
-
@book3.sheet(1)[1,1] = old_cell_value3 == "foo" ? "bar" : "foo"
|
434
|
-
expect{
|
435
|
-
Excel.close_all(:if_unsaved => :raise)
|
436
|
-
}.to raise_error(UnsavedWorkbooks, "Excel contains unsaved workbooks")
|
415
|
+
it "should forget the unsaved workbook" do
|
416
|
+
result = Excel.close_all(:if_unsaved => :forget)
|
437
417
|
sleep 0.2
|
438
|
-
@
|
439
|
-
@
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
418
|
+
@excel1.should_not be_alive
|
419
|
+
new_book1 = Book.open(@simple_file1)
|
420
|
+
new_sheet1 = new_book1.sheet(1)
|
421
|
+
new_sheet1[1,1].value.should == @old_cell_value1
|
422
|
+
new_book1.close
|
423
|
+
result.should == [1,0]
|
444
424
|
end
|
445
|
-
|
446
|
-
end
|
425
|
+
end
|
447
426
|
|
448
427
|
context "with two Excel instances" do
|
449
428
|
|
@@ -451,9 +430,6 @@ module RobustExcelOle
|
|
451
430
|
book1 = Book.open(@simple_file1, :force_excel => :new)
|
452
431
|
book2 = Book.open(@different_file, :force_excel => :new)
|
453
432
|
@excel1 = book1.excel
|
454
|
-
sheet1 = book1.sheet(1)
|
455
|
-
@old_cell_value1 = sheet1[1,1].value
|
456
|
-
sheet1[1,1] = sheet1[1,1].value == "foo" ? "bar" : "foo"
|
457
433
|
@excel2 = book2.excel
|
458
434
|
sheet2 = book2.sheet(1)
|
459
435
|
@old_cell_value2 = sheet2[1,1].value
|
@@ -465,47 +441,49 @@ module RobustExcelOle
|
|
465
441
|
Excel.close_all(:if_unsaved => :raise)
|
466
442
|
}.to raise_error(UnsavedWorkbooks, "Excel contains unsaved workbooks")
|
467
443
|
sleep 0.2
|
468
|
-
@excel1.
|
444
|
+
@excel1.should_not be_alive
|
469
445
|
@excel2.should be_alive
|
446
|
+
result = Excel.close_all(:if_unsaved => :forget)
|
447
|
+
sleep 0.2
|
448
|
+
@excel2.should_not be_alive
|
449
|
+
result.should == [1,0]
|
470
450
|
end
|
471
451
|
|
472
|
-
it "should close the first Excel without unsaved workbooks and then raise an error
|
452
|
+
it "should close the first Excel without unsaved workbooks and then raise an error" do
|
473
453
|
expect{
|
474
454
|
Excel.close_all
|
475
455
|
}.to raise_error(UnsavedWorkbooks, "Excel contains unsaved workbooks")
|
476
456
|
sleep 0.2
|
477
|
-
@excel1.
|
457
|
+
@excel1.should_not be_alive
|
478
458
|
@excel2.should be_alive
|
459
|
+
result = Excel.close_all(:if_unsaved => :forget)
|
460
|
+
sleep 0.2
|
461
|
+
@excel2.should_not be_alive
|
462
|
+
result.should == [1,0]
|
479
463
|
end
|
480
464
|
|
481
465
|
it "should close the Excel instances with saving the unsaved workbooks" do
|
482
|
-
Excel.close_all(:if_unsaved => :save)
|
466
|
+
result = Excel.close_all(:if_unsaved => :save)
|
483
467
|
sleep 0.2
|
484
468
|
@excel1.should_not be_alive
|
485
469
|
@excel2.should_not be_alive
|
486
|
-
new_book1 = Book.open(@simple_file1)
|
487
|
-
new_sheet1 = new_book1.sheet(1)
|
488
|
-
new_sheet1[1,1].value.should_not == @old_cell_value1
|
489
|
-
new_book1.close
|
490
470
|
new_book2 = Book.open(@different_file1)
|
491
471
|
new_sheet2 = new_book2.sheet(1)
|
492
472
|
new_sheet2[1,1].value.should_not == @old_cell_value2
|
493
473
|
new_book2.close
|
474
|
+
result.should == [2,0]
|
494
475
|
end
|
495
476
|
|
496
477
|
it "should close the Excel instances without saving the unsaved workbooks" do
|
497
|
-
Excel.close_all(:if_unsaved => :forget)
|
478
|
+
result = Excel.close_all(:if_unsaved => :forget)
|
498
479
|
sleep 0.2
|
499
480
|
@excel1.should_not be_alive
|
500
481
|
@excel2.should_not be_alive
|
501
|
-
new_book1 = Book.open(@simple_file1)
|
502
|
-
new_sheet1 = new_book1.sheet(1)
|
503
|
-
new_sheet1[1,1].value.should == @old_cell_value1
|
504
|
-
new_book1.close
|
505
482
|
new_book2 = Book.open(@different_file1)
|
506
483
|
new_sheet2 = new_book2.sheet(1)
|
507
484
|
new_sheet2[1,1].value.should == @old_cell_value2
|
508
|
-
new_book2.close
|
485
|
+
new_book2.close
|
486
|
+
result.should == [2,0]
|
509
487
|
end
|
510
488
|
|
511
489
|
it "should raise an error for invalid option" do
|
@@ -513,94 +491,86 @@ module RobustExcelOle
|
|
513
491
|
Excel.close_all(:if_unsaved => :invalid_option)
|
514
492
|
}.to raise_error(OptionInvalid, ":if_unsaved: invalid option: :invalid_option")
|
515
493
|
end
|
516
|
-
|
517
494
|
end
|
518
495
|
|
519
|
-
context "with
|
496
|
+
context "with three Excel instances" do
|
520
497
|
|
521
|
-
|
522
|
-
book1 = Book.open(@
|
523
|
-
|
524
|
-
|
525
|
-
|
498
|
+
before do
|
499
|
+
@book1 = Book.open(@simple_file1, :force_excel => :new)
|
500
|
+
@book2 = Book.open(@another_simple_file, :force_excel => :new)
|
501
|
+
@book3 = Book.open(@different_file, :force_excel => :new)
|
502
|
+
old_cell_value1 = @book2.sheet(1)[1,1].value
|
503
|
+
@book2.sheet(1)[1,1] = old_cell_value1 == "foo" ? "bar" : "foo"
|
526
504
|
end
|
527
505
|
|
528
|
-
it "should
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
Excel.close_all(:if_unsaved => :forget)
|
506
|
+
it "should close the 1st and 3rd Excel instances that have saved workbooks" do
|
507
|
+
expect{
|
508
|
+
Excel.close_all(:if_unsaved => :raise)
|
509
|
+
}.to raise_error(UnsavedWorkbooks, "Excel contains unsaved workbooks")
|
510
|
+
sleep 0.2
|
511
|
+
@book1.excel.should_not be_alive
|
512
|
+
@book2.excel.should be_alive
|
513
|
+
@book3.excel.should_not be_alive
|
514
|
+
result = Excel.close_all(:if_unsaved => :forget)
|
515
|
+
@book2.excel.should_not be_alive
|
516
|
+
result.should == [1,0]
|
537
517
|
end
|
538
|
-
end
|
539
|
-
end
|
540
|
-
end
|
541
|
-
|
542
|
-
=begin
|
543
|
-
context "with :if_unsaved => :alert" do
|
544
|
-
before do
|
545
|
-
@key_sender = IO.popen 'ruby "' + File.join(File.dirname(__FILE__), '/helpers/key_sender.rb') + '" "Microsoft Excel" ' , "w"
|
546
|
-
book2 = Book.open(@simple_file, :force_excel => :new)
|
547
|
-
#@excel1 = book1.excel
|
548
|
-
@excel2 = book2.excel
|
549
|
-
sheet2 = book2.sheet(1)
|
550
|
-
@old_cell_value2 = sheet2[1,1].value
|
551
|
-
sheet2[1,1] = sheet2[1,1].value == "foo" ? "bar" : "foo"
|
552
|
-
end
|
553
|
-
|
554
|
-
after do
|
555
|
-
@key_sender.close
|
556
518
|
end
|
557
519
|
|
558
|
-
|
559
|
-
@key_sender.puts "{enter}"
|
560
|
-
Excel.close_all(:if_unsaved => :alert)
|
561
|
-
@excel2.should_not be_alive
|
562
|
-
new_book2 = Book.open(@simple_file)
|
563
|
-
new_sheet2 = new_book2.sheet(1)
|
564
|
-
new_sheet2[1,1].value.should_not == @old_cell_value2
|
565
|
-
new_book2.close
|
566
|
-
end
|
520
|
+
context "with unknown Excel instances" do
|
567
521
|
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
new_book2.close
|
577
|
-
end
|
522
|
+
before do
|
523
|
+
@ole_xl = WIN32OLE.new('Excel.Application')
|
524
|
+
@book1 = Book.open(@simple_file1, :force_excel => :new)
|
525
|
+
@book2 = Book.open(@another_simple_file, :force_excel => :new)
|
526
|
+
@book3 = Book.open(@different_file, :force_excel => :new)
|
527
|
+
old_cell_value1 = @book2.sheet(1)[1,1].value
|
528
|
+
@book2.sheet(1)[1,1] = old_cell_value1 == "foo" ? "bar" : "foo"
|
529
|
+
end
|
578
530
|
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
531
|
+
it "should close three Excel instances that have saved workbooks" do
|
532
|
+
expect{
|
533
|
+
Excel.close_all(:if_unsaved => :raise)
|
534
|
+
}.to raise_error(UnsavedWorkbooks, "Excel contains unsaved workbooks")
|
535
|
+
sleep 0.2
|
536
|
+
expect{
|
537
|
+
@ole_xl.Name
|
538
|
+
}.to raise_error(WIN32OLERuntimeError)
|
539
|
+
@book1.excel.should_not be_alive
|
540
|
+
@book2.excel.should be_alive
|
541
|
+
@book3.excel.should_not be_alive
|
542
|
+
result = Excel.close_all(:if_unsaved => :forget)
|
543
|
+
@book2.excel.should_not be_alive
|
544
|
+
result.should == [1,0]
|
545
|
+
end
|
587
546
|
|
547
|
+
it "should close all four Excel instances" do
|
548
|
+
result = Excel.close_all(:if_unsaved => :forget)
|
549
|
+
sleep 0.2
|
550
|
+
expect{
|
551
|
+
@ole_xl.Name
|
552
|
+
}.to raise_error(RuntimeError, "failed to get Dispatch Interface")
|
553
|
+
@book1.excel.should_not be_alive
|
554
|
+
@book2.excel.should_not be_alive
|
555
|
+
@book3.excel.should_not be_alive
|
556
|
+
result.should == [4,0]
|
557
|
+
end
|
588
558
|
end
|
559
|
+
|
589
560
|
end
|
590
561
|
end
|
591
|
-
|
592
|
-
|
562
|
+
|
593
563
|
describe "close" do
|
594
564
|
|
595
|
-
context "with
|
565
|
+
context "with saved workbooks" do
|
596
566
|
|
597
567
|
before do
|
598
568
|
@excel = Excel.create
|
599
569
|
@book = Book.open(@simple_file)
|
570
|
+
@excel.should be_alive
|
600
571
|
end
|
601
572
|
|
602
573
|
it "should close the Excel" do
|
603
|
-
@excel.should be_alive
|
604
574
|
@book.should be_alive
|
605
575
|
@excel.close
|
606
576
|
sleep 0.2
|
@@ -608,32 +578,13 @@ module RobustExcelOle
|
|
608
578
|
@book.should_not be_alive
|
609
579
|
end
|
610
580
|
|
611
|
-
it "should close the Excel hard" do
|
612
|
-
@excel.should be_alive
|
613
|
-
@book.should be_alive
|
614
|
-
@excel.close(:hard => true)
|
615
|
-
sleep 0.2
|
616
|
-
@excel.should_not be_alive
|
617
|
-
@book.should_not be_alive
|
618
|
-
end
|
619
|
-
|
620
581
|
it "should close the Excel without destroying the others" do
|
621
|
-
@excel.should be_alive
|
622
582
|
excel2 = Excel.create
|
623
583
|
@excel.close
|
624
584
|
sleep 0.2
|
625
585
|
@excel.should_not be_alive
|
626
586
|
excel2.should be_alive
|
627
587
|
end
|
628
|
-
|
629
|
-
it "should close the Excel hard without destroying the others" do
|
630
|
-
@excel.should be_alive
|
631
|
-
excel2 = Excel.create
|
632
|
-
@excel.close(:hard => true)
|
633
|
-
sleep 0.2
|
634
|
-
@excel.should_not be_alive
|
635
|
-
excel2.should be_alive
|
636
|
-
end
|
637
588
|
end
|
638
589
|
|
639
590
|
context "with unsaved workbooks" do
|
@@ -648,74 +599,60 @@ module RobustExcelOle
|
|
648
599
|
sheet2 = @book2.sheet(1)
|
649
600
|
@old_cell_value2 = sheet2[1,1].value
|
650
601
|
sheet2[1,1] = sheet2[1,1].value == "foo" ? "bar" : "foo"
|
651
|
-
end
|
652
|
-
|
653
|
-
it "should raise an error" do
|
654
602
|
@excel.should be_alive
|
655
603
|
@book.should be_alive
|
656
604
|
@book.saved.should be_false
|
657
605
|
@book2.should be_alive
|
658
606
|
@book2.saved.should be_false
|
607
|
+
end
|
608
|
+
|
609
|
+
it "should raise an error" do
|
659
610
|
expect{
|
660
611
|
@excel.close(:if_unsaved => :raise)
|
661
612
|
}.to raise_error(UnsavedWorkbooks, "Excel contains unsaved workbooks")
|
662
613
|
end
|
663
614
|
|
664
|
-
it "should
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
615
|
+
it "should raise an error per default" do
|
616
|
+
expect{
|
617
|
+
@excel.close(:if_unsaved => :raise)
|
618
|
+
}.to raise_error(UnsavedWorkbooks, "Excel contains unsaved workbooks")
|
619
|
+
end
|
620
|
+
|
621
|
+
it "should close the Excel without saving the workbook" do
|
622
|
+
result = @excel.close(:if_unsaved => :forget)
|
669
623
|
sleep 0.2
|
670
624
|
@excel.should_not be_alive
|
625
|
+
result.should == 1
|
671
626
|
new_book = Book.open(@simple_file)
|
672
627
|
new_sheet = new_book.sheet(1)
|
673
628
|
new_sheet[1,1].value.should == @old_cell_value
|
674
629
|
new_book.close
|
675
|
-
new_book2 = Book.open(@another_simple_file)
|
676
|
-
new_sheet2 = new_book2.sheet(1)
|
677
|
-
new_sheet2[1,1].value.should == @old_cell_value2
|
678
|
-
new_book2.close(:if_unsaved => :forget)
|
679
630
|
end
|
680
|
-
|
681
|
-
it "should close the Excel without saving the workbook" do
|
631
|
+
|
632
|
+
it "should close the Excel without saving the workbook even with displayalerts true" do
|
682
633
|
@excel.displayalerts = false
|
683
634
|
@excel.should be_alive
|
684
|
-
@excel.displayalerts =
|
685
|
-
@excel.close(:if_unsaved => :forget)
|
635
|
+
@excel.displayalerts = true
|
636
|
+
result = @excel.close(:if_unsaved => :forget)
|
686
637
|
sleep 0.2
|
638
|
+
result.should == 1
|
687
639
|
@excel.should_not be_alive
|
688
640
|
new_book = Book.open(@simple_file)
|
689
641
|
new_sheet = new_book.sheet(1)
|
690
642
|
new_sheet[1,1].value.should == @old_cell_value
|
691
643
|
new_book.close
|
692
|
-
new_book2 = Book.open(@another_simple_file)
|
693
|
-
new_sheet2 = new_book2.sheet(1)
|
694
|
-
new_sheet2[1,1].value.should == @old_cell_value2
|
695
|
-
new_book2.close(:if_unsaved => :forget)
|
696
644
|
end
|
697
645
|
|
698
646
|
it "should close the Excel with saving the workbook" do
|
699
647
|
@excel.should be_alive
|
700
|
-
@excel.close(:if_unsaved => :save)
|
648
|
+
result = @excel.close(:if_unsaved => :save)
|
701
649
|
sleep 0.2
|
650
|
+
result.should == 1
|
702
651
|
@excel.should_not be_alive
|
703
652
|
new_book = Book.open(@simple_file)
|
704
653
|
new_sheet = new_book.sheet(1)
|
705
654
|
new_sheet[1,1].value.should_not == @old_cell_value
|
706
655
|
new_book.close
|
707
|
-
new_book2 = Book.open(@another_simple_file)
|
708
|
-
new_sheet2 = new_book2.sheet(1)
|
709
|
-
new_sheet2[1,1].value.should_not == @old_cell_value2
|
710
|
-
new_book2.close
|
711
|
-
end
|
712
|
-
|
713
|
-
it "should close the Excel with saving the workbook" do
|
714
|
-
@excel.should be_alive
|
715
|
-
@excel.close(:if_unsaved => :keep_open)
|
716
|
-
sleep 0.2
|
717
|
-
@excel.should be_alive
|
718
|
-
@excel.close(:if_unsaved => :forget)
|
719
656
|
end
|
720
657
|
|
721
658
|
it "should raise an error for invalid option" do
|
@@ -723,45 +660,14 @@ module RobustExcelOle
|
|
723
660
|
@excel.close(:if_unsaved => :invalid_option)
|
724
661
|
}.to raise_error(OptionInvalid, ":if_unsaved: invalid option: :invalid_option")
|
725
662
|
end
|
726
|
-
|
727
|
-
it "should raise an error by default" do
|
728
|
-
@excel.should be_alive
|
729
|
-
expect{
|
730
|
-
@excel.close
|
731
|
-
}.to raise_error(UnsavedWorkbooks, "Excel contains unsaved workbooks")
|
732
|
-
end
|
733
|
-
|
734
|
-
it "should close the Excel without saving the workbook hard" do
|
735
|
-
@excel.should be_alive
|
736
|
-
@book.should be_alive
|
737
|
-
@book.saved.should be_false
|
738
|
-
@excel.close(:if_unsaved => :forget, :hard => true)
|
739
|
-
sleep 0.2
|
740
|
-
@excel.should_not be_alive
|
741
|
-
@book.should_not be_alive
|
742
|
-
new_book = Book.open(@simple_file)
|
743
|
-
new_sheet = new_book.sheet(1)
|
744
|
-
new_sheet[1,1].value.should == @old_cell_value
|
745
|
-
new_book.close
|
746
|
-
new_book.excel.close(:hard => true)
|
747
|
-
sleep 0.2
|
748
|
-
procs = WIN32OLE.connect("winmgmts:\\\\.")
|
749
|
-
processes = procs.InstancesOf("win32_process")
|
750
|
-
result = []
|
751
|
-
processes.each do |p|
|
752
|
-
result << p if p.name == "EXCEL.EXE"
|
753
|
-
end
|
754
|
-
result.should be_empty
|
755
|
-
end
|
756
|
-
|
757
663
|
end
|
758
664
|
|
759
665
|
context "with :if_unsaved => :alert" do
|
760
666
|
|
761
667
|
before do
|
762
668
|
@key_sender = IO.popen 'ruby "' + File.join(File.dirname(__FILE__), '/helpers/key_sender.rb') + '" "Microsoft Excel" ' , "w"
|
763
|
-
@excel = Excel.create
|
764
|
-
@book = Book.open(@simple_file)
|
669
|
+
@excel = Excel.create(:visible => true)
|
670
|
+
@book = Book.open(@simple_file, :visible => true)
|
765
671
|
sheet = @book.sheet(1)
|
766
672
|
@old_cell_value = sheet[1,1].value
|
767
673
|
sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
|
@@ -775,8 +681,9 @@ module RobustExcelOle
|
|
775
681
|
# "Yes" is to the left of "No", which is the default. --> language independent
|
776
682
|
@excel.should be_alive
|
777
683
|
@key_sender.puts "{enter}"
|
778
|
-
@excel.close(:if_unsaved => :alert)
|
684
|
+
result = @excel.close(:if_unsaved => :alert)
|
779
685
|
@excel.should_not be_alive
|
686
|
+
result.should == 1
|
780
687
|
new_book = Book.open(@simple_file)
|
781
688
|
new_sheet = new_book.sheet(1)
|
782
689
|
new_sheet[1,1].value.should_not == @old_cell_value
|
@@ -788,8 +695,9 @@ module RobustExcelOle
|
|
788
695
|
@book.should be_alive
|
789
696
|
@book.saved.should be_false
|
790
697
|
@key_sender.puts "{right}{enter}"
|
791
|
-
@excel.close(:if_unsaved => :alert)
|
698
|
+
result = @excel.close(:if_unsaved => :alert)
|
792
699
|
@excel.should_not be_alive
|
700
|
+
result.should == 1
|
793
701
|
@book.should_not be_alive
|
794
702
|
new_book = Book.open(@simple_file)
|
795
703
|
new_sheet = new_book.sheet(1)
|
@@ -806,11 +714,104 @@ module RobustExcelOle
|
|
806
714
|
@key_sender.puts "{left}{enter}"
|
807
715
|
expect{
|
808
716
|
@excel.close(:if_unsaved => :alert)
|
809
|
-
}.
|
717
|
+
}.to raise_error(ExcelError, "user canceled or runtime error")
|
810
718
|
end
|
719
|
+
end
|
720
|
+
end
|
811
721
|
|
722
|
+
describe "close_workbooks" do
|
723
|
+
|
724
|
+
context "with standard" do
|
725
|
+
|
726
|
+
before do
|
727
|
+
@book = Book.open(@simple_file)
|
728
|
+
sheet = @book.sheet(1)
|
729
|
+
@old_cell_value = sheet[1,1].value
|
730
|
+
sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
|
731
|
+
@book3 = Book.open(@different_file, :read_only => true)
|
732
|
+
sheet3 = @book3.sheet(1)
|
733
|
+
sheet3[1,1] = sheet3[1,1].value == "foo" ? "bar" : "foo"
|
734
|
+
@excel = @book.excel
|
735
|
+
@book2 = Book.open(@another_simple_file, :force_excel => :new)
|
736
|
+
end
|
737
|
+
|
738
|
+
it "should be ok if there are no unsaved workbooks" do
|
739
|
+
expect{
|
740
|
+
@book2.excel.close_workbooks
|
741
|
+
}.to_not raise_error
|
742
|
+
end
|
743
|
+
|
744
|
+
it "should raise error" do
|
745
|
+
expect{
|
746
|
+
@excel.close_workbooks(:if_unsaved => :raise)
|
747
|
+
}.to raise_error(UnsavedWorkbooks, "Excel contains unsaved workbooks")
|
748
|
+
end
|
749
|
+
|
750
|
+
it "should raise error per default" do
|
751
|
+
expect{
|
752
|
+
@excel.close_workbooks
|
753
|
+
}.to raise_error(UnsavedWorkbooks, "Excel contains unsaved workbooks")
|
754
|
+
end
|
755
|
+
|
756
|
+
it "should close the workbook with forgetting the workbook" do
|
757
|
+
@excel.close_workbooks(:if_unsaved => :forget)
|
758
|
+
sleep 0.2
|
759
|
+
@excel.should be_alive
|
760
|
+
@excel.Workbooks.Count.should == 0
|
761
|
+
new_book = Book.open(@simple_file)
|
762
|
+
new_sheet = new_book.sheet(1)
|
763
|
+
new_sheet[1,1].value.should == @old_cell_value
|
764
|
+
new_book.close
|
765
|
+
end
|
766
|
+
|
767
|
+
it "should close the workbook with saving the workbook" do
|
768
|
+
@excel.close_workbooks(:if_unsaved => :save)
|
769
|
+
sleep 0.2
|
770
|
+
@excel.should be_alive
|
771
|
+
@excel.Workbooks.Count.should == 0
|
772
|
+
new_book = Book.open(@simple_file)
|
773
|
+
new_sheet = new_book.sheet(1)
|
774
|
+
new_sheet[1,1].value.should_not == @old_cell_value
|
775
|
+
new_book.close
|
776
|
+
end
|
777
|
+
|
778
|
+
it "should raise an error for invalid option" do
|
779
|
+
expect {
|
780
|
+
@excel.close_workbooks(:if_unsaved => :invalid_option)
|
781
|
+
}.to raise_error(OptionInvalid, ":if_unsaved: invalid option: :invalid_option")
|
782
|
+
end
|
783
|
+
end
|
784
|
+
end
|
785
|
+
|
786
|
+
|
787
|
+
|
788
|
+
describe "unsaved_workbooks" do
|
789
|
+
|
790
|
+
context "with standard" do
|
791
|
+
|
792
|
+
before do
|
793
|
+
@book = Book.open(@simple_file)
|
794
|
+
sheet = @book.sheet(1)
|
795
|
+
sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
|
796
|
+
@book3 = Book.open(@different_file, :read_only => true)
|
797
|
+
sheet3 = @book3.sheet(1)
|
798
|
+
sheet3[1,1] = sheet3[1,1].value == "foo" ? "bar" : "foo"
|
799
|
+
@book.Saved.should be_false
|
800
|
+
@book3.Saved.should be_false
|
801
|
+
end
|
802
|
+
|
803
|
+
it "should list unsaved workbooks" do
|
804
|
+
excel = @book.excel
|
805
|
+
# unsaved_workbooks yields different WIN32OLE objects than book.workbook
|
806
|
+
uw_names = []
|
807
|
+
excel.unsaved_workbooks.each {|uw| uw_names << uw.Name}
|
808
|
+
uw_names.should == [@book.ole_workbook.Name]
|
809
|
+
end
|
810
|
+
|
811
|
+
it "should yield true, that there are unsaved workbooks" do
|
812
|
+
Excel.contains_unsaved_workbooks?.should be_true
|
813
|
+
end
|
812
814
|
end
|
813
|
-
|
814
815
|
end
|
815
816
|
|
816
817
|
describe "alive" do
|
@@ -990,7 +991,7 @@ module RobustExcelOle
|
|
990
991
|
excel2.Visible.should be_false
|
991
992
|
excel2.visible.should be_false
|
992
993
|
excel2.DisplayAlerts.should be_false
|
993
|
-
excel2.displayalerts.should ==
|
994
|
+
excel2.displayalerts.should == :if_visible
|
994
995
|
end
|
995
996
|
|
996
997
|
it "should take Visible and DisplayAlerts from the connected Excel" do
|
@@ -998,8 +999,8 @@ module RobustExcelOle
|
|
998
999
|
excel2 = Excel.current(:visible => true)
|
999
1000
|
excel2.Visible.should be_true
|
1000
1001
|
excel2.visible.should be_true
|
1001
|
-
excel2.DisplayAlerts.should
|
1002
|
-
excel2.displayalerts.should
|
1002
|
+
excel2.DisplayAlerts.should be_true
|
1003
|
+
excel2.displayalerts.should == :if_visible
|
1003
1004
|
end
|
1004
1005
|
|
1005
1006
|
it "should set Excel visible and invisible with current" do
|
@@ -1016,8 +1017,8 @@ module RobustExcelOle
|
|
1016
1017
|
excel2 = Excel.current(:visible => true)
|
1017
1018
|
excel2.Visible.should be_true
|
1018
1019
|
excel2.visible.should be_true
|
1019
|
-
excel2.displayalerts.should
|
1020
|
-
excel2.DisplayAlerts.should
|
1020
|
+
excel2.displayalerts.should == :if_visible
|
1021
|
+
excel2.DisplayAlerts.should be_true
|
1021
1022
|
end
|
1022
1023
|
|
1023
1024
|
it "should set Excel visible and invisible" do
|
@@ -1051,19 +1052,19 @@ module RobustExcelOle
|
|
1051
1052
|
excel3.Visible.should be_false
|
1052
1053
|
excel3.visible.should be_false
|
1053
1054
|
excel3.DisplayAlerts.should be_false
|
1054
|
-
excel3.displayalerts.should
|
1055
|
+
excel3.displayalerts.should == :if_visible
|
1055
1056
|
excel4 = Excel.current(:visible => true)
|
1056
1057
|
excel4.should === excel
|
1057
1058
|
excel4.Visible.should be_true
|
1058
1059
|
excel4.visible.should be_true
|
1059
|
-
excel4.DisplayAlerts.should
|
1060
|
-
excel4.displayalerts.should
|
1060
|
+
excel4.DisplayAlerts.should be_true
|
1061
|
+
excel4.displayalerts.should == :if_visible
|
1061
1062
|
excel5 = Excel.current(:visible => false)
|
1062
1063
|
excel5.should === excel
|
1063
1064
|
excel5.Visible.should be_false
|
1064
1065
|
excel5.visible.should be_false
|
1065
1066
|
excel5.DisplayAlerts.should be_false
|
1066
|
-
excel5.displayalerts.should
|
1067
|
+
excel5.displayalerts.should == :if_visible
|
1067
1068
|
end
|
1068
1069
|
|
1069
1070
|
it "should enable or disable Excel DispayAlerts" do
|
@@ -1376,48 +1377,7 @@ module RobustExcelOle
|
|
1376
1377
|
excel3.should_not == excel4
|
1377
1378
|
end
|
1378
1379
|
end
|
1379
|
-
|
1380
|
-
describe "unsaved_workbooks" do
|
1381
|
-
|
1382
|
-
context "with standard" do
|
1383
|
-
|
1384
|
-
before do
|
1385
|
-
@book = Book.open(@simple_file)
|
1386
|
-
@book3 = Book.open(@different_file, :read_only => true)
|
1387
|
-
sheet = @book.sheet(1)
|
1388
|
-
sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
|
1389
|
-
sheet3 = @book3.sheet(1)
|
1390
|
-
sheet3[1,1] = sheet3[1,1].value == "foo" ? "bar" : "foo"
|
1391
|
-
@book2 = Book.open(@another_simple_file, :force_excel => :new)
|
1392
|
-
sheet2 = @book2.sheet(1)
|
1393
|
-
sheet2[1,1] = sheet2[1,1].value == "foo" ? "bar" : "foo"
|
1394
|
-
end
|
1395
|
-
|
1396
|
-
it "should list unsaved workbooks" do
|
1397
|
-
@book.Saved.should be_false
|
1398
|
-
@book2.Saved.should be_false
|
1399
|
-
@book3.Saved.should be_false
|
1400
|
-
excel = @book.excel
|
1401
|
-
# unsaved_workbooks yields different WIN32OLE objects than book.workbook
|
1402
|
-
uw_names = []
|
1403
|
-
excel.unsaved_workbooks.each {|uw| uw_names << uw.Name}
|
1404
|
-
uw_names.should == [@book.ole_workbook.Name]
|
1405
|
-
end
|
1406
|
-
|
1407
|
-
it "should list all unsaved workbooks" do
|
1408
|
-
result = []
|
1409
|
-
Excel.unsaved_workbooks_all.each do |unsaved_workbooks|
|
1410
|
-
uw_names = []
|
1411
|
-
unsaved_workbooks.each {|uw| uw_names << uw.Name}
|
1412
|
-
result << uw_names
|
1413
|
-
end
|
1414
|
-
result.include?([@book.ole_workbook.Name]).should be_true
|
1415
|
-
result.include?([@book2.ole_workbook.Name]).should be_true
|
1416
|
-
end
|
1417
|
-
|
1418
|
-
end
|
1419
|
-
end
|
1420
|
-
|
1380
|
+
|
1421
1381
|
describe "generate workbook" do
|
1422
1382
|
|
1423
1383
|
context "with standard" do
|