robust_excel_ole 1.1.4 → 1.1.5
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 +13 -0
- data/README.rdoc +107 -73
- data/{README_excel.rdoc → docs/README_excel.rdoc} +2 -0
- data/{README_open.rdoc → docs/README_open.rdoc} +12 -16
- data/{README_ranges.rdoc → docs/README_ranges.rdoc} +1 -1
- data/{README_save_close.rdoc → docs/README_save_close.rdoc} +0 -0
- data/{README_sheet.rdoc → docs/README_sheet.rdoc} +0 -0
- data/examples/open_save_close/example_control_to_excel.rb +3 -3
- data/examples/open_save_close/example_default_excel.rb +2 -2
- data/examples/open_save_close/example_force_excel.rb +2 -2
- data/examples/open_save_close/example_if_obstructed_closeifsaved.rb +2 -2
- data/examples/open_save_close/example_if_obstructed_forget.rb +2 -2
- data/examples/open_save_close/example_if_obstructed_save.rb +2 -2
- data/examples/open_save_close/example_if_unsaved_accept.rb +3 -3
- data/examples/open_save_close/example_if_unsaved_forget.rb +7 -3
- data/examples/open_save_close/example_if_unsaved_forget_more.rb +1 -1
- data/examples/open_save_close/example_read_only.rb +2 -2
- data/examples/open_save_close/example_rename_cells.rb +2 -2
- data/examples/open_save_close/example_reuse.rb +2 -2
- data/examples/open_save_close/example_simple.rb +1 -1
- data/examples/open_save_close/example_unobtrusively.rb +2 -2
- data/lib/robust_excel_ole/book.rb +75 -76
- data/lib/robust_excel_ole/bookstore.rb +9 -9
- data/lib/robust_excel_ole/excel.rb +5 -5
- data/lib/robust_excel_ole/general.rb +11 -4
- data/lib/robust_excel_ole/reo_common.rb +3 -0
- data/lib/robust_excel_ole/version.rb +1 -1
- data/robust_excel_ole.gemspec +2 -2
- data/spec/book_spec.rb +67 -63
- data/spec/book_specs/book_close_spec.rb +12 -10
- data/spec/book_specs/book_misc_spec.rb +279 -279
- data/spec/book_specs/book_open_spec.rb +258 -105
- data/spec/book_specs/book_save_spec.rb +28 -28
- data/spec/book_specs/book_unobtr_spec.rb +862 -164
- data/spec/bookstore_spec.rb +22 -22
- data/spec/data/another_workbook.xls +0 -0
- data/spec/data/different_workbook.xls +0 -0
- data/spec/data/workbook.xls +0 -0
- data/spec/excel_spec.rb +256 -254
- data/spec/general_spec.rb +7 -7
- data/spec/ruby1.8.6_rspec2.14/book_spec.rb +1421 -0
- data/spec/ruby1.8.6_rspec2.14/book_specs/book_all_spec.rb +22 -0
- data/spec/ruby1.8.6_rspec2.14/book_specs/book_close_spec.rb +252 -0
- data/spec/ruby1.8.6_rspec2.14/book_specs/book_misc_spec.rb +1070 -0
- data/spec/ruby1.8.6_rspec2.14/book_specs/book_open_spec.rb +1855 -0
- data/spec/ruby1.8.6_rspec2.14/book_specs/book_save_spec.rb +514 -0
- data/spec/ruby1.8.6_rspec2.14/book_specs/book_sheet_spec.rb +395 -0
- data/spec/ruby1.8.6_rspec2.14/book_specs/book_subclass_spec.rb +51 -0
- data/spec/ruby1.8.6_rspec2.14/book_specs/book_unobtr_spec.rb +1737 -0
- data/spec/ruby1.8.6_rspec2.14/bookstore_spec.rb +495 -0
- data/spec/ruby1.8.6_rspec2.14/cell_spec.rb +76 -0
- data/spec/ruby1.8.6_rspec2.14/cygwin_spec.rb +42 -0
- data/spec/ruby1.8.6_rspec2.14/excel_spec.rb +1820 -0
- data/spec/ruby1.8.6_rspec2.14/general_spec.rb +212 -0
- data/spec/ruby1.8.6_rspec2.14/range_spec.rb +131 -0
- data/spec/ruby1.8.6_rspec2.14/reo_common_spec.rb +130 -0
- data/spec/ruby1.8.6_rspec2.14/sheet_spec.rb +663 -0
- data/spec/ruby1.8.6_rspec2.14/spec_helper.rb +35 -0
- data/spec/sheet_spec.rb +2 -2
- metadata +28 -12
- data/README_detail.rdoc +0 -852
- data/README_development.rdoc +0 -5
@@ -7,7 +7,7 @@ require "fileutils"
|
|
7
7
|
|
8
8
|
include RobustExcelOle
|
9
9
|
|
10
|
-
Excel.
|
10
|
+
Excel.kill_all
|
11
11
|
begin
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name1 = dir + 'workbook.xls'
|
@@ -44,6 +44,6 @@ begin
|
|
44
44
|
book3.close
|
45
45
|
book2.close
|
46
46
|
ensure
|
47
|
-
Excel.
|
47
|
+
Excel.kill_all # close all workbooks, quit Excel instances
|
48
48
|
rm_tmp(dir)
|
49
49
|
end
|
@@ -7,7 +7,7 @@ require "fileutils"
|
|
7
7
|
|
8
8
|
include RobustExcelOle
|
9
9
|
|
10
|
-
Excel.
|
10
|
+
Excel.kill_all
|
11
11
|
begin
|
12
12
|
dir = create_tmpdir
|
13
13
|
simple_file = dir + 'workbook.xls'
|
@@ -29,6 +29,6 @@ begin
|
|
29
29
|
book2.close
|
30
30
|
book1.close
|
31
31
|
ensure
|
32
|
-
Excel.
|
32
|
+
Excel.kill_all # close all workbooks, quit Excel instances
|
33
33
|
rm_tmp(dir)
|
34
34
|
end
|
@@ -7,7 +7,7 @@ require "fileutils"
|
|
7
7
|
|
8
8
|
include RobustExcelOle
|
9
9
|
|
10
|
-
Excel.
|
10
|
+
Excel.kill_all
|
11
11
|
begin
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name = dir + 'workbook.xls'
|
@@ -31,6 +31,6 @@ begin
|
|
31
31
|
puts "the old book was saved" unless new_first_cell == first_cell
|
32
32
|
new_book.close # close the books
|
33
33
|
ensure
|
34
|
-
Excel.
|
34
|
+
Excel.kill_all # close all workbooks, quit Excel application
|
35
35
|
rm_tmp(dir)
|
36
36
|
end
|
@@ -7,7 +7,7 @@ require "fileutils"
|
|
7
7
|
|
8
8
|
include RobustExcelOle
|
9
9
|
|
10
|
-
Excel.
|
10
|
+
Excel.kill_all
|
11
11
|
begin
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name = dir + 'workbook.xls'
|
@@ -28,6 +28,6 @@ begin
|
|
28
28
|
new_book.close # close the books
|
29
29
|
another_book.close
|
30
30
|
ensure
|
31
|
-
Excel.
|
31
|
+
Excel.kill_all # close all workbooks, quit Excel application
|
32
32
|
rm_tmp(dir)
|
33
33
|
end
|
@@ -7,7 +7,7 @@ require "fileutils"
|
|
7
7
|
|
8
8
|
include RobustExcelOle
|
9
9
|
|
10
|
-
Excel.
|
10
|
+
Excel.kill_all
|
11
11
|
begin
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name = dir + 'workbook.xls'
|
@@ -28,6 +28,6 @@ begin
|
|
28
28
|
new_book.close # close the books
|
29
29
|
old_book.close
|
30
30
|
ensure
|
31
|
-
Excel.
|
31
|
+
Excel.kill_all # close all workbooks, quit Excel application
|
32
32
|
rm_tmp(dir)
|
33
33
|
end
|
@@ -7,7 +7,7 @@ require "fileutils"
|
|
7
7
|
|
8
8
|
include RobustExcelOle
|
9
9
|
|
10
|
-
Excel.
|
10
|
+
Excel.kill_all
|
11
11
|
begin
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name = dir + 'workbook.xls'
|
@@ -16,7 +16,7 @@ begin
|
|
16
16
|
sheet[1,1] = sheet[1,1].value == "simple" ? "complex" : "simple" # change a cell
|
17
17
|
begin
|
18
18
|
new_book = Workbook.open(file_name) # open another book with the same file name
|
19
|
-
rescue
|
19
|
+
rescue WorkbookNotSaved => msg # by default: raises an exception:
|
20
20
|
puts "error: open: #{msg.message}" # a book with the same name is already open and unsaved
|
21
21
|
end
|
22
22
|
new_book = Workbook.open(file_name, :if_unsaved => :accept) # open another book with the same file name
|
@@ -36,6 +36,6 @@ begin
|
|
36
36
|
puts "closed the book successfully with option :if_unsaved => :save"
|
37
37
|
new_book.close # close the other book. It is already saved.
|
38
38
|
ensure
|
39
|
-
Excel.
|
39
|
+
Excel.kill_all # close workbooks, quit Excel application
|
40
40
|
rm_tmp(dir)
|
41
41
|
end
|
@@ -7,19 +7,23 @@ require "fileutils"
|
|
7
7
|
|
8
8
|
include RobustExcelOle
|
9
9
|
|
10
|
-
Excel.
|
10
|
+
Excel.kill_all
|
11
11
|
begin
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name = dir + 'workbook.xls'
|
14
14
|
book = Workbook.open(file_name) # open a book
|
15
|
-
|
15
|
+
puts "file_name: #{file_name}"
|
16
|
+
#book.excel.visible = true # make current Excel visible
|
16
17
|
sleep 1
|
17
18
|
sheet = book.sheet(1) # access a sheet
|
18
19
|
first_cell = sheet[1,1].value
|
19
20
|
sheet[1,1] = first_cell == "simple" ? "complex" : "simple" # change a cell
|
20
21
|
sleep 1
|
22
|
+
puts "new_book: before"
|
23
|
+
puts "file_name: #{file_name}"
|
21
24
|
new_book = Workbook.open(file_name, :if_unsaved => :forget) # open another book with the same file name
|
22
25
|
# and close the unsaved book without saving it
|
26
|
+
puts "new_book: after"
|
23
27
|
sheet_new_book = new_book.sheet(1)
|
24
28
|
if (not book.alive?) && new_book.alive? && sheet_new_book[1,1].value == first_cell then # check whether the unsaved book
|
25
29
|
puts "open with :if_unsaved => :forget : the unsaved book is closed and not saved." # is closed and was not saved
|
@@ -32,6 +36,6 @@ begin
|
|
32
36
|
new_book.close(:if_unsaved => :forget )
|
33
37
|
another_book.close
|
34
38
|
ensure
|
35
|
-
Excel.
|
39
|
+
Excel.kill_all # close all workbooks, quit Excel application
|
36
40
|
rm_tmp(dir)
|
37
41
|
end
|
@@ -12,7 +12,7 @@ begin
|
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name = dir + 'workbook.xls'
|
14
14
|
book = Workbook.open(file_name) # open a book
|
15
|
-
book.excel.visible = true # make current Excel visible
|
15
|
+
#book.excel.visible = true # make current Excel visible
|
16
16
|
sheet = book.sheet(1) # access a sheet
|
17
17
|
first_cell = sheet[1,1].value
|
18
18
|
sheet[1,1] = first_cell == "simple" ? "complex" : "simple" # change a cell
|
@@ -6,7 +6,7 @@ require "fileutils"
|
|
6
6
|
|
7
7
|
include RobustExcelOle
|
8
8
|
|
9
|
-
Excel.
|
9
|
+
Excel.kill_all
|
10
10
|
begin
|
11
11
|
dir = create_tmpdir
|
12
12
|
file_name = dir + 'workbook.xls'
|
@@ -23,7 +23,7 @@ begin
|
|
23
23
|
end
|
24
24
|
book.close # close the book without saving it
|
25
25
|
ensure
|
26
|
-
Excel.
|
26
|
+
Excel.kill_all # close workbooks, quit Excel application
|
27
27
|
rm_tmp(dir)
|
28
28
|
end
|
29
29
|
|
@@ -7,7 +7,7 @@ require "fileutils"
|
|
7
7
|
|
8
8
|
include RobustExcelOle
|
9
9
|
|
10
|
-
Excel.
|
10
|
+
Excel.kill_all
|
11
11
|
begin
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name = dir + 'workbook.xls'
|
@@ -51,7 +51,7 @@ begin
|
|
51
51
|
book.close(:if_unsaved => :forget) # close the book
|
52
52
|
|
53
53
|
ensure
|
54
|
-
Excel.
|
54
|
+
Excel.kill_all # close workbooks, quit Excel application
|
55
55
|
rm_tmp(dir)
|
56
56
|
end
|
57
57
|
|
@@ -6,7 +6,7 @@ require "fileutils"
|
|
6
6
|
|
7
7
|
include RobustExcelOle
|
8
8
|
|
9
|
-
Excel.
|
9
|
+
Excel.kill_all
|
10
10
|
begin
|
11
11
|
dir = create_tmpdir
|
12
12
|
file_name1 = dir + 'workbook.xls'
|
@@ -27,7 +27,7 @@ begin
|
|
27
27
|
book3.close
|
28
28
|
book4.close
|
29
29
|
ensure
|
30
|
-
Excel.
|
30
|
+
Excel.kill_all # close all workbooks, quit Excel application
|
31
31
|
rm_tmp(dir)
|
32
32
|
end
|
33
33
|
|
@@ -32,7 +32,7 @@ begin
|
|
32
32
|
puts "save_as: saved successfully with option :if_exists => :overwrite"
|
33
33
|
book.close # close the book
|
34
34
|
ensure
|
35
|
-
Excel.
|
35
|
+
Excel.kill_all # close workbooks, quit Excel application
|
36
36
|
#rm_tmp(dir)
|
37
37
|
end
|
38
38
|
|
@@ -6,7 +6,7 @@ require "fileutils"
|
|
6
6
|
|
7
7
|
include RobustExcelOle
|
8
8
|
|
9
|
-
Excel.
|
9
|
+
Excel.kill_all
|
10
10
|
begin
|
11
11
|
dir = create_tmpdir
|
12
12
|
simple_file = dir + 'workbook.xls'
|
@@ -23,6 +23,6 @@ begin
|
|
23
23
|
p "book saved" if book.Saved
|
24
24
|
book.close # close the book
|
25
25
|
ensure
|
26
|
-
Excel.
|
26
|
+
Excel.kill_all # close all workbooks, quit Excel application
|
27
27
|
rm_tmp(dir)
|
28
28
|
end
|
@@ -73,9 +73,9 @@ module RobustExcelOle
|
|
73
73
|
# :visible true -> makes the workbook visible
|
74
74
|
# :check_compatibility true -> check compatibility when saving
|
75
75
|
# :update_links true -> user is being asked how to update links, false -> links are never updated
|
76
|
-
# @return [Book] a workbook
|
76
|
+
# @return [Book] a representation of a workbook
|
77
77
|
def open(file, opts={ }, &block)
|
78
|
-
options = process_options(opts)
|
78
|
+
options = @options = process_options(opts)
|
79
79
|
book = nil
|
80
80
|
if (not (options[:force][:excel] == :new))
|
81
81
|
# if readonly is true, then prefer a book that is given in force_excel if this option is set
|
@@ -86,16 +86,20 @@ module RobustExcelOle
|
|
86
86
|
:prefer_writable => (not options[:read_only]),
|
87
87
|
:prefer_excel => (options[:read_only] ? forced_excel : nil)) rescue nil
|
88
88
|
if book
|
89
|
+
#if forced_excel != book.excel &&
|
90
|
+
# (not (book.alive? && (not book.saved) && (not options[:if_unsaved] == :accept)))
|
89
91
|
if (((not options[:force][:excel]) || (forced_excel == book.excel)) &&
|
90
|
-
|
92
|
+
(not (book.alive? && (not book.saved) && (not options[:if_unsaved] == :accept))))
|
91
93
|
book.options = options
|
92
94
|
book.ensure_excel(options) # unless book.excel.alive?
|
93
|
-
# if the ReadOnly status shall be changed,
|
94
|
-
book.
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
95
|
+
# if the ReadOnly status shall be changed, save, close and reopen it
|
96
|
+
if book.alive? and (((not book.writable) and (not options[:read_only])) or
|
97
|
+
(book.writable and options[:read_only]))
|
98
|
+
book.save if book.writable && (not book.saved)
|
99
|
+
book.close(:if_unsaved => :forget)
|
100
|
+
end
|
101
|
+
# reopens the book if it was closed
|
102
|
+
book.ensure_workbook(file,options) unless book.alive?
|
99
103
|
book.visible = options[:force][:visible] unless options[:force][:visible].nil?
|
100
104
|
book.CheckCompatibility = options[:check_compatibility] unless options[:check_compatibility].nil?
|
101
105
|
book.excel.calculation = options[:calculation] unless options[:calculation].nil?
|
@@ -107,6 +111,24 @@ module RobustExcelOle
|
|
107
111
|
end
|
108
112
|
end
|
109
113
|
|
114
|
+
# here is what is different and works
|
115
|
+
=begin
|
116
|
+
if book
|
117
|
+
if (((not options[:force][:excel]) || (forced_excel == book.excel)) &&
|
118
|
+
(not (book.alive? && (not book.saved) && (not options[:if_unsaved] == :accept))))
|
119
|
+
book.options = options
|
120
|
+
book.ensure_excel(options) # unless book.excel.alive?
|
121
|
+
# if the ReadOnly status shall be changed, close and reopen it; save before, if it is writable
|
122
|
+
if book.alive? and (((not book.writable) and (not options[:read_only])) or
|
123
|
+
(book.writable and options[:read_only]))
|
124
|
+
book.save if book.writable
|
125
|
+
book.close(:if_unsaved => :forget)
|
126
|
+
end
|
127
|
+
# reopens the book
|
128
|
+
book.ensure_workbook(file,options) unless book.alive?
|
129
|
+
=end
|
130
|
+
|
131
|
+
|
110
132
|
# creates a Book object by opening an Excel file given its filename workbook or
|
111
133
|
# by lifting a Win32OLE object representing an Excel file
|
112
134
|
# @param [WIN32OLE] workbook a workbook
|
@@ -114,14 +136,13 @@ module RobustExcelOle
|
|
114
136
|
# @option opts [Symbol] see above
|
115
137
|
# @return [Book] a workbook
|
116
138
|
def self.new(workbook, opts={ }, &block)
|
139
|
+
opts = process_options(opts)
|
117
140
|
if workbook && (workbook.is_a? WIN32OLE)
|
118
|
-
opts = process_options(opts)
|
119
141
|
filename = workbook.Fullname.tr('\\','/') rescue nil
|
120
142
|
if filename
|
121
143
|
book = bookstore.fetch(filename)
|
122
144
|
if book && book.alive?
|
123
|
-
book.visible = opts[:force][:visible] unless opts[:force][:visible].nil?
|
124
|
-
#book.excel.calculation = opts[:calculation].nil? ? book.excel.calculation : opts[:calculation]
|
145
|
+
book.visible = opts[:force][:visible] unless opts[:force].nil? or opts[:force][:visible].nil?
|
125
146
|
book.excel.calculation = opts[:calculation] unless opts[:calculation].nil?
|
126
147
|
return book
|
127
148
|
end
|
@@ -139,7 +160,7 @@ module RobustExcelOle
|
|
139
160
|
# @return [Book] a workbook
|
140
161
|
#def initialize(file_or_workbook, opts={ }, &block)
|
141
162
|
def initialize(file_or_workbook, options={ }, &block)
|
142
|
-
#options = self.class.process_options(
|
163
|
+
#options = @options = self.class.process_options(options) if options.empty?
|
143
164
|
if file_or_workbook.is_a? WIN32OLE
|
144
165
|
workbook = file_or_workbook
|
145
166
|
@ole_workbook = workbook
|
@@ -152,7 +173,7 @@ module RobustExcelOle
|
|
152
173
|
else
|
153
174
|
file = file_or_workbook
|
154
175
|
ensure_excel(options)
|
155
|
-
ensure_workbook(file, options)
|
176
|
+
ensure_workbook(file, options)
|
156
177
|
end
|
157
178
|
bookstore.store(self)
|
158
179
|
@modified_cells = []
|
@@ -179,7 +200,7 @@ module RobustExcelOle
|
|
179
200
|
erg[new_key] = {}
|
180
201
|
value.each do |k,v|
|
181
202
|
new_k = k
|
182
|
-
ABBREVIATIONS.each{|
|
203
|
+
ABBREVIATIONS.each{|l,s| new_k = l if k == s}
|
183
204
|
erg[new_key][new_k] = v
|
184
205
|
end
|
185
206
|
else
|
@@ -228,40 +249,17 @@ module RobustExcelOle
|
|
228
249
|
|
229
250
|
public
|
230
251
|
|
231
|
-
=begin
|
232
|
-
# work in progress#
|
233
|
-
def self.open_in_current_excel(file, opts = { }) # :nodoc: #
|
234
|
-
options = DEFAULT_OPEN_OPTS.merge(opts)
|
235
|
-
filename = General::absolute_path(file)
|
236
|
-
ole_workbook = WIN32OLE.connect(filename)
|
237
|
-
workbook = Book.new(ole_workbook)
|
238
|
-
workbook.visible = options[:force][:visible] unless options[:force][:visible].nil?
|
239
|
-
update_links_opt =
|
240
|
-
case options[:update_links]
|
241
|
-
when :alert; RobustExcelOle::XlUpdateLinksUserSetting
|
242
|
-
when :never; RobustExcelOle::XlUpdateLinksNever
|
243
|
-
when :always; RobustExcelOle::XlUpdateLinksAlways
|
244
|
-
else RobustExcelOle::XlUpdateLinksNever
|
245
|
-
end
|
246
|
-
workbook.UpdateLinks = update_links_opt
|
247
|
-
workbook.CheckCompatibility = options[:check_compatibility]
|
248
|
-
workbook
|
249
|
-
end
|
250
|
-
=end
|
251
|
-
|
252
252
|
def ensure_excel(options) # :nodoc: #
|
253
|
-
if
|
253
|
+
#if (excel && @excel.alive? && (options[:force].nil? or options[:force][:excel].nil? or
|
254
|
+
# options[:force][:excel]==@excel))
|
255
|
+
if excel && @excel.alive?
|
254
256
|
@excel.created = false
|
255
257
|
return
|
256
258
|
end
|
257
259
|
excel_option = (options[:force].nil? or options[:force][:excel].nil?) ? options[:default][:excel] : options[:force][:excel]
|
258
260
|
@excel = self.class.excel_of(excel_option) unless (excel_option == :current || excel_option == :new)
|
259
261
|
@excel = excel_class.new(:reuse => (excel_option == :current)) unless (@excel && @excel.alive?)
|
260
|
-
|
261
|
-
#options[:excel] = options[:force_excel] ? options[:force_excel] : options[:default_excel]
|
262
|
-
#options[:excel] = :current if (options[:excel] == :reuse || options[:excel] == :active)
|
263
|
-
#@excel = self.class.excel_of(options[:excel]) unless (options[:excel] == :current || options[:excel] == :new)
|
264
|
-
#@excel = excel_class.new(:reuse => (options[:excel] == :current)) unless (@excel && @excel.alive?)
|
262
|
+
@excel
|
265
263
|
end
|
266
264
|
|
267
265
|
def ensure_workbook(file, options) # :nodoc: #
|
@@ -474,7 +472,7 @@ module RobustExcelOle
|
|
474
472
|
def self.for_reading(*args, &block)
|
475
473
|
args = args.dup
|
476
474
|
opts = args.last.is_a?(Hash) ? args.pop : {}
|
477
|
-
opts = {:
|
475
|
+
opts = {:writable => false}.merge(opts)
|
478
476
|
args.push opts
|
479
477
|
unobtrusively(*args, &block)
|
480
478
|
end
|
@@ -482,7 +480,7 @@ module RobustExcelOle
|
|
482
480
|
def self.for_modifying(*args, &block)
|
483
481
|
args = args.dup
|
484
482
|
opts = args.last.is_a?(Hash) ? args.pop : {}
|
485
|
-
opts = {:
|
483
|
+
opts = {:writable => true}.merge(opts)
|
486
484
|
args.push opts
|
487
485
|
unobtrusively(*args, &block)
|
488
486
|
end
|
@@ -492,21 +490,22 @@ module RobustExcelOle
|
|
492
490
|
# @param [String] file the file name
|
493
491
|
# @param [Hash] opts the options
|
494
492
|
# @option opts [Variant] :if_closed :current (default), :new or an Excel instance
|
495
|
-
# @option opts [Boolean] :read_only
|
496
|
-
# @option opts [Boolean] :
|
497
|
-
#
|
498
|
-
#
|
499
|
-
# otherwise open in a new Excel instance.
|
493
|
+
# @option opts [Boolean] :read_only true/false, open the workbook in read-only/read-write modus (save changes)
|
494
|
+
# @option opts [Boolean] :writable true/false changes of the workbook shall be saved/not saved
|
495
|
+
# @option opts [Boolean] :rw_change_excel Excel instance in which the workbook with the new
|
496
|
+
# write permissions shall be opened :current (default), :new or an Excel instance
|
500
497
|
# @option opts [Boolean] :keep_open whether the workbook shall be kept open after unobtrusively opening
|
501
498
|
# @return [Book] a workbook
|
502
|
-
|
503
499
|
# state = [:open, :saved, :writable, :visible, :calculation, :check_compatibility]
|
504
500
|
def self.unobtrusively(file, opts = { }, &block)
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
501
|
+
opts = {:if_closed => :current,
|
502
|
+
:rw_change_excel => :current,
|
503
|
+
:keep_open => false}.merge(opts)
|
504
|
+
raise OptionInvalid, "contradicting options" if (opts[:writable] && opts[:read_only])
|
505
|
+
prefer_writable = (((not opts[:read_only]) || opts[:writable]==true) &&
|
506
|
+
(not (opts[:read_only].nil?) && opts[:writable]==false))
|
507
|
+
do_not_write = (opts[:read_only] or (opts[:read_only].nil? && opts[:writable]==false))
|
508
|
+
book = bookstore.fetch(file, :prefer_writable => prefer_writable)
|
510
509
|
was_open = book && book.alive?
|
511
510
|
if was_open
|
512
511
|
was_saved = book.saved
|
@@ -514,37 +513,39 @@ module RobustExcelOle
|
|
514
513
|
was_visible = book.visible
|
515
514
|
was_calculation = book.calculation
|
516
515
|
was_check_compatibility = book.check_compatibility
|
517
|
-
|
518
|
-
|
516
|
+
if ((opts[:writable] && (not was_writable) && (not was_saved)) ||
|
517
|
+
(opts[:read_only] && was_writable && (not was_saved)))
|
518
|
+
raise NotImplementedREOError, "unsaved read-only workbook shall be written"
|
519
|
+
end
|
520
|
+
opts[:rw_change_excel] = book.excel if opts[:rw_change_excel]==:current
|
521
|
+
end
|
522
|
+
change_rw_mode = ((opts[:read_only] && was_writable) or (opts[:writable] && (not was_writable)))
|
523
|
+
begin
|
519
524
|
book =
|
520
525
|
if was_open
|
521
|
-
if
|
522
|
-
open(file, :force => {:excel =>
|
526
|
+
if change_rw_mode
|
527
|
+
open(file, :force => {:excel => opts[:rw_change_excel]}, :read_only => do_not_write)
|
523
528
|
else
|
524
529
|
book
|
525
530
|
end
|
526
531
|
else
|
527
|
-
open(file, :force => {:excel =>
|
532
|
+
open(file, :force => {:excel => opts[:if_closed]}, :read_only => do_not_write)
|
528
533
|
end
|
529
534
|
yield book
|
530
535
|
ensure
|
531
536
|
if book && book.alive?
|
532
|
-
unless book.saved
|
533
|
-
book.save unless options[:read_only]
|
534
|
-
book.Saved = true if (was_saved || (not was_open)) && options[:read_only]
|
535
|
-
book.Saved = false if (not was_saved) && (not options[:read_only]) && was_open
|
536
|
-
end
|
537
|
+
book.save unless book.saved || do_not_write || book.ReadOnly
|
537
538
|
if was_open
|
538
|
-
if
|
539
|
+
if opts[:rw_change_excel]==book.excel && change_rw_mode
|
539
540
|
book.close
|
540
|
-
open(file, :force => {:excel =>
|
541
|
-
end
|
541
|
+
book = open(file, :force => {:excel => opts[:rw_change_excel]}, :read_only => (not was_writable))
|
542
|
+
end
|
542
543
|
book.excel.calculation = was_calculation
|
543
544
|
book.CheckCompatibility = was_check_compatibility
|
544
545
|
#book.visible = was_visible # not necessary
|
545
|
-
end
|
546
|
-
|
547
|
-
book.close unless was_open ||
|
546
|
+
end
|
547
|
+
book.Saved = (was_saved || (not was_open))
|
548
|
+
book.close unless was_open || opts[:keep_open]
|
548
549
|
end
|
549
550
|
end
|
550
551
|
end
|
@@ -552,7 +553,9 @@ module RobustExcelOle
|
|
552
553
|
# reopens a closed workbook
|
553
554
|
# @options options
|
554
555
|
def reopen(options = { })
|
555
|
-
self.class.open(@stored_filename, options)
|
556
|
+
book = self.class.open(@stored_filename, options)
|
557
|
+
raise WorkbookREOError("cannot reopen book") unless book && book.alive?
|
558
|
+
book
|
556
559
|
end
|
557
560
|
|
558
561
|
# simple save of a workbook.
|
@@ -825,10 +828,6 @@ module RobustExcelOle
|
|
825
828
|
unless opts[:read_only].nil?
|
826
829
|
# if the ReadOnly status shall be changed, then close and reopen it
|
827
830
|
if ((not writable) and (not opts[:read_only])) or (writable and opts[:read_only])
|
828
|
-
#opts[:check_compatibility] = opts[:check_compatibility].nil? ? check_compatibility :
|
829
|
-
# DEFAULT_OPEN_OPTS[:check_compatibility]
|
830
|
-
#opts[:check_compatibility] = opts[:check_compatibility].nil? ? check_compatibility :
|
831
|
-
# opts[:check_compatibility]
|
832
831
|
opts[:check_compatibility] = check_compatibility if opts[:check_compatibility].nil?
|
833
832
|
close(:if_unsaved => true)
|
834
833
|
open_or_create_workbook(@stored_filename, opts)
|