robust_excel_ole 0.2.0.8 → 0.2.1
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.
- data/README.rdoc +47 -61
- data/examples/open_save_close/example_control_to_excel.rb +40 -0
- data/examples/open_save_close/example_if_obstructed_closeifsaved.rb +33 -0
- data/examples/open_save_close/example_if_obstructed_forget.rb +30 -0
- data/examples/open_save_close/example_if_obstructed_save.rb +31 -0
- data/examples/open_save_close/example_if_unsaved_accept.rb +38 -0
- data/examples/open_save_close/example_if_unsaved_forget.rb +34 -0
- data/examples/open_save_close/example_read_only.rb +27 -0
- data/examples/open_save_close/example_reuse.rb +31 -0
- data/examples/open_save_close/example_simple.rb +30 -0
- data/examples/print_cells/example_print_cells.rb +43 -0
- data/examples/save_sheets/example_save_sheets.rb +30 -0
- data/lib/robust_excel_ole/book.rb +36 -27
- data/lib/robust_excel_ole/excel_app.rb +7 -7
- data/lib/robust_excel_ole/version.rb +1 -1
- data/robust_excel_ole.gemspec +1 -0
- data/spec/book_spec.rb +46 -23
- data/spec/data/book_with_blank.xls +0 -0
- data/spec/data/different_simple.xls +0 -0
- data/spec/data/simple.xls +0 -0
- data/spec/excel_app_spec.rb +24 -12
- data/version.rb +1 -5
- metadata +20 -18
- data/examples/example1.rb +0 -38
- data/examples/example2.rb +0 -33
- data/examples/example3.rb +0 -32
- data/examples/example4.rb +0 -29
- data/examples/example5.rb +0 -35
- data/examples/example6.rb +0 -34
- data/examples/example7.rb +0 -41
- data/examples/example8.rb +0 -32
- data/examples/example9.rb +0 -13
- data/lib/robust_excel_ole/sp +0 -3
@@ -0,0 +1,43 @@
|
|
1
|
+
# example 1: open a book, print the cells, rows, and columns of a sheet
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), '../../lib/robust_excel_ole')
|
4
|
+
|
5
|
+
require File.join(File.dirname(__FILE__), '../../spec/spec_helper')
|
6
|
+
|
7
|
+
require "fileutils"
|
8
|
+
|
9
|
+
include RobustExcelOle
|
10
|
+
|
11
|
+
ExcelApp.close_all
|
12
|
+
begin
|
13
|
+
#dir = 'C:/'
|
14
|
+
dir = create_tmpdir
|
15
|
+
simple_file = dir + 'simple.xls'
|
16
|
+
simple_save_file = dir + 'simple_save.xls'
|
17
|
+
File.delete simple_save_file rescue nil
|
18
|
+
book = Book.open(simple_file)
|
19
|
+
sheet = book[0]
|
20
|
+
cell = sheet[0,0]
|
21
|
+
i = 0
|
22
|
+
sheet.each do |cell|
|
23
|
+
i = i + 1
|
24
|
+
puts "#{i}. cell: #{cell.value}"
|
25
|
+
end
|
26
|
+
i = 0
|
27
|
+
sheet.each_row do |row|
|
28
|
+
i = i + 1
|
29
|
+
puts "#{i}. row: #{row.value}"
|
30
|
+
end
|
31
|
+
i = 0
|
32
|
+
sheet.each_column do |column|
|
33
|
+
i = i + 1
|
34
|
+
puts "#{i}. column: #{column.value}"
|
35
|
+
end
|
36
|
+
sheet[0,0] = "complex"
|
37
|
+
book.save
|
38
|
+
book.close
|
39
|
+
ensure
|
40
|
+
ExcelApp.close_all
|
41
|
+
end
|
42
|
+
|
43
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# example 11: save the sheets of a book as separate books
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), '../../lib/robust_excel_ole')
|
4
|
+
|
5
|
+
require "fileutils"
|
6
|
+
|
7
|
+
include RobustExcelOle
|
8
|
+
|
9
|
+
ExcelApp.close_all
|
10
|
+
begin
|
11
|
+
dir = 'C:/'
|
12
|
+
file_name = dir + 'book_with_blank.xls'
|
13
|
+
book = Book.open(file_name) # open a book
|
14
|
+
ExcelApp.reuse.Visible = true # make Excel visible
|
15
|
+
# 1. Bücher erstmal speichern, um sie öffnen zu können
|
16
|
+
i = 0
|
17
|
+
book.each do |sheet|
|
18
|
+
i = i + 1
|
19
|
+
puts "#{i}. sheet:"
|
20
|
+
file_name_sheet = file_name + "_sheet#{i}.xls"
|
21
|
+
puts "file_name_sheet: #{file_name_sheet}"
|
22
|
+
book.save_as(file_name_sheet)
|
23
|
+
end
|
24
|
+
# generate empty book
|
25
|
+
# book_sheet = ExcelApp.Workbooks.Add
|
26
|
+
|
27
|
+
ensure
|
28
|
+
ExcelApp.close_all # close workbooks, quit Excel application
|
29
|
+
end
|
30
|
+
|
@@ -12,23 +12,24 @@ module RobustExcelOle
|
|
12
12
|
# opens a book.
|
13
13
|
#
|
14
14
|
# options:
|
15
|
-
# :
|
16
|
-
# :read_only (boolean) open in read-only mode (default: false)
|
17
|
-
# :displayalerts (boolean) allow display alerts in Excel (default: false)
|
18
|
-
# :visible (boolean) make visibe in Excel (default: false)
|
15
|
+
# :read_only open in read-only mode (default: false)
|
19
16
|
# :if_unsaved if an unsaved book with the same name is open, then
|
20
|
-
# :raise -> raise an exception
|
17
|
+
# :raise -> raise an exception (default)
|
21
18
|
# :forget -> close the unsaved book, open the new book
|
22
19
|
# :accept -> let the unsaved book open
|
23
20
|
# :excel -> give control to excel
|
24
21
|
# :new_app -> open the new book in a new excel application
|
25
|
-
# :
|
26
|
-
# :raise
|
27
|
-
# :forget
|
28
|
-
# :
|
29
|
-
# :
|
30
|
-
#
|
31
|
-
# :new_app
|
22
|
+
# :if_obstructed if a book with the same name in a different path is open, then
|
23
|
+
# :raise -> raise an exception (default)
|
24
|
+
# :forget -> close the old book, open the new book
|
25
|
+
# :save -> save the old book, close it, open the new book
|
26
|
+
# :close_if_saved -> close the old book and open the new book, if the old book is saved
|
27
|
+
# raise an exception otherwise
|
28
|
+
# :new_app -> open the new book in a new excel application
|
29
|
+
# :reuse use a running Excel-application (default: true)
|
30
|
+
# :excel_app an Excel application (default: nil)
|
31
|
+
# :displayalerts allow display alerts in Excel (default: false)
|
32
|
+
# :visible make visibe in Excel (default: false)
|
32
33
|
def open(file, options={ :reuse => true}, &block)
|
33
34
|
new(file, options, &block)
|
34
35
|
end
|
@@ -38,31 +39,33 @@ module RobustExcelOle
|
|
38
39
|
def initialize(file, opts={ }, &block)
|
39
40
|
@options = {
|
40
41
|
:reuse => true,
|
42
|
+
:excel_app => nil,
|
41
43
|
:read_only => false,
|
42
44
|
:if_unsaved => :raise,
|
43
|
-
:
|
45
|
+
:if_obstructed => :raise
|
44
46
|
}.merge(opts)
|
45
47
|
excel_app_options = {:reuse => true}.merge(opts).delete_if{|k,v|
|
46
|
-
k== :read_only || k== :if_unsaved || k == :
|
48
|
+
k== :read_only || k== :if_unsaved || k == :if_obstructed}
|
47
49
|
if not File.exist?(file)
|
48
50
|
raise ExcelErrorOpen, "file #{file} not found"
|
49
51
|
end
|
50
|
-
@excel_app = ExcelApp.new(excel_app_options)
|
52
|
+
@excel_app = @options[:excel_app] ? @options[:excel_app] : ExcelApp.new(excel_app_options)
|
51
53
|
workbooks = @excel_app.Workbooks
|
52
54
|
@workbook = workbooks.Item(File.basename(file)) rescue nil
|
53
55
|
if @workbook then
|
54
|
-
|
55
|
-
|
56
|
-
if
|
57
|
-
|
56
|
+
obstructed_by_other_book = (File.basename(file) == File.basename(@workbook.Fullname)) &&
|
57
|
+
(not (absolute_path(file) == @workbook.Fullname))
|
58
|
+
if obstructed_by_other_book then
|
59
|
+
# @workbook is not the desired workbook
|
60
|
+
case @options[:if_obstructed]
|
58
61
|
when :raise
|
59
62
|
raise ExcelErrorOpen, "blocked by a book with the same name in a different path"
|
60
63
|
when :forget
|
61
64
|
@workbook.Close
|
62
|
-
when :
|
65
|
+
when :save
|
63
66
|
save unless @workbook.Saved
|
64
67
|
@workbook.Close
|
65
|
-
when :
|
68
|
+
when :close_if_saved
|
66
69
|
if (not @workbook.Saved) then
|
67
70
|
raise ExcelErrorOpen, "book with the same name in a different path is unsaved"
|
68
71
|
else
|
@@ -73,10 +76,10 @@ module RobustExcelOle
|
|
73
76
|
@excel_app = ExcelApp.new(excel_app_options)
|
74
77
|
@workbook = nil
|
75
78
|
else
|
76
|
-
raise ExcelErrorOpen, ":
|
79
|
+
raise ExcelErrorOpen, ":if_obstructed: invalid option"
|
77
80
|
end
|
78
81
|
else
|
79
|
-
# book open, not saved, not
|
82
|
+
# book open, not saved, not obstructed by an other book
|
80
83
|
if (not @workbook.Saved) then
|
81
84
|
#p "book not saved"
|
82
85
|
case @options[:if_unsaved]
|
@@ -221,13 +224,19 @@ module RobustExcelOle
|
|
221
224
|
case opts[:if_exists]
|
222
225
|
when :overwrite
|
223
226
|
# if a book is open with the name of file, then raise error
|
224
|
-
|
225
|
-
#
|
226
|
-
|
227
|
+
# bräuchte alle Excel-Applikationen.
|
228
|
+
# mit ExcelApp.reuse bzw. running_app bzw. connect bekomme ich nur die 1. Excel-Applikation
|
229
|
+
#open_workbook = ExcelApp.reuse.Workbooks(basename) rescue nil
|
230
|
+
begin
|
227
231
|
File.delete(file)
|
228
|
-
|
232
|
+
rescue
|
229
233
|
raise ExcelErrorSave, "book is open and used in Excel"
|
230
234
|
end
|
235
|
+
#if open_workbook == nil then
|
236
|
+
# File.delete(file)
|
237
|
+
#else
|
238
|
+
# raise ExcelErrorSave, "book is open and used in Excel"
|
239
|
+
#end
|
231
240
|
when :excel
|
232
241
|
old_displayalerts = @excel_app.DisplayAlerts # :nodoc:
|
233
242
|
@excel_app.DisplayAlerts = true # :nodoc:
|
@@ -46,6 +46,7 @@ module RobustExcelOle
|
|
46
46
|
Process.kill("KILL", pid)
|
47
47
|
end
|
48
48
|
|
49
|
+
# frees all OLE objects in the object space
|
49
50
|
def self.free_all_ole_objects
|
50
51
|
anz_objekte = 0
|
51
52
|
ObjectSpace.each_object(WIN32OLE) do |o|
|
@@ -96,24 +97,23 @@ module RobustExcelOle
|
|
96
97
|
new(:reuse => false)
|
97
98
|
end
|
98
99
|
|
99
|
-
# uses a running Excel application, if such an application exists
|
100
|
+
# uses a running Excel application (connects), if such an Excel application exists
|
100
101
|
# creates a new one, otherwise
|
101
|
-
def self.
|
102
|
+
def self.reuse
|
102
103
|
new(:reuse => true)
|
103
104
|
end
|
104
105
|
|
105
106
|
# returns an Excel application
|
106
|
-
#
|
107
107
|
# options:
|
108
|
-
# :reuse
|
109
|
-
# :displayalerts
|
110
|
-
# :visible
|
108
|
+
# :reuse use an already running Excel application (default: true)
|
109
|
+
# :displayalerts allow display alerts in Excel (default: false)
|
110
|
+
# :visible make visible in Excel (default: false)
|
111
111
|
def self.new(options= {})
|
112
112
|
options = {:reuse => true}.merge(options)
|
113
113
|
|
114
114
|
ole_app = nil
|
115
115
|
if options[:reuse] then
|
116
|
-
ole_app = running_app
|
116
|
+
ole_app = options[:excel_app] ? options[:excel_app] : running_app
|
117
117
|
if ole_app
|
118
118
|
ole_app.DisplayAlerts = options[:displayalerts] unless options[:displayalerts]==nil
|
119
119
|
ole_app.Visible = options[:visible] unless options[:visible]==nil
|
data/robust_excel_ole.gemspec
CHANGED
data/spec/book_spec.rb
CHANGED
@@ -65,7 +65,7 @@ describe RobustExcelOle::Book do
|
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
-
context "with excel_app" do
|
68
|
+
context "with attr_reader excel_app" do
|
69
69
|
before do
|
70
70
|
@new_book = RobustExcelOle::Book.open(@simple_file)
|
71
71
|
end
|
@@ -79,6 +79,29 @@ describe RobustExcelOle::Book do
|
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
82
|
+
context "with :excel_app" do
|
83
|
+
it "should reuse the given excel application of the book" do
|
84
|
+
book1 = RobustExcelOle::Book.open(@simple_file, :reuse => false)
|
85
|
+
excel_app1 = book1.excel_app
|
86
|
+
book2 = RobustExcelOle::Book.open(@simple_file, :reuse => false)
|
87
|
+
excel_app2 = book2.excel_app
|
88
|
+
excel_app2.should_not == excel_app1
|
89
|
+
book3 = RobustExcelOle::Book.open(@simple_file)
|
90
|
+
excel_app3 = book3.excel_app
|
91
|
+
book4 = RobustExcelOle::Book.open(@simple_file, :excel_app => excel_app2)
|
92
|
+
excel_app4 = book4.excel_app
|
93
|
+
excel_app3.should == excel_app1
|
94
|
+
excel_app4.should == excel_app2
|
95
|
+
excel_app4.class.should == RobustExcelOle::ExcelApp
|
96
|
+
excel_app4.should be_a RobustExcelOle::ExcelApp
|
97
|
+
book1.close
|
98
|
+
book2.close
|
99
|
+
book3.close
|
100
|
+
book4.close
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
|
82
105
|
context "with :read_only" do
|
83
106
|
it "should be able to save, if :read_only => false" do
|
84
107
|
book = RobustExcelOle::Book.open(@simple_file, :read_only => false)
|
@@ -186,7 +209,7 @@ describe RobustExcelOle::Book do
|
|
186
209
|
}.to_not raise_error
|
187
210
|
@book.should be_alive
|
188
211
|
@new_book.should be_alive
|
189
|
-
@new_book.
|
212
|
+
@new_book.should == @book
|
190
213
|
end
|
191
214
|
|
192
215
|
it "should open book and close old book, if :if_unsaved is :forget" do
|
@@ -267,62 +290,62 @@ describe RobustExcelOle::Book do
|
|
267
290
|
@new_book.close rescue nil
|
268
291
|
end
|
269
292
|
|
270
|
-
it "should raise an error, if :
|
293
|
+
it "should raise an error, if :if_obstructed is :raise" do
|
271
294
|
expect {
|
272
|
-
@new_book = RobustExcelOle::Book.open(@simple_file, :
|
295
|
+
@new_book = RobustExcelOle::Book.open(@simple_file, :if_obstructed => :raise)
|
273
296
|
}.to raise_error(ExcelErrorOpen, "blocked by a book with the same name in a different path")
|
274
297
|
end
|
275
298
|
|
276
|
-
it "should close the other book and open the new book, if :
|
277
|
-
@new_book = RobustExcelOle::Book.open(@simple_file, :
|
299
|
+
it "should close the other book and open the new book, if :if_obstructed is :forget" do
|
300
|
+
@new_book = RobustExcelOle::Book.open(@simple_file, :if_obstructed => :forget)
|
278
301
|
@book.should_not be_alive
|
279
302
|
@new_book.should be_alive
|
280
303
|
@new_book.filename.downcase.should == @simple_file.downcase
|
281
304
|
end
|
282
305
|
|
283
|
-
it "should save the old book, close it, and open the new book, if :
|
284
|
-
@new_book = RobustExcelOle::Book.open(@simple_file, :
|
306
|
+
it "should save the old book, close it, and open the new book, if :if_obstructed is :save" do
|
307
|
+
@new_book = RobustExcelOle::Book.open(@simple_file, :if_obstructed => :save)
|
285
308
|
@book.should_not be_alive
|
286
309
|
@new_book.should be_alive
|
287
310
|
@new_book.filename.downcase.should == @simple_file.downcase
|
288
|
-
|
289
|
-
|
290
|
-
|
311
|
+
old_book = RobustExcelOle::Book.open(@simple_file_other_path, :if_obstructed => :forget)
|
312
|
+
old_book.workbook.Worksheets.Count.should == @sheet_count + 1
|
313
|
+
old_book.close
|
291
314
|
end
|
292
315
|
|
293
316
|
it "should raise an error, if the old book is unsaved, and close the old book and open the new book,
|
294
|
-
if :
|
317
|
+
if :if_obstructed is :close_if_saved" do
|
295
318
|
expect{
|
296
|
-
@new_book = RobustExcelOle::Book.open(@simple_file, :
|
319
|
+
@new_book = RobustExcelOle::Book.open(@simple_file, :if_obstructed => :close_if_saved)
|
297
320
|
}.to raise_error(ExcelErrorOpen, "book with the same name in a different path is unsaved")
|
298
321
|
@book.save
|
299
|
-
@new_book = RobustExcelOle::Book.open(@simple_file, :
|
322
|
+
@new_book = RobustExcelOle::Book.open(@simple_file, :if_obstructed => :close_if_saved)
|
300
323
|
@book.should_not be_alive
|
301
324
|
@new_book.should be_alive
|
302
325
|
@new_book.filename.downcase.should == @simple_file.downcase
|
303
|
-
|
304
|
-
|
305
|
-
|
326
|
+
old_book = RobustExcelOle::Book.open(@simple_file_other_path, :if_obstructed => :forget)
|
327
|
+
old_book.workbook.Worksheets.Count.should == @sheet_count + 1
|
328
|
+
old_book.close
|
306
329
|
end
|
307
330
|
|
308
|
-
it "should open the book in a new excel application, if :
|
309
|
-
@new_book = RobustExcelOle::Book.open(@simple_file, :
|
331
|
+
it "should open the book in a new excel application, if :if_obstructed is :new_app" do
|
332
|
+
@new_book = RobustExcelOle::Book.open(@simple_file, :if_obstructed => :new_app)
|
310
333
|
@book.should be_alive
|
311
334
|
@new_book.should be_alive
|
312
335
|
@new_book.filename.should_not == @book.filename
|
313
336
|
@new_book.excel_app.should_not == @book.excel_app
|
314
337
|
end
|
315
338
|
|
316
|
-
it "should raise an error, if :
|
339
|
+
it "should raise an error, if :if_obstructed is default" do
|
317
340
|
expect {
|
318
341
|
@new_book = RobustExcelOle::Book.open(@simple_file)
|
319
342
|
}.to raise_error(ExcelErrorOpen, "blocked by a book with the same name in a different path")
|
320
343
|
end
|
321
344
|
|
322
|
-
it "should raise an error, if :
|
345
|
+
it "should raise an error, if :if_obstructed is invalid option" do
|
323
346
|
expect {
|
324
|
-
@new_book = RobustExcelOle::Book.open(@simple_file, :
|
325
|
-
}.to raise_error(ExcelErrorOpen, ":
|
347
|
+
@new_book = RobustExcelOle::Book.open(@simple_file, :if_obstructed => :invalid_option)
|
348
|
+
}.to raise_error(ExcelErrorOpen, ":if_obstructed: invalid option")
|
326
349
|
end
|
327
350
|
|
328
351
|
end
|
Binary file
|
Binary file
|
data/spec/data/simple.xls
CHANGED
Binary file
|
data/spec/excel_app_spec.rb
CHANGED
@@ -7,16 +7,6 @@ $VERBOSE = nil
|
|
7
7
|
module RobustExcelOle
|
8
8
|
|
9
9
|
describe ExcelApp do
|
10
|
-
before do
|
11
|
-
@dir = create_tmpdir
|
12
|
-
@simple_file = @dir + '/simple.xls'
|
13
|
-
end
|
14
|
-
|
15
|
-
after do
|
16
|
-
rm_tmp(@dir)
|
17
|
-
end
|
18
|
-
|
19
|
-
save_path = "C:" + "/" + "simple_save.xls"
|
20
10
|
|
21
11
|
context "app creation" do
|
22
12
|
after do
|
@@ -68,7 +58,7 @@ module RobustExcelOle
|
|
68
58
|
end
|
69
59
|
|
70
60
|
it "should reuse existing app" do
|
71
|
-
app2 = ExcelApp.
|
61
|
+
app2 = ExcelApp.reuse
|
72
62
|
#puts "@app1 #{@app1.Hwnd}"
|
73
63
|
#puts "app2 #{app2.Hwnd}"
|
74
64
|
app2.Hwnd.should == @app1.Hwnd
|
@@ -114,7 +104,7 @@ module RobustExcelOle
|
|
114
104
|
end
|
115
105
|
|
116
106
|
it "should be true with two identical excel applications" do
|
117
|
-
app2 = ExcelApp.
|
107
|
+
app2 = ExcelApp.reuse
|
118
108
|
app2.should == @app1
|
119
109
|
end
|
120
110
|
|
@@ -131,6 +121,28 @@ module RobustExcelOle
|
|
131
121
|
|
132
122
|
end
|
133
123
|
|
124
|
+
|
125
|
+
context "with :excel_app" do
|
126
|
+
|
127
|
+
before do
|
128
|
+
ExcelApp.close_all
|
129
|
+
end
|
130
|
+
|
131
|
+
after (:each) do
|
132
|
+
ExcelApp.close_all
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should reuse in given excel app" do
|
136
|
+
app1 = ExcelApp.new(:reuse => false)
|
137
|
+
app2 = ExcelApp.new(:reuse => false)
|
138
|
+
app3 = ExcelApp.new(:excel_app => app1)
|
139
|
+
app4 = ExcelApp.new(:excel_app => app2)
|
140
|
+
app3.should == app1
|
141
|
+
app4.should == app2
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
|
134
146
|
context "with Visible and DisplayAlerts" do
|
135
147
|
|
136
148
|
before do
|
data/version.rb
CHANGED