robust_excel_ole 0.6 → 0.6.1
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.
- data/Changelog +12 -0
- data/README.rdoc +5 -3
- data/README_detail.rdoc +1 -1
- data/examples/edit_sheets/example_adding_sheets.rb +1 -1
- data/examples/edit_sheets/example_expanding.rb +1 -1
- data/examples/open_save_close/example_control_to_excel.rb +2 -2
- data/examples/open_save_close/example_if_obstructed_closeifsaved.rb +1 -1
- data/examples/open_save_close/example_if_obstructed_forget.rb +1 -1
- data/examples/open_save_close/example_if_unsaved_accept.rb +2 -2
- data/examples/open_save_close/example_read_only.rb +1 -1
- data/examples/open_save_close/example_simple.rb +1 -1
- data/lib/robust_excel_ole/book.rb +89 -111
- data/lib/robust_excel_ole/excel.rb +49 -50
- data/lib/robust_excel_ole/general.rb +3 -3
- data/lib/robust_excel_ole/reo_common.rb +78 -1
- data/lib/robust_excel_ole/sheet.rb +16 -23
- data/lib/robust_excel_ole/version.rb +1 -1
- data/spec/book_spec.rb +7 -7
- data/spec/book_specs/book_close_spec.rb +24 -5
- data/spec/book_specs/book_misc_spec.rb +16 -7
- data/spec/book_specs/book_open_spec.rb +15 -20
- data/spec/book_specs/book_save_spec.rb +21 -21
- data/spec/book_specs/book_sheet_spec.rb +3 -3
- data/spec/book_specs/book_unobtr_spec.rb +1 -1
- data/spec/data/book_with_blank.xls +0 -0
- data/spec/data/different_workbook.xls +0 -0
- data/spec/data/refed_wb.xls +0 -0
- data/spec/data/reference_workbook.xls +0 -0
- data/spec/data/referencing_wb.xls +0 -0
- data/spec/data/workbook.xls +0 -0
- data/spec/excel_spec.rb +87 -125
- data/spec/general_spec.rb +2 -2
- data/spec/reo_common_spec.rb +1 -1
- data/spec/sheet_spec.rb +13 -17
- metadata +7 -3
@@ -141,8 +141,7 @@ module RobustExcelOle
|
|
141
141
|
else
|
142
142
|
file = file_or_workbook
|
143
143
|
ensure_excel(options)
|
144
|
-
ensure_workbook(file, options)
|
145
|
-
@ole_workbook.CheckCompatibility = options[:check_compatibility]
|
144
|
+
ensure_workbook(file, options)
|
146
145
|
@can_be_closed = false if @can_be_closed.nil?
|
147
146
|
end
|
148
147
|
bookstore.store(self)
|
@@ -172,15 +171,32 @@ module RobustExcelOle
|
|
172
171
|
begin
|
173
172
|
object.excel
|
174
173
|
rescue
|
175
|
-
raise
|
174
|
+
raise TypeErrorREO, "given object is neither an Excel, a Workbook, nor a Win32ole"
|
176
175
|
end
|
177
176
|
end
|
178
|
-
#rescue
|
179
|
-
# trace "no Excel, Book, or WIN32OLE object representing a Workbook or an Excel instance"
|
180
177
|
end
|
181
178
|
|
182
179
|
public
|
183
180
|
|
181
|
+
def self.open_in_current_excel(file, opts = { })
|
182
|
+
options = DEFAULT_OPEN_OPTS.merge(opts)
|
183
|
+
filename = General::absolute_path(file)
|
184
|
+
ole_workbook = WIN32OLE.connect(filename)
|
185
|
+
workbook = Book.new(ole_workbook)
|
186
|
+
workbook.visible = options[:visible] unless options[:visible].nil?
|
187
|
+
update_links_opt =
|
188
|
+
case options[:update_links]
|
189
|
+
when :alert; RobustExcelOle::XlUpdateLinksUserSetting
|
190
|
+
when :never; RobustExcelOle::XlUpdateLinksNever
|
191
|
+
when :always; RobustExcelOle::XlUpdateLinksAlways
|
192
|
+
else RobustExcelOle::XlUpdateLinksNever
|
193
|
+
end
|
194
|
+
workbook.UpdateLinks = update_links_opt
|
195
|
+
workbook.CheckCompatibility = options[:check_compatibility]
|
196
|
+
workbook
|
197
|
+
end
|
198
|
+
|
199
|
+
|
184
200
|
def ensure_excel(options) # :nodoc: #
|
185
201
|
return if @excel && @excel.alive?
|
186
202
|
options[:excel] = options[:force_excel] ? options[:force_excel] : options[:default_excel]
|
@@ -191,23 +207,23 @@ module RobustExcelOle
|
|
191
207
|
|
192
208
|
def ensure_workbook(file, options) # :nodoc: #
|
193
209
|
file = @stored_filename ? @stored_filename : file
|
194
|
-
raise(
|
210
|
+
raise(FileNameNotGiven, "filename is nil") if file.nil?
|
195
211
|
unless File.exist?(file)
|
196
212
|
if options[:if_absent] == :create
|
197
213
|
@ole_workbook = excel_class.current.generate_workbook(file)
|
198
214
|
else
|
199
|
-
raise
|
215
|
+
raise FileNotFound, "file #{file.inspect} not found"
|
200
216
|
end
|
201
217
|
end
|
202
218
|
@ole_workbook = @excel.Workbooks.Item(File.basename(file)) rescue nil
|
203
219
|
if @ole_workbook then
|
204
220
|
obstructed_by_other_book = (File.basename(file) == File.basename(@ole_workbook.Fullname)) &&
|
205
221
|
(not (General::absolute_path(file) == @ole_workbook.Fullname))
|
206
|
-
# if
|
222
|
+
# if workbook is obstructed by a workbook with same name and different path
|
207
223
|
if obstructed_by_other_book then
|
208
224
|
case options[:if_obstructed]
|
209
225
|
when :raise
|
210
|
-
raise
|
226
|
+
raise WorkbookBlocked, "blocked by a workbook with the same name in a different path: #{@ole_workbook.Fullname.tr('\\','/')}"
|
211
227
|
when :forget
|
212
228
|
@ole_workbook.Close
|
213
229
|
@ole_workbook = nil
|
@@ -219,7 +235,7 @@ module RobustExcelOle
|
|
219
235
|
open_or_create_workbook(file, options)
|
220
236
|
when :close_if_saved
|
221
237
|
if (not @ole_workbook.Saved) then
|
222
|
-
raise
|
238
|
+
raise WorkbookBlocked, "workbook with the same name in a different path is unsaved: #{@ole_workbook.Fullname.tr('\\','/')}"
|
223
239
|
else
|
224
240
|
@ole_workbook.Close
|
225
241
|
@ole_workbook = nil
|
@@ -231,14 +247,14 @@ module RobustExcelOle
|
|
231
247
|
@excel = excel_class.new(excel_options)
|
232
248
|
open_or_create_workbook(file, options)
|
233
249
|
else
|
234
|
-
raise
|
250
|
+
raise OptionInvalid, ":if_obstructed: invalid option: #{options[:if_obstructed].inspect}"
|
235
251
|
end
|
236
252
|
else
|
237
253
|
# book open, not obstructed by an other book, but not saved and writable
|
238
254
|
if (not @ole_workbook.Saved) then
|
239
255
|
case options[:if_unsaved]
|
240
256
|
when :raise
|
241
|
-
raise
|
257
|
+
raise WorkbookNotSaved, "workbook is already open but not saved: #{File.basename(file).inspect}"
|
242
258
|
when :forget
|
243
259
|
@ole_workbook.Close
|
244
260
|
@ole_workbook = nil
|
@@ -246,16 +262,14 @@ module RobustExcelOle
|
|
246
262
|
when :accept
|
247
263
|
# do nothing
|
248
264
|
when :alert, :excel
|
249
|
-
@excel.with_displayalerts
|
250
|
-
open_or_create_workbook(file,options)
|
251
|
-
end
|
265
|
+
@excel.with_displayalerts(true) { open_or_create_workbook(file,options) }
|
252
266
|
when :new_excel
|
253
267
|
excel_options = {:visible => false}.merge(options)
|
254
268
|
excel_options[:reuse] = false
|
255
269
|
@excel = excel_class.new(excel_options)
|
256
270
|
open_or_create_workbook(file, options)
|
257
271
|
else
|
258
|
-
raise
|
272
|
+
raise OptionInvalid, ":if_unsaved: invalid option: #{options[:if_unsaved].inspect}"
|
259
273
|
end
|
260
274
|
end
|
261
275
|
end
|
@@ -276,19 +290,21 @@ module RobustExcelOle
|
|
276
290
|
rescue RuntimeError => msg
|
277
291
|
trace "RuntimeError: #{msg.message}"
|
278
292
|
if msg.message =~ /method missing: Excel not alive/
|
279
|
-
raise
|
293
|
+
raise ExcelDamaged, "Excel instance not alive or damaged"
|
280
294
|
else
|
281
|
-
raise
|
295
|
+
raise UnexpectedError, "unknown RuntimeError"
|
282
296
|
end
|
283
297
|
rescue WeakRef::RefError => msg
|
284
|
-
|
285
|
-
raise ExcelErrorOpen, "#{msg.message}"
|
298
|
+
raise ExcelWeakRef, "#{msg.message}"
|
286
299
|
end
|
287
300
|
# workaround for linked workbooks for Excel 2007:
|
288
301
|
# opening and closing a dummy workbook if Excel has no workbooks.
|
289
302
|
# delay: with visible: 0.2 sec, without visible almost none
|
290
303
|
count = workbooks.Count
|
291
|
-
|
304
|
+
if @excel.Version == "12.0" && count == 0
|
305
|
+
workbooks.Add
|
306
|
+
#@excel.set_calculation(:automatic)
|
307
|
+
end
|
292
308
|
update_links_opt =
|
293
309
|
case options[:update_links]
|
294
310
|
when :alert; RobustExcelOle::XlUpdateLinksUserSetting
|
@@ -296,27 +312,29 @@ module RobustExcelOle
|
|
296
312
|
when :always; RobustExcelOle::XlUpdateLinksAlways
|
297
313
|
else RobustExcelOle::XlUpdateLinksNever
|
298
314
|
end
|
315
|
+
# probably bug in Excel: setting UpadateLinks seems to be dependent on calculation mode:
|
316
|
+
# update happens, if calcultion mode is automatic, does not, if calculation mode is manual
|
317
|
+
# parameter 'UpdateLinks' has no effect
|
299
318
|
@excel.with_displayalerts(update_links_opt == :alert ? true : @excel.displayalerts) do
|
300
|
-
# ??? determining update_links_opt here does not work, it is always XlUpdateLinksNever afterwords
|
301
319
|
workbooks.Open(filename, { 'ReadOnly' => options[:read_only] , 'UpdateLinks' => update_links_opt } )
|
302
320
|
end
|
303
|
-
workbooks.Open(filename, { 'ReadOnly' => options[:read_only] } )
|
304
321
|
workbooks.Item(1).Close if @excel.Version == "12.0" && count == 0
|
305
322
|
rescue WIN32OLERuntimeError => msg
|
306
|
-
trace "WIN32OLERuntimeError: #{msg.message}"
|
323
|
+
# trace "WIN32OLERuntimeError: #{msg.message}"
|
307
324
|
if msg.message =~ /800A03EC/
|
308
|
-
raise
|
325
|
+
raise WorkbookError, "open: user canceled or open error"
|
309
326
|
else
|
310
|
-
raise
|
327
|
+
raise UnexpectedError, "unknown WIN32OLERuntimeError"
|
311
328
|
end
|
312
329
|
end
|
313
330
|
begin
|
314
331
|
# workaround for bug in Excel 2010: workbook.Open does not always return the workbook with given file name
|
315
332
|
@ole_workbook = workbooks.Item(File.basename(filename))
|
316
333
|
self.visible = options[:visible] unless options[:visible].nil?
|
317
|
-
|
334
|
+
#@ole_workbook.UpdateLinks = update_links_opt
|
335
|
+
@ole_workbook.CheckCompatibility = options[:check_compatibility]
|
318
336
|
rescue WIN32OLERuntimeError
|
319
|
-
raise
|
337
|
+
raise FileNotFound, "cannot find the file #{File.basename(filename).inspect}"
|
320
338
|
end
|
321
339
|
end
|
322
340
|
end
|
@@ -333,32 +351,30 @@ module RobustExcelOle
|
|
333
351
|
# :forget -> closes the workbook
|
334
352
|
# :keep_open -> keep the workbook open
|
335
353
|
# :alert or :excel -> gives control to excel
|
336
|
-
# @raise
|
337
|
-
# @raise
|
354
|
+
# @raise WorkbookNotSaved if the option :if_unsaved is :raise and the workbook is unsaved
|
355
|
+
# @raise OptionInvalid if the options is invalid
|
338
356
|
def close(opts = {:if_unsaved => :raise})
|
339
357
|
if (alive? && (not @ole_workbook.Saved) && writable) then
|
340
358
|
case opts[:if_unsaved]
|
341
359
|
when :raise
|
342
|
-
raise
|
360
|
+
raise WorkbookNotSaved, "workbook is unsaved: #{File.basename(self.stored_filename).inspect}"
|
343
361
|
when :save
|
344
362
|
save
|
345
363
|
close_workbook
|
346
364
|
when :forget
|
347
|
-
close_workbook
|
365
|
+
@excel.with_displayalerts(false) { close_workbook }
|
348
366
|
when :keep_open
|
349
367
|
# nothing
|
350
368
|
when :alert, :excel
|
351
|
-
@excel.with_displayalerts
|
352
|
-
close_workbook
|
353
|
-
end
|
369
|
+
@excel.with_displayalerts(true) { close_workbook }
|
354
370
|
else
|
355
|
-
raise
|
371
|
+
raise OptionInvalid, ":if_unsaved: invalid option: #{opts[:if_unsaved].inspect}"
|
356
372
|
end
|
357
373
|
else
|
358
374
|
close_workbook
|
359
375
|
end
|
360
|
-
|
361
|
-
|
376
|
+
trace "close: canceled by user" if alive? &&
|
377
|
+
(opts[:if_unsaved] == :alert || opts[:if_unsaved] == :excel) && (not @ole_workbook.Saved)
|
362
378
|
end
|
363
379
|
|
364
380
|
private
|
@@ -474,18 +490,17 @@ module RobustExcelOle
|
|
474
490
|
end
|
475
491
|
|
476
492
|
# simple save of a workbook.
|
477
|
-
# @raise ExcelErrorSave if workbook is not alive or opened for read-only, or another error occurs
|
478
493
|
# @return [Boolean] true, if successfully saved, nil otherwise
|
479
494
|
def save
|
480
|
-
raise
|
481
|
-
raise
|
495
|
+
raise ObjectNotAlive, "workbook is not alive" if (not alive?)
|
496
|
+
raise WorkbookReadOnly, "Not opened for writing (opened with :read_only option)" if @ole_workbook.ReadOnly
|
482
497
|
begin
|
483
498
|
@ole_workbook.Save
|
484
499
|
rescue WIN32OLERuntimeError => msg
|
485
500
|
if msg.message =~ /SaveAs/ and msg.message =~ /Workbook/ then
|
486
|
-
raise
|
501
|
+
raise WorkbookNotSaved, "workbook not saved"
|
487
502
|
else
|
488
|
-
raise
|
503
|
+
raise UnexpectedError, "unknown WIN32OELERuntimeError:\n#{msg.message}"
|
489
504
|
end
|
490
505
|
end
|
491
506
|
true
|
@@ -507,14 +522,11 @@ module RobustExcelOle
|
|
507
522
|
# :save -> saves the blocking workbook and closes it
|
508
523
|
# :close_if_saved -> closes the blocking workbook, if it is saved,
|
509
524
|
# otherwise raises an exception
|
510
|
-
# @raise ExcelErrorSave if workbook is not alive, opened in read-only mode, invalid options,
|
511
|
-
# the file already exists (with option :if_exists :raise),
|
512
|
-
# the workbook is blocked by another one (with option :if_obstructed :raise)
|
513
525
|
# @return [Book], the book itself, if successfully saved, raises an exception otherwise
|
514
526
|
def save_as(file, opts = { } )
|
515
|
-
raise
|
516
|
-
raise
|
517
|
-
raise
|
527
|
+
raise FileNameNotGiven, "filename is nil" if file.nil?
|
528
|
+
raise ObjectNotAlive, "workbook is not alive" if (not alive?)
|
529
|
+
raise WorkbookReadOnly, "Not opened for writing (opened with :read_only option)" if @ole_workbook.ReadOnly
|
518
530
|
options = {
|
519
531
|
:if_exists => :raise,
|
520
532
|
:if_obstructed => :raise,
|
@@ -529,7 +541,7 @@ module RobustExcelOle
|
|
529
541
|
begin
|
530
542
|
File.delete(file)
|
531
543
|
rescue Errno::EACCES
|
532
|
-
raise
|
544
|
+
raise WorkbookBeingUsed, "workbook is open and used in Excel"
|
533
545
|
end
|
534
546
|
end
|
535
547
|
when :alert, :excel
|
@@ -538,9 +550,9 @@ module RobustExcelOle
|
|
538
550
|
end
|
539
551
|
return self
|
540
552
|
when :raise
|
541
|
-
raise
|
553
|
+
raise FileAlreadyExists, "file already exists: #{File.basename(file).inspect}"
|
542
554
|
else
|
543
|
-
raise
|
555
|
+
raise OptionInvalid, ":if_exists: invalid option: #{options[:if_exists].inspect}"
|
544
556
|
end
|
545
557
|
end
|
546
558
|
blocking_workbook =
|
@@ -552,15 +564,15 @@ module RobustExcelOle
|
|
552
564
|
if blocking_workbook then
|
553
565
|
case options[:if_obstructed]
|
554
566
|
when :raise
|
555
|
-
raise
|
567
|
+
raise WorkbookBlocked, "blocked by another workbook: #{blocking_workbook.Fullname.tr('\\','/')}"
|
556
568
|
when :forget
|
557
569
|
# nothing
|
558
570
|
when :save
|
559
571
|
blocking_workbook.Save
|
560
572
|
when :close_if_saved
|
561
|
-
raise
|
573
|
+
raise WorkbookBlocked, "blocking workbook is unsaved: #{File.basename(file).inspect}" unless blocking_workbook.Saved
|
562
574
|
else
|
563
|
-
raise
|
575
|
+
raise OptionInvalid, ":if_obstructed: invalid option: #{options[:if_obstructed].inspect}"
|
564
576
|
end
|
565
577
|
blocking_workbook.Close
|
566
578
|
end
|
@@ -583,14 +595,10 @@ module RobustExcelOle
|
|
583
595
|
bookstore.store(self)
|
584
596
|
rescue WIN32OLERuntimeError => msg
|
585
597
|
if msg.message =~ /SaveAs/ and msg.message =~ /Workbook/ then
|
586
|
-
if options[:if_exists] == :alert || options[:if_exists] == :excel
|
587
|
-
|
588
|
-
else
|
589
|
-
return nil
|
590
|
-
end
|
591
|
-
# another possible semantics. raise ExcelErrorSaveFailed, "could not save Workbook"
|
598
|
+
trace "save: canceled by user" if options[:if_exists] == :alert || options[:if_exists] == :excel
|
599
|
+
# another possible semantics. raise WorkbookError, "could not save Workbook"
|
592
600
|
else
|
593
|
-
raise
|
601
|
+
raise UnexpectedError, "unknown WIN32OELERuntimeError:\n#{msg.message}"
|
594
602
|
end
|
595
603
|
end
|
596
604
|
end
|
@@ -604,8 +612,8 @@ module RobustExcelOle
|
|
604
612
|
begin
|
605
613
|
sheet_class.new(@ole_workbook.Worksheets.Item(name))
|
606
614
|
rescue WIN32OLERuntimeError => msg
|
607
|
-
raise
|
608
|
-
trace "#{msg.message}"
|
615
|
+
raise NameNotFound, "could not return a sheet with name #{name.inspect}"
|
616
|
+
# trace "#{msg.message}"
|
609
617
|
end
|
610
618
|
end
|
611
619
|
|
@@ -622,7 +630,7 @@ module RobustExcelOle
|
|
622
630
|
# @option opts [Symbol] :as new name of the copied sheet
|
623
631
|
# @option opts [Symbol] :before a sheet before which the sheet shall be inserted
|
624
632
|
# @option opts [Symbol] :after a sheet after which the sheet shall be inserted
|
625
|
-
# @raise
|
633
|
+
# @raise NameAlreadyExists if the sheet name already exists
|
626
634
|
# @return [Sheet] the copied sheet
|
627
635
|
def copy_sheet(sheet, opts = { })
|
628
636
|
new_sheet_name = opts.delete(:as)
|
@@ -632,7 +640,7 @@ module RobustExcelOle
|
|
632
640
|
begin
|
633
641
|
new_sheet.name = new_sheet_name if new_sheet_name
|
634
642
|
rescue WIN32OLERuntimeError => msg
|
635
|
-
msg.message =~ /800A03EC/ ? raise(
|
643
|
+
msg.message =~ /800A03EC/ ? raise(NameAlreadyExists, "sheet name already exists") : raise(UnexpectedError)
|
636
644
|
end
|
637
645
|
new_sheet
|
638
646
|
end
|
@@ -643,7 +651,7 @@ module RobustExcelOle
|
|
643
651
|
# @option opts [Symbol] :as new name of the copied added sheet
|
644
652
|
# @option opts [Symbol] :before a sheet before which the sheet shall be inserted
|
645
653
|
# @option opts [Symbol] :after a sheet after which the sheet shall be inserted
|
646
|
-
# @raise
|
654
|
+
# @raise NameAlreadyExists if the sheet name already exists
|
647
655
|
# @return [Sheet] the added sheet
|
648
656
|
def add_empty_sheet(opts = { })
|
649
657
|
new_sheet_name = opts.delete(:as)
|
@@ -653,7 +661,7 @@ module RobustExcelOle
|
|
653
661
|
begin
|
654
662
|
new_sheet.name = new_sheet_name if new_sheet_name
|
655
663
|
rescue WIN32OLERuntimeError => msg
|
656
|
-
msg.message =~ /800A03EC/ ? raise(
|
664
|
+
msg.message =~ /800A03EC/ ? raise(NameAlreadyExists, "sheet name already exists") : raise(UnexpectedError)
|
657
665
|
end
|
658
666
|
new_sheet
|
659
667
|
end
|
@@ -665,7 +673,6 @@ module RobustExcelOle
|
|
665
673
|
# @option opts [Symbol] :as new name of the copied or added sheet
|
666
674
|
# @option opts [Symbol] :before a sheet before which the sheet shall be inserted
|
667
675
|
# @option opts [Symbol] :after a sheet after which the sheet shall be inserted
|
668
|
-
# @raise ExcelErrorSheet if the sheet name already exists
|
669
676
|
# @return [Sheet] the copied or added sheet
|
670
677
|
def add_or_copy_sheet(sheet = nil, opts = { })
|
671
678
|
if sheet.is_a? Hash
|
@@ -710,16 +717,14 @@ module RobustExcelOle
|
|
710
717
|
# @param [String] name the name of the range
|
711
718
|
# @param [Hash] opts the options
|
712
719
|
# @option opts [Symbol] :default the default value that is provided if no contents could be returned
|
713
|
-
# @raise ExcelError if range name is not in the workbook or if range value could not be evaluated
|
714
720
|
# @return [Variant] the contents of a range with given name
|
715
|
-
|
716
721
|
def nameval(name, opts = {:default => nil})
|
717
722
|
default_val = opts[:default]
|
718
723
|
begin
|
719
724
|
name_obj = self.Names.Item(name)
|
720
725
|
rescue WIN32OLERuntimeError
|
721
726
|
return default_val if default_val
|
722
|
-
raise
|
727
|
+
raise NameNotFound, "name #{name.inspect} not in #{File.basename(self.stored_filename).inspect}"
|
723
728
|
end
|
724
729
|
begin
|
725
730
|
value = name_obj.RefersToRange.Value
|
@@ -728,12 +733,12 @@ module RobustExcelOle
|
|
728
733
|
value = self.sheet(1).Evaluate(name_obj.Name)
|
729
734
|
rescue WIN32OLERuntimeError
|
730
735
|
return default_val if default_val
|
731
|
-
raise
|
736
|
+
raise RangeNotEvaluatable, "cannot evaluate range named #{name.inspect} in #{File.basename(self.stored_filename).inspect}"
|
732
737
|
end
|
733
738
|
end
|
734
739
|
if value == RobustExcelOle::XlErrName # -2146826259
|
735
740
|
return default_val if default_val
|
736
|
-
raise
|
741
|
+
raise RangeNotEvaluatable, "cannot evaluate range named #{name.inspect} in #{File.basename(self.stored_filename).inspect}"
|
737
742
|
end
|
738
743
|
return default_val if default_val && value.nil?
|
739
744
|
value
|
@@ -742,46 +747,44 @@ module RobustExcelOle
|
|
742
747
|
# sets the contents of a range
|
743
748
|
# @param [String] name the name of a range
|
744
749
|
# @param [Variant] value the contents of the range
|
745
|
-
# @raise ExcelError if range name is not in the workbook or if value could not be assigned to range
|
746
750
|
def set_nameval(name, value)
|
747
751
|
begin
|
748
752
|
name_obj = self.Names.Item(name)
|
749
753
|
rescue WIN32OLERuntimeError
|
750
|
-
raise
|
754
|
+
raise NameNotFound, "name #{name.inspect} not in #{File.basename(self.stored_filename).inspect}"
|
751
755
|
end
|
752
756
|
begin
|
753
757
|
name_obj.RefersToRange.Value = value
|
754
758
|
rescue WIN32OLERuntimeError
|
755
|
-
raise
|
759
|
+
raise RangeNotEvaluatable, "cannot assign value to range named #{name.inspect} in #{File.basename(self.stored_filename).inspect}"
|
756
760
|
end
|
757
761
|
end
|
758
762
|
|
759
763
|
# renames a range
|
760
764
|
# @param [String] name the previous range name
|
761
765
|
# @param [String] new_name the new range name
|
762
|
-
# @raise ExcelError if name is not in the file, or if new_name cannot be set
|
763
766
|
def rename_range(name, new_name)
|
764
767
|
begin
|
765
768
|
item = self.Names.Item(name)
|
766
769
|
rescue WIN32OLERuntimeError
|
767
|
-
raise
|
770
|
+
raise NameNotFound, "name #{name.inspect} not in #{File.basename(self.stored_filename).inspect}"
|
768
771
|
end
|
769
772
|
begin
|
770
773
|
item.Name = new_name
|
771
774
|
rescue WIN32OLERuntimeError
|
772
|
-
raise
|
775
|
+
raise UnexpectedError, "name error in #{File.basename(self.stored_filename).inspect}"
|
773
776
|
end
|
774
777
|
end
|
775
778
|
|
776
779
|
# brings workbook to foreground, makes it available for heyboard inputs, makes the Excel instance visible
|
777
|
-
# @raise ExcelError if workbook cannot be activated
|
778
780
|
def activate
|
779
781
|
@excel.visible = true
|
780
782
|
begin
|
781
|
-
Win32API.new("user32","SetForegroundWindow","I","I").call
|
783
|
+
Win32API.new("user32","SetForegroundWindow","I","I").call # Excel 2010
|
784
|
+
SetForegroundWindow.call(@excel.Hwnd)
|
782
785
|
@ole_workbook.Activate # Excel 2007
|
783
|
-
rescue WIN32OLERuntimeError
|
784
|
-
raise
|
786
|
+
rescue WIN32OLERuntimeError => msg
|
787
|
+
raise UnexpectedError, "cannot activate: #{message.msg}"
|
785
788
|
end
|
786
789
|
end
|
787
790
|
|
@@ -796,7 +799,7 @@ module RobustExcelOle
|
|
796
799
|
saved = @ole_workbook.Saved
|
797
800
|
@excel.visible = true if visible_value
|
798
801
|
@ole_workbook.Windows(@ole_workbook.Name).Visible = visible_value if @excel.Visible
|
799
|
-
|
802
|
+
@ole_workbook.Saved = saved
|
800
803
|
end
|
801
804
|
|
802
805
|
# returns true, if the workbook reacts to methods, false otherwise
|
@@ -893,7 +896,7 @@ module RobustExcelOle
|
|
893
896
|
def method_missing(name, *args) # :nodoc: #
|
894
897
|
if name.to_s[0,1] =~ /[A-Z]/
|
895
898
|
begin
|
896
|
-
raise
|
899
|
+
raise ObjectNotAlive, "method missing: workbook not alive" unless alive?
|
897
900
|
@ole_workbook.send(name, *args)
|
898
901
|
rescue WIN32OLERuntimeError => msg
|
899
902
|
if msg.message =~ /unknown property or method/
|
@@ -912,31 +915,6 @@ public
|
|
912
915
|
|
913
916
|
Workbook = Book
|
914
917
|
|
915
|
-
class ExcelError < RuntimeError # :nodoc: #
|
916
|
-
end
|
917
918
|
|
918
|
-
class ExcelErrorOpen < ExcelError # :nodoc: #
|
919
|
-
end
|
920
|
-
|
921
|
-
class ExcelErrorClose < ExcelError # :nodoc: #
|
922
|
-
end
|
923
|
-
|
924
|
-
class ExcelErrorSave < ExcelError # :nodoc: #
|
925
|
-
end
|
926
|
-
|
927
|
-
class ExcelErrorSaveFailed < ExcelErrorSave # :nodoc: #
|
928
|
-
end
|
929
|
-
|
930
|
-
class ExcelErrorSaveUnknown < ExcelErrorSave # :nodoc: #
|
931
|
-
end
|
932
|
-
|
933
|
-
class ExcelUserCanceled < RuntimeError # :nodoc: #
|
934
|
-
end
|
935
|
-
|
936
|
-
class ExcelErrorSheet < ExcelError # :nodoc: #
|
937
|
-
end
|
938
|
-
|
939
|
-
class ExcelErrorSheetUnknown < ExcelErrorSheet # :nodoc: #
|
940
|
-
end
|
941
919
|
|
942
920
|
end
|