robust_excel_ole 1.17 → 1.18
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 +18 -0
- data/README.rdoc +17 -0
- data/docs/README_excel.rdoc +6 -0
- data/docs/README_ranges.rdoc +6 -0
- data/examples/example_ruby_library.rb +27 -0
- data/extconf.rb +7 -0
- data/lib/robust_excel_ole.rb +1 -1
- data/lib/robust_excel_ole/cell.rb +13 -5
- data/lib/robust_excel_ole/excel.rb +1 -4
- data/lib/robust_excel_ole/range.rb +23 -8
- data/lib/robust_excel_ole/range_owners.rb +8 -5
- data/lib/robust_excel_ole/vba_objects.rb +30 -0
- data/lib/robust_excel_ole/version.rb +1 -1
- data/lib/robust_excel_ole/workbook.rb +17 -21
- data/lib/robust_excel_ole/worksheet.rb +33 -8
- data/robust_excel_ole.gemspec +1 -0
- data/spec/excel_spec.rb +16 -0
- data/spec/general_spec.rb +0 -1
- data/spec/range_spec.rb +56 -2
- data/spec/worksheet_spec.rb +34 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f98eac7f4995b60c16017d6be170e0621eaf77b708c4f796b4bde1b0bdb17fc
|
4
|
+
data.tar.gz: bdad471c90fbda86803c03860077e29d2eba3583ec94173d782f8f80b1eb3480
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8a472ec475629d7f9cb2d6886ed009a23e1a5598ba79152accca7f21dde87b05ff46f4a6f776acc6b75ea21538249df31e94145883946d379e0b71dcdcae05f
|
7
|
+
data.tar.gz: 90aa4909eaec50fc74b57c75ad5112ba4216e49177263532dbf703ad4d3694b5a64f7f4c69613dac528fc9cf7874dae98d39900bef5aa62eee3bfb0a860bc215
|
data/Changelog
CHANGED
@@ -1,6 +1,24 @@
|
|
1
1
|
# Change Log
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
## [1.18] 2020-30-4
|
5
|
+
|
6
|
+
### Added
|
7
|
+
- Workbook#worksheets, worksheets_count
|
8
|
+
- Worksheet#each_value
|
9
|
+
- Range#value, value=
|
10
|
+
|
11
|
+
### Changed
|
12
|
+
- Range#initialize: optional paramter worksheet
|
13
|
+
|
14
|
+
## [1.17]
|
15
|
+
|
16
|
+
### Added
|
17
|
+
- Excel#active_workbook
|
18
|
+
|
19
|
+
### Changed
|
20
|
+
- Excel#namevalue, set_namevalue, namevalue_glob, set_namevalue_glob are being removed
|
21
|
+
|
4
22
|
## [1.16]
|
5
23
|
|
6
24
|
### Added
|
data/README.rdoc
CHANGED
@@ -14,6 +14,23 @@ Library references are supported.
|
|
14
14
|
RobustExcelOle works by sending VBA methods via Win32OLE.
|
15
15
|
Therefore, it runs on Windows only.
|
16
16
|
|
17
|
+
== Feature list
|
18
|
+
|
19
|
+
- opening and processing workbooks across various Excel instances
|
20
|
+
- reading and writing workbooks (cells and ranges)
|
21
|
+
- reopening and unobtrusively opening workbooks
|
22
|
+
- convenient methods for standard tasks (like opening, reading, writing, closing, saving workbooks, naming, adding, and copying ranges and worksheets)
|
23
|
+
- dealing with various cases of Excel and user behaviour, e.g. managing conflicts when opening workbooks (e.g. blocking or unsaved workbooks),
|
24
|
+
even with simultanously happening user interactions
|
25
|
+
- workarounds for Excel bugs and JRuby bugs
|
26
|
+
- various workbook formats, e.g. .xlsx, .xls, .xlsm are supported
|
27
|
+
- library references are supported
|
28
|
+
- console for convenient usage
|
29
|
+
|
30
|
+
== What's new?
|
31
|
+
|
32
|
+
- removing methods to operate on ranges directly from an Excel instance. However, you can use the method Excel.active_workbook to do so.
|
33
|
+
See ChangeLogs.
|
17
34
|
|
18
35
|
== Requirements
|
19
36
|
|
data/docs/README_excel.rdoc
CHANGED
@@ -124,6 +124,12 @@ or, with a block,
|
|
124
124
|
|
125
125
|
excel.each_workbook(:visible => true) {|w| puts w}
|
126
126
|
|
127
|
+
=== Accessing the active workbook
|
128
|
+
|
129
|
+
You can operate on the active workbook with help of the method Workbook#active_workbook, e.g.
|
130
|
+
|
131
|
+
workbook = excel.active_workbook
|
132
|
+
|
127
133
|
=== Bringing an Excel instance to the foreground
|
128
134
|
|
129
135
|
excel1.focus
|
data/docs/README_ranges.rdoc
CHANGED
@@ -394,6 +394,12 @@ The methods Worksheet#each, Worksheet#each_row and Worksheet#each_column enable
|
|
394
394
|
# do something with column
|
395
395
|
end
|
396
396
|
|
397
|
+
The method Worksheet#each_value accesses the values of each row.
|
398
|
+
|
399
|
+
worksheet.each_value do |row_values|
|
400
|
+
# do something with the row_values
|
401
|
+
end
|
402
|
+
|
397
403
|
You access a range of a row by giving the number of the row, and optionally, the range of the cell numbers.
|
398
404
|
|
399
405
|
worksheet.row_range(1) # => first row
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#require 'robust_excel_ole'
|
2
|
+
|
3
|
+
#workbook = Workbook.open './sample_excel_files/xlsx_500_rows.xlsx'
|
4
|
+
|
5
|
+
require_relative '../lib/robust_excel_ole'
|
6
|
+
|
7
|
+
include RobustExcelOle
|
8
|
+
|
9
|
+
workbook = Workbook.open './../spec/data/workbook.xls'
|
10
|
+
|
11
|
+
puts "Found #{workbook.worksheets_count} worksheets"
|
12
|
+
|
13
|
+
workbook.each do |worksheet|
|
14
|
+
puts "Reading: #{worksheet.name}"
|
15
|
+
num_rows = 0
|
16
|
+
|
17
|
+
worksheet.each do |row|
|
18
|
+
row_cells = row.map{ |cell| cell.value }
|
19
|
+
num_rows += 1
|
20
|
+
|
21
|
+
# uncomment to print out row values
|
22
|
+
# puts row_cells.join " "
|
23
|
+
end
|
24
|
+
puts "Read #{num_rows} rows"
|
25
|
+
end
|
26
|
+
|
27
|
+
puts 'Done'
|
data/extconf.rb
ADDED
data/lib/robust_excel_ole.rb
CHANGED
@@ -12,8 +12,8 @@ require File.join(File.dirname(__FILE__), 'robust_excel_ole/excel')
|
|
12
12
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/bookstore')
|
13
13
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/workbook')
|
14
14
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/worksheet')
|
15
|
-
require File.join(File.dirname(__FILE__), 'robust_excel_ole/range')
|
16
15
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/cell')
|
16
|
+
require File.join(File.dirname(__FILE__), 'robust_excel_ole/range')
|
17
17
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/cygwin') if RUBY_PLATFORM =~ /cygwin/
|
18
18
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/version')
|
19
19
|
|
@@ -1,13 +1,15 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
+
require File.join(File.dirname(__FILE__), './range')
|
4
|
+
|
3
5
|
module RobustExcelOle
|
4
6
|
|
5
7
|
class Cell < Range
|
6
|
-
attr_reader :ole_cell
|
8
|
+
#attr_reader :ole_cell
|
7
9
|
|
8
|
-
def initialize(win32_cell)
|
9
|
-
@ole_cell = win32_cell.MergeCells ? win32_cell.MergeArea.Item(1,1) : win32_cell
|
10
|
+
def initialize(win32_cell, worksheet)
|
10
11
|
super
|
12
|
+
ole_cell
|
11
13
|
end
|
12
14
|
|
13
15
|
def v
|
@@ -18,6 +20,10 @@ module RobustExcelOle
|
|
18
20
|
self.Value = value
|
19
21
|
end
|
20
22
|
|
23
|
+
def ole_cell
|
24
|
+
@ole_range = @ole_range.MergeArea.Item(1,1) if @ole_range.MergeCells
|
25
|
+
end
|
26
|
+
|
21
27
|
private
|
22
28
|
|
23
29
|
# @private
|
@@ -25,13 +31,15 @@ module RobustExcelOle
|
|
25
31
|
if name.to_s[0,1] =~ /[A-Z]/
|
26
32
|
if ::ERRORMESSAGE_JRUBY_BUG
|
27
33
|
begin
|
28
|
-
|
34
|
+
#@ole_cell.send(name, *args)
|
35
|
+
@ole_range.send(name, *args)
|
29
36
|
rescue Java::OrgRacobCom::ComFailException
|
30
37
|
raise VBAMethodMissingError, "unknown VBA property or method #{name.inspect}"
|
31
38
|
end
|
32
39
|
else
|
33
40
|
begin
|
34
|
-
|
41
|
+
#@ole_cell.send(name, *args)
|
42
|
+
@ole_range.send(name, *args)
|
35
43
|
rescue NoMethodError
|
36
44
|
raise VBAMethodMissingError, "unknown VBA property or method #{name.inspect}"
|
37
45
|
end
|
@@ -3,8 +3,6 @@
|
|
3
3
|
require 'weakref'
|
4
4
|
require 'Win32API'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
6
|
def ka
|
9
7
|
Excel.kill_all
|
10
8
|
end
|
@@ -709,8 +707,7 @@ module RobustExcelOle
|
|
709
707
|
# @private
|
710
708
|
# returns active workbook
|
711
709
|
def workbook
|
712
|
-
|
713
|
-
@workbook = workbook_class.new(@ole_excel.ActiveWorkbook)
|
710
|
+
@workbook ||= workbook_class.new(@ole_excel.ActiveWorkbook) if @ole_excel.Workbooks.Count > 0
|
714
711
|
end
|
715
712
|
|
716
713
|
alias_method :active_workbook, :workbook
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
+
|
2
3
|
module RobustExcelOle
|
3
4
|
|
4
5
|
# This class essentially wraps a Win32Ole Range object.
|
@@ -11,17 +12,33 @@ module RobustExcelOle
|
|
11
12
|
attr_reader :ole_range
|
12
13
|
attr_reader :worksheet
|
13
14
|
|
14
|
-
def initialize(win32_range)
|
15
|
+
def initialize(win32_range, worksheet = nil)
|
15
16
|
@ole_range = win32_range
|
16
|
-
@worksheet = worksheet_class.new(self.Parent)
|
17
|
+
@worksheet = worksheet ? worksheet : worksheet_class.new(self.Parent)
|
18
|
+
#@worksheet = worksheet_class.new(self.Parent)
|
17
19
|
end
|
18
20
|
|
19
21
|
def each
|
20
|
-
@ole_range.
|
21
|
-
yield
|
22
|
+
@ole_range.each_with_index do |ole_cell, index|
|
23
|
+
yield cell(index){ole_cell}
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
27
|
+
def [] index
|
28
|
+
cell(index) {
|
29
|
+
@ole_range.Cells.Item(index + 1)
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def cell(index)
|
36
|
+
@cells ||= []
|
37
|
+
@cells[index + 1] ||= RobustExcelOle::Cell.new(yield,@worksheet)
|
38
|
+
end
|
39
|
+
|
40
|
+
public
|
41
|
+
|
25
42
|
# returns flat array of the values of a given range
|
26
43
|
# @params [Range] a range
|
27
44
|
# @returns [Array] the values
|
@@ -82,10 +99,8 @@ module RobustExcelOle
|
|
82
99
|
end
|
83
100
|
end
|
84
101
|
|
85
|
-
|
86
|
-
|
87
|
-
@cells[index + 1] = RobustExcelOle::Cell.new(@ole_range.Cells.Item(index + 1))
|
88
|
-
end
|
102
|
+
alias_method :value, :v
|
103
|
+
alias_method :value=, :v=
|
89
104
|
|
90
105
|
# copies a range
|
91
106
|
# @params [Address or Address-Array] address or upper left position of the destination range
|
@@ -22,12 +22,13 @@ module RobustExcelOle
|
|
22
22
|
raise
|
23
23
|
end
|
24
24
|
ole_range = name_obj.RefersToRange
|
25
|
+
worksheet = self if self.is_a?(Worksheet)
|
25
26
|
value = begin
|
26
27
|
#name_obj.RefersToRange.Value
|
27
28
|
if !::RANGES_JRUBY_BUG
|
28
29
|
ole_range.Value
|
29
30
|
else
|
30
|
-
values = RobustExcelOle::Range.new(ole_range).v
|
31
|
+
values = RobustExcelOle::Range.new(ole_range, worksheet).v
|
31
32
|
(values.size==1 && values.first.size==1) ? values.first.first : values
|
32
33
|
end
|
33
34
|
rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException
|
@@ -42,7 +43,7 @@ module RobustExcelOle
|
|
42
43
|
if !::RANGES_JRUBY_BUG
|
43
44
|
ole_range.Value
|
44
45
|
else
|
45
|
-
values = RobustExcelOle::Range.new(ole_range).v
|
46
|
+
values = RobustExcelOle::Range.new(ole_range, worksheet).v
|
46
47
|
(values.size==1 && values.first.size==1) ? values.first.first : values
|
47
48
|
end
|
48
49
|
rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException
|
@@ -105,11 +106,12 @@ module RobustExcelOle
|
|
105
106
|
raise NameNotFound, "name #{name.inspect} not in #{self.inspect}"
|
106
107
|
end
|
107
108
|
begin
|
109
|
+
worksheet = self if self.is_a?(Worksheet)
|
108
110
|
#value = ole_range.Value
|
109
111
|
value = if !::RANGES_JRUBY_BUG
|
110
112
|
ole_range.Value
|
111
113
|
else
|
112
|
-
values = RobustExcelOle::Range.new(ole_range).v
|
114
|
+
values = RobustExcelOle::Range.new(ole_range, worksheet).v
|
113
115
|
(values.size==1 && values.first.size==1) ? values.first.first : values
|
114
116
|
end
|
115
117
|
rescue WIN32OLERuntimeError, Java::OrgRacobCom::ComFailException
|
@@ -180,10 +182,11 @@ module RobustExcelOle
|
|
180
182
|
# @return [Range] a range
|
181
183
|
def range(name_or_address, address2 = :__not_provided)
|
182
184
|
begin
|
185
|
+
worksheet = self if self.is_a?(Worksheet)
|
183
186
|
if address2 == :__not_provided
|
184
187
|
range = if name_or_address.is_a?(String)
|
185
188
|
begin
|
186
|
-
RobustExcelOle::Range.new(name_object(name_or_address).RefersToRange)
|
189
|
+
RobustExcelOle::Range.new(name_object(name_or_address).RefersToRange, worksheet)
|
187
190
|
rescue NameNotFound
|
188
191
|
nil
|
189
192
|
end
|
@@ -193,7 +196,7 @@ module RobustExcelOle
|
|
193
196
|
address = name_or_address
|
194
197
|
address = [name_or_address,address2] unless address2 == :__not_provided
|
195
198
|
self.Names.Add('__dummy001',nil,true,nil,nil,nil,nil,nil,nil,'=' + address_tool.as_r1c1(address))
|
196
|
-
range = RobustExcelOle::Range.new(name_object('__dummy001').RefersToRange)
|
199
|
+
range = RobustExcelOle::Range.new(name_object('__dummy001').RefersToRange, worksheet)
|
197
200
|
self.Names.Item('__dummy001').Delete
|
198
201
|
workbook = self.is_a?(Workbook) ? self : self.workbook
|
199
202
|
workbook.save
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module RobustExcelOle
|
4
|
+
|
5
|
+
class VbaObjects < Base
|
6
|
+
|
7
|
+
def to_reo
|
8
|
+
self
|
9
|
+
end
|
10
|
+
|
11
|
+
# @private
|
12
|
+
def address_tool
|
13
|
+
excel.address_tool
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
# @private
|
19
|
+
class RangeNotEvaluatable < MiscREOError
|
20
|
+
end
|
21
|
+
|
22
|
+
# @private
|
23
|
+
class OptionInvalid < MiscREOError
|
24
|
+
end
|
25
|
+
|
26
|
+
# @private
|
27
|
+
class ObjectNotAlive < MiscREOError
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -783,12 +783,22 @@ module RobustExcelOle
|
|
783
783
|
raise NameNotFound, "could not return a sheet with name #{name.inspect}"
|
784
784
|
end
|
785
785
|
|
786
|
+
def worksheets_count
|
787
|
+
@ole_workbook.Worksheets.Count
|
788
|
+
end
|
789
|
+
|
786
790
|
def each
|
787
791
|
@ole_workbook.Worksheets.each do |sheet|
|
788
792
|
yield worksheet_class.new(sheet)
|
789
793
|
end
|
790
794
|
end
|
791
795
|
|
796
|
+
def worksheets
|
797
|
+
result = []
|
798
|
+
each { |worksheet| result << worksheet }
|
799
|
+
result
|
800
|
+
end
|
801
|
+
|
792
802
|
def each_with_index(offset = 0)
|
793
803
|
i = offset
|
794
804
|
@ole_workbook.Worksheets.each do |sheet|
|
@@ -813,24 +823,18 @@ module RobustExcelOle
|
|
813
823
|
new_sheet_name = opts.delete(:as)
|
814
824
|
last_sheet_local = last_sheet
|
815
825
|
after_or_before, base_sheet = opts.to_a.first || [:after, last_sheet_local]
|
826
|
+
base_sheet_ole = base_sheet.ole_worksheet
|
816
827
|
begin
|
817
828
|
if !::COPYSHEETS_JRUBY_BUG
|
818
|
-
|
819
|
-
# sheet.Copy({ after_or_before.to_s => base_sheet.ole_worksheet })
|
820
|
-
#else
|
821
|
-
# ole_workbook.Worksheets.Add({ after_or_before.to_s => base_sheet.ole_worksheet })
|
822
|
-
#end
|
823
|
-
add_or_copy_sheet_simple(sheet, { after_or_before.to_s => base_sheet.ole_worksheet })
|
829
|
+
add_or_copy_sheet_simple(sheet, { after_or_before.to_s => base_sheet_ole })
|
824
830
|
else
|
825
831
|
if after_or_before == :before
|
826
|
-
|
827
|
-
add_or_copy_sheet_simple(sheet, base_sheet.ole_worksheet)
|
832
|
+
add_or_copy_sheet_simple(sheet, base_sheet_ole)
|
828
833
|
else
|
829
834
|
if base_sheet.name != last_sheet_local.name
|
830
835
|
add_or_copy_sheet_simple(sheet, base_sheet.Next)
|
831
836
|
else
|
832
|
-
|
833
|
-
add_or_copy_sheet_simple(sheet, base_sheet.ole_worksheet)
|
837
|
+
add_or_copy_sheet_simple(sheet, base_sheet_ole)
|
834
838
|
base_sheet.Move(ole_workbook.Worksheets.Item(ole_workbook.Worksheets.Count-1))
|
835
839
|
ole_workbook.Worksheets.Item(ole_workbook.Worksheets.Count).Activate
|
836
840
|
end
|
@@ -846,19 +850,11 @@ module RobustExcelOle
|
|
846
850
|
|
847
851
|
private
|
848
852
|
|
849
|
-
|
850
|
-
# if sheet
|
851
|
-
# sheet.Copy(base_sheet.ole_worksheet)
|
852
|
-
# else
|
853
|
-
# ole_workbook.Worksheets.Add(base_sheet.ole_worksheet)
|
854
|
-
# end
|
855
|
-
#end
|
856
|
-
|
857
|
-
def add_or_copy_sheet_simple(sheet, base_ole_worksheet)
|
853
|
+
def add_or_copy_sheet_simple(sheet, base_sheet_ole_or_hash)
|
858
854
|
if sheet
|
859
|
-
sheet.Copy(
|
855
|
+
sheet.Copy(base_sheet_ole_or_hash)
|
860
856
|
else
|
861
|
-
ole_workbook.Worksheets.Add(
|
857
|
+
ole_workbook.Worksheets.Add(base_sheet_ole_or_hash)
|
862
858
|
end
|
863
859
|
end
|
864
860
|
|
@@ -71,7 +71,7 @@ module RobustExcelOle
|
|
71
71
|
xy = "#{x}_#{y}"
|
72
72
|
@cells = { }
|
73
73
|
begin
|
74
|
-
@cells[xy] = RobustExcelOle::Cell.new(@ole_worksheet.Cells.Item(x, y))
|
74
|
+
@cells[xy] = RobustExcelOle::Cell.new(@ole_worksheet.Cells.Item(x, y), @worksheet)
|
75
75
|
rescue
|
76
76
|
raise RangeNotEvaluatable, "cannot read cell (#{x.inspect},#{y.inspect})"
|
77
77
|
end
|
@@ -108,16 +108,27 @@ module RobustExcelOle
|
|
108
108
|
# value of a cell, if row and column are given
|
109
109
|
# @params row and column
|
110
110
|
# @returns value of the cell
|
111
|
+
def cellval(x,y)
|
112
|
+
xy = "#{x}_#{y}"
|
113
|
+
begin
|
114
|
+
@ole_worksheet.Cells.Item(x, y).Value
|
115
|
+
rescue
|
116
|
+
raise RangeNotEvaluatable, "cannot read cell (#{p1.inspect},#{p2.inspect})"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
=begin
|
111
121
|
def cellval(x,y)
|
112
122
|
xy = "#{x}_#{y}"
|
113
123
|
@cells = { }
|
114
124
|
begin
|
115
|
-
@cells[xy] = RobustExcelOle::Cell.new(@ole_worksheet.Cells.Item(x, y))
|
125
|
+
@cells[xy] = RobustExcelOle::Cell.new(@ole_worksheet.Cells.Item(x, y), @worksheet)
|
116
126
|
@cells[xy].Value
|
117
127
|
rescue
|
118
128
|
raise RangeNotEvaluatable, "cannot read cell (#{p1.inspect},#{p2.inspect})"
|
119
129
|
end
|
120
130
|
end
|
131
|
+
=end
|
121
132
|
|
122
133
|
# sets the value of a cell, if row, column and color of the cell are given
|
123
134
|
# @params [Integer] x,y row and column
|
@@ -148,17 +159,31 @@ module RobustExcelOle
|
|
148
159
|
end
|
149
160
|
end
|
150
161
|
|
162
|
+
def each_value
|
163
|
+
@ole_worksheet.UsedRange.Value.each do |row_values|
|
164
|
+
yield row_values
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def each_value_with_index(offset = 0)
|
169
|
+
i = offset
|
170
|
+
@ole_worksheet.UsedRange.Value.each do |row_values|
|
171
|
+
yield row_values, i
|
172
|
+
i += 1
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
151
176
|
def each_row(offset = 0)
|
152
177
|
offset += 1
|
153
178
|
1.upto(@end_row) do |row|
|
154
179
|
next if row < offset
|
155
|
-
yield RobustExcelOle::Range.new(@ole_worksheet.Range(@ole_worksheet.Cells(row, 1), @ole_worksheet.Cells(row, @end_column)))
|
180
|
+
yield RobustExcelOle::Range.new(@ole_worksheet.Range(@ole_worksheet.Cells(row, 1), @ole_worksheet.Cells(row, @end_column)), self)
|
156
181
|
end
|
157
182
|
end
|
158
183
|
|
159
184
|
def each_row_with_index(offset = 0)
|
160
185
|
each_row(offset) do |row_range|
|
161
|
-
yield RobustExcelOle::Range.new(row_range), (row_range.Row - 1 - offset)
|
186
|
+
yield RobustExcelOle::Range.new(row_range, self), (row_range.Row - 1 - offset)
|
162
187
|
end
|
163
188
|
end
|
164
189
|
|
@@ -166,24 +191,24 @@ module RobustExcelOle
|
|
166
191
|
offset += 1
|
167
192
|
1.upto(@end_column) do |column|
|
168
193
|
next if column < offset
|
169
|
-
yield RobustExcelOle::Range.new(@ole_worksheet.Range(@ole_worksheet.Cells(1, column), @ole_worksheet.Cells(@end_row, column)))
|
194
|
+
yield RobustExcelOle::Range.new(@ole_worksheet.Range(@ole_worksheet.Cells(1, column), @ole_worksheet.Cells(@end_row, column)), self)
|
170
195
|
end
|
171
196
|
end
|
172
197
|
|
173
198
|
def each_column_with_index(offset = 0)
|
174
199
|
each_column(offset) do |column_range|
|
175
|
-
yield RobustExcelOle::Range.new(column_range), (column_range.Column - 1 - offset)
|
200
|
+
yield RobustExcelOle::Range.new(column_range, self), (column_range.Column - 1 - offset)
|
176
201
|
end
|
177
202
|
end
|
178
203
|
|
179
204
|
def row_range(row, integer_range = nil)
|
180
205
|
integer_range ||= 1..@end_column
|
181
|
-
RobustExcelOle::Range.new(@ole_worksheet.Range(@ole_worksheet.Cells(row, integer_range.min), @ole_worksheet.Cells(row, integer_range.max)))
|
206
|
+
RobustExcelOle::Range.new(@ole_worksheet.Range(@ole_worksheet.Cells(row, integer_range.min), @ole_worksheet.Cells(row, integer_range.max)), self)
|
182
207
|
end
|
183
208
|
|
184
209
|
def col_range(col, integer_range = nil)
|
185
210
|
integer_range ||= 1..@end_row
|
186
|
-
RobustExcelOle::Range.new(@ole_worksheet.Range(@ole_worksheet.Cells(integer_range.min, col), @ole_worksheet.Cells(integer_range.max, col)))
|
211
|
+
RobustExcelOle::Range.new(@ole_worksheet.Range(@ole_worksheet.Cells(integer_range.min, col), @ole_worksheet.Cells(integer_range.max, col)), self)
|
187
212
|
end
|
188
213
|
|
189
214
|
def == other_worksheet
|
data/robust_excel_ole.gemspec
CHANGED
data/spec/excel_spec.rb
CHANGED
@@ -35,6 +35,22 @@ module RobustExcelOle
|
|
35
35
|
rm_tmp(@dir)
|
36
36
|
end
|
37
37
|
|
38
|
+
context "active_workbook" do
|
39
|
+
|
40
|
+
before do
|
41
|
+
@excel = Excel.create
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should access the active workbook" do
|
45
|
+
@excel.active_workbook.should be nil
|
46
|
+
workbook = Workbook.open(@simple_file1)
|
47
|
+
active_workbook = @excel.active_workbook
|
48
|
+
active_workbook.Fullname.should == workbook.Fullname
|
49
|
+
active_workbook.should == workbook
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
38
54
|
context "with connect and preserving options" do
|
39
55
|
|
40
56
|
before do
|
data/spec/general_spec.rb
CHANGED
data/spec/range_spec.rb
CHANGED
@@ -18,20 +18,74 @@ describe RobustExcelOle::Range do
|
|
18
18
|
@book = Workbook.open(@dir + '/workbook.xls', :force_excel => :new)
|
19
19
|
@sheet = @book.sheet(2)
|
20
20
|
@range = RobustExcelOle::Range.new(@sheet.ole_worksheet.UsedRange.Rows(1))
|
21
|
+
@range2 = @sheet.range([1..2,1..3])
|
21
22
|
end
|
22
23
|
|
23
24
|
after do
|
24
|
-
@book.close
|
25
|
+
@book.close(:if_unsaved => :forget)
|
25
26
|
Excel.kill_all
|
26
27
|
rm_tmp(@dir)
|
27
28
|
end
|
28
29
|
|
30
|
+
describe "#[]" do
|
31
|
+
|
32
|
+
it "should yield a cell" do
|
33
|
+
@range[0].should be_kind_of RobustExcelOle::Cell
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should yield the value of the first cell" do
|
37
|
+
@range2[0].Value.should == 'simple'
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should cash the cells in the range" do
|
41
|
+
cell = @range2[0]
|
42
|
+
cell.v.should == 'simple'
|
43
|
+
@range2.Cells.Item(1).Value = 'foo'
|
44
|
+
cell.v.should == 'foo'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
29
48
|
describe "#each" do
|
49
|
+
|
30
50
|
it "items is RobustExcelOle::Cell" do
|
31
|
-
@
|
51
|
+
@range2.each do |cell|
|
32
52
|
cell.should be_kind_of RobustExcelOle::Cell
|
33
53
|
end
|
34
54
|
end
|
55
|
+
|
56
|
+
it "should work with [] doing cashing synchonized, from #[] to #each" do
|
57
|
+
i = 0
|
58
|
+
@range2.each do |cell|
|
59
|
+
cell.v.should == 'simple' if i == 0
|
60
|
+
cell.v.should == 'file' if i == 1
|
61
|
+
cell.v.should == 'sheet2' if i == 2
|
62
|
+
i += 1
|
63
|
+
end
|
64
|
+
@range2[0].Value = 'foo'
|
65
|
+
@range2[1].Value = 'bar'
|
66
|
+
@range2[2].Value = 'simple'
|
67
|
+
i = 0
|
68
|
+
@range2.each do |cell|
|
69
|
+
cell.v.should == 'foo' if i == 0
|
70
|
+
cell.v.should == 'bar' if i == 1
|
71
|
+
cell.v.should == 'simple' if i == 2
|
72
|
+
i += 1
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should work with [] doing cashing synchonized, from #each to #[]" do
|
77
|
+
@range2[0].Value.should == 'simple'
|
78
|
+
@range2[1].Value.should == 'file'
|
79
|
+
@range2[2].Value.should == 'sheet2'
|
80
|
+
i = 0
|
81
|
+
@range2.each do |cell|
|
82
|
+
cell.Value = 'foo' if i == 0
|
83
|
+
cell.Value = 'bar' if i == 1
|
84
|
+
cell.Value = 'simple' if i == 2
|
85
|
+
i += 1
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
35
89
|
end
|
36
90
|
|
37
91
|
describe "#values" do
|
data/spec/worksheet_spec.rb
CHANGED
@@ -295,6 +295,40 @@ describe Worksheet do
|
|
295
295
|
|
296
296
|
end
|
297
297
|
|
298
|
+
describe "#each_value" do
|
299
|
+
|
300
|
+
it "should yield arrays" do
|
301
|
+
@sheet.each_value do |row_value|
|
302
|
+
row_value.should be_kind_of Array
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
it "should read the rows" do
|
307
|
+
i = 0
|
308
|
+
@sheet.each_value do |row_values|
|
309
|
+
case i
|
310
|
+
when 0
|
311
|
+
row_values.should == ['foo', 'workbook', 'sheet1']
|
312
|
+
when 1
|
313
|
+
row_values.should == ['foo', nil, 'foobaaa']
|
314
|
+
end
|
315
|
+
i += 1
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
it "should read the rows with index" do
|
320
|
+
@sheet.each_value_with_index do |row_values, i|
|
321
|
+
case i
|
322
|
+
when 0
|
323
|
+
row_values.should == ['foo', 'workbook', 'sheet1']
|
324
|
+
when 1
|
325
|
+
row_values.should == ['foo', nil, 'foobaaa']
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
end
|
331
|
+
|
298
332
|
describe "#each_row" do
|
299
333
|
it "items should RobustExcelOle::Range" do
|
300
334
|
@sheet.each_row do |rows|
|
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.18'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- traths
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-05-
|
11
|
+
date: 2020-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -34,7 +34,8 @@ description: "RobustExcelOle helps controlling Excel. \n This
|
|
34
34
|
email:
|
35
35
|
- Thomas.Raths@gmx.net
|
36
36
|
executables: []
|
37
|
-
extensions:
|
37
|
+
extensions:
|
38
|
+
- extconf.rb
|
38
39
|
extra_rdoc_files:
|
39
40
|
- README.rdoc
|
40
41
|
- LICENSE
|
@@ -55,6 +56,7 @@ files:
|
|
55
56
|
- docs/README_ranges.rdoc
|
56
57
|
- docs/README_save_close.rdoc
|
57
58
|
- docs/README_sheet.rdoc
|
59
|
+
- examples/example_ruby_library.rb
|
58
60
|
- examples/introductory_examples/example_introductory.rb
|
59
61
|
- examples/introductory_examples/example_open.rb
|
60
62
|
- examples/introductory_examples/example_range.rb
|
@@ -81,6 +83,7 @@ files:
|
|
81
83
|
- examples/open_save_close/example_reuse.rb
|
82
84
|
- examples/open_save_close/example_simple.rb
|
83
85
|
- examples/open_save_close/example_unobtrusively.rb
|
86
|
+
- extconf.rb
|
84
87
|
- jreo.bat
|
85
88
|
- lib/jreo_console.rb
|
86
89
|
- lib/reo_console.rb
|
@@ -96,6 +99,7 @@ files:
|
|
96
99
|
- lib/robust_excel_ole/range_owners.rb
|
97
100
|
- lib/robust_excel_ole/robustexcelole.sublime-project
|
98
101
|
- lib/robust_excel_ole/robustexcelole.sublime-workspace
|
102
|
+
- lib/robust_excel_ole/vba_objects.rb
|
99
103
|
- lib/robust_excel_ole/version.rb
|
100
104
|
- lib/robust_excel_ole/workbook.rb
|
101
105
|
- lib/robust_excel_ole/worksheet.rb
|