robust_excel_ole 1.16 → 1.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/docs/README_open.rdoc +4 -0
- data/lib/robust_excel_ole.rb +5 -4
- data/lib/robust_excel_ole/{address.rb → address_tool.rb} +23 -22
- data/lib/robust_excel_ole/{reo_common.rb → base.rb} +2 -90
- data/lib/robust_excel_ole/bookstore.rb +2 -2
- data/lib/robust_excel_ole/cell.rb +21 -17
- data/lib/robust_excel_ole/excel.rb +64 -26
- data/lib/robust_excel_ole/general.rb +7 -5
- data/lib/robust_excel_ole/range.rb +15 -7
- data/lib/robust_excel_ole/range_owners.rb +18 -6
- data/lib/robust_excel_ole/version.rb +1 -1
- data/lib/robust_excel_ole/workbook.rb +140 -147
- data/lib/robust_excel_ole/worksheet.rb +7 -7
- data/spec/address_tool_spec.rb +175 -0
- data/spec/{reo_common_spec.rb → base_spec.rb} +10 -29
- data/spec/cell_spec.rb +67 -25
- data/spec/data/more_data/workbook.xls +0 -0
- data/spec/data/workbook.xls +0 -0
- data/spec/excel_spec.rb +25 -273
- data/spec/general_spec.rb +16 -19
- data/spec/range_spec.rb +1 -1
- data/spec/workbook_spec.rb +7 -75
- data/spec/workbook_specs/workbook_misc_spec.rb +10 -10
- data/spec/workbook_specs/workbook_open_spec.rb +228 -14
- data/spec/workbook_specs/workbook_unobtr_spec.rb +31 -31
- metadata +6 -6
- data/spec/address_spec.rb +0 -174
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c268eff75271d48aae54af54c03c138e8a965a6c6965b6fc9b5fd330a346888d
|
4
|
+
data.tar.gz: '0921d96d9d20546523acb5ea5e419d8e2351307c23d25abe8b8d96010364b643'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c98669d651a2ff192bab0767ea16085a08cab8e0c656c3123b684080b96b62899967f3c4998637002dddf72eb1dbbd635f2ef102153d53842977adeba11d32c6
|
7
|
+
data.tar.gz: 1ac22fd73f4dae16142c1dc1d81bd9d9f8eeb5fbf95f85b4bcf26d99293b474c544aae863af4d40cc64052535ab40541956b69db8301274aade5afcacea37534
|
data/docs/README_open.rdoc
CHANGED
@@ -153,6 +153,7 @@ The method +General.to_reo+ enables type-lifting WIN32OLE objects to RobustExcel
|
|
153
153
|
This object can be type-lifted to a RobustExcelOle workbook.
|
154
154
|
|
155
155
|
workbook = win32ole_workbook.to_reo
|
156
|
+
|
156
157
|
workbook.to_class
|
157
158
|
=> RobustExcelOle::Workbook
|
158
159
|
|
@@ -166,6 +167,9 @@ You can supply options, e.g. +:visible+.
|
|
166
167
|
|
167
168
|
workbook = Workbook.new(win32ole_workbook, :visible => true)
|
168
169
|
|
170
|
+
You can also supply a workbook and options, e.g.
|
171
|
+
|
172
|
+
new_workbook = Workbook.new(workbook, :visible => true)
|
169
173
|
|
170
174
|
=== Identity transperence ===
|
171
175
|
|
data/lib/robust_excel_ole.rb
CHANGED
@@ -3,16 +3,17 @@ if RUBY_PLATFORM =~ /java/
|
|
3
3
|
else
|
4
4
|
require 'win32ole'
|
5
5
|
end
|
6
|
-
require File.join(File.dirname(__FILE__), 'robust_excel_ole/
|
7
|
-
require File.join(File.dirname(__FILE__), 'robust_excel_ole/range_owners')
|
8
|
-
require File.join(File.dirname(__FILE__), 'robust_excel_ole/address')
|
6
|
+
require File.join(File.dirname(__FILE__), 'robust_excel_ole/base')
|
9
7
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/general')
|
8
|
+
require File.join(File.dirname(__FILE__), 'robust_excel_ole/vba_objects')
|
9
|
+
require File.join(File.dirname(__FILE__), 'robust_excel_ole/range_owners')
|
10
|
+
require File.join(File.dirname(__FILE__), 'robust_excel_ole/address_tool')
|
10
11
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/excel')
|
11
12
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/bookstore')
|
12
13
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/workbook')
|
13
14
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/worksheet')
|
14
|
-
require File.join(File.dirname(__FILE__), 'robust_excel_ole/cell')
|
15
15
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/range')
|
16
|
+
require File.join(File.dirname(__FILE__), 'robust_excel_ole/cell')
|
16
17
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/cygwin') if RUBY_PLATFORM =~ /cygwin/
|
17
18
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/version')
|
18
19
|
|
@@ -2,37 +2,38 @@
|
|
2
2
|
|
3
3
|
module RobustExcelOle
|
4
4
|
|
5
|
-
class
|
5
|
+
class AddressTool < Base
|
6
6
|
|
7
|
-
def
|
8
|
-
|
9
|
-
|
7
|
+
def initialize(address_string)
|
8
|
+
r1c1_letters = address_string.gsub(/[0-9]/,'')
|
9
|
+
@row_letter = r1c1_letters[0..0]
|
10
|
+
@col_letter = r1c1_letters[1..1]
|
10
11
|
end
|
11
12
|
|
12
13
|
# address formats that are valid:
|
13
14
|
# r1c1-format: e.g. "Z3S1", "Z3S1:Z5S2", "Z[3]S1", "Z3S[-1]:Z[5]S1", "Z[3]", "S[-2]"
|
14
15
|
# infinite ranges are not possible, e.g. "Z3:Z5", "S2:S5", "Z2", "S3", "Z[2]"
|
15
|
-
#
|
16
|
-
#
|
16
|
+
# integer_ranges-fromat: e.g. [3,1], [3,"A"], [3..5,1..2], [3..5, "A".."B"],
|
17
|
+
# [3..4, nil], [nil, 2..4], [2,nil], [nil,4]
|
17
18
|
# a1-format: e.g. "A3", "A3:B5", "A:B", "3:5", "A", "3"
|
18
19
|
|
19
|
-
def
|
20
|
+
def as_r1c1(address)
|
20
21
|
transform_address(address,:r1c1)
|
21
22
|
end
|
22
23
|
|
23
|
-
def
|
24
|
+
def as_a1(address)
|
24
25
|
transform_address(address,:a1)
|
25
26
|
end
|
26
27
|
|
27
28
|
# valid address formats: e.g. [3,1], [3,"A"], [3..5,1..2], [3..5, "A".."B"],
|
28
29
|
# [3..4, nil], [nil, 2..4], [2,nil], [nil,4]
|
29
|
-
def
|
30
|
+
def as_integer_ranges(address)
|
30
31
|
transform_address(address,:int_range)
|
31
32
|
end
|
32
33
|
|
33
34
|
private
|
34
35
|
|
35
|
-
def
|
36
|
+
def transform_address(address, format)
|
36
37
|
address = address.is_a?(Array) ? address : [address]
|
37
38
|
raise AddressInvalid, "address #{address.inspect} has more than two components" if address.size > 2
|
38
39
|
begin
|
@@ -70,8 +71,8 @@ module RobustExcelOle
|
|
70
71
|
raise AddressInvalid, "address (#{address.inspect}) format not correct"
|
71
72
|
end
|
72
73
|
if format==:r1c1
|
73
|
-
r1c1_string(
|
74
|
-
r1c1_string(
|
74
|
+
r1c1_string(@row_letter,rows,:min) + r1c1_string(@col_letter,columns,:min) + ":" +
|
75
|
+
r1c1_string(@row_letter,rows,:max) + r1c1_string(@col_letter,columns,:max)
|
75
76
|
elsif format==:int_range
|
76
77
|
[rows,columns]
|
77
78
|
else
|
@@ -79,8 +80,7 @@ module RobustExcelOle
|
|
79
80
|
end
|
80
81
|
end
|
81
82
|
|
82
|
-
|
83
|
-
def self.r1c1_string(letter,int_range,type)
|
83
|
+
def r1c1_string(letter,int_range,type)
|
84
84
|
return "" if int_range.nil? || int_range.begin.nil?
|
85
85
|
parameter = type == :min ? int_range.begin : int_range.end
|
86
86
|
is_relative = parameter.is_a?(Array)
|
@@ -88,27 +88,28 @@ module RobustExcelOle
|
|
88
88
|
letter + (is_relative ? "(" : "") + parameter.to_s + (is_relative ? ")" : "")
|
89
89
|
end
|
90
90
|
|
91
|
-
|
92
|
-
def self.analyze(comp,format)
|
91
|
+
def analyze(comp,format)
|
93
92
|
row_comp, col_comp = if format==:a1
|
94
93
|
[comp.gsub(/[A-Z]/,''), comp.gsub(/[0-9]/,'')]
|
95
94
|
else
|
96
|
-
a,b = comp.split(
|
97
|
-
c,d = b.split(
|
95
|
+
a,b = comp.split(@row_letter)
|
96
|
+
c,d = b.split(@col_letter)
|
98
97
|
b.nil? ? ["",b] : (d.nil? ? [c,""] : [c,d])
|
99
98
|
end
|
100
|
-
def
|
99
|
+
def s2n(s)
|
101
100
|
s!="" ? (s[0] == "[" ? [s.gsub(/\[|\]/,'').to_i] : (s.to_i!=0 ? s.to_i : s)) : nil
|
102
101
|
end
|
103
102
|
[s2n(row_comp), s2n(col_comp)]
|
104
103
|
end
|
105
104
|
|
106
|
-
|
107
|
-
# @private
|
108
|
-
def self.str2num(str)
|
105
|
+
def str2num(str)
|
109
106
|
str.tr("A-Z","0-9A-P").to_i(26) + (26**str.size-1)/25
|
110
107
|
end
|
111
108
|
|
112
109
|
end
|
113
110
|
|
111
|
+
# @private
|
112
|
+
class AddressInvalid < REOError
|
113
|
+
end
|
114
|
+
|
114
115
|
end
|
@@ -50,94 +50,10 @@ module RobustExcelOle
|
|
50
50
|
class MiscREOError < REOError
|
51
51
|
end
|
52
52
|
|
53
|
-
# @private
|
54
|
-
class ExcelDamaged < ExcelREOError
|
55
|
-
end
|
56
|
-
|
57
|
-
# @private
|
58
|
-
class UnsavedWorkbooks < ExcelREOError
|
59
|
-
end
|
60
|
-
|
61
|
-
# @private
|
62
|
-
class WorkbookBlocked < WorkbookREOError
|
63
|
-
end
|
64
|
-
|
65
|
-
# @private
|
66
|
-
class WorkbookNotSaved < WorkbookREOError
|
67
|
-
end
|
68
|
-
|
69
|
-
# @private
|
70
|
-
class WorkbookReadOnly < WorkbookREOError
|
71
|
-
end
|
72
|
-
|
73
|
-
# @private
|
74
|
-
class WorkbookBeingUsed < WorkbookREOError
|
75
|
-
end
|
76
|
-
|
77
|
-
# @private
|
78
|
-
class WorkbookConnectingUnsavedError < WorkbookREOError
|
79
|
-
end
|
80
|
-
|
81
|
-
# @private
|
82
|
-
class WorkbookConnectingBlockingError < WorkbookREOError
|
83
|
-
end
|
84
|
-
|
85
|
-
# @private
|
86
|
-
class WorkbookConnectingUnknownError < WorkbookREOError
|
87
|
-
end
|
88
|
-
|
89
|
-
# @private
|
90
|
-
class FileNotFound < FileREOError
|
91
|
-
end
|
92
|
-
|
93
|
-
# @private
|
94
|
-
class FileNameNotGiven < FileREOError
|
95
|
-
end
|
96
|
-
|
97
|
-
# @private
|
98
|
-
class FileAlreadyExists < FileREOError
|
99
|
-
end
|
100
|
-
|
101
|
-
# @private
|
102
|
-
class NameNotFound < NamesREOError
|
103
|
-
end
|
104
|
-
|
105
|
-
# @private
|
106
|
-
class NameAlreadyExists < NamesREOError
|
107
|
-
end
|
108
|
-
|
109
|
-
# @private
|
110
|
-
class RangeNotEvaluatable < MiscREOError
|
111
|
-
end
|
112
|
-
|
113
|
-
# @private
|
114
|
-
class RangeNotCreated < MiscREOError
|
115
|
-
end
|
116
|
-
|
117
|
-
# @private
|
118
|
-
class RangeNotCopied < MiscREOError
|
119
|
-
end
|
120
|
-
|
121
|
-
# @private
|
122
|
-
class OptionInvalid < MiscREOError
|
123
|
-
end
|
124
|
-
|
125
|
-
# @private
|
126
|
-
class ObjectNotAlive < MiscREOError
|
127
|
-
end
|
128
|
-
|
129
53
|
# @private
|
130
54
|
class TypeREOError < REOError
|
131
55
|
end
|
132
56
|
|
133
|
-
# @private
|
134
|
-
class TimeOut < REOError
|
135
|
-
end
|
136
|
-
|
137
|
-
# @private
|
138
|
-
class AddressInvalid < REOError
|
139
|
-
end
|
140
|
-
|
141
57
|
# @private
|
142
58
|
class UnexpectedREOError < REOError
|
143
59
|
end
|
@@ -145,13 +61,9 @@ module RobustExcelOle
|
|
145
61
|
# @private
|
146
62
|
class NotImplementedREOError < REOError
|
147
63
|
end
|
64
|
+
|
148
65
|
|
149
|
-
class
|
150
|
-
|
151
|
-
# @private
|
152
|
-
def excel
|
153
|
-
raise TypeREOError, 'receiver instance is neither an Excel nor a Workbook'
|
154
|
-
end
|
66
|
+
class Base
|
155
67
|
|
156
68
|
# @private
|
157
69
|
def own_methods
|
@@ -2,7 +2,8 @@
|
|
2
2
|
|
3
3
|
module RobustExcelOle
|
4
4
|
|
5
|
-
class Bookstore <
|
5
|
+
class Bookstore < Base
|
6
|
+
|
6
7
|
def initialize
|
7
8
|
@filename2books ||= Hash.new { |hash, key| hash[key] = [] }
|
8
9
|
@hidden_excel_instance = nil
|
@@ -103,7 +104,6 @@ module RobustExcelOle
|
|
103
104
|
|
104
105
|
private
|
105
106
|
|
106
|
-
# @private
|
107
107
|
def try_hidden_excel
|
108
108
|
@hidden_excel_instance.__getobj__ if @hidden_excel_instance && @hidden_excel_instance.weakref_alive? && @hidden_excel_instance.__getobj__.alive?
|
109
109
|
end
|
@@ -1,11 +1,13 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
module RobustExcelOle
|
4
|
-
|
5
|
-
|
4
|
+
|
5
|
+
class Cell < Range
|
6
|
+
attr_reader :ole_cell
|
6
7
|
|
7
8
|
def initialize(win32_cell)
|
8
|
-
@
|
9
|
+
@ole_cell = win32_cell.MergeCells ? win32_cell.MergeArea.Item(1,1) : win32_cell
|
10
|
+
super
|
9
11
|
end
|
10
12
|
|
11
13
|
def v
|
@@ -16,25 +18,27 @@ module RobustExcelOle
|
|
16
18
|
self.Value = value
|
17
19
|
end
|
18
20
|
|
21
|
+
private
|
22
|
+
|
19
23
|
# @private
|
20
24
|
def method_missing(name, *args)
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
if name.to_s[0,1] =~ /[A-Z]/
|
26
|
+
if ::ERRORMESSAGE_JRUBY_BUG
|
27
|
+
begin
|
28
|
+
@ole_cell.send(name, *args)
|
29
|
+
rescue Java::OrgRacobCom::ComFailException
|
30
|
+
raise VBAMethodMissingError, "unknown VBA property or method #{name.inspect}"
|
31
|
+
end
|
32
|
+
else
|
33
|
+
begin
|
34
|
+
@ole_cell.send(name, *args)
|
35
|
+
rescue NoMethodError
|
36
|
+
raise VBAMethodMissingError, "unknown VBA property or method #{name.inspect}"
|
37
|
+
end
|
27
38
|
end
|
28
39
|
else
|
29
|
-
|
30
|
-
@cell.send(name, *args)
|
31
|
-
rescue NoMethodError
|
32
|
-
raise VBAMethodMissingError, "unknown VBA property or method #{name.inspect}"
|
33
|
-
end
|
40
|
+
super
|
34
41
|
end
|
35
|
-
# else
|
36
|
-
# super
|
37
|
-
# end
|
38
42
|
end
|
39
43
|
end
|
40
44
|
end
|
@@ -16,9 +16,10 @@ module RobustExcelOle
|
|
16
16
|
# that you would apply for an Application object.
|
17
17
|
# See https://docs.microsoft.com/en-us/office/vba/api/excel.application(object)#methods
|
18
18
|
|
19
|
-
class Excel <
|
19
|
+
class Excel < VbaObjects
|
20
20
|
attr_reader :ole_excel
|
21
21
|
attr_reader :properties
|
22
|
+
attr_reader :address_tool
|
22
23
|
|
23
24
|
alias ole_object ole_excel
|
24
25
|
|
@@ -125,10 +126,18 @@ module RobustExcelOle
|
|
125
126
|
self
|
126
127
|
end
|
127
128
|
|
129
|
+
# @private
|
130
|
+
def address_tool
|
131
|
+
raise(ExcelREOError, "Excel contains no workbook") unless @ole_excel.Workbooks.Count > 0
|
132
|
+
@address_tool ||= begin
|
133
|
+
address_string = @ole_excel.Workbooks.Item(1).Worksheets.Item(1).Cells.Item(1,1).Address(true,true,XlR1C1)
|
134
|
+
address_tool_class.new(address_string)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
128
138
|
private
|
129
139
|
|
130
140
|
# retain the saved status of all workbooks
|
131
|
-
# @private
|
132
141
|
def retain_saved_workbooks
|
133
142
|
saved_stati = @ole_excel.Workbooks.map { |w| w.Saved }
|
134
143
|
begin
|
@@ -138,7 +147,6 @@ module RobustExcelOle
|
|
138
147
|
end
|
139
148
|
end
|
140
149
|
|
141
|
-
# @private
|
142
150
|
def ole_workbooks
|
143
151
|
ole_workbooks = begin
|
144
152
|
@ole_excel.Workbooks
|
@@ -153,11 +161,13 @@ module RobustExcelOle
|
|
153
161
|
|
154
162
|
public
|
155
163
|
|
164
|
+
# @private
|
156
165
|
def self.contains_unsaved_workbooks?
|
157
166
|
!Excel.current.unsaved_workbooks.empty?
|
158
167
|
end
|
159
168
|
|
160
169
|
# returns unsaved workbooks (win32ole objects)
|
170
|
+
# @private
|
161
171
|
def unsaved_workbooks
|
162
172
|
unsaved_workbooks = []
|
163
173
|
begin
|
@@ -175,6 +185,7 @@ module RobustExcelOle
|
|
175
185
|
# :forget -> closes the Excel instance without saving the workbooks
|
176
186
|
# :save -> saves the workbooks before closing
|
177
187
|
# :alert -> let Excel do it
|
188
|
+
# @private
|
178
189
|
def close_workbooks(options = { :if_unsaved => :raise })
|
179
190
|
return unless alive?
|
180
191
|
|
@@ -382,12 +393,11 @@ module RobustExcelOle
|
|
382
393
|
@@hwnd2excel.size
|
383
394
|
end
|
384
395
|
|
385
|
-
|
396
|
+
private
|
386
397
|
|
387
398
|
# returns a Win32OLE object that represents a Excel instance to which Excel connects
|
388
399
|
# connects to the first opened Excel instance
|
389
400
|
# if this Excel instance is being closed, then Excel creates a new Excel instance
|
390
|
-
# @private
|
391
401
|
def self.current_ole_excel
|
392
402
|
if ::CONNECT_EXCEL_JRUBY_BUG
|
393
403
|
result = known_excel_instance
|
@@ -430,6 +440,25 @@ module RobustExcelOle
|
|
430
440
|
nil
|
431
441
|
end
|
432
442
|
|
443
|
+
def self.hwnd2excel(hwnd)
|
444
|
+
excel_weakref = @@hwnd2excel[hwnd]
|
445
|
+
if excel_weakref
|
446
|
+
if excel_weakref.weakref_alive?
|
447
|
+
excel_weakref.__getobj__
|
448
|
+
else
|
449
|
+
trace 'dead reference to an Excel'
|
450
|
+
begin
|
451
|
+
@@hwnd2excel.delete(hwnd)
|
452
|
+
nil
|
453
|
+
rescue
|
454
|
+
trace "Warning: deleting dead reference failed! (hwnd: #{hwnd.inspect})"
|
455
|
+
end
|
456
|
+
end
|
457
|
+
end
|
458
|
+
end
|
459
|
+
|
460
|
+
public
|
461
|
+
|
433
462
|
# returns all Excel objects for all Excel instances opened with RobustExcelOle
|
434
463
|
def self.known_excel_instances
|
435
464
|
pid2excel = {}
|
@@ -464,24 +493,6 @@ module RobustExcelOle
|
|
464
493
|
self
|
465
494
|
end
|
466
495
|
|
467
|
-
# @private
|
468
|
-
def self.hwnd2excel(hwnd)
|
469
|
-
excel_weakref = @@hwnd2excel[hwnd]
|
470
|
-
if excel_weakref
|
471
|
-
if excel_weakref.weakref_alive?
|
472
|
-
excel_weakref.__getobj__
|
473
|
-
else
|
474
|
-
trace 'dead reference to an Excel'
|
475
|
-
begin
|
476
|
-
@@hwnd2excel.delete(hwnd)
|
477
|
-
nil
|
478
|
-
rescue
|
479
|
-
trace "Warning: deleting dead reference failed! (hwnd: #{hwnd.inspect})"
|
480
|
-
end
|
481
|
-
end
|
482
|
-
end
|
483
|
-
end
|
484
|
-
|
485
496
|
# @private
|
486
497
|
def hwnd
|
487
498
|
self.Hwnd
|
@@ -700,7 +711,9 @@ module RobustExcelOle
|
|
700
711
|
def workbook
|
701
712
|
return @workbook unless @workbook.nil?
|
702
713
|
@workbook = workbook_class.new(@ole_excel.ActiveWorkbook)
|
703
|
-
end
|
714
|
+
end
|
715
|
+
|
716
|
+
alias_method :active_workbook, :workbook
|
704
717
|
|
705
718
|
# @private
|
706
719
|
def to_s
|
@@ -727,11 +740,26 @@ module RobustExcelOle
|
|
727
740
|
self.class.workbook_class
|
728
741
|
end
|
729
742
|
|
743
|
+
# @private
|
744
|
+
def self.address_tool_class
|
745
|
+
@address_tool_class ||= begin
|
746
|
+
module_name = parent_name
|
747
|
+
"#{module_name}::AddressTool".constantize
|
748
|
+
rescue NameError => e
|
749
|
+
AddressTool
|
750
|
+
end
|
751
|
+
end
|
752
|
+
|
753
|
+
# @private
|
754
|
+
def address_tool_class
|
755
|
+
self.class.address_tool_class
|
756
|
+
end
|
757
|
+
|
758
|
+
|
730
759
|
include MethodHelpers
|
731
760
|
|
732
761
|
private
|
733
762
|
|
734
|
-
# @private
|
735
763
|
def method_missing(name, *args)
|
736
764
|
if name.to_s[0,1] =~ /[A-Z]/
|
737
765
|
raise ObjectNotAlive, 'method missing: Excel not alive' unless alive?
|
@@ -754,7 +782,16 @@ module RobustExcelOle
|
|
754
782
|
end
|
755
783
|
end
|
756
784
|
|
757
|
-
|
785
|
+
public
|
786
|
+
|
787
|
+
# @private
|
788
|
+
class ExcelDamaged < ExcelREOError
|
789
|
+
end
|
790
|
+
|
791
|
+
# @private
|
792
|
+
class UnsavedWorkbooks < ExcelREOError
|
793
|
+
end
|
794
|
+
|
758
795
|
|
759
796
|
Application = Excel
|
760
797
|
|
@@ -763,3 +800,4 @@ end
|
|
763
800
|
class WIN32OLE
|
764
801
|
include Enumerable
|
765
802
|
end
|
803
|
+
|