robust_excel_ole 1.1.3 → 1.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Changelog +9 -1
- data/README.rdoc +122 -169
- data/README_detail.rdoc +10 -4
- data/README_development.rdoc +5 -0
- data/README_excel.rdoc +145 -0
- data/README_open.rdoc +202 -0
- data/README_ranges.rdoc +134 -0
- data/README_save_close.rdoc +77 -0
- data/README_sheet.rdoc +71 -0
- data/examples/open_save_close/example_control_to_excel.rb +2 -2
- data/lib/robust_excel_ole/book.rb +80 -44
- data/lib/robust_excel_ole/excel.rb +30 -7
- data/lib/robust_excel_ole/general.rb +1 -1
- data/lib/robust_excel_ole/reo_common.rb +65 -49
- data/lib/robust_excel_ole/sheet.rb +2 -6
- data/lib/robust_excel_ole/version.rb +1 -1
- data/spec/book_spec.rb +5 -5
- data/spec/book_specs/book_misc_spec.rb +69 -1
- data/spec/book_specs/book_open_spec.rb +11 -17
- data/spec/book_specs/book_unobtr_spec.rb +1 -1
- data/spec/data/another_workbook.xls +0 -0
- data/spec/data/workbook.xls +0 -0
- data/spec/excel_spec.rb +51 -53
- data/spec/general_spec.rb +2 -2
- data/spec/reo_common_spec.rb +1 -1
- data/spec/sheet_spec.rb +14 -0
- metadata +8 -2
@@ -0,0 +1,77 @@
|
|
1
|
+
= RobustExcelOle
|
2
|
+
|
3
|
+
== Saving and closing workbooks
|
4
|
+
|
5
|
+
=== Saving a workbook.
|
6
|
+
|
7
|
+
Imagine, you have opened a workbook with
|
8
|
+
|
9
|
+
book = Workbook.open('workbook.xls', :visible => true)
|
10
|
+
|
11
|
+
and have modified it.
|
12
|
+
|
13
|
+
You can save the workbook by
|
14
|
+
|
15
|
+
book.save
|
16
|
+
|
17
|
+
If you want to save a workbook with a file name, then use
|
18
|
+
|
19
|
+
book.save_as('new_workbook.xls')
|
20
|
+
|
21
|
+
The options and respective valid values are the following:
|
22
|
+
|
23
|
+
+:if_exists+:: +:raise+ (default), +:overwrite+, +:alert+
|
24
|
+
+:if_obstruced+:: +:raise (default), +:forget+, +:save+, +close_if_saved
|
25
|
+
|
26
|
+
The option +:if_exists+ :
|
27
|
+
|
28
|
+
If a workbook with the file name already exists, then
|
29
|
+
|
30
|
+
+:raise+:: Raise an exeption. Don't write the file.
|
31
|
+
+:overwrite+:: Delete the existing file and write the file. If the workbook is open in an Excel instance, then raise an exception.
|
32
|
+
+:alert+:: Give the control to Excel.
|
33
|
+
|
34
|
+
For example, you want to save a workbook and overwrite the file if it exists before, then use
|
35
|
+
|
36
|
+
book.save_as('another_workbook.xls', :if_exists => :overwrite)
|
37
|
+
|
38
|
+
If a workbook blocks the workbook that should be saved, then the former one can be saved and closed before.
|
39
|
+
|
40
|
+
book = Workbook.open('workbook.xls')
|
41
|
+
book2 = Workbook.open('another_workbook.xls')
|
42
|
+
book2.save_as('dir/workbook.xls', :if_exists => :overwrite, :if_obstructed => :save)
|
43
|
+
|
44
|
+
=== Closing a workbook.
|
45
|
+
|
46
|
+
You can close the workbook with the command
|
47
|
+
|
48
|
+
book.close
|
49
|
+
|
50
|
+
There is one option: +:if_unsaved+ . It can have one of the following values:
|
51
|
+
|
52
|
+
+:raise+ (default), +:save+, +:forget+, +:alert+
|
53
|
+
|
54
|
+
The option specifies: If the workbook is unsaved, then
|
55
|
+
|
56
|
+
+:save+:: Save the workbook before closing it.
|
57
|
+
+:raise+:: Raise an exception. Don't close the workbook.
|
58
|
+
+:forget+:: Close the workbook.
|
59
|
+
+:alert+:: Give control to Excel.
|
60
|
+
|
61
|
+
=== Opening, saving and closing a workbook under a certain name
|
62
|
+
|
63
|
+
You can open a workbook with given file name.
|
64
|
+
|
65
|
+
book = Workbook.open('workbook.xls')
|
66
|
+
|
67
|
+
You can save a workbook with given file name, if it is open.
|
68
|
+
|
69
|
+
Workbook.save_as('workbook.xls')
|
70
|
+
|
71
|
+
The workbook can be saved under a new file name, if it is open.
|
72
|
+
|
73
|
+
Workbook.save_as('workbook.xls', 'new_workbook.xls')
|
74
|
+
|
75
|
+
Finally the workbook can be closed with a given filename.
|
76
|
+
|
77
|
+
Workbook.close('workbook.xls')
|
data/README_sheet.rdoc
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
= RobustExcelOle
|
2
|
+
|
3
|
+
== Accessing and processing worksheets
|
4
|
+
|
5
|
+
Worksheets are represented by Sheet objects.
|
6
|
+
|
7
|
+
Assume you have opened a workbook
|
8
|
+
|
9
|
+
book = Workbook.open('workbook.xls', :visible => true)
|
10
|
+
|
11
|
+
=== Accessing a worksheet.
|
12
|
+
|
13
|
+
You can access a worksheet by giving the number
|
14
|
+
|
15
|
+
sheet = book.sheet(1)
|
16
|
+
|
17
|
+
or its name
|
18
|
+
|
19
|
+
sheet = book.sheet('Sheet1')
|
20
|
+
|
21
|
+
You can get the first and last worksheet with
|
22
|
+
|
23
|
+
sheet = book.first_sheet
|
24
|
+
|
25
|
+
and
|
26
|
+
|
27
|
+
sheet = book.last_sheet
|
28
|
+
|
29
|
+
You can access all sheet objects by using the methods Workbook#each.
|
30
|
+
|
31
|
+
book.each do |sheet|
|
32
|
+
# do something with sheet
|
33
|
+
end
|
34
|
+
|
35
|
+
=== Reading and changing the worksheet name
|
36
|
+
|
37
|
+
You can read and change the worksheet name.
|
38
|
+
|
39
|
+
sheet1.name
|
40
|
+
# => "Sheet1"
|
41
|
+
|
42
|
+
sheet1.name = "new_sheet"
|
43
|
+
|
44
|
+
=== Adding and copying a worksheet.
|
45
|
+
|
46
|
+
You can add (append) an empty worksheet using
|
47
|
+
|
48
|
+
book.add_empty_sheet
|
49
|
+
|
50
|
+
Additionally you can name it.
|
51
|
+
|
52
|
+
book.add_empty_sheet(:as => 'sheet_name')
|
53
|
+
|
54
|
+
You can specify the position of the added empty worksheet.
|
55
|
+
|
56
|
+
book.add_empty_sheet(:as => 'new_name', :before => another_sheet)
|
57
|
+
|
58
|
+
You can copy a worksheet and add it.
|
59
|
+
|
60
|
+
book.copy_sheet sheet
|
61
|
+
|
62
|
+
Additionally you can specify a name and a position.
|
63
|
+
|
64
|
+
book.copy_sheet(sheet, :as => 'new_name', :after => another_sheet)
|
65
|
+
|
66
|
+
If you want to copy a worksheet, if a sheet is given, and add an empty worksheet, if no worksheet is given, then use
|
67
|
+
|
68
|
+
book.add_or_copy_sheet
|
69
|
+
|
70
|
+
book.add_or_copy_sheet(sheet, :as => 'new_name', :after => another_sheet)
|
71
|
+
|
@@ -26,13 +26,13 @@ begin
|
|
26
26
|
Excel.current.visible = true
|
27
27
|
begin
|
28
28
|
book.close(:if_unsaved => :alert) # close the unsaved book.
|
29
|
-
rescue
|
29
|
+
rescue WorkbookREOError => msg # user is asked whether the unsaved book shall be saved
|
30
30
|
puts "#{msg.message}" # if the user chooses to cancel, then an expeption is raised
|
31
31
|
end
|
32
32
|
if new_book then
|
33
33
|
begin
|
34
34
|
new_book.save_as(file_name, :if_exists => :alert) # save the new book, if it was opened
|
35
|
-
rescue
|
35
|
+
rescue WorkbookREOError => msg # user is asked, whether the existing file shall be overwritten
|
36
36
|
puts "save_as: #{msg.message}" # if the user chooses "no" or "cancel", an exception is raised
|
37
37
|
end
|
38
38
|
|
@@ -25,13 +25,8 @@ module RobustExcelOle
|
|
25
25
|
:check_compatibility => false,
|
26
26
|
:update_links => :never
|
27
27
|
}
|
28
|
-
|
29
|
-
|
30
|
-
[[:default,:excel],[:default_excel]],[[:force,:excel],[:force_excel]],
|
31
|
-
[[:default,:excel],[:default,:e]], [[:force,:excel],[:force,:e]],
|
32
|
-
[[:default,:visible],[:default,:v]], [[:force,:visible],[:force,:v]],
|
33
|
-
[[:force,:visible],[:visible]], [[:force,:visible],[:v]]
|
34
|
-
]
|
28
|
+
|
29
|
+
ABBREVIATIONS = [[:default,:d], [:force, :f], [:excel, :e], [:visible, :v]]
|
35
30
|
|
36
31
|
class << self
|
37
32
|
|
@@ -95,11 +90,14 @@ module RobustExcelOle
|
|
95
90
|
(not (book.alive? && (not book.saved) && (not options[:if_unsaved] == :accept))))
|
96
91
|
book.options = options
|
97
92
|
book.ensure_excel(options) # unless book.excel.alive?
|
98
|
-
# if the
|
99
|
-
book.close if (book.alive? &&
|
93
|
+
# if the ReadOnly status shall be changed, then save, close and reopen it
|
94
|
+
book.close(:if_unsaved => :save) if (book.alive? &&
|
95
|
+
(((not book.writable) and (not options[:read_only])) or
|
96
|
+
(book.writable and options[:read_only])))
|
100
97
|
# reopens the book
|
101
98
|
book.ensure_workbook(file,options) unless book.alive?
|
102
99
|
book.visible = options[:force][:visible] unless options[:force][:visible].nil?
|
100
|
+
book.CheckCompatibility = options[:check_compatibility] unless options[:check_compatibility].nil?
|
103
101
|
book.excel.calculation = options[:calculation] unless options[:calculation].nil?
|
104
102
|
return book
|
105
103
|
end
|
@@ -139,8 +137,9 @@ module RobustExcelOle
|
|
139
137
|
# @param [Hash] opts the options
|
140
138
|
# @option opts [Symbol] see above
|
141
139
|
# @return [Book] a workbook
|
142
|
-
def initialize(file_or_workbook, opts={ }, &block)
|
143
|
-
|
140
|
+
#def initialize(file_or_workbook, opts={ }, &block)
|
141
|
+
def initialize(file_or_workbook, options={ }, &block)
|
142
|
+
#options = self.class.process_options(opts)
|
144
143
|
if file_or_workbook.is_a? WIN32OLE
|
145
144
|
workbook = file_or_workbook
|
146
145
|
@ole_workbook = workbook
|
@@ -169,29 +168,41 @@ module RobustExcelOle
|
|
169
168
|
|
170
169
|
private
|
171
170
|
|
172
|
-
#
|
173
|
-
def self.process_options(options
|
171
|
+
# translates abbreviations and synonyms and merges with default options
|
172
|
+
def self.process_options(options, proc_opts = {:use_defaults => true})
|
174
173
|
translator = proc do |opts|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
174
|
+
erg = {}
|
175
|
+
opts.each do |key,value|
|
176
|
+
new_key = key
|
177
|
+
ABBREVIATIONS.each{|long,short| new_key = long if key == short}
|
178
|
+
if value.is_a?(Hash)
|
179
|
+
erg[new_key] = {}
|
180
|
+
value.each do |k,v|
|
181
|
+
new_k = k
|
182
|
+
ABBREVIATIONS.each{|long,short| new_k = long if k == short}
|
183
|
+
erg[new_key][new_k] = v
|
183
184
|
end
|
184
|
-
|
185
|
+
else
|
186
|
+
erg[new_key] = value
|
187
|
+
end
|
185
188
|
end
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
+
erg[:default] = {} if erg[:default].nil?
|
190
|
+
erg[:force] = {} if erg[:force].nil?
|
191
|
+
force_list = [:visible, :excel]
|
192
|
+
erg.each {|key,value| erg[:force][key] = value if force_list.include?(key)}
|
193
|
+
erg[:default][:excel] = erg[:default_excel] unless erg[:default_excel].nil?
|
194
|
+
erg[:force][:excel] = erg[:force_excel] unless erg[:force_excel].nil?
|
195
|
+
erg[:default][:excel] = :current if (erg[:default][:excel] == :reuse || erg[:default][:excel] == :active)
|
196
|
+
erg[:force][:excel] = :current if (erg[:force][:excel] == :reuse || erg[:force][:excel] == :active)
|
197
|
+
erg
|
189
198
|
end
|
190
|
-
|
191
|
-
|
192
|
-
|
199
|
+
opts = translator.call(options)
|
200
|
+
default_open_opts = proc_opts[:use_defaults] ? DEFAULT_OPEN_OPTS :
|
201
|
+
{:default => {:excel => :current}, :force => {}, :update_links => :never }
|
202
|
+
default_opts = translator.call(default_open_opts)
|
203
|
+
opts = default_opts.merge(opts)
|
193
204
|
opts[:default] = default_opts[:default].merge(opts[:default]) unless opts[:default].nil?
|
194
|
-
opts[:force] = default_opts[:force].merge(opts[:force]) unless opts[:force].nil?
|
205
|
+
opts[:force] = default_opts[:force].merge(opts[:force]) unless opts[:force].nil?
|
195
206
|
opts
|
196
207
|
end
|
197
208
|
|
@@ -210,7 +221,7 @@ module RobustExcelOle
|
|
210
221
|
begin
|
211
222
|
object.excel
|
212
223
|
rescue
|
213
|
-
raise
|
224
|
+
raise TypeREOError, "given object is neither an Excel, a Workbook, nor a Win32ole"
|
214
225
|
end
|
215
226
|
end
|
216
227
|
end
|
@@ -333,7 +344,7 @@ module RobustExcelOle
|
|
333
344
|
begin
|
334
345
|
workbooks = @excel.Workbooks
|
335
346
|
rescue WIN32OLERuntimeError => msg
|
336
|
-
raise
|
347
|
+
raise UnexpectedREOError, "WIN32OLERuntimeError: #{msg.message} #{msg.backtrace}"
|
337
348
|
end
|
338
349
|
begin
|
339
350
|
with_workaround_linked_workbooks_excel2007(options) do
|
@@ -343,14 +354,14 @@ module RobustExcelOle
|
|
343
354
|
rescue WIN32OLERuntimeError => msg
|
344
355
|
# for Excel2007: for option :if_unsaved => :alert and user cancels: this error appears?
|
345
356
|
# if yes: distinguish these events
|
346
|
-
raise
|
357
|
+
raise UnexpectedREOError, "WIN32OLERuntimeError: #{msg.message} #{msg.backtrace}"
|
347
358
|
end
|
348
359
|
begin
|
349
360
|
# workaround for bug in Excel 2010: workbook.Open does not always return the workbook when given file name
|
350
361
|
begin
|
351
362
|
@ole_workbook = workbooks.Item(File.basename(filename))
|
352
363
|
rescue WIN32OLERuntimeError => msg
|
353
|
-
raise
|
364
|
+
raise UnexpectedREOError, "WIN32OLERuntimeError: #{msg.message}"
|
354
365
|
end
|
355
366
|
if options[:force][:visible].nil? && (not options[:default][:visible].nil?)
|
356
367
|
if @excel.created
|
@@ -365,7 +376,7 @@ module RobustExcelOle
|
|
365
376
|
@excel.calculation = options[:calculation] unless options[:calculation].nil?
|
366
377
|
self.Saved = true # unless self.Saved # ToDo: this is too hard
|
367
378
|
rescue WIN32OLERuntimeError => msg
|
368
|
-
raise
|
379
|
+
raise UnexpectedREOError, "WIN32OLERuntimeError: #{msg.message} #{msg.backtrace}"
|
369
380
|
end
|
370
381
|
end
|
371
382
|
end
|
@@ -490,7 +501,6 @@ module RobustExcelOle
|
|
490
501
|
# @return [Book] a workbook
|
491
502
|
|
492
503
|
# state = [:open, :saved, :writable, :visible, :calculation, :check_compatibility]
|
493
|
-
|
494
504
|
def self.unobtrusively(file, opts = { }, &block)
|
495
505
|
options = {:if_closed => :current,
|
496
506
|
:read_only => false,
|
@@ -540,14 +550,15 @@ module RobustExcelOle
|
|
540
550
|
end
|
541
551
|
|
542
552
|
# reopens a closed workbook
|
543
|
-
|
544
|
-
|
553
|
+
# @options options
|
554
|
+
def reopen(options = { })
|
555
|
+
self.class.open(@stored_filename, options)
|
545
556
|
end
|
546
557
|
|
547
558
|
# simple save of a workbook.
|
548
|
-
# @option opts [Boolean] states, whether colored ranges shall be discolored
|
559
|
+
# @option opts [Boolean] :discoloring states, whether colored ranges shall be discolored
|
549
560
|
# @return [Boolean] true, if successfully saved, nil otherwise
|
550
|
-
def save(opts = {:discoloring => false})
|
561
|
+
def save(opts = {:discoloring => false})
|
551
562
|
raise ObjectNotAlive, "workbook is not alive" if (not alive?)
|
552
563
|
raise WorkbookReadOnly, "Not opened for writing (opened with :read_only option)" if @ole_workbook.ReadOnly
|
553
564
|
begin
|
@@ -558,7 +569,7 @@ module RobustExcelOle
|
|
558
569
|
if msg.message =~ /SaveAs/ and msg.message =~ /Workbook/ then
|
559
570
|
raise WorkbookNotSaved, "workbook not saved"
|
560
571
|
else
|
561
|
-
raise
|
572
|
+
raise UnexpectedREOError, "unknown WIN32OLERuntimeError:\n#{msg.message}"
|
562
573
|
end
|
563
574
|
end
|
564
575
|
true
|
@@ -580,7 +591,7 @@ module RobustExcelOle
|
|
580
591
|
# :save -> saves the blocking workbook and closes it
|
581
592
|
# :close_if_saved -> closes the blocking workbook, if it is saved,
|
582
593
|
# otherwise raises an exception
|
583
|
-
# :discoloring states,
|
594
|
+
# :discoloring states, whether colored ranges shall be discolored
|
584
595
|
# @return [Book], the book itself, if successfully saved, raises an exception otherwise
|
585
596
|
def save_as(file, opts = { } )
|
586
597
|
raise FileNameNotGiven, "filename is nil" if file.nil?
|
@@ -657,9 +668,9 @@ module RobustExcelOle
|
|
657
668
|
rescue WIN32OLERuntimeError => msg
|
658
669
|
if msg.message =~ /SaveAs/ and msg.message =~ /Workbook/ then
|
659
670
|
# trace "save: canceled by user" if options[:if_exists] == :alert || options[:if_exists] == :excel
|
660
|
-
# another possible semantics. raise
|
671
|
+
# another possible semantics. raise WorkbookREOError, "could not save Workbook"
|
661
672
|
else
|
662
|
-
raise
|
673
|
+
raise UnexpectedREOError, "unknown WIN32OELERuntimeError:\n#{msg.message}"
|
663
674
|
end
|
664
675
|
end
|
665
676
|
end
|
@@ -667,6 +678,7 @@ module RobustExcelOle
|
|
667
678
|
public
|
668
679
|
|
669
680
|
# closes a given file if it is open
|
681
|
+
# @options opts [Symbol] :if_unsaved
|
670
682
|
def self.close(file, opts = {:if_unsaved => :raise})
|
671
683
|
book = bookstore.fetch(file) rescue nil
|
672
684
|
book.close(opts) if book && book.alive?
|
@@ -799,10 +811,34 @@ module RobustExcelOle
|
|
799
811
|
begin
|
800
812
|
item.Name = new_name
|
801
813
|
rescue WIN32OLERuntimeError
|
802
|
-
raise
|
814
|
+
raise UnexpectedREOError, "name error in #{File.basename(self.stored_filename).inspect}"
|
803
815
|
end
|
804
816
|
end
|
805
817
|
|
818
|
+
# sets options
|
819
|
+
# @param [Hash] opts
|
820
|
+
def for_this_workbook(opts)
|
821
|
+
return unless alive?
|
822
|
+
opts = self.class.process_options(opts, :use_defaults => false)
|
823
|
+
visible_before = visible
|
824
|
+
check_compatibility_before = check_compatibility
|
825
|
+
unless opts[:read_only].nil?
|
826
|
+
# if the ReadOnly status shall be changed, then close and reopen it
|
827
|
+
if ((not writable) and (not opts[:read_only])) or (writable and opts[:read_only])
|
828
|
+
#opts[:check_compatibility] = opts[:check_compatibility].nil? ? check_compatibility :
|
829
|
+
# DEFAULT_OPEN_OPTS[:check_compatibility]
|
830
|
+
#opts[:check_compatibility] = opts[:check_compatibility].nil? ? check_compatibility :
|
831
|
+
# opts[:check_compatibility]
|
832
|
+
opts[:check_compatibility] = check_compatibility if opts[:check_compatibility].nil?
|
833
|
+
close(:if_unsaved => true)
|
834
|
+
open_or_create_workbook(@stored_filename, opts)
|
835
|
+
end
|
836
|
+
end
|
837
|
+
self.visible = opts[:force][:visible].nil? ? visible_before : opts[:force][:visible]
|
838
|
+
self.CheckCompatibility = opts[:check_compatibility].nil? ? check_compatibility_before : opts[:check_compatibility]
|
839
|
+
@excel.calculation = opts[:calculation] unless opts[:calculation].nil?
|
840
|
+
end
|
841
|
+
|
806
842
|
# brings workbook to foreground, makes it available for heyboard inputs, makes the Excel instance visible
|
807
843
|
def focus
|
808
844
|
self.visible = true
|
@@ -133,10 +133,6 @@ module RobustExcelOle
|
|
133
133
|
self
|
134
134
|
end
|
135
135
|
|
136
|
-
def set_options(options)
|
137
|
-
self.class.new(@ole_excel, options)
|
138
|
-
end
|
139
|
-
|
140
136
|
private
|
141
137
|
|
142
138
|
# returns a Win32OLE object that represents a Excel instance to which Excel connects
|
@@ -217,9 +213,9 @@ module RobustExcelOle
|
|
217
213
|
@ole_excel.Workbooks.Close
|
218
214
|
rescue WIN32OLERuntimeError => msg
|
219
215
|
if msg.message =~ /800A03EC/
|
220
|
-
raise
|
216
|
+
raise ExcelREOError, "user canceled or runtime error"
|
221
217
|
else
|
222
|
-
raise
|
218
|
+
raise UnexpectedREOError, "unknown WIN32OLERuntimeError: #{msg.message}"
|
223
219
|
end
|
224
220
|
end
|
225
221
|
weak_wkbks = nil
|
@@ -490,7 +486,7 @@ module RobustExcelOle
|
|
490
486
|
raise FileNotFound, "could not save workbook with filename #{file_name.inspect}"
|
491
487
|
else
|
492
488
|
# todo some time: find out when this occurs :
|
493
|
-
raise
|
489
|
+
raise UnexpectedREOError, "unknown WIN32OLERuntimeError with filename #{file_name.inspect}: \n#{msg.message}"
|
494
490
|
end
|
495
491
|
end
|
496
492
|
end
|
@@ -568,6 +564,32 @@ module RobustExcelOle
|
|
568
564
|
end
|
569
565
|
end
|
570
566
|
|
567
|
+
# set options in this Excel instance
|
568
|
+
def for_this_instance(options)
|
569
|
+
self.class.new(@ole_excel, options)
|
570
|
+
end
|
571
|
+
|
572
|
+
def set_options(options)
|
573
|
+
for_this_instance(options)
|
574
|
+
end
|
575
|
+
|
576
|
+
# set options in all workbooks
|
577
|
+
def for_all_workbooks(options)
|
578
|
+
ole_workbooks = begin
|
579
|
+
@ole_excel.Workbooks
|
580
|
+
rescue WIN32OLERuntimeError => msg
|
581
|
+
if msg.message =~ /failed to get Dispatch Interface/
|
582
|
+
raise ExcelDamaged, "Excel instance not alive or damaged"
|
583
|
+
else
|
584
|
+
raise ExcelREOError, "workbooks could not be determined"
|
585
|
+
end
|
586
|
+
end
|
587
|
+
ole_workbooks.each do |ole_workbook|
|
588
|
+
book_class.open(ole_workbook).for_this_workbook(options)
|
589
|
+
end
|
590
|
+
end
|
591
|
+
|
592
|
+
=begin
|
571
593
|
# make all workbooks visible or invisible
|
572
594
|
def workbooks_visible= visible_value
|
573
595
|
begin
|
@@ -580,6 +602,7 @@ module RobustExcelOle
|
|
580
602
|
raise ExcelDamaged, "Excel instance not alive or damaged" if msg.message =~ /failed to get Dispatch Interface/
|
581
603
|
end
|
582
604
|
end
|
605
|
+
=end
|
583
606
|
|
584
607
|
def focus
|
585
608
|
self.visible = true
|