robust_excel_ole 1.14 → 1.15

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.
@@ -18,7 +18,6 @@ module RobustExcelOle
18
18
  attr_accessor :stored_filename
19
19
  attr_accessor :color_if_modified
20
20
  attr_accessor :was_open
21
- attr_reader :workbook
22
21
 
23
22
  alias ole_object ole_workbook
24
23
 
@@ -29,8 +28,8 @@ module RobustExcelOle
29
28
  :if_unsaved => :raise,
30
29
  :if_obstructed => :raise,
31
30
  :if_absent => :raise,
32
- :if_exists => :raise,
33
- :check_compatibility => false
31
+ :if_exists => :raise
32
+ #:check_compatibility => false
34
33
  }.freeze
35
34
 
36
35
  CORE_DEFAULT_OPEN_OPTS = {
@@ -100,7 +99,7 @@ module RobustExcelOle
100
99
  # if readonly is true, then prefer a book that is given in force_excel if this option is set
101
100
  forced_excel =
102
101
  (options[:force][:excel].nil? || options[:force][:excel] == :current) ?
103
- (excel_class.new(:reuse => true) if !JRUBY_BUG_CONNECT) : excel_of(options[:force][:excel])
102
+ (excel_class.new(:reuse => true) if !::JRUBY_BUG_CONNECT) : excel_of(options[:force][:excel])
104
103
  begin
105
104
  book = if File.exists?(file)
106
105
  bookstore.fetch(file, :prefer_writable => !(options[:read_only]),
@@ -110,7 +109,8 @@ module RobustExcelOle
110
109
  trace "#{$!.message}"
111
110
  end
112
111
  if book
113
- book.was_open = book.alive?
112
+ # hack (unless condition): calling Worksheet[]= causes calling Worksheet#workbook which calls Workbook#new(ole_workbook)
113
+ book.was_open = book.alive? unless file_or_workbook.is_a? WIN32OLE
114
114
  # drop the fetched workbook if it shall be opened in another Excel instance
115
115
  # or the workbook is an unsaved workbook that should not be accepted
116
116
  if (options[:force][:excel].nil? || options[:force][:excel] == :current || forced_excel == book.excel) &&
@@ -151,7 +151,6 @@ module RobustExcelOle
151
151
  end
152
152
  set_options(filename, options)
153
153
  bookstore.store(self)
154
- @workbook = @excel.workbook = self
155
154
  r1c1_letters = @ole_workbook.Worksheets.Item(1).Cells.Item(1,1).Address(true,true,XlR1C1).gsub(/[0-9]/,'') #('ReferenceStyle' => XlR1C1).gsub(/[0-9]/,'')
156
155
  address_class.new(r1c1_letters)
157
156
  if block
@@ -232,43 +231,46 @@ module RobustExcelOle
232
231
 
233
232
  # @private
234
233
  def ensure_workbook(filename, options)
235
- unless @ole_workbook && alive?
236
- filename = @stored_filename ? @stored_filename : filename
237
- manage_nonexisting_file(filename,options)
238
- excel_option = options[:force][:excel].nil? ? options[:default][:excel] : options[:force][:excel]
239
- ensure_excel(options)
240
- workbooks = @excel.Workbooks
241
- @ole_workbook = workbooks.Item(File.basename(filename)) rescue nil if @ole_workbook.nil?
242
- if @ole_workbook
243
- @was_open = true
244
- manage_blocking_or_unsaved_workbook(filename,options)
245
- else
246
- if excel_option.nil? || excel_option == :current &&
247
- (!JRUBY_BUG_CONNECT || filename[0] != '/')
248
- connect(filename,options)
249
- else
250
- open_or_create_workbook(filename,options)
251
- end
252
- end
234
+ return if (@ole_workbook && alive? && (options[:read_only].nil? || @ole_workbook.ReadOnly == options[:read_only]))
235
+ if options[:if_unsaved]==:accept &&
236
+ ((options[:read_only]==true && self.ReadOnly==false) || (options[:read_only]==false && self.ReadOnly==true))
237
+ raise OptionInvalid, ":if_unsaved:accept and change of read-only mode is not possible"
253
238
  end
239
+ filename = @stored_filename ? @stored_filename : filename
240
+ manage_nonexisting_file(filename,options)
241
+ excel_option = options[:force][:excel].nil? ? options[:default][:excel] : options[:force][:excel]
242
+ ensure_excel(options)
243
+ workbooks = @excel.Workbooks
244
+ @ole_workbook = workbooks.Item(File.basename(filename)) rescue nil if @ole_workbook.nil?
245
+ if @ole_workbook
246
+ @was_open = true if @was_open.nil? # necessary?
247
+ manage_blocking_or_unsaved_workbook(filename,options)
248
+ open_or_create_workbook(filename,options) if @ole_workbook.ReadOnly != options[:read_only]
249
+ else
250
+ if excel_option.nil? || excel_option == :current &&
251
+ (!::JRUBY_BUG_CONNECT || filename[0] != '/')
252
+ workbooks_number_before_connect = @excel.Workbooks.Count
253
+ connect(filename,options)
254
+ @was_open = @excel.Workbooks.Count == workbooks_number_before_connect
255
+ else
256
+ open_or_create_workbook(filename,options)
257
+ end
258
+ end
254
259
  end
255
260
 
256
261
  # @private
257
262
  def set_options(filename, options)
263
+ # changing read-only mode
258
264
  if (!options[:read_only].nil?) && options[:read_only] != @ole_workbook.ReadOnly
259
- #raise OptionInvalid, ":if_unsaved:accept and changing read-only mode is not possible" if options[:if_unsaved]==:accept
260
- @excel.with_displayalerts(false) { @ole_workbook.Close }
261
- @ole_workbook = nil
262
- open_or_create_workbook(filename, options)
265
+ ensure_workbook(filename, options)
263
266
  end
264
267
  retain_saved do
265
268
  self.visible = options[:force][:visible].nil? ? @excel.Visible : options[:force][:visible]
266
269
  @excel.calculation = options[:calculation] unless options[:calculation].nil?
267
270
  @ole_workbook.CheckCompatibility = options[:check_compatibility] unless options[:check_compatibility].nil?
268
- end
271
+ end
269
272
  end
270
273
 
271
-
272
274
  private
273
275
 
274
276
  # @private
@@ -299,9 +301,6 @@ module RobustExcelOle
299
301
  end
300
302
  end
301
303
  @excel = excel_class.new(ole_excel)
302
- excels_number_after = excel_class.excels_number
303
- workbooks_number_after = ole_excel.Workbooks.Count
304
- @was_open = (excels_number_after==excels_number) && (workbooks_number_after==workbooks_number)
305
304
  end
306
305
 
307
306
  # @private
@@ -410,11 +409,13 @@ module RobustExcelOle
410
409
  end
411
410
 
412
411
  # @private
413
- def open_or_create_workbook(filename, options)
414
- return if @ole_workbook && options[:if_unsaved] != :alert && options[:if_unsaved] != :excel
412
+ def open_or_create_workbook(filename, options)
413
+ return if @ole_workbook && options[:if_unsaved] != :alert && options[:if_unsaved] != :excel &&
414
+ (options[:read_only].nil? || options[:read_only]==@ole_workbook.ReadOnly )
415
415
  begin
416
416
  abs_filename = General.absolute_path(filename)
417
417
  begin
418
+ @was_open = false if @was_open.nil?
418
419
  workbooks = @excel.Workbooks
419
420
  rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException => msg
420
421
  raise UnexpectedREOError, "cannot access workbooks: #{msg.message} #{msg.backtrace}"
@@ -467,7 +468,7 @@ module RobustExcelOle
467
468
  workaround_condition = @excel.Version.split('.').first.to_i == 12 && workbooks.Count == 0
468
469
  if workaround_condition
469
470
  workbooks.Add
470
- @excel.calculation = options[:calculation].nil? ? @excel.calculation : options[:calculation]
471
+ @excel.calculation = options[:calculation].nil? ? @excel.properties[:calculation] : options[:calculation]
471
472
  end
472
473
  begin
473
474
  # @excel.with_displayalerts(update_links_opt == :alert ? true : @excel.displayalerts) do
@@ -545,20 +546,20 @@ module RobustExcelOle
545
546
  end
546
547
  end
547
548
 
548
- def self.for_reading(*args, &block)
549
- args = args.dup
550
- opts = args.last.is_a?(Hash) ? args.pop : {}
551
- opts = {:writable => false}.merge(opts)
552
- args.push opts
553
- unobtrusively(*args, &block)
549
+ def for_reading(opts = { }, &block)
550
+ unobtrusively({:writable => false}.merge(opts), &block)
551
+ end
552
+
553
+ def for_modifying(opts = { }, &block)
554
+ unobtrusively({:writable => true}.merge(opts), &block)
554
555
  end
555
556
 
556
- def self.for_modifying(*args, &block)
557
- args = args.dup
558
- opts = args.last.is_a?(Hash) ? args.pop : {}
559
- opts = {:writable => true}.merge(opts)
560
- args.push opts
561
- unobtrusively(*args, &block)
557
+ def self.for_reading(arg, opts = { }, &block)
558
+ unobtrusively(arg, {:writable => false}.merge(opts), &block)
559
+ end
560
+
561
+ def self.for_modifying(arg, opts = { }, &block)
562
+ unobtrusively(arg, {:writable => true}.merge(opts), &block)
562
563
  end
563
564
 
564
565
  # allows to read or modify a workbook such that its state remains unchanged
@@ -570,32 +571,48 @@ module RobustExcelOle
570
571
  # @option opts [Boolean] :writable true (default)/false changes of the workbook shall be saved/not saved
571
572
  # @option opts [Boolean] :keep_open whether the workbook shall be kept open after unobtrusively opening (default: false)
572
573
  # @return [Workbook] a workbook
573
- def self.unobtrusively(file_or_workbook, opts = { })
574
- opts = process_options(opts, :use_defaults => false)
575
- raise OptionInvalid, 'contradicting options' if opts[:writable] && opts[:read_only]
576
- opts = opts.merge({:force => {:excel => opts[:if_closed]}, :if_closed => :current,
577
- :if_unsaved => :accept, :keep_open => false})
578
- opts = opts.merge({:read_only => opts[:read_only]}) unless opts[:read_only].nil?
574
+ def self.unobtrusively(file_or_workbook, opts = { }, &block)
579
575
  file = (file_or_workbook.is_a? WIN32OLE) ? file_or_workbook.Fullname.tr('\\','/') : file_or_workbook
576
+ unobtrusively_opening(file, opts, nil, &block)
577
+ end
578
+
579
+ def unobtrusively(opts = { }, &block)
580
+ file = @stored_filename
581
+ self.class.unobtrusively_opening(file, opts, alive?, &block)
582
+ end
583
+
584
+ @private
585
+ def self.unobtrusively_opening(file, opts, book_is_alive, &block)
586
+ opts = process_options(opts)
587
+ opts = {:if_closed => :current, :keep_open => false}.merge(opts)
588
+ raise OptionInvalid, 'contradicting options' if opts[:writable] && opts[:read_only]
589
+ if book_is_alive.nil?
590
+ prefer_writable = ((!(opts[:read_only]) || opts[:writable] == true) &&
591
+ !(opts[:read_only].nil? && opts[:writable] == false))
592
+ known_book = bookstore.fetch(file, :prefer_writable => prefer_writable)
593
+ end
594
+ excel_opts = if (book_is_alive==false || (book_is_alive.nil? && (known_book.nil? || !known_book.alive?)))
595
+ {:force => {:excel => opts[:if_closed]}}
596
+ else
597
+ {:force => {:excel => opts[:force][:excel]}, :default => {:excel => opts[:default][:excel]}}
598
+ end
599
+ open_opts = excel_opts.merge({:if_unsaved => :accept})
580
600
  begin
581
- book = open(file)
601
+ book = open(file, open_opts)
582
602
  was_visible = book.visible
583
603
  was_writable = book.writable
584
604
  was_saved = book.saved
585
605
  was_check_compatibility = book.check_compatibility
586
- was_calculation = book.excel.calculation
587
- book.set_options(file,opts)
588
- if !was_saved && ((opts[:writable] && !was_writable) || (opts[:read_only] && was_writable))
589
- raise NotImplementedREOError, 'unsaved read-only workbook shall be written'
590
- end
606
+ was_calculation = book.excel.properties[:calculation]
607
+ book.set_options(file,opts)
591
608
  yield book
592
609
  ensure
593
610
  if book && book.alive?
594
- do_not_write = (opts[:read_only] || (opts[:read_only].nil? && opts[:writable] == false))
595
- book.save unless was_saved || do_not_write || book.ReadOnly
596
- # open and close if the read_only mode has changed
611
+ do_not_write = opts[:read_only] || opts[:writable]==false
612
+ book.save unless book.saved || do_not_write || !book.writable
597
613
  if (opts[:read_only] && was_writable) || (!opts[:read_only] && !was_writable)
598
- book = open(file, :read_only => !was_writable, :if_unsaved => :forget)
614
+ book.set_options(file, opts.merge({:read_only => !was_writable,
615
+ :if_unsaved => (opts[:writable]==false ? :forget : :save)}))
599
616
  end
600
617
  if book.was_open
601
618
  book.visible = was_visible
@@ -608,60 +625,6 @@ module RobustExcelOle
608
625
  end
609
626
  end
610
627
 
611
- # allows to read or modify a workbook such that its state remains unchanged
612
- # state comprises: open, saved, writable, visible, calculation mode, check compatibility
613
- # @param [String] file_or_workbook a file name or WIN32OLE workbook
614
- # @param [Hash] opts the options
615
- # @option opts [Variant] :if_closed :current (default), :new or an Excel instance
616
- # @option opts [Boolean] :read_only true/false (default), open the workbook in read-only/read-write modus (save changes)
617
- # @option opts [Boolean] :writable true (default)/false changes of the workbook shall be saved/not saved
618
- # @option opts [Boolean] :keep_open whether the workbook shall be kept open after unobtrusively opening (default: false)
619
- # @return [Workbook] a workbook
620
- =begin
621
- def self.unobtrusively(file_or_workbook, opts = { })
622
- book = new(file_or_workbook)
623
- book.unobtrusively(opts)
624
- end
625
- =end
626
-
627
- def unobtrusively(opts = { })
628
- opts = process_options(opts, :use_defaults => false)
629
- raise OptionInvalid, 'contradicting options' if opts[:writable] && opts[:read_only]
630
- opts = opts.merge({:force => {:excel => opts[:if_closed]}, :if_closed => :current,
631
- :if_unsaved => :accept, :keep_open => false})
632
- opts = opts.merge({:read_only => opts[:read_only]}) unless opts[:read_only].nil?
633
- file = stored_filename
634
- begin
635
- book = open(file, opts)
636
- was_visible = book.visible
637
- was_saved = book.saved
638
- was_writable = book.was_writable
639
- was_check_compatibility = book.CheckCompatibility
640
- was_calculation = book.excel.calculation
641
- if !was_saved && ((opts[:writable] && !was_writable) || (opts[:read_only] && was_writable))
642
- raise NotImplementedREOError, 'unsaved read-only workbook shall be written'
643
- end
644
- yield book
645
- ensure
646
- if book && book.alive?
647
- do_not_write = (opts[:read_only] || (opts[:read_only].nil? && opts[:writable] == false))
648
- book.save unless book.saved || do_not_write || book.ReadOnly
649
- # open and close if the read_only mode has changed
650
- if (opts[:read_only] && was_writable) || (!opts[:read_only] && !was_writable)
651
- book = open(file, :read_only => !was_writable, :if_unsaved => :forget)
652
- end
653
- if book.was_open
654
- book.visible = was_visible
655
- book.CheckCompatibility = was_check_compatibility
656
- book.excel.calculation = was_calculation
657
- end
658
- book.Saved = (was_saved || !book.was_open)
659
- book.close unless book.was_open || opts[:keep_open]
660
- end
661
- end
662
- end
663
-
664
-
665
628
  # reopens a closed workbook
666
629
  # @options options
667
630
  def reopen(options = { })
@@ -857,7 +820,7 @@ module RobustExcelOle
857
820
  last_sheet_local = last_sheet
858
821
  after_or_before, base_sheet = opts.to_a.first || [:after, last_sheet_local]
859
822
  begin
860
- if !JRUBY_BUG_COPYSHEETS
823
+ if !::JRUBY_BUG_COPYSHEETS
861
824
  if sheet
862
825
  sheet.Copy({ after_or_before.to_s => base_sheet.ole_worksheet })
863
826
  else
@@ -990,7 +953,7 @@ module RobustExcelOle
990
953
  end
991
954
 
992
955
  def calculation
993
- @excel.calculation if @ole_workbook
956
+ @excel.properties[:calculation] if @ole_workbook
994
957
  end
995
958
 
996
959
  # @private
@@ -1000,7 +963,7 @@ module RobustExcelOle
1000
963
 
1001
964
  # returns true, if the workbook is visible, false otherwise
1002
965
  def visible
1003
- @excel.visible && @ole_workbook.Windows(@ole_workbook.Name).Visible
966
+ @excel.Visible && @ole_workbook.Windows(@ole_workbook.Name).Visible
1004
967
  end
1005
968
 
1006
969
  # makes both the Excel instance and the window of the workbook visible, or the window invisible
@@ -1046,6 +1009,11 @@ module RobustExcelOle
1046
1009
  self.class.bookstore
1047
1010
  end
1048
1011
 
1012
+ # @private
1013
+ def workbook
1014
+ self
1015
+ end
1016
+
1049
1017
  # @private
1050
1018
  def to_s
1051
1019
  self.filename.to_s
@@ -1109,7 +1077,7 @@ module RobustExcelOle
1109
1077
  def method_missing(name, *args)
1110
1078
  if name.to_s[0,1] =~ /[A-Z]/
1111
1079
  raise ObjectNotAlive, 'method missing: workbook not alive' unless alive?
1112
- if JRUBY_BUG_ERRORMESSAGE
1080
+ if ::JRUBY_BUG_ERRORMESSAGE
1113
1081
  begin
1114
1082
  @ole_workbook.send(name, *args)
1115
1083
  rescue Java::OrgRacobCom::ComFailException
@@ -12,6 +12,7 @@ module RobustExcelOle
12
12
  class Worksheet < RangeOwners
13
13
 
14
14
  attr_reader :ole_worksheet
15
+ attr_reader :workbook
15
16
 
16
17
  def initialize(win32_worksheet)
17
18
  @ole_worksheet = win32_worksheet
@@ -27,12 +28,17 @@ module RobustExcelOle
27
28
  end
28
29
 
29
30
  def workbook
30
- ole_workbook = self.Parent
31
- saved_status = ole_workbook.Saved
32
- ole_workbook.Saved = true unless saved_status
33
- workbook = workbook_class.new(ole_workbook)
34
- ole_workbook.Saved = saved_status
35
- workbook
31
+ return @workbook unless @workbook.nil?
32
+ begin
33
+ ole_workbook = self.Parent
34
+ saved_status = ole_workbook.Saved
35
+ ole_workbook.Saved = true unless saved_status
36
+ @workbook = workbook_class.new(ole_workbook)
37
+ ole_workbook.Saved = saved_status
38
+ rescue
39
+ nil
40
+ end
41
+ @workbook
36
42
  end
37
43
 
38
44
  # sheet name
@@ -40,7 +46,7 @@ module RobustExcelOle
40
46
  def name
41
47
  @ole_worksheet.Name
42
48
  rescue
43
- raise WorksheetREOError, "name #{name.inspect} could not be determined"
49
+ raise WorksheetREOError, "name could not be determined"
44
50
  end
45
51
 
46
52
  # sets sheet name
@@ -206,8 +212,7 @@ module RobustExcelOle
206
212
 
207
213
  # @private
208
214
  def to_s
209
- '#<Worksheet: ' + name.to_s + ">"
210
- #'#<Worksheet: ' + ('not alive ' unless workbook.alive?).to_s + name.to_s + " #{File.basename(workbook.stored_filename)} >"
215
+ '#<Worksheet: ' + (workbook.nil? ? 'not alive ' : (name + ' ' + File.basename(workbook.stored_filename)).to_s) + ">"
211
216
  end
212
217
 
213
218
  # @private
@@ -220,7 +225,7 @@ module RobustExcelOle
220
225
  # @private
221
226
  def method_missing(name, *args)
222
227
  if name.to_s[0,1] =~ /[A-Z]/
223
- if JRUBY_BUG_ERRORMESSAGE
228
+ if ::JRUBY_BUG_ERRORMESSAGE
224
229
  begin
225
230
  @ole_worksheet.send(name, *args)
226
231
  rescue Java::OrgRacobCom::ComFailException
@@ -271,16 +271,16 @@ module RobustExcelOle
271
271
  ole_excel = WIN32OLE.new("Excel.Application")
272
272
  reo_excel = Excel.new(ole_excel)
273
273
  reo_excel.ole_excel.Hwnd.should == ole_excel.Hwnd
274
- reo_excel.visible.should == false
275
- reo_excel.displayalerts.should == :if_visible
274
+ reo_excel.Visible.should == false
275
+ reo_excel.properties[:displayalerts].should == :if_visible
276
276
  end
277
277
 
278
278
  it "lifts an Excel instance given as WIN32OLE object and set options" do
279
279
  app = WIN32OLE.new('Excel.Application')
280
280
  ole_excel = WIN32OLE.connect("Excel.Application")
281
281
  reo_excel = Excel.new(ole_excel, {:displayalerts => true, :visible => true})
282
- ole_excel.visible.should == true
283
- ole_excel.displayalerts.should == true
282
+ ole_excel.Visible.should == true
283
+ ole_excel.DisplayAlerts.should == true
284
284
  end
285
285
 
286
286
 
@@ -889,6 +889,8 @@ module RobustExcelOle
889
889
  # "Yes" is to the left of "No", which is the default. --> language independent
890
890
  @excel.should be_alive
891
891
  @key_sender.puts "{enter}"
892
+ @key_sender.puts "{enter}"
893
+ @key_sender.puts "{enter}"
892
894
  result = @excel.close(:if_unsaved => :alert)
893
895
  @excel.should_not be_alive
894
896
  result.should == 1
@@ -920,6 +922,7 @@ module RobustExcelOle
920
922
  @book.saved.should be false
921
923
  @key_sender.puts "{left}{enter}"
922
924
  @key_sender.puts "{left}{enter}"
925
+ @key_sender.puts "{left}{enter}"
923
926
  expect{
924
927
  @excel.close(:if_unsaved => :alert)
925
928
  }.to raise_error(ExcelREOError, "user canceled or runtime error")
@@ -1254,55 +1257,55 @@ module RobustExcelOle
1254
1257
  excel2 = Excel.create
1255
1258
  excel1.focus
1256
1259
  excel1.Visible.should be true
1257
- excel1.visible.should be true
1260
+ excel1.properties[:visible].should be true
1258
1261
  end
1259
1262
 
1260
1263
  it "should set default values" do
1261
1264
  excel1 = Excel.new
1262
1265
  excel1.Visible.should be false
1263
1266
  excel1.DisplayAlerts.should be false
1264
- excel1.visible.should be false
1265
- excel1.displayalerts.should == :if_visible
1267
+ excel1.properties[:visible].should be false
1268
+ excel1.properties[:displayalerts].should == :if_visible
1266
1269
  end
1267
1270
 
1268
1271
  it "should set visible true" do
1269
1272
  excel1 = Excel.new(:visible => true)
1270
1273
  excel1.Visible.should be true
1271
1274
  excel1.DisplayAlerts.should be true
1272
- excel1.visible.should be true
1273
- excel1.displayalerts.should == :if_visible
1275
+ excel1.properties[:visible].should be true
1276
+ excel1.properties[:displayalerts].should == :if_visible
1274
1277
  end
1275
1278
 
1276
1279
  it "should set visible false" do
1277
1280
  excel1 = Excel.new(:visible => false)
1278
1281
  excel1.Visible.should be false
1279
1282
  excel1.DisplayAlerts.should be false
1280
- excel1.visible.should be false
1281
- excel1.displayalerts.should == :if_visible
1283
+ excel1.properties[:visible].should be false
1284
+ excel1.properties[:displayalerts].should == :if_visible
1282
1285
  end
1283
1286
 
1284
1287
  it "should set displayalerts true" do
1285
1288
  excel1 = Excel.new(:displayalerts => true)
1286
1289
  excel1.Visible.should be false
1287
1290
  excel1.DisplayAlerts.should be true
1288
- excel1.visible.should be false
1289
- excel1.displayalerts.should be true
1291
+ excel1.properties[:visible].should be false
1292
+ excel1.properties[:displayalerts].should be true
1290
1293
  end
1291
1294
 
1292
1295
  it "should set displayalerts false" do
1293
1296
  excel1 = Excel.new(:displayalerts => false)
1294
1297
  excel1.Visible.should be false
1295
1298
  excel1.DisplayAlerts.should be false
1296
- excel1.visible.should be false
1297
- excel1.displayalerts.should be false
1299
+ excel1.properties[:visible].should be false
1300
+ excel1.properties[:displayalerts].should be false
1298
1301
  end
1299
1302
 
1300
1303
  it "should use values of the current Excel when reusing" do
1301
1304
  excel1 = Excel.create
1302
1305
  excel1.Visible.should be false
1303
1306
  excel1.DisplayAlerts.should be false
1304
- excel1.visible.should be false
1305
- excel1.displayalerts.should == :if_visible
1307
+ excel1.properties[:visible].should be false
1308
+ excel1.properties[:displayalerts].should == :if_visible
1306
1309
  excel1.Visible = true
1307
1310
  excel1.DisplayAlerts = true
1308
1311
  excel1.Visible.should be true
@@ -1316,49 +1319,49 @@ module RobustExcelOle
1316
1319
  excel1 = Excel.create
1317
1320
  excel2 = Excel.current
1318
1321
  excel2.Visible.should be false
1319
- excel2.visible.should be false
1322
+ excel2.properties[:visible].should be false
1320
1323
  excel2.DisplayAlerts.should be false
1321
- excel2.displayalerts.should == :if_visible
1324
+ excel2.properties[:displayalerts].should == :if_visible
1322
1325
  end
1323
1326
 
1324
1327
  it "should take Visible and DisplayAlerts from the connected Excel" do
1325
1328
  excel1 = Excel.create
1326
1329
  excel2 = Excel.current(:visible => true)
1327
1330
  excel2.Visible.should be true
1328
- excel2.visible.should be true
1331
+ excel2.properties[:visible].should be true
1329
1332
  excel2.DisplayAlerts.should be true
1330
- excel2.displayalerts.should == :if_visible
1333
+ excel2.properties[:displayalerts].should == :if_visible
1331
1334
  end
1332
1335
 
1333
1336
  it "should set Excel visible and invisible with current" do
1334
1337
  excel1 = Excel.new(:reuse => false, :visible => true)
1335
1338
  excel1.Visible.should be true
1336
- excel1.visible.should be true
1339
+ excel1.properties[:visible].should be true
1337
1340
  excel1.DisplayAlerts.should be true
1338
- excel1.displayalerts.should == :if_visible
1341
+ excel1.properties[:displayalerts].should == :if_visible
1339
1342
  excel1.visible = false
1340
1343
  excel1.Visible.should be false
1341
- excel1.visible.should be false
1344
+ excel1.properties[:visible].should be false
1342
1345
  excel1.DisplayAlerts.should be false
1343
- excel1.displayalerts.should == :if_visible
1346
+ excel1.properties[:displayalerts].should == :if_visible
1344
1347
  excel2 = Excel.current(:visible => true)
1345
1348
  excel2.Visible.should be true
1346
- excel2.visible.should be true
1347
- excel2.displayalerts.should == :if_visible
1349
+ excel2.properties[:visible].should be true
1350
+ excel2.properties[:displayalerts].should == :if_visible
1348
1351
  excel2.DisplayAlerts.should be true
1349
1352
  end
1350
1353
 
1351
1354
  it "should set Excel visible and invisible" do
1352
1355
  excel = Excel.new(:reuse => false, :visible => true)
1353
1356
  excel.Visible.should be true
1354
- excel.visible.should be true
1357
+ excel.properties[:visible].should be true
1355
1358
  excel.DisplayAlerts.should be true
1356
- excel.displayalerts.should == :if_visible
1359
+ excel.properties[:displayalerts].should == :if_visible
1357
1360
  excel.visible = false
1358
1361
  excel.Visible.should be false
1359
- excel.visible.should be false
1362
+ excel.properties[:visible].should be false
1360
1363
  excel.DisplayAlerts.should be false
1361
- excel.displayalerts.should == :if_visible
1364
+ excel.properties[:displayalerts].should == :if_visible
1362
1365
  excel7 = Excel.current
1363
1366
  excel7.should === excel
1364
1367
  excel7.Visible.should be false
@@ -1366,117 +1369,117 @@ module RobustExcelOle
1366
1369
  excel1 = Excel.create(:visible => true)
1367
1370
  excel1.should_not == excel
1368
1371
  excel1.Visible.should be true
1369
- excel1.visible.should be true
1372
+ excel1.properties[:visible].should be true
1370
1373
  excel1.DisplayAlerts.should be true
1371
- excel1.displayalerts.should == :if_visible
1374
+ excel1.properties[:displayalerts].should == :if_visible
1372
1375
  excel2 = Excel.create(:visible => false)
1373
1376
  excel2.Visible.should be false
1374
- excel2.visible.should be false
1377
+ excel2.properties[:visible].should be false
1375
1378
  excel2.DisplayAlerts.should be false
1376
- excel2.displayalerts.should == :if_visible
1379
+ excel2.properties[:displayalerts].should == :if_visible
1377
1380
  excel3 = Excel.current
1378
1381
  excel3.should === excel
1379
1382
  excel3.Visible.should be false
1380
- excel3.visible.should be false
1383
+ excel3.properties[:visible].should be false
1381
1384
  excel3.DisplayAlerts.should be false
1382
- excel3.displayalerts.should == :if_visible
1385
+ excel3.properties[:displayalerts].should == :if_visible
1383
1386
  excel4 = Excel.current(:visible => true)
1384
1387
  excel4.should === excel
1385
1388
  excel4.Visible.should be true
1386
- excel4.visible.should be true
1389
+ excel4.properties[:visible].should be true
1387
1390
  excel4.DisplayAlerts.should be true
1388
- excel4.displayalerts.should == :if_visible
1391
+ excel4.properties[:displayalerts].should == :if_visible
1389
1392
  excel5 = Excel.current(:visible => false)
1390
1393
  excel5.should === excel
1391
1394
  excel5.Visible.should be false
1392
- excel5.visible.should be false
1395
+ excel5.properties[:visible].should be false
1393
1396
  excel5.DisplayAlerts.should be false
1394
- excel5.displayalerts.should == :if_visible
1397
+ excel5.properties[:displayalerts].should == :if_visible
1395
1398
  end
1396
1399
 
1397
1400
  it "should enable or disable Excel DispayAlerts" do
1398
1401
  excel = Excel.new(:reuse => false, :displayalerts => true)
1399
1402
  excel.DisplayAlerts.should be true
1400
- excel.displayalerts.should be true
1403
+ excel.properties[:displayalerts].should be true
1401
1404
  excel.Visible.should be false
1402
- excel.visible.should be false
1405
+ excel.properties[:visible].should be false
1403
1406
  excel6 = Excel.current
1404
1407
  excel6.should === excel
1405
1408
  excel6.DisplayAlerts.should be true
1406
- excel6.displayalerts.should be true
1409
+ excel6.properties[:displayalerts].should be true
1407
1410
  excel6.Visible.should be false
1408
- excel6.visible.should be false
1411
+ excel6.properties[:visible].should be false
1409
1412
  excel.displayalerts = false
1410
1413
  excel.DisplayAlerts.should be false
1411
- excel.displayalerts.should be false
1414
+ excel.properties[:displayalerts].should be false
1412
1415
  excel.Visible.should be false
1413
- excel.visible.should be false
1416
+ excel.properties[:visible].should be false
1414
1417
  excel7 = Excel.current
1415
1418
  excel7.should === excel
1416
1419
  excel7.DisplayAlerts.should be false
1417
- excel7.displayalerts.should be false
1420
+ excel7.properties[:displayalerts].should be false
1418
1421
  excel7.Visible.should be false
1419
- excel7.visible.should be false
1422
+ excel7.properties[:visible].should be false
1420
1423
  excel1 = Excel.create(:displayalerts => true)
1421
1424
  excel1.should_not == excel
1422
1425
  excel1.DisplayAlerts.should be true
1423
- excel1.displayalerts.should be true
1426
+ excel1.properties[:displayalerts].should be true
1424
1427
  excel1.Visible.should be false
1425
- excel1.visible.should be false
1428
+ excel1.properties[:visible].should be false
1426
1429
  excel2 = Excel.create(:displayalerts => false)
1427
1430
  excel2.DisplayAlerts.should be false
1428
- excel2.displayalerts.should be false
1431
+ excel2.properties[:displayalerts].should be false
1429
1432
  excel2.Visible.should be false
1430
- excel2.visible.should be false
1433
+ excel2.properties[:visible].should be false
1431
1434
  excel3 = Excel.current
1432
1435
  excel3.should === excel
1433
1436
  excel3.DisplayAlerts.should be false
1434
- excel3.displayalerts.should be false
1437
+ excel3.properties[:displayalerts].should be false
1435
1438
  excel3.Visible.should be false
1436
- excel3.visible.should be false
1439
+ excel3.properties[:visible].should be false
1437
1440
  excel4 = Excel.current(:displayalerts => true)
1438
1441
  excel4.should === excel
1439
1442
  excel4.DisplayAlerts.should be true
1440
- excel4.displayalerts.should be true
1443
+ excel4.properties[:displayalerts].should be true
1441
1444
  excel4.Visible.should be false
1442
- excel4.visible.should be false
1445
+ excel4.properties[:visible].should be false
1443
1446
  excel5 = Excel.current(:displayalerts => false)
1444
1447
  excel5.should === excel
1445
1448
  excel5.DisplayAlerts.should be false
1446
- excel5.displayalerts.should be false
1449
+ excel5.properties[:displayalerts].should be false
1447
1450
  excel5.Visible.should be false
1448
- excel5.visible.should be false
1451
+ excel5.properties[:visible].should be false
1449
1452
  end
1450
1453
 
1451
1454
  it "should set Excel visible and displayalerts" do
1452
1455
  excel = Excel.new(:reuse => false, :visible => true, :displayalerts => true)
1453
1456
  excel.DisplayAlerts.should be true
1454
- excel.displayalerts.should be true
1457
+ excel.properties[:displayalerts].should be true
1455
1458
  excel.Visible.should be true
1456
- excel.visible.should be true
1459
+ excel.properties[:visible].should be true
1457
1460
  excel6 = Excel.current
1458
1461
  excel6.should === excel
1459
1462
  excel6.DisplayAlerts.should be true
1460
- excel6.displayalerts.should be true
1463
+ excel6.properties[:displayalerts].should be true
1461
1464
  excel6.Visible.should be true
1462
- excel6.visible.should be true
1465
+ excel6.properties[:visible].should be true
1463
1466
  excel.displayalerts = false
1464
1467
  excel.DisplayAlerts.should be false
1465
- excel.displayalerts.should be false
1468
+ excel.properties[:displayalerts].should be false
1466
1469
  excel.Visible.should be true
1467
- excel.visible.should be true
1470
+ excel.properties[:visible].should be true
1468
1471
  excel7 = Excel.current
1469
1472
  excel7.should === excel
1470
1473
  excel7.DisplayAlerts.should be false
1471
- excel7.displayalerts.should be false
1474
+ excel7.properties[:displayalerts].should be false
1472
1475
  excel7.Visible.should be true
1473
- excel7.visible.should be true
1476
+ excel7.properties[:visible].should be true
1474
1477
  excel2 = Excel.new(:reuse => false, :visible => true, :displayalerts => true)
1475
1478
  excel2.visible = false
1476
1479
  excel2.DisplayAlerts.should be true
1477
- excel2.displayalerts.should be true
1480
+ excel2.properties[:displayalerts].should be true
1478
1481
  excel2.Visible.should be false
1479
- excel2.visible.should be false
1482
+ excel2.properties[:visible].should be false
1480
1483
  excel3 = Excel.new(:reuse => false, :visible => true, :displayalerts => false)
1481
1484
  excel3.Visible.should be true
1482
1485
  excel3.DisplayAlerts.should be false
@@ -1488,21 +1491,21 @@ module RobustExcelOle
1488
1491
  excel3.DisplayAlerts.should be false
1489
1492
  excel4 = Excel.create(:visible => true, :displayalerts => true)
1490
1493
  excel4.DisplayAlerts.should be true
1491
- excel4.displayalerts.should be true
1494
+ excel4.properties[:displayalerts].should be true
1492
1495
  excel4.Visible.should be true
1493
- excel4.visible.should be true
1496
+ excel4.properties[:visible].should be true
1494
1497
  excel5 = Excel.current(:visible => true, :displayalerts => false)
1495
1498
  excel5.should === excel
1496
1499
  excel5.DisplayAlerts.should be false
1497
- excel5.displayalerts.should be false
1500
+ excel5.properties[:displayalerts].should be false
1498
1501
  excel5.Visible.should be true
1499
- excel5.visible.should be true
1502
+ excel5.properties[:visible].should be true
1500
1503
  excel6 = Excel.current(:visible => false, :displayalerts => true)
1501
1504
  excel6.should === excel
1502
1505
  excel6.DisplayAlerts.should be true
1503
- excel6.displayalerts.should be true
1506
+ excel6.properties[:displayalerts].should be true
1504
1507
  excel6.Visible.should be false
1505
- excel6.visible.should be false
1508
+ excel6.properties[:visible].should be false
1506
1509
  end
1507
1510
 
1508
1511
  it "should work with displayalerts == if_visible" do
@@ -1623,17 +1626,17 @@ module RobustExcelOle
1623
1626
 
1624
1627
  it "should create and reuse Excel with calculation mode" do
1625
1628
  excel1 = Excel.create(:calculation => :manual)
1626
- excel1.calculation.should == :manual
1629
+ excel1.properties[:calculation].should == :manual
1627
1630
  excel2 = Excel.create(:calculation => :automatic)
1628
- excel2.calculation.should == :automatic
1631
+ excel2.properties[:calculation].should == :automatic
1629
1632
  excel3 = Excel.current
1630
- excel3.calculation.should == :manual
1633
+ excel3.properties[:calculation].should == :manual
1631
1634
  excel4 = Excel.current(:calculation => :automatic)
1632
- excel4.calculation.should == :automatic
1635
+ excel4.properties[:calculation].should == :automatic
1633
1636
  excel5 = Excel.new(:reuse => false)
1634
- excel5.calculation.should == nil
1637
+ excel5.properties[:calculation].should == nil
1635
1638
  excel6 = Excel.new(:reuse => false, :calculation => :manual)
1636
- excel6.calculation.should == :manual
1639
+ excel6.properties[:calculation].should == :manual
1637
1640
  end
1638
1641
 
1639
1642
  =begin
@@ -1657,11 +1660,11 @@ module RobustExcelOle
1657
1660
  old_calculation_mode = @excel1.Calculation
1658
1661
  old_calculatebeforesave = @excel1.CalculateBeforeSave
1659
1662
  @excel1.calculation = :automatic
1660
- @excel1.calculation.should == :automatic
1663
+ @excel1.properties[:calculation].should == :automatic
1661
1664
  @excel1.Calculation.should == old_calculation_mode
1662
1665
  @excel1.CalculateBeforeSave.should == old_calculatebeforesave
1663
1666
  @excel1.calculation = :manual
1664
- @excel1.calculation.should == :manual
1667
+ @excel1.properties[:calculation].should == :manual
1665
1668
  @excel1.Calculation.should == old_calculation_mode
1666
1669
  @excel1.CalculateBeforeSave.should == old_calculatebeforesave
1667
1670
  end
@@ -1673,7 +1676,7 @@ module RobustExcelOle
1673
1676
  book1 = Workbook.open(@simple_file1, :visible => false)
1674
1677
  expect( book1.Windows(1).Visible ).to be true # false
1675
1678
  expect { excel1.calculation = :manual
1676
- }.to change{ excel1.calculation
1679
+ }.to change{ excel1.properties[:calculation]
1677
1680
  }.from( :automatic
1678
1681
  ).to( :manual )
1679
1682
  end
@@ -1683,7 +1686,7 @@ module RobustExcelOle
1683
1686
  book1 = Workbook.open(@simple_file1, :visible => false)
1684
1687
  expect( book1.Windows(1).Visible ).to be true # false
1685
1688
  expect { excel1.calculation = :automatic
1686
- }.to change{ excel1.calculation
1689
+ }.to change{ excel1.properties[:calculation]
1687
1690
  }.from( :manual
1688
1691
  ).to( :automatic )
1689
1692
  end
@@ -1694,7 +1697,7 @@ module RobustExcelOle
1694
1697
  book = Workbook.open(@simple_file, :visible => true)
1695
1698
  old_calculation_mode = @excel1.Calculation
1696
1699
  @excel1.with_calculation(:manual) do
1697
- @excel1.calculation.should == :manual
1700
+ @excel1.properties[:calculation].should == :manual
1698
1701
  @excel1.Calculation.should == XlCalculationManual
1699
1702
  @excel1.CalculateBeforeSave.should be false
1700
1703
  book.Saved.should be true
@@ -1702,7 +1705,7 @@ module RobustExcelOle
1702
1705
  @excel1.Calculation.should == old_calculation_mode
1703
1706
  @excel1.CalculateBeforeSave.should be false
1704
1707
  @excel1.with_calculation(:automatic) do
1705
- @excel1.calculation.should == :automatic
1708
+ @excel1.properties[:calculation].should == :automatic
1706
1709
  @excel1.Calculation.should == XlCalculationAutomatic
1707
1710
  @excel1.CalculateBeforeSave.should be false
1708
1711
  book.Saved.should be false
@@ -1717,7 +1720,7 @@ module RobustExcelOle
1717
1720
  book.Saved.should be true
1718
1721
  book.Windows(book.Name).Visible = true
1719
1722
  @excel1.calculation = :manual
1720
- @excel1.calculation.should == :manual
1723
+ @excel1.properties[:calculation].should == :manual
1721
1724
  @excel1.Calculation.should == XlCalculationManual
1722
1725
  @excel1.CalculateBeforeSave.should be false
1723
1726
  book.Saved.should be true
@@ -1728,7 +1731,7 @@ module RobustExcelOle
1728
1731
  book = Workbook.open(@simple_file, :visible => true)
1729
1732
  book.Saved.should be true
1730
1733
  @excel1.calculation = :automatic
1731
- @excel1.calculation.should == :automatic
1734
+ @excel1.properties[:calculation].should == :automatic
1732
1735
  @excel1.Calculation.should == XlCalculationAutomatic
1733
1736
  @excel1.CalculateBeforeSave.should be false
1734
1737
  book.Saved.should be true
@@ -1741,7 +1744,7 @@ module RobustExcelOle
1741
1744
  book.Saved.should be false
1742
1745
  book.Windows(book.Name).Visible = true
1743
1746
  @excel1.calculation = :manual
1744
- @excel1.calculation.should == :manual
1747
+ @excel1.properties[:calculation].should == :manual
1745
1748
  @excel1.Calculation.should == XlCalculationManual
1746
1749
  @excel1.CalculateBeforeSave.should be false
1747
1750
  book.Saved.should be false
@@ -1753,7 +1756,7 @@ module RobustExcelOle
1753
1756
  book.sheet(1)[1,1] = "foo"
1754
1757
  book.Saved.should be false
1755
1758
  @excel1.calculation = :automatic
1756
- @excel1.calculation.should == :automatic
1759
+ @excel1.properties[:calculation].should == :automatic
1757
1760
  @excel1.Calculation.should == XlCalculationAutomatic
1758
1761
  @excel1.CalculateBeforeSave.should be false
1759
1762
  book.Saved.should be false
@@ -1770,7 +1773,7 @@ module RobustExcelOle
1770
1773
  @excel1 = Excel.new
1771
1774
  b = Workbook.open(@simple_file, :visible => true)
1772
1775
  @excel1.Calculation = XlCalculationManual
1773
- @excel1.calculation.should == :manual
1776
+ @excel1.properties[:calculation].should == :manual
1774
1777
  @excel1.Calculation.should == XlCalculationManual
1775
1778
  end
1776
1779
 
@@ -1778,7 +1781,7 @@ module RobustExcelOle
1778
1781
  @excel1 = Excel.new
1779
1782
  b = Workbook.open(@simple_file, :visible => true)
1780
1783
  @excel1.Calculation = XlCalculationAutomatic
1781
- @excel1.calculation.should == :automatic
1784
+ @excel1.properties[:calculation].should == :automatic
1782
1785
  @excel1.Calculation.should == XlCalculationAutomatic
1783
1786
  end
1784
1787
 
@@ -2096,7 +2099,6 @@ module RobustExcelOle
2096
2099
  end
2097
2100
 
2098
2101
  end
2099
-
2100
2102
 
2101
2103
  describe "namevalue_glob, set_namevalue_glob" do
2102
2104