robust_excel_ole 1.9 → 1.10
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Changelog +6 -0
- data/README.rdoc +14 -0
- data/docs/README_ranges.rdoc +8 -0
- data/docs/README_sheet.rdoc +3 -1
- data/examples/modifying_sheets/example_access_sheets_and_cells.rb +1 -1
- data/examples/modifying_sheets/example_adding_sheets.rb +2 -2
- data/examples/open_save_close/example_if_obstructed_closeifsaved.rb +1 -1
- data/jreo.bat +3 -0
- data/lib/jreo_console.rb +67 -0
- data/lib/robust_excel_ole.rb +5 -1
- data/lib/robust_excel_ole/address.rb +5 -1
- data/lib/robust_excel_ole/bookstore.rb +8 -0
- data/lib/robust_excel_ole/cell.rb +5 -5
- data/lib/robust_excel_ole/excel.rb +30 -11
- data/lib/robust_excel_ole/general.rb +0 -4
- data/lib/robust_excel_ole/range.rb +63 -15
- data/lib/robust_excel_ole/range_owners.rb +89 -39
- data/lib/robust_excel_ole/reo_common.rb +4 -0
- data/lib/robust_excel_ole/version.rb +1 -1
- data/lib/robust_excel_ole/workbook.rb +55 -41
- data/spec/bookstore_spec.rb +43 -1
- data/spec/data/another_workbook.xls +0 -0
- data/spec/data/different_workbook.xls +0 -0
- data/spec/data/more_data/workbook.xls +0 -0
- data/spec/data/workbook.xls +0 -0
- data/spec/excel_spec.rb +3 -2
- data/spec/helpers/key_sender.rb +1 -0
- data/spec/range_spec.rb +50 -29
- data/spec/reo_common_spec.rb +0 -1
- data/spec/workbook_spec.rb +6 -6
- data/spec/workbook_specs/workbook_open_spec.rb +15 -14
- data/spec/workbook_specs/workbook_sheet_spec.rb +10 -1
- data/spec/workbook_specs/workbook_unobtr_spec.rb +2 -2
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9645dff34f91fdb38da9b5a8375e17170bace4159355b126b142cb4ab6689bf
|
4
|
+
data.tar.gz: d0ca3dbd87bca685ecb98ba1ac747b427c430e52bfe3de5b14beccfefd30d94c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae0be8a8538c3dd3c27a44c3d11d781be260cb2898e1cf221925d0902160ef4104b9142fd99c106ee5f210aa83688fa062d4ee1a13c8ae49dcb96b150b3baaeb
|
7
|
+
data.tar.gz: c21be14de79476461692a475685e518f478947051ac9cc8d417952646690b642e8dc2e52999a16b56c2cb8e337ac58b21ae2a28dfffbd8f89260aeced27d216b
|
data/.gitignore
CHANGED
data/Changelog
CHANGED
data/README.rdoc
CHANGED
@@ -36,6 +36,12 @@ and go into the path of the gem 'robust_excel_ole'. There you start the console
|
|
36
36
|
|
37
37
|
reo
|
38
38
|
|
39
|
+
or
|
40
|
+
|
41
|
+
jreo
|
42
|
+
|
43
|
+
depending on whether you are using ruby or jruby.
|
44
|
+
|
39
45
|
The call of the console will include RobustExcelOle for you.
|
40
46
|
|
41
47
|
The following examples can be used for both scripts and console. If you have started the console in the gem path, you can just put these examples.
|
@@ -299,6 +305,14 @@ and set another value to that range.
|
|
299
305
|
|
300
306
|
For more details about reading and writing contents of cells and ranges see {README_ranges}[https://github.com/Thomas008/robust_excel_ole/blob/master/docs/README_ranges.rdoc]
|
301
307
|
|
308
|
+
=== Running in jruby
|
309
|
+
|
310
|
+
RobustExcelOle runs in jruby as well. You can call the console via the command +jreo+. However, note that, due to some restrictions of the library jruby-win32ole, there are some restrictions. So we had implemented some adaptions and workarounds. Some issues still remain when running under jruby:
|
311
|
+
|
312
|
+
1. Excel.current or Excel.new(:reuse => true) does not connect to an already running Excel instance, unless some workbook has been opened via RobustExcelOle. 2. Excel.kill_all does work, Excel.close_all does not work. 3. When providing an absolute path, you have to state the "/" ("C:/abc.xls" works, "C:abc" does not work)
|
313
|
+
|
314
|
+
|
315
|
+
|
302
316
|
=== More things
|
303
317
|
|
304
318
|
You can convert a win32ole object into a RobustExcelOle object.
|
data/docs/README_ranges.rdoc
CHANGED
@@ -57,6 +57,14 @@ or as flat array
|
|
57
57
|
range.values
|
58
58
|
=> ["foo", "workbook", "sheet1", nil, "foo", nil, "foobaaa", nil, "matz", "is", "nice", nil]
|
59
59
|
|
60
|
+
You can set values with help of range#Value or range#v, e.g.
|
61
|
+
|
62
|
+
range.Value = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
|
63
|
+
|
64
|
+
or
|
65
|
+
|
66
|
+
range.v = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
|
67
|
+
|
60
68
|
Now we copy the range. With help of VBA methods you would do
|
61
69
|
|
62
70
|
range.Copy(:destination => sheet.range([4..6,5..8]).ole_range)
|
data/docs/README_sheet.rdoc
CHANGED
@@ -67,12 +67,14 @@ Additionally you can specify a name and a position.
|
|
67
67
|
|
68
68
|
book.copy_sheet(sheet, :as => 'new_name', :after => another_sheet)
|
69
69
|
|
70
|
-
If you want to copy a worksheet, if a sheet is given, and add an empty worksheet, if no worksheet is given, then use
|
70
|
+
If you want to copy a worksheet, if a worksheet +sheet+ is given, and add an empty worksheet, if no worksheet is given, then use
|
71
71
|
|
72
72
|
book.add_or_copy_sheet
|
73
73
|
|
74
74
|
book.add_or_copy_sheet(sheet, :as => 'new_name', :after => another_sheet)
|
75
75
|
|
76
|
+
Note, that running in jruby, due to some restrictions of jruby, there is a workaround when adding or copy a worksheet at the end (appending): the last worksheet is being copied and deleted afterwards, in order to serve as a dummy worksheet. This may cause a different behaviour.
|
77
|
+
|
76
78
|
== Code
|
77
79
|
|
78
80
|
worksheet.rb[https://github.com/Thomas008/robust_excel_ole/blob/master/lib/robust_excel_ole/worksheet.rb]
|
@@ -7,7 +7,7 @@ require "fileutils"
|
|
7
7
|
|
8
8
|
include RobustExcelOle
|
9
9
|
|
10
|
-
Excel.
|
10
|
+
Excel.kill_all
|
11
11
|
begin
|
12
12
|
dir = create_tmpdir
|
13
13
|
simple_file = dir + 'workbook.xls'
|
@@ -63,7 +63,7 @@ begin
|
|
63
63
|
@book.close(:if_unsaved => :forget) # close the book without saving it
|
64
64
|
|
65
65
|
ensure
|
66
|
-
Excel.close_all
|
66
|
+
Excel.close_all(:if_unsaved => :forget)
|
67
67
|
rm_tmp(dir)
|
68
68
|
end
|
69
69
|
|
@@ -20,7 +20,7 @@ begin
|
|
20
20
|
sleep 1
|
21
21
|
begin
|
22
22
|
new_book = Workbook.open(other_file_name, :if_obstructed => :close_if_saved) # raises an exception since the file is not saved
|
23
|
-
|
23
|
+
rescue WorkbookBlocked => msg
|
24
24
|
puts "error: open: #{msg.message}"
|
25
25
|
end
|
26
26
|
book.save # save the unsaved book
|
data/jreo.bat
ADDED
data/lib/jreo_console.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# require '../robust_excel_ole/lib/robust_excel_ole'
|
2
|
+
include REO
|
3
|
+
# include RobustExcelOle
|
4
|
+
include General
|
5
|
+
|
6
|
+
require 'irb/completion'
|
7
|
+
require 'irb/ext/save-history'
|
8
|
+
gem 'jruby-readline'
|
9
|
+
|
10
|
+
ARGV.concat ['--readline',
|
11
|
+
'--prompt-mode',
|
12
|
+
'simple',
|
13
|
+
'-rjruby-readline']
|
14
|
+
|
15
|
+
#IRB.conf[:PROMPT_MODE] = :SIMPLE
|
16
|
+
#IRB.conf[:USE_READLINE] = true
|
17
|
+
#IRB.conf[:AUTO_INDENT] = true
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
# 250 entries in the list
|
23
|
+
IRB.conf[:SAVE_HISTORY] = 250
|
24
|
+
|
25
|
+
# Store results in home directory with specified file name
|
26
|
+
# IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb-history"
|
27
|
+
#IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb-save-history"
|
28
|
+
|
29
|
+
IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.reo-history"
|
30
|
+
|
31
|
+
# @private
|
32
|
+
module Readline
|
33
|
+
module Hist
|
34
|
+
LOG = IRB.conf[:HISTORY_FILE]
|
35
|
+
# LOG = "#{ENV['HOME']}/.irb-history"
|
36
|
+
|
37
|
+
def self.write_log(line)
|
38
|
+
File.open(LOG, 'ab') do |f|
|
39
|
+
f << "#{line}
|
40
|
+
"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.start_session_log
|
45
|
+
timestamp = proc { Time.now.strftime('%Y-%m-%d, %H:%M:%S') }
|
46
|
+
# @private
|
47
|
+
class <<timestamp
|
48
|
+
alias_method :to_s, :call
|
49
|
+
end
|
50
|
+
write_log("###### session start: #{timestamp}")
|
51
|
+
at_exit { write_log("###### session stop: #{timestamp}") }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
alias old_readline readline
|
56
|
+
def readline(*args)
|
57
|
+
ln = old_readline(*args)
|
58
|
+
begin
|
59
|
+
Hist.write_log(ln)
|
60
|
+
rescue StandardError
|
61
|
+
end
|
62
|
+
ln
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
Readline::Hist.start_session_log
|
67
|
+
puts 'JREO console started'
|
data/lib/robust_excel_ole.rb
CHANGED
@@ -1,4 +1,8 @@
|
|
1
|
-
|
1
|
+
if RUBY_PLATFORM =~ /java/
|
2
|
+
require 'jruby-win32ole'
|
3
|
+
else
|
4
|
+
require 'win32ole'
|
5
|
+
end
|
2
6
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/reo_common')
|
3
7
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/range_owners')
|
4
8
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/address')
|
@@ -4,12 +4,16 @@ module RobustExcelOle
|
|
4
4
|
|
5
5
|
class Address < REOCommon
|
6
6
|
|
7
|
+
# hack
|
8
|
+
#@@row_letter = "Z"
|
9
|
+
#@@col_letter = "S"
|
10
|
+
|
7
11
|
def self.new(r1c1_letters)
|
8
12
|
@@row_letter = r1c1_letters[0..0]
|
9
13
|
@@col_letter = r1c1_letters[1..1]
|
10
14
|
end
|
11
15
|
|
12
|
-
# address formats
|
16
|
+
# address formats that are valid:
|
13
17
|
# r1c1-format: e.g. "Z3S1", "Z3S1:Z5S2", "Z[3]S1", "Z3S[-1]:Z[5]S1", "Z[3]", "S[-2]"
|
14
18
|
# infinite ranges are not possible, e.g. "Z3:Z5", "S2:S5", "Z2", "S3", "Z[2]"
|
15
19
|
# int_range: e.g. [3,1], [3,"A"], [3..5,1..2], [3..5, "A".."B"],
|
@@ -8,6 +8,14 @@ module RobustExcelOle
|
|
8
8
|
@hidden_excel_instance = nil
|
9
9
|
end
|
10
10
|
|
11
|
+
# returns an excel
|
12
|
+
def excel
|
13
|
+
fn2books = @filename2books.first
|
14
|
+
return nil if fn2books.nil? || fn2books.empty? || fn2books[1].empty?
|
15
|
+
book = fn2books[1].first.__getobj__
|
16
|
+
book.excel
|
17
|
+
end
|
18
|
+
|
11
19
|
# returns a book with the given filename, if it was open once
|
12
20
|
# @param [String] filename the file name
|
13
21
|
# @param [Hash] options the options
|
@@ -5,17 +5,17 @@ module RobustExcelOle
|
|
5
5
|
attr_reader :cell
|
6
6
|
|
7
7
|
def initialize(win32_cell)
|
8
|
-
@cell =
|
9
|
-
win32_cell.MergeArea.Item(1,1)
|
10
|
-
else
|
11
|
-
win32_cell
|
12
|
-
end
|
8
|
+
@cell = win32_cell.MergeCells ? win32_cell.MergeArea.Item(1,1) : win32_cell
|
13
9
|
end
|
14
10
|
|
15
11
|
def v
|
16
12
|
self.Value
|
17
13
|
end
|
18
14
|
|
15
|
+
def v=(value)
|
16
|
+
self.Value = value
|
17
|
+
end
|
18
|
+
|
19
19
|
# @private
|
20
20
|
def method_missing(name, *args)
|
21
21
|
#if name.to_s[0,1] =~ /[A-Z]/
|
@@ -75,7 +75,15 @@ module RobustExcelOle
|
|
75
75
|
end
|
76
76
|
ole_xl = win32ole_excel unless win32ole_excel.nil?
|
77
77
|
options = { :reuse => true }.merge(options)
|
78
|
-
ole_xl = current_excel if options[:reuse] == true
|
78
|
+
#ole_xl = current_excel if options[:reuse] == true
|
79
|
+
if options[:reuse] == true
|
80
|
+
ole_xl = if RUBY_PLATFORM =~ /java/
|
81
|
+
excel_instance = known_excel_instance
|
82
|
+
ole_xl = excel_instance.ole_excel unless excel_instance.nil?
|
83
|
+
else
|
84
|
+
current_excel
|
85
|
+
end
|
86
|
+
end
|
79
87
|
ole_xl ||= WIN32OLE.new('Excel.Application')
|
80
88
|
hwnd = ole_xl.HWnd
|
81
89
|
stored = hwnd2excel(hwnd)
|
@@ -102,7 +110,7 @@ module RobustExcelOle
|
|
102
110
|
end
|
103
111
|
end
|
104
112
|
result
|
105
|
-
end
|
113
|
+
end
|
106
114
|
|
107
115
|
def initialize(options = {}); end
|
108
116
|
|
@@ -141,12 +149,14 @@ module RobustExcelOle
|
|
141
149
|
# connects to the first opened Excel instance
|
142
150
|
# if this Excel instance is being closed, then Excel creates a new Excel instance
|
143
151
|
# @private
|
144
|
-
def self.current_excel
|
145
|
-
result =
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
152
|
+
def self.current_excel
|
153
|
+
result = if result.nil?
|
154
|
+
begin
|
155
|
+
WIN32OLE.connect('Excel.Application')
|
156
|
+
rescue
|
157
|
+
nil
|
158
|
+
end
|
159
|
+
end
|
150
160
|
if result
|
151
161
|
begin
|
152
162
|
result.Visible # send any method, just to see if it responds
|
@@ -413,7 +423,18 @@ module RobustExcelOle
|
|
413
423
|
processes.select { |p| p.name == 'EXCEL.EXE' }.size
|
414
424
|
end
|
415
425
|
|
416
|
-
# returns
|
426
|
+
# returns an Excel instance
|
427
|
+
def self.known_excel_instance
|
428
|
+
@@hwnd2excel.each do |hwnd, wr_excel|
|
429
|
+
if wr_excel.weakref_alive?
|
430
|
+
excel = wr_excel.__getobj__
|
431
|
+
return excel if excel.alive?
|
432
|
+
end
|
433
|
+
end
|
434
|
+
nil
|
435
|
+
end
|
436
|
+
|
437
|
+
# returns all Excel objects for all Excel instances opened with RobustExcelOle
|
417
438
|
def self.known_excel_instances
|
418
439
|
pid2excel = {}
|
419
440
|
@@hwnd2excel.each do |hwnd,wr_excel|
|
@@ -427,8 +448,6 @@ module RobustExcelOle
|
|
427
448
|
pid2excel[pid] = excel
|
428
449
|
end
|
429
450
|
processes = WIN32OLE.connect('winmgmts:\\\\.').InstancesOf('win32_process')
|
430
|
-
# excel_processes = processes.select{ |p| p.name == "EXCEL.EXE" && pid2excel.include?(p.processid)}
|
431
|
-
# excel_processes.map{ |p| Excel.new(pid2excel[p.processid]) }
|
432
451
|
processes.select { |p| Excel.new(pid2excel[p.processid]) if p.name == 'EXCEL.EXE' && pid2excel.include?(p.processid) }
|
433
452
|
result = []
|
434
453
|
processes.each do |p|
|
@@ -26,7 +26,13 @@ module RobustExcelOle
|
|
26
26
|
# @params [Range] a range
|
27
27
|
# @returns [Array] the values
|
28
28
|
def values(range = nil)
|
29
|
-
result = map { |x| x.Value }.flatten
|
29
|
+
#result = map { |x| x.Value }.flatten
|
30
|
+
result_unflatten = if RUBY_PLATFORM !~ /java/
|
31
|
+
map { |x| x.v }
|
32
|
+
else
|
33
|
+
self.v
|
34
|
+
end
|
35
|
+
result = result_unflatten.flatten
|
30
36
|
if range
|
31
37
|
relevant_result = []
|
32
38
|
result.each_with_index { |row_or_column, i| relevant_result << row_or_column if range.include?(i) }
|
@@ -37,7 +43,42 @@ module RobustExcelOle
|
|
37
43
|
end
|
38
44
|
|
39
45
|
def v
|
40
|
-
|
46
|
+
begin
|
47
|
+
if RUBY_PLATFORM !~ /java/
|
48
|
+
self.Value
|
49
|
+
else
|
50
|
+
address_r1c1 = self.AddressLocal(true,true,XlR1C1)
|
51
|
+
row, col = Address.int_range(address_r1c1)
|
52
|
+
values = []
|
53
|
+
row.each do |r|
|
54
|
+
values_col = []
|
55
|
+
col.each{ |c| values_col << worksheet.Cells(r,c).Value}
|
56
|
+
values << values_col
|
57
|
+
end
|
58
|
+
values
|
59
|
+
end
|
60
|
+
rescue WIN32OLERuntimeError
|
61
|
+
raise RangeNotEvaluatable, 'cannot read value'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def v=(value)
|
66
|
+
begin
|
67
|
+
if RUBY_PLATFORM !~ /java/
|
68
|
+
ole_range.Value = value
|
69
|
+
else
|
70
|
+
address_r1c1 = ole_range.AddressLocal(true,true,XlR1C1)
|
71
|
+
row, col = Address.int_range(address_r1c1)
|
72
|
+
row.each_with_index do |r,i|
|
73
|
+
col.each_with_index do |c,j|
|
74
|
+
ole_range.Cells(i+1,j+1).Value = (value.respond_to?(:first) ? value[i][j] : value)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
value
|
79
|
+
rescue # WIN32OLERuntimeError
|
80
|
+
raise RangeNotEvaluatable, "cannot assign value to range #{address_r1c1.inspect}"
|
81
|
+
end
|
41
82
|
end
|
42
83
|
|
43
84
|
def [] index
|
@@ -74,7 +115,7 @@ module RobustExcelOle
|
|
74
115
|
end
|
75
116
|
end
|
76
117
|
rows, columns = Address.int_range(dest_address)
|
77
|
-
dest_sheet = @worksheet if dest_sheet == :__not_provided
|
118
|
+
#dest_sheet = @worksheet if dest_sheet == :__not_provided
|
78
119
|
dest_address_is_position = (rows.min == rows.max && columns.min == columns.max)
|
79
120
|
dest_range_address = if (not dest_address_is_position)
|
80
121
|
[rows.min..rows.max,columns.min..columns.max]
|
@@ -90,14 +131,17 @@ module RobustExcelOle
|
|
90
131
|
dest_range = dest_sheet.range(dest_range_address)
|
91
132
|
begin
|
92
133
|
if options[:values_only]
|
93
|
-
dest_range.Value = options[:transpose] ? self.Value.transpose : self.Value
|
134
|
+
# dest_range.Value = options[:transpose] ? self.Value.transpose : self.Value
|
135
|
+
dest_range.v = options[:transpose] ? self.v.transpose : self.v
|
94
136
|
else
|
95
137
|
if dest_range.worksheet.workbook.excel == @worksheet.workbook.excel
|
96
138
|
if options[:transpose]
|
97
|
-
self.Copy
|
98
|
-
dest_range.PasteSpecial('transpose' => true)
|
139
|
+
self.Copy
|
140
|
+
#dest_range.PasteSpecial('transpose' => true)
|
141
|
+
dest_range.PasteSpecial(XlPasteAll,XlPasteSpecialOperationNone,false,true)
|
99
142
|
else
|
100
|
-
self.Copy('destination' => dest_range.ole_range)
|
143
|
+
#self.Copy('destination' => dest_range.ole_range)
|
144
|
+
self.Copy(dest_range.ole_range)
|
101
145
|
end
|
102
146
|
else
|
103
147
|
if options[:transpose]
|
@@ -107,7 +151,8 @@ module RobustExcelOle
|
|
107
151
|
@worksheet.workbook.excel.with_displayalerts(false) {added_sheet.Delete}
|
108
152
|
else
|
109
153
|
self.Copy
|
110
|
-
dest_sheet.Paste('destination' => dest_range.ole_range)
|
154
|
+
#dest_sheet.Paste('destination' => dest_range.ole_range)
|
155
|
+
dest_sheet.Paste(dest_range.ole_range)
|
111
156
|
end
|
112
157
|
end
|
113
158
|
end
|
@@ -144,9 +189,11 @@ module RobustExcelOle
|
|
144
189
|
if dest_range.worksheet.workbook.excel == @worksheet.workbook.excel
|
145
190
|
if options[:transpose]
|
146
191
|
self.Copy
|
147
|
-
dest_range.PasteSpecial('transpose' => true)
|
192
|
+
#dest_range.PasteSpecial('transpose' => true)
|
193
|
+
dest_range.PasteSpecial(XlPasteAll,XlPasteSpecialOperationNone,false,true)
|
148
194
|
else
|
149
|
-
self.Copy('destination' => dest_range.ole_range)
|
195
|
+
#self.Copy('destination' => dest_range.ole_range)
|
196
|
+
self.Copy(dest_range.ole_range)
|
150
197
|
end
|
151
198
|
else
|
152
199
|
if options[:transpose]
|
@@ -156,7 +203,8 @@ module RobustExcelOle
|
|
156
203
|
@worksheet.workbook.excel.with_displayalerts(false) {added_sheet.Delete}
|
157
204
|
else
|
158
205
|
self.Copy
|
159
|
-
dest_sheet.Paste('destination' => dest_range.ole_range)
|
206
|
+
#dest_sheet.Paste('destination' => dest_range.ole_range)
|
207
|
+
dest_sheet.Paste(dest_range.ole_range)
|
160
208
|
end
|
161
209
|
end
|
162
210
|
end
|
@@ -184,7 +232,7 @@ module RobustExcelOle
|
|
184
232
|
|
185
233
|
# @private
|
186
234
|
def method_missing(name, *args)
|
187
|
-
|
235
|
+
if name.to_s[0,1] =~ /[A-Z]/
|
188
236
|
begin
|
189
237
|
@ole_range.send(name, *args)
|
190
238
|
rescue WIN32OLERuntimeError => msg
|
@@ -194,9 +242,9 @@ module RobustExcelOle
|
|
194
242
|
raise msg
|
195
243
|
end
|
196
244
|
end
|
197
|
-
|
198
|
-
|
199
|
-
|
245
|
+
else
|
246
|
+
super
|
247
|
+
end
|
200
248
|
end
|
201
249
|
end
|
202
250
|
end
|