robust_excel_ole 1.14 → 1.15

Sign up to get free protection for your applications and to get access to all the features.
@@ -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