robust_excel_ole 1.21 → 1.22
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/Changelog +6 -0
- data/README.rdoc +0 -134
- data/bin/jreo +13 -10
- data/jreo.bat +1 -1
- data/lib/robust_excel_ole/bookstore.rb +3 -3
- data/lib/robust_excel_ole/cell.rb +4 -3
- data/lib/robust_excel_ole/excel.rb +1 -1
- data/lib/robust_excel_ole/general.rb +15 -15
- data/lib/robust_excel_ole/range.rb +35 -95
- data/lib/robust_excel_ole/version.rb +1 -1
- data/lib/robust_excel_ole/workbook.rb +8 -7
- data/lib/robust_excel_ole/worksheet.rb +2 -2
- data/reo.bat +3 -0
- data/spec/general_spec.rb +10 -11
- data/spec/workbook_specs/workbook_misc_spec.rb +2 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5739475bb50983be2c17b084b939ec1143d9508f280dfd8bf80445d5fbce521
|
4
|
+
data.tar.gz: 1ecdceba6d53cf8a231d81425ca2c8f9b02a6fff2f6e2ad4aa90813b1223febf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4b326afc9230578f4f10bbbd4b2bb12d0536b3104ed0cc897b96a7ed3afe8ee6016181aa0603c8c9f260fa1966b19cd5b9ab07af5dda8312f9b7b363ee7ac7a
|
7
|
+
data.tar.gz: 06b76a2ecbab24b208d449d858329eb997e6375b2e5533c2ee0525fc1316ca249aa4594a9feb70525a9f492ba92153fdd9264caa23a6ec3c1af02547debab2d8
|
data/Changelog
CHANGED
data/README.rdoc
CHANGED
@@ -27,7 +27,6 @@ RobustExcelOle supports
|
|
27
27
|
- availability of all VBA methods
|
28
28
|
- availability of the Excel constants (in form if Ruby constants: Excel constant.capitalize)
|
29
29
|
- all standard Excel file formats (.xlsx, .xls, .xlsm)
|
30
|
-
- list objects
|
31
30
|
- reopening workbooks after closing them
|
32
31
|
- unobtrusively opening workbooks, i.e. opening and processing workbooks
|
33
32
|
while preserving their status, e.g. saved, readonly
|
@@ -318,139 +317,6 @@ and set another value to that range.
|
|
318
317
|
|
319
318
|
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]
|
320
319
|
|
321
|
-
=== List Objects
|
322
|
-
|
323
|
-
=== Creating List Objects
|
324
|
-
|
325
|
-
We can define a list object (or table) from scratch.
|
326
|
-
|
327
|
-
table = ListObject.new(worksheet, "table 1", [1,1], 3,["Person","AmountSales"])
|
328
|
-
|
329
|
-
This command creates a list object in worksheet named "table 1", with upper left corner at position [1,1] (first cell), with 3 rows and the columns "Person" and "Amoun%tSales".
|
330
|
-
|
331
|
-
Likewise we can get a RobustExcelOle list object with help of an existing WIN32OlE list object.
|
332
|
-
|
333
|
-
ole_listobject = worksheet.ListObjects.Item("Table 1")
|
334
|
-
table = ListObject.new(ole_listobject)
|
335
|
-
|
336
|
-
or
|
337
|
-
|
338
|
-
table = ole_listobject.to_reo
|
339
|
-
|
340
|
-
Now we have a RobustExcelOle ListObject that wraps a WIN32OLE ListObject. So we can send any WIN32OLE (VBA) method to it. See
|
341
|
-
https://docs.microsoft.com/en-us/office/vba/api/excel.listobject#methods.
|
342
|
-
|
343
|
-
A row in this table can be accessed with help of #[], e.g.
|
344
|
-
|
345
|
-
row1 = table[1]
|
346
|
-
|
347
|
-
=== Reading and setting values
|
348
|
-
|
349
|
-
Now we can set and get the value of a cell of the table with help of methods that are equal to or are underscored variants of the column names, e.g.
|
350
|
-
|
351
|
-
row1.AmountSales = 40
|
352
|
-
|
353
|
-
or
|
354
|
-
|
355
|
-
row1.amount_sales = 40
|
356
|
-
|
357
|
-
and
|
358
|
-
|
359
|
-
row1.AmountSales
|
360
|
-
# => 40
|
361
|
-
|
362
|
-
or
|
363
|
-
|
364
|
-
row1.amount_sales
|
365
|
-
# => 40
|
366
|
-
|
367
|
-
Special characters in the colare being ignored.
|
368
|
-
|
369
|
-
We can also read and set values in a whole row, e.g.
|
370
|
-
|
371
|
-
table.row_values(1)
|
372
|
-
# => ["John", 40]
|
373
|
-
|
374
|
-
or
|
375
|
-
|
376
|
-
table[1].values
|
377
|
-
# => ["John", 40]
|
378
|
-
|
379
|
-
and
|
380
|
-
|
381
|
-
table.set_row_values(1, ["Herbert", 80])
|
382
|
-
# => ["Herbert", 80]
|
383
|
-
|
384
|
-
or
|
385
|
-
|
386
|
-
table[1].set_values(["Herbert", 80])
|
387
|
-
|
388
|
-
If the number of given values is less than the number of cells in the row, only the first values are written. The remaining values keep their value.
|
389
|
-
|
390
|
-
Similarly, we can read and set the values in a whole column, e.g.
|
391
|
-
|
392
|
-
table.column_values("Person")
|
393
|
-
# => ["John", "Peter"]
|
394
|
-
|
395
|
-
and
|
396
|
-
|
397
|
-
table.set_column_values(1, ["Herbert","Paul"])
|
398
|
-
|
399
|
-
The column names we can get with help of
|
400
|
-
|
401
|
-
table.column_names
|
402
|
-
|
403
|
-
A column can be renamed.
|
404
|
-
|
405
|
-
table.rename_column("Person", "Enterprise")
|
406
|
-
|
407
|
-
or
|
408
|
-
|
409
|
-
table.rename_column(1, "Enterprise")
|
410
|
-
|
411
|
-
=== Adding and Deleting rows and columns
|
412
|
-
|
413
|
-
We can add rows and columns, supplying optionally their name, the position and contents.
|
414
|
-
|
415
|
-
table.add_column("column_name")
|
416
|
-
table.add_column("column_name", 3)
|
417
|
-
table.add_column("column_name", 3, ["John", "Paul"])
|
418
|
-
|
419
|
-
table.add_row(3)
|
420
|
-
table.add_row(3, ["John", 40, 2, 2004])
|
421
|
-
|
422
|
-
Deleting columns and rows is done by
|
423
|
-
|
424
|
-
table.delete_column("column_name")
|
425
|
-
table.delete_row(3)
|
426
|
-
|
427
|
-
We can delete only the contents of a column
|
428
|
-
|
429
|
-
table.delete_column_values("column_name")
|
430
|
-
|
431
|
-
Similarly can delete only the contents of a row.
|
432
|
-
|
433
|
-
table.delete_row_values(2)
|
434
|
-
|
435
|
-
or
|
436
|
-
|
437
|
-
table[2].delete_values
|
438
|
-
|
439
|
-
Finally we can delete empty rows and columns.
|
440
|
-
|
441
|
-
table.delete_empty_rows
|
442
|
-
table.delete_empty_columns
|
443
|
-
|
444
|
-
=== Finding values and sorting
|
445
|
-
|
446
|
-
You can find all cells containing a given value, e.g.
|
447
|
-
|
448
|
-
table.find_value(value)
|
449
|
-
#=> [#<Cell: (5,8)>#, #<Cell: (9,6)>#]
|
450
|
-
|
451
|
-
You can sort a table according to a given column and sort order, e.g.
|
452
|
-
|
453
|
-
table.sort("Person", :ascending)
|
454
320
|
|
455
321
|
=== More things
|
456
322
|
|
data/bin/jreo
CHANGED
@@ -2,23 +2,26 @@
|
|
2
2
|
# -*- jruby -*-
|
3
3
|
|
4
4
|
require 'pry'
|
5
|
-
require 'robust_excel_ole'
|
5
|
+
require '../robust_excel_ole/lib/robust_excel_ole'
|
6
6
|
|
7
7
|
include REO
|
8
8
|
include General
|
9
9
|
|
10
|
-
puts 'REO console started'
|
11
|
-
puts
|
12
|
-
|
13
10
|
# some pry configuration
|
14
11
|
Pry.config.windows_console_warning = false
|
15
|
-
Pry.config.
|
12
|
+
#Pry.config.history_save = true
|
16
13
|
Pry.config.color = false
|
17
14
|
#Pry.editor = 'notepad' # 'subl', 'vi'
|
18
15
|
#Pry.config.prompt =
|
19
|
-
#
|
20
|
-
|
21
|
-
|
22
|
-
#
|
16
|
+
#[
|
17
|
+
#->(_obj, _nest_level, _) { ">> " },
|
18
|
+
#->(*) { " " }
|
19
|
+
#]
|
23
20
|
|
24
|
-
|
21
|
+
hooks = Pry::Hooks.new
|
22
|
+
|
23
|
+
hooks.add_hook :when_started, :hook12 do
|
24
|
+
puts 'REO console started'
|
25
|
+
puts
|
26
|
+
end
|
27
|
+
Pry.start(nil, hooks: hooks)
|
data/jreo.bat
CHANGED
@@ -32,7 +32,7 @@ module RobustExcelOle
|
|
32
32
|
def fetch(filename, options = { :prefer_writable => true })
|
33
33
|
return nil unless filename
|
34
34
|
filename = General.absolute_path(filename)
|
35
|
-
filename_key = General.canonize(filename)
|
35
|
+
filename_key = General.canonize(filename).downcase
|
36
36
|
weakref_books = @filename2books[filename_key]
|
37
37
|
return nil if weakref_books.nil? || weakref_books.empty?
|
38
38
|
|
@@ -70,9 +70,9 @@ module RobustExcelOle
|
|
70
70
|
# stores a workbook
|
71
71
|
# @param [Workbook] book a given book
|
72
72
|
def store(book)
|
73
|
-
filename_key = General.canonize(book.filename)
|
73
|
+
filename_key = General.canonize(book.filename).downcase
|
74
74
|
if book.stored_filename
|
75
|
-
old_filename_key = General.canonize(book.stored_filename)
|
75
|
+
old_filename_key = General.canonize(book.stored_filename).downcase
|
76
76
|
# deletes the weak reference to the book
|
77
77
|
@filename2books[old_filename_key].delete(book)
|
78
78
|
end
|
@@ -20,18 +20,19 @@ module RobustExcelOle
|
|
20
20
|
self.Value = value
|
21
21
|
end
|
22
22
|
|
23
|
+
# @private
|
23
24
|
def ole_cell
|
24
25
|
@ole_range = @ole_range.MergeArea.Item(1,1) if @ole_range.MergeCells
|
25
26
|
end
|
26
27
|
|
27
28
|
# @private
|
28
29
|
def to_s
|
29
|
-
@ole_range.
|
30
|
+
"#<Cell:" + " (#{@ole_range.Row},#{@ole_range.Column})" + ">"
|
30
31
|
end
|
31
32
|
|
32
33
|
# @private
|
33
|
-
def inspect
|
34
|
-
|
34
|
+
def inspect
|
35
|
+
self.to_s[0..-2] + " #{@ole_range.Parent.Name}" + ">"
|
35
36
|
end
|
36
37
|
|
37
38
|
private
|
@@ -701,7 +701,7 @@ module RobustExcelOle
|
|
701
701
|
# @param [String] name the name of the range
|
702
702
|
# @param [Variant] value the contents of the range
|
703
703
|
def []=(name, value)
|
704
|
-
set_namevalue_glob(name, value
|
704
|
+
set_namevalue_glob(name, value)
|
705
705
|
end
|
706
706
|
|
707
707
|
# @private
|
@@ -10,13 +10,14 @@ module General
|
|
10
10
|
::CONNECT_EXCEL_JRUBY_BUG = IS_JRUBY_PLATFORM && true
|
11
11
|
::RANGES_JRUBY_BUG = IS_JRUBY_PLATFORM && true
|
12
12
|
|
13
|
+
@private
|
13
14
|
NetworkDrive = Struct.new(:drive_letter, :network_name) do
|
14
15
|
|
15
16
|
def self.get_all(drives)
|
16
17
|
ndrives = []
|
17
18
|
count = drives.Count
|
18
19
|
(0..(count - 1)).step(2) do |i|
|
19
|
-
ndrives << NetworkDrive.new( drives.Item(i), drives.Item(i + 1))
|
20
|
+
ndrives << NetworkDrive.new( drives.Item(i), drives.Item(i + 1).tr('\\','/'))
|
20
21
|
end
|
21
22
|
ndrives
|
22
23
|
end
|
@@ -24,23 +25,22 @@ module General
|
|
24
25
|
end
|
25
26
|
|
26
27
|
@private
|
27
|
-
def
|
28
|
+
def hostnameshare2networkpath(filename)
|
29
|
+
return filename unless filename[0,2] == "//"
|
28
30
|
network = WIN32OLE.new('WScript.Network')
|
29
31
|
drives = network.enumnetworkdrives
|
30
|
-
drive_letter, filename_after_drive_letter = filename.split(':')
|
31
|
-
drive_letter = normalize_drive_letter(drive_letter)
|
32
32
|
network_drives = NetworkDrive.get_all(drives)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
33
|
+
f_c = filename.dup
|
34
|
+
network_drive = network_drives.find do |d|
|
35
|
+
e = f_c.sub!(d.network_name,d.drive_letter)
|
36
|
+
return e if e
|
37
|
+
end
|
38
|
+
filename
|
39
|
+
end
|
37
40
|
|
38
|
-
def self.normalize_drive_letter(drive)
|
39
|
-
drive.upcase.end_with?(':') ? drive : "#{drive}:"
|
40
|
-
end
|
41
|
-
|
42
41
|
# @private
|
43
|
-
def absolute_path(file)
|
42
|
+
def absolute_path(file)
|
43
|
+
return file if file[0,2] == "//"
|
44
44
|
file[0,2] = './' if ::EXPANDPATH_JRUBY_BUG && file =~ /[A-Z]:[^\/]/
|
45
45
|
file = File.expand_path(file)
|
46
46
|
file = RobustExcelOle::Cygwin.cygpath('-w', file) if RUBY_PLATFORM =~ /cygwin/
|
@@ -50,8 +50,8 @@ module General
|
|
50
50
|
# @private
|
51
51
|
def canonize(filename)
|
52
52
|
raise TypeREOError, "No string given to canonize, but #{filename.inspect}" unless filename.is_a?(String)
|
53
|
-
filename =
|
54
|
-
normalize(filename)
|
53
|
+
filename = hostnameshare2networkpath(filename)
|
54
|
+
normalize(filename) if filename
|
55
55
|
end
|
56
56
|
|
57
57
|
# @private
|
@@ -20,8 +20,14 @@ module RobustExcelOle
|
|
20
20
|
def initialize(win32_range, worksheet = nil)
|
21
21
|
@ole_range = win32_range
|
22
22
|
@worksheet = worksheet ? worksheet.to_reo : worksheet_class.new(self.Parent)
|
23
|
-
|
24
|
-
|
23
|
+
end
|
24
|
+
|
25
|
+
def rows
|
26
|
+
@rows ||= (1..@ole_range.Rows.Count)
|
27
|
+
end
|
28
|
+
|
29
|
+
def columns
|
30
|
+
@columns ||= (1..@ole_range.Columns.Count)
|
25
31
|
end
|
26
32
|
|
27
33
|
def each
|
@@ -49,7 +55,6 @@ module RobustExcelOle
|
|
49
55
|
# @params [Range] a range
|
50
56
|
# @returns [Array] the values
|
51
57
|
def values(range = nil)
|
52
|
-
#result = map { |x| x.Value }.flatten
|
53
58
|
result_unflatten = if !::RANGES_JRUBY_BUG
|
54
59
|
map { |x| x.v }
|
55
60
|
else
|
@@ -71,9 +76,9 @@ module RobustExcelOle
|
|
71
76
|
self.Value
|
72
77
|
else
|
73
78
|
values = []
|
74
|
-
|
79
|
+
rows.each do |r|
|
75
80
|
values_col = []
|
76
|
-
|
81
|
+
columns.each{ |c| values_col << worksheet.Cells(r,c).Value}
|
77
82
|
values << values_col
|
78
83
|
end
|
79
84
|
values
|
@@ -89,8 +94,8 @@ module RobustExcelOle
|
|
89
94
|
if !::RANGES_JRUBY_BUG
|
90
95
|
ole_range.Value = value
|
91
96
|
else
|
92
|
-
|
93
|
-
|
97
|
+
rows.each_with_index do |r,i|
|
98
|
+
columns.each_with_index do |c,j|
|
94
99
|
ole_range.Cells(i+1,j+1).Value = (value.respond_to?(:first) ? value[i][j] : value)
|
95
100
|
end
|
96
101
|
end
|
@@ -108,44 +113,29 @@ module RobustExcelOle
|
|
108
113
|
# @params [Address or Address-Array] address or upper left position of the destination range
|
109
114
|
# @options [Worksheet] the destination worksheet
|
110
115
|
# @options [Hash] options: :transpose, :values_only
|
111
|
-
def copy(
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
else
|
121
|
-
if options_or_sheet.is_a?(Worksheet) or options_or_sheet.is_a?(WIN32OLE)
|
122
|
-
options_or_sheet.to_reo
|
123
|
-
else
|
124
|
-
@worksheet
|
125
|
-
end
|
126
|
-
end
|
127
|
-
options = if options_or_sheet.is_a?(Hash)
|
128
|
-
options_or_sheet
|
129
|
-
else
|
130
|
-
if not_provided_or_options.is_a?(Hash)
|
131
|
-
not_provided_or_options
|
132
|
-
else
|
133
|
-
{ }
|
134
|
-
end
|
116
|
+
def copy(dest_address, *remaining_args)
|
117
|
+
dest_sheet = @worksheet
|
118
|
+
options = { }
|
119
|
+
remaining_args.each do |arg|
|
120
|
+
case arg
|
121
|
+
when Object::Range, Integer then dest_address = [dest_address,arg]
|
122
|
+
when Worksheet, WIN32OLE then dest_sheet = arg.to_reo
|
123
|
+
when Hash then options = arg
|
124
|
+
else raise RangeNotCopied, "cannot copy range: argument error: #{remaining_args.inspect}"
|
135
125
|
end
|
126
|
+
end
|
127
|
+
begin
|
136
128
|
rows, columns = address_tool.as_integer_ranges(dest_address)
|
137
129
|
dest_address_is_position = (rows.min == rows.max && columns.min == columns.max)
|
138
130
|
dest_range_address = if (not dest_address_is_position)
|
139
|
-
|
131
|
+
[rows.min..rows.max,columns.min..columns.max]
|
132
|
+
else
|
133
|
+
if (not options[:transpose])
|
134
|
+
[rows.min..rows.min+self.Rows.Count-1, columns.min..columns.min+self.Columns.Count-1]
|
140
135
|
else
|
141
|
-
|
142
|
-
[rows.min..rows.min+self.Rows.Count-1,
|
143
|
-
columns.min..columns.min+self.Columns.Count-1]
|
144
|
-
else
|
145
|
-
[rows.min..rows.min+self.Columns.Count-1,
|
146
|
-
columns.min..columns.min+self.Rows.Count-1]
|
147
|
-
end
|
136
|
+
[rows.min..rows.min+self.Columns.Count-1, columns.min..columns.min+self.Rows.Count-1]
|
148
137
|
end
|
138
|
+
end
|
149
139
|
dest_range = dest_sheet.range(dest_range_address)
|
150
140
|
if options[:values_only]
|
151
141
|
dest_range.v = options[:transpose] ? self.v.transpose : self.v
|
@@ -160,8 +150,8 @@ module RobustExcelOle
|
|
160
150
|
else
|
161
151
|
if options[:transpose]
|
162
152
|
added_sheet = @worksheet.workbook.add_sheet
|
163
|
-
self.
|
164
|
-
added_sheet.range(dest_range_address).
|
153
|
+
self.copy(dest_address, added_sheet, :transpose => true)
|
154
|
+
added_sheet.range(dest_range_address).copy(dest_address,dest_sheet)
|
165
155
|
@worksheet.workbook.excel.with_displayalerts(false) {added_sheet.Delete}
|
166
156
|
else
|
167
157
|
self.Copy
|
@@ -169,63 +159,12 @@ module RobustExcelOle
|
|
169
159
|
end
|
170
160
|
end
|
171
161
|
end
|
162
|
+
dest_range
|
172
163
|
rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException => msg
|
173
164
|
raise RangeNotCopied, 'cannot copy range'
|
174
165
|
end
|
175
166
|
end
|
176
167
|
|
177
|
-
# becomes copy
|
178
|
-
# copies a range
|
179
|
-
# @params [Address or Address-Array] address or upper left position of the destination range
|
180
|
-
# @options [Worksheet] the destination worksheet
|
181
|
-
# @options [Hash] options: :transpose, :values_only
|
182
|
-
def copy_special(dest_address, dest_sheet = :__not_provided, options = { })
|
183
|
-
rows, columns = address_tool.as_integer_ranges(dest_address)
|
184
|
-
dest_sheet = @worksheet if dest_sheet == :__not_provided
|
185
|
-
dest_address_is_position = (rows.min == rows.max && @columns.min == @columns.max)
|
186
|
-
dest_range_address = if (not dest_address_is_position)
|
187
|
-
[rows.min..rows.max,columns.min..columns.max]
|
188
|
-
else
|
189
|
-
if (not options[:transpose])
|
190
|
-
[rows.min..rows.min+self.Rows.Count-1,
|
191
|
-
columns.min..columns.min+self.Columns.Count-1]
|
192
|
-
else
|
193
|
-
[rows.min..rows.min+self.Columns.Count-1,
|
194
|
-
columns.min..columns.min+self.Rows.Count-1]
|
195
|
-
end
|
196
|
-
end
|
197
|
-
dest_range = dest_sheet.range(dest_range_address)
|
198
|
-
begin
|
199
|
-
if options[:values_only]
|
200
|
-
dest_range.Value = options[:transpose] ? self.Value.transpose : self.Value
|
201
|
-
else
|
202
|
-
if dest_range.worksheet.workbook.excel == @worksheet.workbook.excel
|
203
|
-
if options[:transpose]
|
204
|
-
self.Copy
|
205
|
-
#dest_range.PasteSpecial('transpose' => true)
|
206
|
-
dest_range.PasteSpecial(XlPasteAll,XlPasteSpecialOperationNone,false,true)
|
207
|
-
else
|
208
|
-
#self.Copy('destination' => dest_range.ole_range)
|
209
|
-
self.Copy(dest_range.ole_range)
|
210
|
-
end
|
211
|
-
else
|
212
|
-
if options[:transpose]
|
213
|
-
added_sheet = @worksheet.workbook.add_sheet
|
214
|
-
self.copy_special(dest_address, added_sheet, :transpose => true)
|
215
|
-
added_sheet.range(dest_range_address).copy_special(dest_address,dest_sheet)
|
216
|
-
@worksheet.workbook.excel.with_displayalerts(false) {added_sheet.Delete}
|
217
|
-
else
|
218
|
-
self.Copy
|
219
|
-
#dest_sheet.Paste('destination' => dest_range.ole_range)
|
220
|
-
dest_sheet.Paste(dest_range.ole_range)
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|
224
|
-
rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException => msg
|
225
|
-
raise RangeNotCopied, 'cannot copy range'
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
168
|
def == other_range
|
230
169
|
other_range.is_a?(Range) &&
|
231
170
|
self.worksheet == other_range.worksheet
|
@@ -249,12 +188,13 @@ module RobustExcelOle
|
|
249
188
|
|
250
189
|
# @private
|
251
190
|
def to_s
|
252
|
-
"#<REO::Range: " + "
|
191
|
+
"#<REO::Range: " + "#{@ole_range.Address('External' => true).gsub(/\$/,'')} " + ">"
|
192
|
+
# "#<REO::Range: " + "#{@ole_range.Address.gsub(/\$/,'')} " + "#{worksheet.Name} " + ">"
|
253
193
|
end
|
254
194
|
|
255
195
|
# @private
|
256
196
|
def inspect
|
257
|
-
|
197
|
+
to_s # [0..-2] + "#{worksheet.workbook.Name} " + ">"
|
258
198
|
end
|
259
199
|
|
260
200
|
# @private
|
@@ -823,11 +823,12 @@ module RobustExcelOle
|
|
823
823
|
opts = sheet
|
824
824
|
sheet = nil
|
825
825
|
end
|
826
|
-
new_sheet_name = opts.delete(:as)
|
827
|
-
last_sheet_local = last_sheet
|
828
|
-
after_or_before, base_sheet = opts.to_a.first || [:after, last_sheet_local]
|
829
|
-
base_sheet_ole = base_sheet.ole_worksheet
|
830
826
|
begin
|
827
|
+
sheet = sheet.to_reo unless sheet.nil?
|
828
|
+
new_sheet_name = opts.delete(:as)
|
829
|
+
last_sheet_local = last_sheet
|
830
|
+
after_or_before, base_sheet = opts.to_a.first || [:after, last_sheet_local]
|
831
|
+
base_sheet_ole = base_sheet.to_reo.ole_worksheet
|
831
832
|
if !::COPYSHEETS_JRUBY_BUG
|
832
833
|
add_or_copy_sheet_simple(sheet, { after_or_before.to_s => base_sheet_ole })
|
833
834
|
else
|
@@ -843,7 +844,7 @@ module RobustExcelOle
|
|
843
844
|
end
|
844
845
|
end
|
845
846
|
end
|
846
|
-
rescue WIN32OLERuntimeError, NameNotFound, Java::OrgRacobCom::ComFailException
|
847
|
+
rescue # WIN32OLERuntimeError, NameNotFound, Java::OrgRacobCom::ComFailException
|
847
848
|
raise WorksheetREOError, "could not add given worksheet #{sheet.inspect}"
|
848
849
|
end
|
849
850
|
new_sheet = worksheet_class.new(ole_workbook.Activesheet)
|
@@ -892,7 +893,7 @@ module RobustExcelOle
|
|
892
893
|
# @param [String] name the name of the range
|
893
894
|
# @param [Variant] value the contents of the range
|
894
895
|
def []= (name, value)
|
895
|
-
set_namevalue_glob(name, value
|
896
|
+
set_namevalue_glob(name, value)
|
896
897
|
end
|
897
898
|
|
898
899
|
# sets options
|
@@ -921,7 +922,7 @@ module RobustExcelOle
|
|
921
922
|
|
922
923
|
# returns the full file name of the workbook
|
923
924
|
def filename
|
924
|
-
@ole_workbook.Fullname.tr('\\','/') rescue nil
|
925
|
+
General.canonize(@ole_workbook.Fullname.tr('\\','/')) rescue nil
|
925
926
|
end
|
926
927
|
|
927
928
|
# @private
|
@@ -96,7 +96,7 @@ module RobustExcelOle
|
|
96
96
|
else
|
97
97
|
name, value = p1, p2
|
98
98
|
begin
|
99
|
-
set_namevalue_glob(name, value
|
99
|
+
set_namevalue_glob(name, value)
|
100
100
|
rescue REOError
|
101
101
|
begin
|
102
102
|
workbook.set_namevalue_glob(name, value)
|
@@ -258,7 +258,7 @@ module RobustExcelOle
|
|
258
258
|
|
259
259
|
# @private
|
260
260
|
def inspect
|
261
|
-
self.to_s
|
261
|
+
self.to_s[0..-2] + "#{workbook.Name} " + ">"
|
262
262
|
end
|
263
263
|
|
264
264
|
include MethodHelpers
|
data/reo.bat
ADDED
data/spec/general_spec.rb
CHANGED
@@ -52,7 +52,7 @@ module RobustExcelOle
|
|
52
52
|
ole_table = worksheet.ListObjects.Item(1)
|
53
53
|
table = Table.new(ole_table)
|
54
54
|
table.Name.should == "table3"
|
55
|
-
table.HeaderRowRange.Value.first.should == ["Number","Person","Amount","Time","
|
55
|
+
table.HeaderRowRange.Value.first.should == ["Number","Person","Amount","Time","Price"]
|
56
56
|
table.ListRows.Count.should == 6
|
57
57
|
worksheet[3,4].Value.should == "Number"
|
58
58
|
end
|
@@ -151,13 +151,11 @@ module RobustExcelOle
|
|
151
151
|
end
|
152
152
|
|
153
153
|
it "should do methods for sheet" do
|
154
|
-
|
155
|
-
(Object.instance_methods.select{|m| m =~ /^(?!\_)/} - @book1.sheet(1).methods).sort.should be_empty
|
154
|
+
((@ole_sheet_methods + @sheet_methods) - @book1.sheet(1).methods).should be_empty
|
156
155
|
end
|
157
156
|
|
158
157
|
it "should do own_methods with popular ole_excel and excel methods" do
|
159
|
-
|
160
|
-
(Object.instance_methods - @book1.sheet(1).own_methods).should == Object.instance_methods
|
158
|
+
((@ole_sheet_methods + @sheet_methods) - @book1.sheet(1).own_methods).should == [] #be_empty
|
161
159
|
end
|
162
160
|
|
163
161
|
it "should respond to popular sheet methods" do
|
@@ -223,10 +221,12 @@ module RobustExcelOle
|
|
223
221
|
canonize("this../.i.s/.../..the/..../pa.th/").should == "this../.i.s/.../..the/..../pa.th"
|
224
222
|
end
|
225
223
|
|
224
|
+
=begin
|
226
225
|
it "should downcase" do
|
227
226
|
canonize("/This/IS/tHe/path").should == "/this/is/the/path"
|
228
227
|
canonize("///THIS/.///./////iS//the/../PatH/////").should == "/this/is/path"
|
229
228
|
end
|
229
|
+
=end
|
230
230
|
|
231
231
|
it "should raise an error for no strings" do
|
232
232
|
expect{
|
@@ -234,14 +234,13 @@ module RobustExcelOle
|
|
234
234
|
}.to raise_error(TypeREOError, "No string given to canonize, but 1")
|
235
235
|
end
|
236
236
|
|
237
|
-
it "should yield the
|
238
|
-
General.canonize(@
|
239
|
-
General.canonize(@
|
240
|
-
General.canonize(@simple_file).should ==
|
241
|
-
General.canonize(@simple_file_extern).should ==
|
237
|
+
it "should yield the network path" do
|
238
|
+
General.canonize(@hostname_share_path).should == @network_path
|
239
|
+
General.canonize(@network_path).should == @network_path
|
240
|
+
General.canonize(@simple_file).should == @simple_file
|
241
|
+
General.canonize(@simple_file_extern).should == @simple_file_extern
|
242
242
|
end
|
243
243
|
|
244
|
-
|
245
244
|
end
|
246
245
|
end
|
247
246
|
|
@@ -763,7 +763,7 @@ describe Workbook do
|
|
763
763
|
@book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == 4
|
764
764
|
@book1["new"].should == "bar"
|
765
765
|
@book1["new"] = "bar"
|
766
|
-
@book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should ==
|
766
|
+
@book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == 4
|
767
767
|
@book1.save
|
768
768
|
@book1.close
|
769
769
|
#book2 = Workbook.open(@simple_file1, :visible => true)
|
@@ -777,7 +777,7 @@ describe Workbook do
|
|
777
777
|
@book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == 4
|
778
778
|
@book1["new"].should == "bar"
|
779
779
|
@book1["new"] = "bar"
|
780
|
-
@book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should ==
|
780
|
+
@book1.Names.Item("new").RefersToRange.Interior.ColorIndex.should == 4
|
781
781
|
@book1.save
|
782
782
|
@book1.close
|
783
783
|
end
|
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.22'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- traths
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-08-
|
11
|
+
date: 2020-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -132,6 +132,7 @@ files:
|
|
132
132
|
- lib/robust_excel_ole/workbook.rb
|
133
133
|
- lib/robust_excel_ole/worksheet.rb
|
134
134
|
- lib/spec_helper.rb
|
135
|
+
- reo.bat
|
135
136
|
- robust_excel_ole.gemspec
|
136
137
|
- spec/address_tool_spec.rb
|
137
138
|
- spec/base_spec.rb
|