robust_excel_ole 1.26 → 1.27
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog +2 -0
- data/README.rdoc +10 -5
- data/bin/jreo +1 -1
- data/bin/reo +1 -1
- data/lib/reo_console.rb +3 -29
- data/lib/robust_excel_ole/excel.rb +7 -7
- data/lib/robust_excel_ole/general.rb +98 -18
- data/lib/robust_excel_ole/version.rb +1 -1
- data/spec/general_spec.rb +28 -0
- metadata +2 -4
- data/jreo.bat +0 -3
- data/reo.bat +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf42835b0febd0db61ca5f87c473f63256d97d2dbaaf05cbe8b97be01fc6f17e
|
4
|
+
data.tar.gz: 81c4e849c1aceca218207e04577e8857098c1c68482c209515a79e2ead44c5ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88fadf70ac1ec5fab7e133d21fe9a6e9f0ed5399fec3dd0d5198d9c639ebde470dde7f657778564c8a7b9a326fe6b0d177e3cfeca66c4f3642ca97fccfd9314e
|
7
|
+
data.tar.gz: 578aa3c80a722c10b2d4cdc390a45f1286775586fc58ac4c67dfe7dedb1da0939b4e79fea366bc6bf49034d9631f1b8cfaac3eb54c56b6dab3385f1811f86254
|
data/Changelog
CHANGED
data/README.rdoc
CHANGED
@@ -320,7 +320,11 @@ For more details about reading and writing contents of cells and ranges see {REA
|
|
320
320
|
|
321
321
|
=== More features
|
322
322
|
|
323
|
-
The
|
323
|
+
1. The method +General.change_current_binding+ allows to change the value of self within the current binding, while preserving the local variables, without starting another repl. Assume, +object+ shall be the self, then you would put
|
324
|
+
|
325
|
+
General.change_current_binding(object)
|
326
|
+
|
327
|
+
Without this method, the ruby shell 'pry' allows to change the value of 'self' in the console as well, e.g.
|
324
328
|
|
325
329
|
object.pry
|
326
330
|
|
@@ -328,13 +332,14 @@ or
|
|
328
332
|
|
329
333
|
cd object
|
330
334
|
|
331
|
-
|
335
|
+
However, this command also starts another pry repl (with another binding). Moreover, local variables in the previous binding are forgotten.
|
336
|
+
|
332
337
|
|
333
|
-
The method +General.
|
338
|
+
2. The method +General.update_to_reo+ extends the class Win32Ole such that RobustExcelOle methods can be applied to Win32Ole objects. As mentioned above, the RobustExcelOle objects are wrapper of corresponding WIN32OLE objects. With help of +update_to_reo+ the RobustExcelOle objects and their wrapped Win32Ole objects are interchangeable. One example would be
|
334
339
|
|
335
|
-
|
340
|
+
range.ole_range.copy([4,3])
|
336
341
|
|
337
|
-
|
342
|
+
Likewise it is possible to convert ("type-lift") Win32Ole objects into the corresponding RobustExcelOle object, using General.to_reo.
|
338
343
|
|
339
344
|
range = sheet.Names.Item("firstcell").to_reo
|
340
345
|
|
data/bin/jreo
CHANGED
data/bin/reo
CHANGED
data/lib/reo_console.rb
CHANGED
@@ -4,35 +4,6 @@ require '../robust_excel_ole/lib/robust_excel_ole'
|
|
4
4
|
include REO
|
5
5
|
include General
|
6
6
|
|
7
|
-
# change the current binding such that self is the current object in the pry-instance,
|
8
|
-
# preserve the local variables
|
9
|
-
|
10
|
-
class Pry
|
11
|
-
|
12
|
-
class << self
|
13
|
-
attr_accessor :pry_instance
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.change_current_binding(current_object)
|
17
|
-
pry_instance = self.pry_instance
|
18
|
-
old_binding = pry_instance.binding_stack.pop
|
19
|
-
pry_instance.push_binding(current_object.__binding__)
|
20
|
-
exclude_vars = [:__, :_, :_dir, :_dir_, :_file, :_file_, :_in_, :_out_, :_ex, :_ex_, :pry_instance]
|
21
|
-
old_binding.local_variables.each do |var|
|
22
|
-
pry_instance.add_sticky_local(var) {old_binding.local_variable_get(var)} unless exclude_vars.include?(var)
|
23
|
-
end
|
24
|
-
self.pry_instance = pry_instance
|
25
|
-
nil
|
26
|
-
end
|
27
|
-
|
28
|
-
def push_initial_binding(target = nil)
|
29
|
-
# memorize the current pry instance
|
30
|
-
self.class.pry_instance = self
|
31
|
-
push_binding(target || Pry.toplevel_binding)
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
7
|
# some pry configuration
|
37
8
|
Pry.config.windows_console_warning = false
|
38
9
|
Pry.config.color = false
|
@@ -65,4 +36,7 @@ hooks.add_hook :when_started, :hook12 do
|
|
65
36
|
puts 'REO console started'
|
66
37
|
puts
|
67
38
|
end
|
39
|
+
|
40
|
+
General.uplift_to_reo
|
41
|
+
|
68
42
|
Pry.start(nil, hooks: hooks)
|
@@ -370,7 +370,7 @@ module RobustExcelOle
|
|
370
370
|
number = 0
|
371
371
|
WIN32OLE.connect('winmgmts:\\\\.').InstancesOf('win32_process').each do |p|
|
372
372
|
begin
|
373
|
-
if p.
|
373
|
+
if p.Name == 'EXCEL.EXE'
|
374
374
|
Process.kill('KILL', p.processid)
|
375
375
|
number += 1
|
376
376
|
end
|
@@ -384,7 +384,7 @@ module RobustExcelOle
|
|
384
384
|
|
385
385
|
def self.excels_number
|
386
386
|
processes = WIN32OLE.connect('winmgmts:\\\\.').InstancesOf('win32_process')
|
387
|
-
processes.select { |p| p.
|
387
|
+
processes.select { |p| p.Name == 'EXCEL.EXE' }.size
|
388
388
|
end
|
389
389
|
|
390
390
|
def self.known_excels_number
|
@@ -417,7 +417,7 @@ module RobustExcelOle
|
|
417
417
|
result.Visible # send any method, just to see if it responds
|
418
418
|
rescue
|
419
419
|
trace 'dead excel ' + (begin
|
420
|
-
"Window-handle = #{result.
|
420
|
+
"Window-handle = #{result.Hwnd}"
|
421
421
|
rescue
|
422
422
|
'without window handle'
|
423
423
|
end)
|
@@ -471,13 +471,13 @@ module RobustExcelOle
|
|
471
471
|
pid2excel[pid] = excel
|
472
472
|
end
|
473
473
|
processes = WIN32OLE.connect('winmgmts:\\\\.').InstancesOf('win32_process')
|
474
|
-
processes.select { |p| Excel.new(pid2excel[p.
|
474
|
+
processes.select { |p| Excel.new(pid2excel[p.ProcessId]) if p.Name == 'EXCEL.EXE' && pid2excel.include?(p.ProcessId) }
|
475
475
|
result = []
|
476
476
|
processes.each do |p|
|
477
|
-
next unless p.
|
477
|
+
next unless p.Name == 'EXCEL.EXE'
|
478
478
|
|
479
|
-
if pid2excel.include?(p.
|
480
|
-
excel = pid2excel[p.
|
479
|
+
if pid2excel.include?(p.ProcessId)
|
480
|
+
excel = pid2excel[p.ProcessId]
|
481
481
|
result << excel
|
482
482
|
end
|
483
483
|
# how to connect to an (interactively opened) Excel instance and get a WIN32OLE object?
|
@@ -3,14 +3,14 @@
|
|
3
3
|
module General
|
4
4
|
|
5
5
|
IS_JRUBY_PLATFORM = (RUBY_PLATFORM =~ /java/)
|
6
|
-
::EXPANDPATH_JRUBY_BUG
|
7
|
-
::CONNECT_JRUBY_BUG
|
8
|
-
::COPYSHEETS_JRUBY_BUG
|
9
|
-
::ERRORMESSAGE_JRUBY_BUG
|
10
|
-
::CONNECT_EXCEL_JRUBY_BUG
|
11
|
-
::RANGES_JRUBY_BUG
|
12
|
-
|
13
|
-
@private
|
6
|
+
::EXPANDPATH_JRUBY_BUG = IS_JRUBY_PLATFORM && true
|
7
|
+
::CONNECT_JRUBY_BUG = IS_JRUBY_PLATFORM && true
|
8
|
+
::COPYSHEETS_JRUBY_BUG = IS_JRUBY_PLATFORM && true
|
9
|
+
::ERRORMESSAGE_JRUBY_BUG = IS_JRUBY_PLATFORM && true
|
10
|
+
::CONNECT_EXCEL_JRUBY_BUG = IS_JRUBY_PLATFORM && true
|
11
|
+
::RANGES_JRUBY_BUG = IS_JRUBY_PLATFORM && true
|
12
|
+
|
13
|
+
# @private
|
14
14
|
NetworkDrive = Struct.new(:drive_letter, :network_name) do
|
15
15
|
|
16
16
|
def self.get_all(drives)
|
@@ -24,7 +24,7 @@ module General
|
|
24
24
|
|
25
25
|
end
|
26
26
|
|
27
|
-
@private
|
27
|
+
# @private
|
28
28
|
def hostnameshare2networkpath(filename)
|
29
29
|
return filename unless filename[0,2] == "//"
|
30
30
|
network = WIN32OLE.new('WScript.Network')
|
@@ -68,8 +68,95 @@ module General
|
|
68
68
|
Pry.change_current_binding(current_object)
|
69
69
|
end
|
70
70
|
|
71
|
-
|
71
|
+
def class2method
|
72
|
+
[{Excel => :Hwnd},
|
73
|
+
{Workbook => :FullName},
|
74
|
+
{Worksheet => :UsedRange},
|
75
|
+
{RobustExcelOle::Range => :Row},
|
76
|
+
{ListObject => :ListRows}]
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
# enable RobustExcelOle methods to Win32Ole objects
|
81
|
+
def uplift_to_reo
|
82
|
+
exclude_list = [:each, :inspect]
|
83
|
+
class2method.each do |element|
|
84
|
+
classname = element.first.first
|
85
|
+
method = element.first.last
|
86
|
+
classname.instance_methods(false).each do |inst_method|
|
87
|
+
if !exclude_list.include?(inst_method)
|
88
|
+
WIN32OLE.send(:define_method, inst_method) do |*args, &blk|
|
89
|
+
self.to_reo.send(inst_method, *args, &blk)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
nil
|
95
|
+
end
|
96
|
+
|
97
|
+
module_function :absolute_path, :canonize, :normalize, :change_current_binding, :class2method, :uplift_to_reo
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
# @private
|
102
|
+
class Pry
|
103
|
+
|
104
|
+
# change the current binding such that self is the current object in the pry-instance,
|
105
|
+
# preserve the local variables
|
106
|
+
|
107
|
+
class << self
|
108
|
+
attr_accessor :pry_instance
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.change_current_binding(current_object)
|
112
|
+
pry_instance = self.pry_instance
|
113
|
+
old_binding = pry_instance.binding_stack.pop
|
114
|
+
pry_instance.push_binding(current_object.__binding__)
|
115
|
+
exclude_vars = [:__, :_, :_dir, :_dir_, :_file, :_file_, :_in_, :_out_, :_ex, :_ex_, :pry_instance]
|
116
|
+
old_binding.local_variables.each do |var|
|
117
|
+
pry_instance.add_sticky_local(var) {old_binding.local_variable_get(var)} unless exclude_vars.include?(var)
|
118
|
+
end
|
119
|
+
self.pry_instance = pry_instance
|
120
|
+
nil
|
121
|
+
end
|
122
|
+
|
123
|
+
def push_initial_binding(target = nil)
|
124
|
+
# memorize the current pry instance
|
125
|
+
self.class.pry_instance = self
|
126
|
+
push_binding(target || Pry.toplevel_binding)
|
127
|
+
end
|
72
128
|
|
129
|
+
class REPL
|
130
|
+
|
131
|
+
def read
|
132
|
+
@indent.reset if pry.eval_string.empty?
|
133
|
+
current_prompt = pry.select_prompt
|
134
|
+
indentation = pry.config.auto_indent ? @indent.current_prefix : ''
|
135
|
+
val = read_line("#{current_prompt}#{indentation}")
|
136
|
+
# Return nil for EOF, :no_more_input for error, or :control_c for <Ctrl-C>
|
137
|
+
return val unless val.is_a?(String)
|
138
|
+
if pry.config.auto_indent
|
139
|
+
original_val = "#{indentation}#{val}"
|
140
|
+
indented_val = @indent.indent(val)
|
141
|
+
|
142
|
+
if output.tty? &&
|
143
|
+
pry.config.correct_indent &&
|
144
|
+
Pry::Helpers::BaseHelpers.use_ansi_codes?
|
145
|
+
# avoid repeating read line
|
146
|
+
|
147
|
+
#output.print @indent.correct_indentation(
|
148
|
+
# current_prompt,
|
149
|
+
# indented_val,
|
150
|
+
# calculate_overhang(current_prompt, original_val, indented_val)
|
151
|
+
#)
|
152
|
+
output.flush
|
153
|
+
end
|
154
|
+
else
|
155
|
+
indented_val = val
|
156
|
+
end
|
157
|
+
indented_val
|
158
|
+
end
|
159
|
+
end
|
73
160
|
end
|
74
161
|
|
75
162
|
# @private
|
@@ -122,14 +209,7 @@ class WIN32OLE
|
|
122
209
|
|
123
210
|
# type-lifting WIN32OLE objects to RobustExcelOle objects
|
124
211
|
def to_reo
|
125
|
-
class2method
|
126
|
-
{Excel => :Hwnd},
|
127
|
-
{Workbook => :FullName},
|
128
|
-
{Worksheet => :UsedRange},
|
129
|
-
{RobustExcelOle::Range => :Row},
|
130
|
-
{ListObject => :ListRows}
|
131
|
-
]
|
132
|
-
class2method.each do |element|
|
212
|
+
General.class2method.each do |element|
|
133
213
|
classname = element.first.first
|
134
214
|
method = element.first.last
|
135
215
|
begin
|
data/spec/general_spec.rb
CHANGED
@@ -96,6 +96,34 @@ module RobustExcelOle
|
|
96
96
|
|
97
97
|
end
|
98
98
|
|
99
|
+
describe "General.uplift_to_reo" do
|
100
|
+
|
101
|
+
before do
|
102
|
+
@book1 = Workbook.open(@simple_file, :visible => true)
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should apply reo-methods to win32ole objects" do
|
106
|
+
General.uplift_to_reo
|
107
|
+
ole_book1 = @book1.ole_workbook
|
108
|
+
sheet1 = ole_book1.sheet(1)
|
109
|
+
sheet1.should be_a Worksheet
|
110
|
+
sheet1.name.should == "Sheet1"
|
111
|
+
ole_sheet1 = sheet1.ole_worksheet
|
112
|
+
range1 = ole_sheet1.range([1..2,3..4])
|
113
|
+
range1.should be_a RobustExcelOle::Range
|
114
|
+
range1.value.should == [["sheet1",nil],["foobaaa",nil]]
|
115
|
+
ole_range1 = range1.ole_range
|
116
|
+
ole_range1.copy([6,6])
|
117
|
+
range2 = sheet1.range([6..7,6..7])
|
118
|
+
range2.value.should == [["sheet1",nil],["foobaaa",nil]]
|
119
|
+
excel1 = @book1.excel
|
120
|
+
ole_excel1 = excel1.ole_excel
|
121
|
+
ole_excel1.close(:if_unsaved => :forget)
|
122
|
+
Excel.kill_all
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
99
127
|
describe "methods, own_methods, respond_to?" do
|
100
128
|
|
101
129
|
before do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: robust_excel_ole
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '1.
|
4
|
+
version: '1.27'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- traths
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-10-
|
11
|
+
date: 2020-10-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -126,7 +126,6 @@ files:
|
|
126
126
|
- examples/open_save_close/example_reuse.rb
|
127
127
|
- examples/open_save_close/example_simple.rb
|
128
128
|
- examples/open_save_close/example_unobtrusively.rb
|
129
|
-
- jreo.bat
|
130
129
|
- lib/reo_console.rb
|
131
130
|
- lib/robust_excel_ole.rb
|
132
131
|
- lib/robust_excel_ole/address_tool.rb
|
@@ -149,7 +148,6 @@ files:
|
|
149
148
|
- lib/robust_excel_ole/workbook.rb
|
150
149
|
- lib/robust_excel_ole/worksheet.rb
|
151
150
|
- lib/spec_helper.rb
|
152
|
-
- reo.bat
|
153
151
|
- robust_excel_ole.gemspec
|
154
152
|
- spec/address_tool_spec.rb
|
155
153
|
- spec/base_spec.rb
|
data/jreo.bat
DELETED
data/reo.bat
DELETED