excelgrip 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 46b0f4cce294025f901a90db691d4b404f1409c1
4
+ data.tar.gz: bed79d72b0b89e9bc32c77dc9f6bf3e18e89f3e5
5
+ SHA512:
6
+ metadata.gz: 67feb7837e2707b358409bd111d2a08e45e90c2de0de3a5740a20704242ef09f8a965a11851b00ef5869dbb8d580d1086d6c0510e774c01badd8cd76946289ea
7
+ data.tar.gz: a2e875ca9560e730bcc5e849851238141ba92889e732321d2c80c79eeb3b2ea3640e6d6e0b870a89632490a4dc210078328479c58c552f39e84b1e1524313db2
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in excelgrip.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 yac4423
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 yac4423
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,174 @@
1
+ # Excelgrip
2
+ Excelgrip is Ruby library to handle all Excel classes.
3
+ * Windows Only
4
+ * Necessary Microsoft Excel
5
+
6
+ ## Installation
7
+ # gem install excelgrip
8
+
9
+ = Usage
10
+ require 'excelgrip'
11
+ excel = Excelgrip::Excel.new
12
+ book = excel.open_book("./sample.xls")
13
+ sheet = book.sheets(1)
14
+ puts sheet["A1:B1"].value
15
+ sheet["A1:B1"].value = ["TEST", "Yap"]
16
+
17
+ = Documentation
18
+ In RubyDoc.Info, all Excelgrip classes are listed.
19
+ http://rubydoc.info/gems/excelgrip/
20
+
21
+ == Excelgrip::GripWrapper
22
+ Base class of all Excelgrip classes.
23
+ This class wraps a various Excel objects.
24
+ === Methods
25
+ [raw]
26
+ Return raw Excel object which is wrapped by Excelgrip object.
27
+
28
+ == Excelgrip::Excel class
29
+ Wrap Excel object to get all classes of Excel class library.
30
+ excel = Excelgrip::Excel.new
31
+ book = excel.open_book("./sample.xls") # Workbook
32
+ sheet = book.sheets(1) # Worksheet
33
+ range = sheet["A1:B1"] # Range
34
+ === Additional Methods
35
+ [open_book(filename)]
36
+ Open excel file. Return Workbook object. Modify workbook and save it, overwrite the excel file.
37
+ [copy_book(filename)]
38
+ Open excel file as a template file. Return Workbook object.
39
+ If you modify workbook and save, the excel file is not change.
40
+ [workbooks(index=nil)]
41
+ Return the workbook object specified by index.
42
+ When omit index, return Workbooks object.
43
+
44
+ == Excelgrip::Workbooks
45
+ Wrap Workbooks object to to use all properties and methods of Workbooks class.
46
+ [[index]]
47
+ Return the workbook object specified by index.
48
+ [size]
49
+ Return count of Workbook objects opened by Excel.
50
+ [each {|workbook| block}]
51
+ Calls the given block for each Workbook object in Excel.
52
+ excel.workbooks.each {|book|
53
+ p book
54
+ }
55
+
56
+ == Excelgrip::Workbook
57
+ Wrap Workbook object to to use all properties and methods of Workbook class.
58
+ [[sheetname]]
59
+ Return the worksheet object specified by sheetname in the book.
60
+ [worksheets(index=nil)]
61
+ Return the worksheet object specified by index.
62
+ When omit index, return Worksheets object.
63
+
64
+ sheets() is alias of worksheets().
65
+ [add_sheet(source_sheet)]
66
+ Add new worksheet which is copy of source_sheet.
67
+ [save(filename)]
68
+ Save the workbook to file.
69
+ [each_sheet {|sheet| block}]
70
+ Calls the given block for each Worksheet object in the Workbook.
71
+ book = excel.copy_book("./sample.xls")
72
+ book.each_sheet {|sheet|
73
+ p sheet.name
74
+ }
75
+
76
+ === Excelgrip::Worksheets
77
+ Wrap Worksheets object to to use all properties and methods of Worksheets class.
78
+ [[index]]
79
+ Return Worksheet object specified by index.
80
+ [size]
81
+ Return count of Worksheet.
82
+ [each {|worksheet| block}]
83
+ Calls the given block for each Worksheet object in Worksheets.
84
+ book.worksheets.each {|book|
85
+ p book
86
+ }
87
+
88
+
89
+ == Excelgrip::Worksheet
90
+ Wrap Worksheet object to to use all properties and methods of Worksheet class.
91
+ [range(rangename)]
92
+ Return Range object specified by rangename.
93
+ (ex)
94
+ * sheet.range("A1")
95
+ * sheet.range("A1:N1")
96
+ * sheet.range("Title") # "Title" is a name of cell.
97
+ [range(cell1, cell2)]
98
+ Return Range object between cell1 and cell2.
99
+ (ex)
100
+ cell1=sheet.range("A1")
101
+ cell2=sheet.range("N1")
102
+ sheet.range(cell1, cell2)
103
+ [cells(v_pos, h_pos)]
104
+ Return Range object that location is (v_pos, h_pos). The upper left cell is cells(1, 1).
105
+ [[rangename]]
106
+ Return Range object specified by rangename.
107
+ range01 = sheet["A1:N1"]
108
+ [name]
109
+ Name of this sheet.
110
+
111
+ == Excelgrip::Range
112
+ Wrap Range ojject to use all properties and methods of Range class.
113
+ [value]
114
+ Return the value of the cell. When this Range object is composed by multi cells, this method return Array of values.
115
+ [text]
116
+ Alias of value method.
117
+ [value=]
118
+ Modify value of this cell. When this Range object is composed by multi cells, set Array to modify multi cells at once.
119
+ [name]
120
+ Return name of this cell or cells.
121
+ [v_pos]
122
+ Return virtical position of this cell or cells.
123
+ [h_pos]
124
+ Return horizontal position of this cell or cells.
125
+ [position]
126
+ Return virtical and horizontal position of this cell or cells.
127
+ [v_size]
128
+ Return virtical count of cells in the Range.
129
+ [h_size]
130
+ Return horizontal count of cells in the Range.
131
+ [meage]
132
+ Meage cells in the Rage.
133
+ [unmeage]
134
+ Unmeage cells in the Range.
135
+ [meagearea]
136
+ Returns a Range object that represents the merged range containing the specified cell.
137
+ [cells(v_pos, h_pos)]
138
+ Returns a Range object that represents the cells in my range.
139
+ The upper left cell of my Range is self.cells(1, 1).
140
+ [each_range {|cell| block}]
141
+ Calls the given block for each sub Range object in my Range.
142
+ (ex)
143
+ target_range = sheet["A1:N1"]
144
+ target_range.each {|cell|
145
+ p cell.value
146
+ }
147
+ [==(other_range)]
148
+ Compare other range object to my range object based on position.
149
+ [include?(other_range)]
150
+ Check the other range is contained in my range.
151
+ [insert_here(shift)]
152
+ Copy my Range in the sheet. "shift" specify the direction to move. Excel::XlShiftToRight or Excel::XlShiftDown.
153
+ When shift is nil, direction is automatically determined.
154
+ [delete(shift)]
155
+ Delete my Range in the sheet. "shift" specify the direction to move after delete my Range.
156
+ Excel::XlShiftToRight or Excel::XlShiftDown.
157
+ When shift is nil, direction is automatically determined.
158
+ [get_cursor]
159
+ Return RangeCursor ofject of my Range object.
160
+
161
+ == Excelgrip::RangeCursor
162
+ Sub Class of Range class. RangeCursor is movable Range.
163
+ [h_move(offset)]
164
+ Move cell to horizontal direction. Merged cells is counted one cell.
165
+ [v_move(offset)]
166
+ Move cell to virtical direction. Merged cells is counted one cell.
167
+ [delete(shift)]
168
+ Delete my Range in the sheet. "shift" specify the direction to move after delete my Range.
169
+
170
+ = Author
171
+ notesgrip@tech-notes.dyndns.org
172
+
173
+ = License
174
+ MIT
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
data/excelgrip.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'excelgrip/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "excelgrip"
8
+ spec.version = Excelgrip::VERSION
9
+ spec.authors = ["yac4423"]
10
+ spec.email = ["excelgrip@tech-notes.dyndns.org"]
11
+ spec.summary = %q{Control Excel from Ruby Script.}
12
+ spec.description = %q{Control Excel from Ruby Script.}
13
+ spec.homepage = "https://github.com/yac4423/excelgrip"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ end
@@ -0,0 +1,54 @@
1
+ module Excelgrip
2
+ class GripWrapper
3
+ def initialize(raw_object)
4
+ if raw_object.methods.include?("raw")
5
+ @raw_object = raw_object.raw
6
+ else
7
+ @raw_object = raw_object
8
+ end
9
+ end
10
+
11
+ def raw
12
+ @raw_object
13
+ end
14
+
15
+ def inspect()
16
+ "<#{self.class}>"
17
+ end
18
+
19
+ private
20
+
21
+ OLE_METHODS = [:Type, :Initialize]
22
+ def method_missing(m_id, *params)
23
+ unless OLE_METHODS.include?(m_id)
24
+ missing_method_name = m_id.to_s.downcase
25
+ methods.each {|method|
26
+ if method.to_s.downcase == missing_method_name
27
+ return send(method, *params)
28
+ end
29
+ }
30
+ end
31
+ # Undefined Method is throwed to raw_object
32
+ begin
33
+ @raw_object.send(m_id, *params)
34
+ rescue
35
+ raise $!,$!.message, caller
36
+ end
37
+ end
38
+
39
+ def toRaw(target_obj)
40
+ target_obj.respond_to?("raw") ? target_obj.raw : target_obj
41
+ end
42
+ end
43
+
44
+ class FileSystemObject
45
+ include Singleton
46
+ def initialize
47
+ @body = WIN32OLE.new('Scripting.FileSystemObject')
48
+ end
49
+
50
+ def fullpath(filename)
51
+ @body.getAbsolutePathName(filename)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,3 @@
1
+ module Excelgrip
2
+ VERSION = "0.0.2"
3
+ end
data/lib/excelgrip.rb ADDED
@@ -0,0 +1,463 @@
1
+ #!ruby -Ks
2
+
3
+ # ExcelGrip Ver.0.00 2014/9/21
4
+ # Copyright (C) 2014 Yac <excelgrip@tech-notes.dyndns.org>
5
+ # This software is released under the MIT License, see LICENSE.txt.
6
+ require 'win32ole'
7
+ require 'singleton'
8
+ require 'excelgrip/version'
9
+ require 'excelgrip/GripWrapper'
10
+
11
+ module Excelgrip
12
+ # ====================================================
13
+ # ============= Excel Application Class ==============
14
+ # ====================================================
15
+ class Excel < GripWrapper
16
+ def initialize(visible=true)
17
+ @raw_object = WIN32OLE.new('EXCEL.Application')
18
+ WIN32OLE.const_load(@raw_object, Excel)
19
+ @raw_object.visible = visible
20
+ @raw_object.displayAlerts = false
21
+ end
22
+
23
+ def copy_book(template_filename = nil)
24
+ if (template_filename == nil) or (template_filename == "") then
25
+ workbook = @raw_object.Workbooks.add
26
+ else
27
+ fullpath = FileSystemObject.instance.fullpath(template_filename)
28
+ workbook = @raw_object.workbooks.add(fullpath)
29
+ end
30
+ Workbook.new(workbook)
31
+ end
32
+
33
+ def open_book(filename)
34
+ fullpath = FileSystemObject.instance.fullpath(filename)
35
+ workbook = @raw_object.workbooks.open({'filename'=> fullpath})
36
+ Workbook.new(workbook)
37
+ end
38
+
39
+ def workbooks(index=nil)
40
+ if index
41
+ Workbook.new(@raw_object.Workbooks(index))
42
+ else
43
+ Workbooks.new(@raw_object.Workbooks)
44
+ end
45
+ end
46
+
47
+ def quit
48
+ @raw_object.Quit
49
+ @raw_object = nil
50
+ undef_my_method()
51
+ end
52
+ end
53
+ # ========================================================
54
+ # ============ Workbook Collection Class =================
55
+ # ========================================================
56
+ class Workbooks < GripWrapper
57
+ def item(index=nil)
58
+ Workbook.new(@raw_object.item(index))
59
+ end
60
+
61
+ def [](index)
62
+ Workbook.new(@raw_object.item(index))
63
+ end
64
+
65
+ def size
66
+ @raw_object.count
67
+ end
68
+
69
+ def each
70
+ @raw_object.each {|raw_workbook|
71
+ yield(Workbook.new(raw_workbook))
72
+ }
73
+ end
74
+
75
+ end
76
+
77
+ # ========================================================
78
+ # ============ Worksheet Collection Class ================
79
+ # ========================================================
80
+ class Worksheets < GripWrapper
81
+ def [](index)
82
+ raw_worksheet = @raw_object.item(index)
83
+ raw_worksheet.Activate
84
+ Worksheet.new(raw_worksheet)
85
+ end
86
+
87
+ alias item []
88
+
89
+ def size
90
+ @raw_object.count
91
+ end
92
+
93
+ def each
94
+ @raw_object.each {|raw_worksheet|
95
+ raw_worksheet.Activate
96
+ yield(Worksheet.new(raw_worksheet))
97
+ }
98
+ end
99
+ end
100
+
101
+ # =============================================
102
+ # ============ Workbook Class =================
103
+ # =============================================
104
+ class Workbook < GripWrapper
105
+ def [](sheet_name)
106
+ raw_worksheet = @raw_object.Worksheets(sheet_name)
107
+ raw_worksheet.Activate
108
+ Worksheet.new(raw_worksheet)
109
+ end
110
+
111
+ alias open_sheet []
112
+
113
+ def worksheets(index=nil)
114
+ if index
115
+ self[index]
116
+ else
117
+ Worksheets.new(@raw_object.worksheets)
118
+ end
119
+ end
120
+
121
+ alias sheets worksheets
122
+
123
+ def add_sheet(source_sheet)
124
+ last_sheet_no = @raw_object.worksheets.count
125
+ source_sheet.copy({'after' => @raw_object.worksheets(last_sheet_no)})
126
+ raw_worksheet = @raw_object.sheets(last_sheet_no + 1)
127
+ Worksheet.new(raw_worksheet)
128
+ end
129
+
130
+ def save(filename)
131
+ fullpath = FileSystemObject.instance.fullpath(filename)
132
+ @raw_object.saveAs({'filename'=>fullpath})
133
+ end
134
+
135
+ def each_sheet
136
+ @raw_object.worksheets.each {|raw_worksheet|
137
+ raw_worksheet.Activate
138
+ yield Worksheet.new(raw_worksheet)
139
+ }
140
+ end
141
+
142
+ def parent
143
+ @raw_object.parent
144
+ end
145
+
146
+ def close
147
+ @raw_object.Close
148
+ @raw_object = nil
149
+ undef_my_method()
150
+ end
151
+ end
152
+
153
+ # =============================================
154
+ # ============== Worksheet Class ==============
155
+ # =============================================
156
+ class Worksheet < GripWrapper
157
+ def range(cell_1, cell_2=nil)
158
+ if cell_1.class == String
159
+ begin
160
+ raw_range = @raw_object.range(cell_1)
161
+ rescue WIN32OLERuntimeError
162
+ raise $!,$!.message, caller
163
+ end
164
+ else
165
+ raw_range = @raw_object.range(cell_1.raw, cell_2.raw)
166
+ end
167
+ Range.new(raw_range)
168
+ end
169
+
170
+ def cells(v_pos, h_pos)
171
+ begin
172
+ raw_range = @raw_object.Cells(v_pos, h_pos)
173
+ rescue WIN32OLERuntimeError
174
+ raise $!,$!.message, caller
175
+ end
176
+ Range.new(raw_range)
177
+ end
178
+
179
+ def [](cell_1)
180
+ begin
181
+ range(cell_1)
182
+ rescue WIN32OLERuntimeError
183
+ raise $!,$!.message, caller
184
+ end
185
+ end
186
+
187
+ def delete
188
+ @raw_object.delete
189
+ @raw_object = nil
190
+ undef_my_method()
191
+ end
192
+
193
+ def name=(sheet_name)
194
+ @raw_object.name = sheet_name
195
+ end
196
+
197
+ def parent
198
+ Workbook.new(@raw_object.parent)
199
+ end
200
+ end
201
+
202
+ # =========================================
203
+ # ============== Range Class ==============
204
+ # =========================================
205
+ class Range < GripWrapper
206
+ # Return value of cell.
207
+ # If range contains multi cells, return Array of value.
208
+ def value
209
+ if (h_size() == 1) and (v_size() == 1)
210
+ return @raw_object.value
211
+ end
212
+
213
+ return_arr = []
214
+ self.each_range {|inner_range|
215
+ return_arr.push inner_range.raw.value
216
+ }
217
+ if return_arr.size == 1
218
+ return return_arr[0]
219
+ else
220
+ return return_arr
221
+ end
222
+ end
223
+ alias text value
224
+
225
+
226
+ def value=(text)
227
+ if text.class == Array
228
+ text_arr = text.dup
229
+ else
230
+ text_arr = [text]
231
+ end
232
+
233
+ self.each_range {|inner_range|
234
+ inner_range.raw.value = text_arr.shift
235
+ }
236
+ end
237
+ alias text= value=
238
+
239
+ def name
240
+ book = parent.parent
241
+ name_list = book.names
242
+ name_list.each {|name_obj|
243
+ # puts "*** name_obj.name = #{name_obj.name}"
244
+ if Range.new(name_obj.RefersToRange) == self
245
+ return name_obj.name
246
+ end
247
+ }
248
+ @raw_object.Address("RowAbsolute"=>false, "ColumnAbsolute"=>false, "ReferenceStyle"=>Excel::XlA1)
249
+ end
250
+
251
+ def name=(range_name)
252
+ sheet = parent
253
+ book = sheet.parent
254
+ a1_address = @raw_object.Address("ReferenceStyle"=>Excel::XlA1)
255
+ # puts "*** Range.name=#{range_name}, address=#{a1_address}"
256
+ book.names.Add("Name"=>range_name, "RefersToLocal"=>"=#{sheet.name}!#{a1_address}")
257
+
258
+ end
259
+
260
+ def v_pos()
261
+ @raw_object.row
262
+ end
263
+
264
+ def h_pos()
265
+ @raw_object.column
266
+ end
267
+
268
+ def position()
269
+ [@raw_object.row, @raw_object.column]
270
+ end
271
+
272
+ def v_size
273
+ @raw_object.rows.count
274
+ end
275
+
276
+ def h_size
277
+ @raw_object.columns.count
278
+ end
279
+
280
+ def merge()
281
+ orig_name = name()
282
+ @raw_object.Merge()
283
+ Range.new(@raw_object)
284
+ end
285
+
286
+ def unmerge()
287
+ top_cell = @raw_object.cells(1,1)
288
+ @raw_object.UnMerge()
289
+ Range.new(top_cell)
290
+ end
291
+
292
+ def mergearea()
293
+ Range.new(@raw_object.MergeArea)
294
+ end
295
+
296
+
297
+
298
+ def cells(v_pos, h_pos)
299
+ Range.new(@raw_object.cells(v_pos, h_pos))
300
+ end
301
+
302
+ def inspect()
303
+ return self.class unless @raw_object
304
+ if (v_size > 1) or (h_size > 1)
305
+ "Range:((V:#{v_pos},H:#{h_pos})-(V:#{v_pos+v_size-1},H:#{h_pos+h_size-1}))"
306
+ else
307
+ "Range:(V:#{v_pos},H:#{h_pos})"
308
+ end
309
+ end
310
+
311
+ def each_range()
312
+ my_h_size = h_size()
313
+ my_v_size = v_size()
314
+
315
+ merge_range_array = []
316
+
317
+ my_v_size.times {|v_offset|
318
+ my_h_size.times {|h_offset|
319
+ target_cell = Range.new(@raw_object.cells(v_offset+1, h_offset+1))
320
+ if target_cell.MergeCells
321
+ if operation_finished?(merge_range_array,target_cell)
322
+ # skip
323
+ else
324
+ merge_range_array.push target_cell.mergeArea
325
+ yield(target_cell.mergeArea.cells(1,1))
326
+ end
327
+ else
328
+ yield(target_cell)
329
+ end
330
+ }
331
+ }
332
+ end
333
+
334
+
335
+
336
+ def ==(other_range)
337
+ return false unless other_range.methods.include?("position")
338
+ if (position() == other_range.position()) and
339
+ (h_size() == other_range.h_size) and (v_size() == other_range.v_size)
340
+ return true
341
+ end
342
+ return false
343
+ end
344
+
345
+ def include?(inner_range)
346
+ my_v_pos, my_h_pos = position()
347
+ my_v_size = v_size()
348
+ my_h_size = h_size()
349
+ my_h_range = my_h_pos..(my_h_pos+my_h_size-1)
350
+ my_v_range = my_v_pos..(my_v_pos+my_v_size-1)
351
+
352
+ inner_v_pos, inner_h_pos = inner_range.position()
353
+ inner_v_size = inner_range.v_size()
354
+ inner_h_size = inner_range.h_size()
355
+ if ( my_h_range.include?(inner_h_pos) and my_h_range.include?(inner_h_pos+inner_h_size-1) and
356
+ my_v_range.include?(inner_v_pos) and my_v_range.include?(inner_v_pos+inner_v_size-1))
357
+ return true
358
+ else
359
+ return false
360
+ end
361
+
362
+
363
+ end
364
+
365
+ # shift = Excel::XlShiftToRight or Excel::XlShiftDown
366
+ def insert_here(shift=nil)
367
+ @raw_object.copy
368
+ if shift then
369
+ @raw_object.insert({'shift'=>shift})
370
+ else
371
+ @raw_object.insert # Auto Shift
372
+ end
373
+ self
374
+ end
375
+
376
+ # shift = Excel::XlShiftToLeft or Excel::XlShiftUp
377
+ def delete(shift=nil)
378
+ if shift then
379
+ @raw_object.delete({'shift'=>shift})
380
+ else
381
+ @raw_object.delete # Auto Shift
382
+ end
383
+ @raw_object = nil
384
+ undef_my_method()
385
+ end
386
+
387
+ def parent
388
+ Worksheet.new(@raw_object.parent)
389
+ end
390
+
391
+ def get_cursor()
392
+ RangeCursor.new(self)
393
+ end
394
+ alias get_cursol get_cursor # Compativirity old excel_lib. I missed the spell of "cursor".
395
+
396
+ private
397
+ def operation_finished?(merge_range_array,target_cell)
398
+ merge_range_array.each {|merge_range|
399
+ if merge_range.include?(target_cell)
400
+ return true
401
+ end
402
+ }
403
+ return false
404
+ end
405
+ end
406
+
407
+ # ===============================================
408
+ # ============== RangeCursor Class ==============
409
+ # ===============================================
410
+ class RangeCursor < Range
411
+ def h_move(offset)
412
+ return(self) if offset == 0
413
+ sheet = @raw_object.parent
414
+ sign = (offset.abs / offset) # +1 or -1
415
+ offset.abs.times do
416
+ v_pos, h_pos = position()
417
+ h_pos += (h_size() * sign)
418
+ h_pos = 1 if h_pos < 1
419
+ next_top_cell = sheet.cells(v_pos,h_pos)
420
+ next_bottom_cell = sheet.cells(v_pos + v_size() - 1, h_pos + h_size() -1)
421
+ next_range = sheet.range(next_top_cell, next_bottom_cell)
422
+ @raw_object = next_range
423
+ end
424
+
425
+ self.activate
426
+ self
427
+ end
428
+
429
+ def v_move(offset)
430
+ return(self) if offset == 0
431
+ sheet = @raw_object.parent
432
+ sign = (offset.abs / offset) # +1 or -1
433
+ offset.abs.times do
434
+ v_pos, h_pos = position()
435
+ v_pos += (v_size() * sign)
436
+ v_pos = 1 if v_pos < 1
437
+ next_top_cell = sheet.cells(v_pos, h_pos)
438
+ next_bottom_cell = sheet.cells(v_pos + v_size() - 1, h_pos + h_size() -1)
439
+ next_range = sheet.range(next_top_cell, next_bottom_cell)
440
+ @raw_object = next_range
441
+ end
442
+ self.activate
443
+ self
444
+ end
445
+
446
+ # return Excel::Range object
447
+ def range()
448
+ @raw_object
449
+ end
450
+ alias parent range
451
+
452
+ #undef delete
453
+ def delete(shift=nil)
454
+ range_name = @raw_object.name
455
+ parent_sheet = @raw_object.parent
456
+ @raw_object.delete(shift)
457
+ @raw_object = parent_sheet.range(range_name)
458
+ end
459
+
460
+ end
461
+
462
+ end
463
+
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: excelgrip
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - yac4423
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ description: Control Excel from Ruby Script.
42
+ email:
43
+ - excelgrip@tech-notes.dyndns.org
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - .gitignore
49
+ - Gemfile
50
+ - LICENSE
51
+ - LICENSE.txt
52
+ - README.rdoc
53
+ - Rakefile
54
+ - excelgrip.gemspec
55
+ - lib/excelgrip.rb
56
+ - lib/excelgrip/GripWrapper.rb
57
+ - lib/excelgrip/version.rb
58
+ homepage: https://github.com/yac4423/excelgrip
59
+ licenses:
60
+ - MIT
61
+ metadata: {}
62
+ post_install_message:
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubyforge_project:
78
+ rubygems_version: 2.0.14
79
+ signing_key:
80
+ specification_version: 4
81
+ summary: Control Excel from Ruby Script.
82
+ test_files: []