robust_excel_ole 1.21 → 1.22
Sign up to get free protection for your applications and to get access to all the features.
- 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
|