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