robust_excel_ole 0.5.1 → 0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog +13 -0
- data/README.rdoc +70 -21
- data/README_detail.rdoc +60 -27
- data/examples/edit_sheets/example_access_sheets_and_cells.rb +2 -2
- data/examples/edit_sheets/example_adding_sheets.rb +2 -2
- data/examples/edit_sheets/example_concating.rb +2 -3
- data/examples/edit_sheets/example_copying.rb +2 -3
- data/examples/edit_sheets/example_expanding.rb +2 -3
- data/examples/edit_sheets/example_naming.rb +2 -3
- data/examples/edit_sheets/example_ranges.rb +2 -2
- data/examples/edit_sheets/example_saving.rb +2 -3
- data/examples/open_save_close/example_control_to_excel.rb +3 -3
- data/examples/open_save_close/example_default_excel.rb +4 -4
- 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 +2 -2
- data/examples/open_save_close/example_if_unsaved_forget.rb +2 -2
- data/examples/open_save_close/example_if_unsaved_forget_more.rb +4 -5
- data/examples/open_save_close/example_read_only.rb +2 -2
- data/examples/open_save_close/example_rename_cells.rb +3 -3
- data/examples/open_save_close/example_reuse.rb +2 -2
- data/examples/open_save_close/example_simple.rb +3 -4
- data/examples/open_save_close/example_unobtrusively.rb +2 -2
- data/lib/robust_excel_ole/book.rb +84 -78
- data/lib/robust_excel_ole/bookstore.rb +5 -1
- data/lib/robust_excel_ole/excel.rb +165 -188
- data/lib/robust_excel_ole/reo_common.rb +4 -0
- data/lib/robust_excel_ole/sheet.rb +15 -6
- data/lib/robust_excel_ole/version.rb +1 -1
- data/spec/book_spec.rb +104 -77
- data/spec/book_specs/book_close_spec.rb +9 -8
- data/spec/book_specs/book_misc_spec.rb +367 -26
- data/spec/book_specs/book_open_spec.rb +375 -94
- data/spec/book_specs/book_save_spec.rb +137 -112
- data/spec/book_specs/book_sheet_spec.rb +1 -1
- data/spec/book_specs/book_subclass_spec.rb +2 -1
- data/spec/book_specs/book_unobtr_spec.rb +87 -96
- data/spec/bookstore_spec.rb +8 -5
- data/spec/cell_spec.rb +1 -1
- data/spec/data/another_workbook.xls +0 -0
- data/spec/data/book_with_blank.xls +0 -0
- data/spec/data/workbook.xls +0 -0
- data/spec/excel_spec.rb +484 -72
- data/spec/range_spec.rb +1 -1
- data/spec/sheet_spec.rb +47 -1
- metadata +4 -5
@@ -1,9 +1,8 @@
|
|
1
1
|
# example_saving.rb:
|
2
2
|
# save the sheets of a book as separate workbooks
|
3
3
|
|
4
|
-
require '
|
5
|
-
|
6
|
-
require File.join(File.dirname(__FILE__), '../../lib/general')
|
4
|
+
require File.expand_path('../../lib/robust_excel_ole', File.dirname(__FILE__))
|
5
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '../../spec/helpers/create_temporary_dir')
|
7
6
|
require "fileutils"
|
8
7
|
|
9
8
|
include RobustExcelOle
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# example_give_control_to_excel.rb:
|
2
2
|
# open, close, save with giving control to Excel
|
3
3
|
|
4
|
-
require File.
|
5
|
-
require File.join(File.dirname(__FILE__), '../../spec/helpers/create_temporary_dir')
|
4
|
+
require File.expand_path('../../lib/robust_excel_ole', File.dirname(__FILE__))
|
5
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '../../spec/helpers/create_temporary_dir')
|
6
6
|
require "fileutils"
|
7
7
|
|
8
8
|
include RobustExcelOle
|
@@ -23,7 +23,7 @@ begin
|
|
23
23
|
puts "#{msg.message}" # an exeptions is raised
|
24
24
|
end
|
25
25
|
puts "new book has opened" if new_book
|
26
|
-
Excel.current.
|
26
|
+
Excel.current.visible = true
|
27
27
|
begin
|
28
28
|
book.close(:if_unsaved => :alert) # close the unsaved book.
|
29
29
|
rescue ExcelUserCanceled => msg # user is asked whether the unsaved book shall be saved
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# example_default_excel.rb:
|
2
2
|
# reopening books using :default_excel
|
3
3
|
|
4
|
-
require File.
|
5
|
-
require File.join(File.dirname(__FILE__), '../../spec/helpers/create_temporary_dir')
|
4
|
+
require File.expand_path('../../lib/robust_excel_ole', File.dirname(__FILE__))
|
5
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '../../spec/helpers/create_temporary_dir')
|
6
6
|
require "fileutils"
|
7
7
|
|
8
8
|
include RobustExcelOle
|
@@ -23,9 +23,9 @@ begin
|
|
23
23
|
p "book1 == book2" if book2 == book1 # the books are identical
|
24
24
|
sleep 2
|
25
25
|
new_excel = Excel.new(:reuse => false) # create a new Excel
|
26
|
-
book3 = Book.open(file_name2, :default_excel => :
|
26
|
+
book3 = Book.open(file_name2, :default_excel => :current, :visible => true) # open another book
|
27
27
|
if book3.excel == book2.excel then # since this book cannot be reopened, the option :default_excel applies:
|
28
|
-
p "book3 opened in the first Excel" # according to :default_excel => :
|
28
|
+
p "book3 opened in the first Excel" # according to :default_excel => :current the book is opened
|
29
29
|
end # in the Excel instance the was created first
|
30
30
|
sleep 2
|
31
31
|
new_excel = Excel.new(:reuse => false)
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# example_force_excel.rb:
|
2
2
|
# opening books in new or given Excel instances using :force_excel
|
3
3
|
|
4
|
-
require File.
|
5
|
-
require File.join(File.dirname(__FILE__), '../../spec/helpers/create_temporary_dir')
|
4
|
+
require File.expand_path('../../lib/robust_excel_ole', File.dirname(__FILE__))
|
5
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '../../spec/helpers/create_temporary_dir')
|
6
6
|
require "fileutils"
|
7
7
|
|
8
8
|
include RobustExcelOle
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# example_if_obstructed_close_if_saved.rb:
|
2
2
|
# open with :if_obstructed: :close_if_saved
|
3
3
|
|
4
|
-
require File.
|
5
|
-
require File.join(File.dirname(__FILE__), '../../spec/helpers/create_temporary_dir')
|
4
|
+
require File.expand_path('../../lib/robust_excel_ole', File.dirname(__FILE__))
|
5
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '../../spec/helpers/create_temporary_dir')
|
6
6
|
require "fileutils"
|
7
7
|
|
8
8
|
include RobustExcelOle
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# example_if_obstructed_forget.rb:
|
2
2
|
# open with :if_obstructed: :forget, :new_excel
|
3
3
|
|
4
|
-
require File.
|
5
|
-
require File.join(File.dirname(__FILE__), '../../spec/helpers/create_temporary_dir')
|
4
|
+
require File.expand_path('../../lib/robust_excel_ole', File.dirname(__FILE__))
|
5
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '../../spec/helpers/create_temporary_dir')
|
6
6
|
require "fileutils"
|
7
7
|
|
8
8
|
include RobustExcelOle
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# example_if_obstructed_save.rb:
|
2
2
|
# open with :if_obstructed: :save
|
3
3
|
|
4
|
-
require File.
|
5
|
-
require File.join(File.dirname(__FILE__), '../../spec/helpers/create_temporary_dir')
|
4
|
+
require File.expand_path('../../lib/robust_excel_ole', File.dirname(__FILE__))
|
5
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '../../spec/helpers/create_temporary_dir')
|
6
6
|
require "fileutils"
|
7
7
|
|
8
8
|
include RobustExcelOle
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# example_ifunsaved_accept.rb:
|
2
2
|
# open with :if_unsaved => :accept, close with :if_unsaved => :save
|
3
3
|
|
4
|
-
require File.
|
5
|
-
require File.join(File.dirname(__FILE__), '../../spec/helpers/create_temporary_dir')
|
4
|
+
require File.expand_path('../../lib/robust_excel_ole', File.dirname(__FILE__))
|
5
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '../../spec/helpers/create_temporary_dir')
|
6
6
|
require "fileutils"
|
7
7
|
|
8
8
|
include RobustExcelOle
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# example_ifunsaved_forget.rb:
|
2
2
|
# open with :if_unsaved => :forget, :new_excel, close with :if_unsaved => :save
|
3
3
|
|
4
|
-
require File.
|
5
|
-
require File.join(File.dirname(__FILE__), '../../spec/helpers/create_temporary_dir')
|
4
|
+
require File.expand_path('../../lib/robust_excel_ole', File.dirname(__FILE__))
|
5
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '../../spec/helpers/create_temporary_dir')
|
6
6
|
require "fileutils"
|
7
7
|
|
8
8
|
include RobustExcelOle
|
@@ -1,19 +1,18 @@
|
|
1
1
|
# example_ifunsaved_forget_more.rb:
|
2
2
|
# open with :if_unsaved => :forget, :new_excel, close with :if_unsaved => :save
|
3
3
|
|
4
|
-
require File.
|
5
|
-
require File.join(File.dirname(__FILE__), '../../spec/helpers/create_temporary_dir')
|
4
|
+
require File.expand_path('../../lib/robust_excel_ole', File.dirname(__FILE__))
|
5
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '../../spec/helpers/create_temporary_dir')
|
6
6
|
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 = Book.open(file_name) # open a book
|
15
15
|
book.excel.visible = true # make current Excel visible
|
16
|
-
sleep
|
17
16
|
sheet = book.sheet(1) # access a sheet
|
18
17
|
first_cell = sheet[1,1].value
|
19
18
|
sheet[1,1] = first_cell == "simple" ? "complex" : "simple" # change a cell
|
@@ -33,6 +32,6 @@ begin
|
|
33
32
|
another_book.close(:if_unsaved => :forget ) # close the last book without saving it.
|
34
33
|
book.close(:if_unsaved => :save) # close the first book and save it before
|
35
34
|
ensure
|
36
|
-
Excel.
|
35
|
+
Excel.kill_all # close all workbooks, quit Excel application
|
37
36
|
rm_tmp(dir)
|
38
37
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# example_read_only: open with read_only mode. save, close
|
2
2
|
|
3
|
-
require File.
|
4
|
-
require File.join(File.dirname(__FILE__), '../../spec/helpers/create_temporary_dir')
|
3
|
+
require File.expand_path('../../lib/robust_excel_ole', File.dirname(__FILE__))
|
4
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '../../spec/helpers/create_temporary_dir')
|
5
5
|
require "fileutils"
|
6
6
|
|
7
7
|
include RobustExcelOle
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# example_simple.rb:
|
2
2
|
# open a book, simple save, save_as, close
|
3
3
|
|
4
|
-
require File.
|
5
|
-
require File.join(File.dirname(__FILE__), '../../spec/helpers/create_temporary_dir')
|
4
|
+
require File.expand_path('../../lib/robust_excel_ole', File.dirname(__FILE__))
|
5
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '../../spec/helpers/create_temporary_dir')
|
6
6
|
require "fileutils"
|
7
7
|
|
8
8
|
include RobustExcelOle
|
@@ -17,7 +17,7 @@ begin
|
|
17
17
|
workbook = book.ole_workbook
|
18
18
|
fullname = workbook.Fullname
|
19
19
|
puts "fullname: #{fullname}"
|
20
|
-
sheet.
|
20
|
+
sheet.set_name("a_name",1,1) # rename cell A1 to "a_name"
|
21
21
|
number = workbook.Names.Count
|
22
22
|
puts "number of name objects :#{number}"
|
23
23
|
name_object = workbook.Names("a_name")
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# example_reuse.rb: open a book in a new Excel and a running Excel instance. make visible
|
2
2
|
|
3
|
-
require File.
|
4
|
-
require File.join(File.dirname(__FILE__), '../../spec/helpers/create_temporary_dir')
|
3
|
+
require File.expand_path('../../lib/robust_excel_ole', File.dirname(__FILE__))
|
4
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '../../spec/helpers/create_temporary_dir')
|
5
5
|
require "fileutils"
|
6
6
|
|
7
7
|
include RobustExcelOle
|
@@ -5,15 +5,14 @@ LOG_TO_STDOUT = false
|
|
5
5
|
REO_LOG_FILE = "reo2.log"
|
6
6
|
REO_LOG_DIR = "C:/"
|
7
7
|
|
8
|
-
require File.
|
9
|
-
require File.join(File.dirname(__FILE__), '../../spec/helpers/create_temporary_dir')
|
8
|
+
require File.expand_path('../../lib/robust_excel_ole', File.dirname(__FILE__))
|
9
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '../../spec/helpers/create_temporary_dir')
|
10
10
|
require "fileutils"
|
11
11
|
|
12
12
|
include RobustExcelOle
|
13
13
|
|
14
14
|
Excel.kill_all
|
15
15
|
begin
|
16
|
-
trace "hello"
|
17
16
|
dir = create_tmpdir
|
18
17
|
file_name = dir + 'workbook.xls'
|
19
18
|
other_file_name = dir + 'different_workbook.xls'
|
@@ -34,6 +33,6 @@ begin
|
|
34
33
|
book.close # close the book
|
35
34
|
ensure
|
36
35
|
Excel.close_all # close workbooks, quit Excel application
|
37
|
-
rm_tmp(dir)
|
36
|
+
#rm_tmp(dir)
|
38
37
|
end
|
39
38
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# example_unobtrusively.rb:
|
2
2
|
|
3
|
-
require File.
|
4
|
-
require File.join(File.dirname(__FILE__), '../../spec/helpers/create_temporary_dir')
|
3
|
+
require File.expand_path('../../lib/robust_excel_ole', File.dirname(__FILE__))
|
4
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), '../../spec/helpers/create_temporary_dir')
|
5
5
|
require "fileutils"
|
6
6
|
|
7
7
|
include RobustExcelOle
|
@@ -15,13 +15,13 @@ module RobustExcelOle
|
|
15
15
|
alias ole_object ole_workbook
|
16
16
|
|
17
17
|
DEFAULT_OPEN_OPTS = {
|
18
|
-
:
|
19
|
-
:default_excel => :active,
|
18
|
+
:default_excel => :current,
|
20
19
|
:if_unsaved => :raise,
|
21
20
|
:if_obstructed => :raise,
|
22
21
|
:if_absent => :raise,
|
23
22
|
:read_only => false,
|
24
|
-
:check_compatibility => true
|
23
|
+
:check_compatibility => true,
|
24
|
+
:update_links => :never
|
25
25
|
}
|
26
26
|
|
27
27
|
class << self
|
@@ -29,26 +29,26 @@ module RobustExcelOle
|
|
29
29
|
# opens a workbook.
|
30
30
|
# @param [String] file the file name
|
31
31
|
# @param [Hash] opts the options
|
32
|
-
# @option opts [Variant] :default_excel :active (default), :new, or <excel-instance>
|
33
|
-
# @option opts [Variant] :force_excel :
|
32
|
+
# @option opts [Variant] :default_excel :current (or :active, or :reuse) (default), :new, or <excel-instance>
|
33
|
+
# @option opts [Variant] :force_excel :current, :new, or <excel-instance>
|
34
34
|
# @option opts [Symbol] :if_unsaved :raise (default), :forget, :accept, :alert, :excel, or :new_excel
|
35
35
|
# @option opts [Symbol] :if_obstructed :raise (default), :forget, :save, :close_if_saved, or _new_excel
|
36
|
-
# @option opts [Symbol] :if_absent :raise (default)
|
37
|
-
# @option opts [Boolean] :read_only true (default)
|
38
|
-
# @option opts [Boolean] :
|
39
|
-
# @option opts [Boolean] :visible true
|
36
|
+
# @option opts [Symbol] :if_absent :raise (default) or :create
|
37
|
+
# @option opts [Boolean] :read_only true (default) or false
|
38
|
+
# @option opts [Boolean] :update_links :never (default), :always, :alert
|
39
|
+
# @option opts [Boolean] :visible true or false (default)
|
40
40
|
# options:
|
41
41
|
# :default_excel if the workbook was already open in an Excel instance, then open it in that Excel instance,
|
42
42
|
# where it was opened most recently
|
43
43
|
# Otherwise, i.e. if the workbook was not open before or the Excel instance is not alive
|
44
|
-
# :
|
45
|
-
#
|
46
|
-
#
|
47
|
-
# :new
|
48
|
-
# <excel-instance>
|
44
|
+
# :current -> connects to a running (the first opened) Excel instance,
|
45
|
+
# (or :active, :reuse) excluding the hidden Excel instance, if it exists,
|
46
|
+
# otherwise opens in a new Excel instance.
|
47
|
+
# :new -> opens in a new Excel instance
|
48
|
+
# <excel-instance> -> opens in the given Excel instance
|
49
49
|
# :force_excel no matter whether the workbook was already open
|
50
|
-
# :new
|
51
|
-
# :
|
50
|
+
# :new -> opens in a new Exceö instance
|
51
|
+
# :current (or :active, :reuse) -> opens in the current Excel instance
|
52
52
|
# <excel-instance> -> opens in the given Excel instance
|
53
53
|
# :if_unsaved if an unsaved workbook with the same name is open, then
|
54
54
|
# :raise -> raises an exception
|
@@ -65,22 +65,20 @@ module RobustExcelOle
|
|
65
65
|
# :new_excel -> opens the new workbook in a new Excel instance
|
66
66
|
# :if_absent :raise -> raises an exception , if the file does not exists
|
67
67
|
# :create -> creates a new Excel file, if it does not exists
|
68
|
-
#
|
69
|
-
# :
|
70
|
-
# :
|
71
|
-
# :
|
72
|
-
# :check_compatibility check compatibility when saving
|
73
|
-
# if :default_excel is set, then DisplayAlerts and Visible are set only if these parameters are given
|
68
|
+
# :read_only true -> opens in read-only mode
|
69
|
+
# :update_links true -> user is being asked how to update links, false -> links are never updated
|
70
|
+
# :visible true -> makes the window of the workbook visible
|
71
|
+
# :check_compatibility true -> check compatibility when saving
|
74
72
|
# @return [Book] a workbook
|
75
73
|
def open(file, opts={ }, &block)
|
76
74
|
options = DEFAULT_OPEN_OPTS.merge(opts)
|
77
|
-
options[:default_excel] = :
|
78
|
-
options[:force_excel] = :
|
75
|
+
options[:default_excel] = :current if (options[:default_excel] == :reuse || options[:default_excel] == :active)
|
76
|
+
options[:force_excel] = :current if (options[:force_excel] == :reuse || options[:force_excel] == :active)
|
79
77
|
book = nil
|
80
78
|
if (not (options[:force_excel] == :new))
|
81
79
|
# if readonly is true, then prefer a book that is given in force_excel if this option is set
|
82
80
|
forced_excel = if options[:force_excel]
|
83
|
-
options[:force_excel] == :
|
81
|
+
options[:force_excel] == :current ? excel_class.new(:reuse => true) : excel_of(options[:force_excel])
|
84
82
|
end
|
85
83
|
book = bookstore.fetch(file,
|
86
84
|
:prefer_writable => (not options[:read_only]),
|
@@ -94,6 +92,7 @@ module RobustExcelOle
|
|
94
92
|
book.close if (book.alive? && (not book.writable) && (not options[:read_only]))
|
95
93
|
# reopens the book
|
96
94
|
book.ensure_workbook(file,options) unless book.alive?
|
95
|
+
book.visible = options[:visible] unless options[:visible].nil?
|
97
96
|
return book
|
98
97
|
end
|
99
98
|
end
|
@@ -102,7 +101,8 @@ module RobustExcelOle
|
|
102
101
|
end
|
103
102
|
end
|
104
103
|
|
105
|
-
# creates a Book object
|
104
|
+
# creates a Book object by opening an Excel file given its filename workbook or
|
105
|
+
# by lifting a Win32OLE object representing an Excel file
|
106
106
|
# @param [WIN32OLE] workbook a workbook
|
107
107
|
# @param [Hash] opts the options
|
108
108
|
# @option opts [Symbol] see above
|
@@ -113,7 +113,7 @@ module RobustExcelOle
|
|
113
113
|
if filename
|
114
114
|
book = bookstore.fetch(filename)
|
115
115
|
if book && book.alive?
|
116
|
-
book.
|
116
|
+
book.visible = opts[:visible] unless opts[:visible].nil?
|
117
117
|
return book
|
118
118
|
end
|
119
119
|
end
|
@@ -135,13 +135,15 @@ module RobustExcelOle
|
|
135
135
|
# use the Excel instance where the workbook is opened
|
136
136
|
win32ole_excel = WIN32OLE.connect(workbook.Fullname).Application rescue nil
|
137
137
|
@excel = excel_class.new(win32ole_excel)
|
138
|
-
|
138
|
+
@excel.visible = options[:visible] unless options[:visible].nil?
|
139
139
|
# if the Excel could not be promoted, then create it
|
140
140
|
ensure_excel(options)
|
141
141
|
else
|
142
142
|
file = file_or_workbook
|
143
143
|
ensure_excel(options)
|
144
144
|
ensure_workbook(file, options)
|
145
|
+
@ole_workbook.CheckCompatibility = options[:check_compatibility]
|
146
|
+
@can_be_closed = false if @can_be_closed.nil?
|
145
147
|
end
|
146
148
|
bookstore.store(self)
|
147
149
|
if block
|
@@ -153,11 +155,6 @@ module RobustExcelOle
|
|
153
155
|
end
|
154
156
|
end
|
155
157
|
|
156
|
-
def apply_options(options) # :nodoc: #
|
157
|
-
@excel.visible = options[:visible] unless options[:visible].nil?
|
158
|
-
@excel.displayalerts = options[:displayalerts] unless options[:displayalerts].nil?
|
159
|
-
end
|
160
|
-
|
161
158
|
private
|
162
159
|
|
163
160
|
# returns an Excel object when given Excel, Book or Win32ole object representing a Workbook or an Excel
|
@@ -187,16 +184,14 @@ module RobustExcelOle
|
|
187
184
|
def ensure_excel(options) # :nodoc: #
|
188
185
|
return if @excel && @excel.alive?
|
189
186
|
options[:excel] = options[:force_excel] ? options[:force_excel] : options[:default_excel]
|
190
|
-
options[:excel] = :
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
@excel = excel_class.new(excel_options) unless (@excel && @excel.alive?)
|
195
|
-
apply_options unless excel_options
|
196
|
-
end
|
187
|
+
options[:excel] = :current if (options[:excel] == :reuse || options[:excel] == :active)
|
188
|
+
@excel = self.class.excel_of(options[:excel]) unless (options[:excel] == :current || options[:excel] == :new)
|
189
|
+
@excel = excel_class.new(:reuse => (options[:excel] == :current)) unless (@excel && @excel.alive?)
|
190
|
+
end
|
197
191
|
|
198
192
|
def ensure_workbook(file, options) # :nodoc: #
|
199
193
|
file = @stored_filename ? @stored_filename : file
|
194
|
+
raise(ExcelErrorOpen, "filename is nil") if file.nil?
|
200
195
|
unless File.exist?(file)
|
201
196
|
if options[:if_absent] == :create
|
202
197
|
@ole_workbook = excel_class.current.generate_workbook(file)
|
@@ -231,7 +226,7 @@ module RobustExcelOle
|
|
231
226
|
open_or_create_workbook(file, options)
|
232
227
|
end
|
233
228
|
when :new_excel
|
234
|
-
excel_options = {:
|
229
|
+
excel_options = {:visible => false}.merge(options)
|
235
230
|
excel_options[:reuse] = false
|
236
231
|
@excel = excel_class.new(excel_options)
|
237
232
|
open_or_create_workbook(file, options)
|
@@ -255,7 +250,7 @@ module RobustExcelOle
|
|
255
250
|
open_or_create_workbook(file,options)
|
256
251
|
end
|
257
252
|
when :new_excel
|
258
|
-
excel_options = {:
|
253
|
+
excel_options = {:visible => false}.merge(options)
|
259
254
|
excel_options[:reuse] = false
|
260
255
|
@excel = excel_class.new(excel_options)
|
261
256
|
open_or_create_workbook(file, options)
|
@@ -294,10 +289,19 @@ module RobustExcelOle
|
|
294
289
|
# delay: with visible: 0.2 sec, without visible almost none
|
295
290
|
count = workbooks.Count
|
296
291
|
workbooks.Add if @excel.Version == "12.0" && count == 0
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
292
|
+
update_links_opt =
|
293
|
+
case options[:update_links]
|
294
|
+
when :alert; RobustExcelOle::XlUpdateLinksUserSetting
|
295
|
+
when :never; RobustExcelOle::XlUpdateLinksNever
|
296
|
+
when :always; RobustExcelOle::XlUpdateLinksAlways
|
297
|
+
else RobustExcelOle::XlUpdateLinksNever
|
298
|
+
end
|
299
|
+
@excel.with_displayalerts(update_links_opt == :alert ? true : @excel.displayalerts) do
|
300
|
+
# ??? determining update_links_opt here does not work, it is always XlUpdateLinksNever afterwords
|
301
|
+
workbooks.Open(filename, { 'ReadOnly' => options[:read_only] , 'UpdateLinks' => update_links_opt } )
|
302
|
+
end
|
303
|
+
workbooks.Open(filename, { 'ReadOnly' => options[:read_only] } )
|
304
|
+
workbooks.Item(1).Close if @excel.Version == "12.0" && count == 0
|
301
305
|
rescue WIN32OLERuntimeError => msg
|
302
306
|
trace "WIN32OLERuntimeError: #{msg.message}"
|
303
307
|
if msg.message =~ /800A03EC/
|
@@ -307,12 +311,13 @@ module RobustExcelOle
|
|
307
311
|
end
|
308
312
|
end
|
309
313
|
begin
|
310
|
-
# workaround for bug in Excel 2010: workbook.Open does not always return
|
311
|
-
|
312
|
-
|
314
|
+
# workaround for bug in Excel 2010: workbook.Open does not always return the workbook with given file name
|
315
|
+
@ole_workbook = workbooks.Item(File.basename(filename))
|
316
|
+
self.visible = options[:visible] unless options[:visible].nil?
|
317
|
+
@ole_workbook.UpdateLinks = update_links_opt
|
313
318
|
rescue WIN32OLERuntimeError
|
314
319
|
raise ExcelErrorOpen, "cannot find the file #{File.basename(filename).inspect}"
|
315
|
-
end
|
320
|
+
end
|
316
321
|
end
|
317
322
|
end
|
318
323
|
|
@@ -385,34 +390,30 @@ module RobustExcelOle
|
|
385
390
|
# @param [String] file the file name
|
386
391
|
# @param [Hash] if_closed an option
|
387
392
|
# @param [Hash] opts the options
|
388
|
-
# @option opts [Variant] :if_closed :
|
393
|
+
# @option opts [Variant] :if_closed :current (or :reuse, :active) (default), :hidden or a Excel instance
|
389
394
|
# @option opts [Boolean] :read_only whether the file is opened for read-only
|
390
395
|
# @option opts [Boolean] :readonly_excel behaviour when workbook is opened read-only and shall be modified
|
391
396
|
# @option opts [Boolean] :keep_open whether the workbook shall be kept open after unobtrusively opening
|
392
|
-
# @option opts [Boolean] :displayalerts true, or false (default)
|
393
397
|
# @option opts [Boolean] :visible true, or false (default)
|
394
398
|
# options:
|
395
399
|
# :if_closed : if the workbook is closed, then open it in
|
396
|
-
# :
|
397
|
-
#
|
400
|
+
# :current (or :active, :reuse) -> the Excel instance of the workbook, if it exists,
|
401
|
+
# reuse another Excel, otherwise
|
398
402
|
# :hidden -> a separate Excel instance that is not visible and has no displayaslerts
|
399
403
|
# <excel-instance> -> the given Excel instance
|
400
|
-
# :read_only : opens the workbook unobtrusively for reading only (default: false)
|
401
404
|
# :readonly_excel: if the workbook is opened only as ReadOnly and shall be modified, then
|
402
405
|
# true: closes it and open it as writable in the Excel instance where it was open so far
|
403
406
|
# false (default) opens it as writable in another running excel instance, if it exists,
|
404
407
|
# otherwise open in a new Excel instance.
|
405
|
-
# :
|
406
|
-
# :visible makes visible in Excel
|
407
|
-
# :check_compatibility checks compatibility when saving
|
408
|
+
# :visible, :readl_only, :update_links, :check_compatibility : see options in #open
|
408
409
|
# @return [Book] a workbook
|
409
410
|
def self.unobtrusively(file, if_closed = nil, opts = { }, &block)
|
410
411
|
if if_closed.is_a? Hash
|
411
412
|
opts = if_closed
|
412
413
|
if_closed = nil
|
413
414
|
end
|
414
|
-
if_closed = :
|
415
|
-
if_closed = :
|
415
|
+
if_closed = :current if (if_closed == :reuse || if_closed == :active)
|
416
|
+
if_closed = :current unless if_closed
|
416
417
|
options = {
|
417
418
|
:read_only => false,
|
418
419
|
:readonly_excel => false,
|
@@ -435,8 +436,8 @@ module RobustExcelOle
|
|
435
436
|
book =
|
436
437
|
if was_not_alive_or_nil
|
437
438
|
case if_closed
|
438
|
-
when :
|
439
|
-
open(file, :read_only => options[:read_only])
|
439
|
+
when :current
|
440
|
+
open(file, :default_excel => :current, :read_only => options[:read_only])
|
440
441
|
when :hidden
|
441
442
|
open(file, :force_excel => bookstore.hidden_excel, :read_only => options[:read_only])
|
442
443
|
else
|
@@ -450,7 +451,6 @@ module RobustExcelOle
|
|
450
451
|
open(file, :force_excel => :new, :read_only => options[:read_only])
|
451
452
|
end
|
452
453
|
end
|
453
|
-
book.excel.displayalerts = options[:displayalerts] unless options[:displayalerts].nil?
|
454
454
|
book.excel.visible = options[:visible] unless options[:visible].nil?
|
455
455
|
old_check_compatibility = book.CheckCompatibility
|
456
456
|
book.CheckCompatibility = options[:check_compatibility]
|
@@ -477,7 +477,7 @@ module RobustExcelOle
|
|
477
477
|
# @raise ExcelErrorSave if workbook is not alive or opened for read-only, or another error occurs
|
478
478
|
# @return [Boolean] true, if successfully saved, nil otherwise
|
479
479
|
def save
|
480
|
-
raise ExcelErrorSave, "
|
480
|
+
raise ExcelErrorSave, "workbook is not alive" if (not alive?)
|
481
481
|
raise ExcelErrorSave, "Not opened for writing (opened with :read_only option)" if @ole_workbook.ReadOnly
|
482
482
|
begin
|
483
483
|
@ole_workbook.Save
|
@@ -511,8 +511,9 @@ module RobustExcelOle
|
|
511
511
|
# the file already exists (with option :if_exists :raise),
|
512
512
|
# the workbook is blocked by another one (with option :if_obstructed :raise)
|
513
513
|
# @return [Book], the book itself, if successfully saved, raises an exception otherwise
|
514
|
-
def save_as(file
|
515
|
-
raise
|
514
|
+
def save_as(file, opts = { } )
|
515
|
+
raise(ExcelErrorSave, "filename is nil") if file.nil?
|
516
|
+
raise ExcelErrorSave, "workbook is not alive" if (not alive?)
|
516
517
|
raise ExcelErrorSave, "Not opened for writing (opened with :read_only option)" if @ole_workbook.ReadOnly
|
517
518
|
options = {
|
518
519
|
:if_exists => :raise,
|
@@ -704,16 +705,20 @@ module RobustExcelOle
|
|
704
705
|
# returns the contents of a range with given name
|
705
706
|
# evaluates formula contents of the range is a formula
|
706
707
|
# if no contents could be returned, then return default value, if provided, raise error otherwise
|
708
|
+
# Excel Bug: if a local name without a qualifier is given, then by default Excel takes the first worksheet,
|
709
|
+
# even if a different worksheet is active
|
707
710
|
# @param [String] name the name of the range
|
708
711
|
# @param [Hash] opts the options
|
709
712
|
# @option opts [Symbol] :default the default value that is provided if no contents could be returned
|
710
713
|
# @raise ExcelError if range name is not in the workbook or if range value could not be evaluated
|
711
714
|
# @return [Variant] the contents of a range with given name
|
715
|
+
|
712
716
|
def nameval(name, opts = {:default => nil})
|
717
|
+
default_val = opts[:default]
|
713
718
|
begin
|
714
719
|
name_obj = self.Names.Item(name)
|
715
720
|
rescue WIN32OLERuntimeError
|
716
|
-
return
|
721
|
+
return default_val if default_val
|
717
722
|
raise ExcelError, "name #{name.inspect} not in #{File.basename(self.stored_filename).inspect}"
|
718
723
|
end
|
719
724
|
begin
|
@@ -722,15 +727,15 @@ module RobustExcelOle
|
|
722
727
|
begin
|
723
728
|
value = self.sheet(1).Evaluate(name_obj.Name)
|
724
729
|
rescue WIN32OLERuntimeError
|
725
|
-
return
|
726
|
-
raise
|
730
|
+
return default_val if default_val
|
731
|
+
raise ExcelError, "cannot evaluate name #{name.inspect} in #{File.basename(self.stored_filename).inspect}"
|
727
732
|
end
|
728
733
|
end
|
729
|
-
if value == -2146826259
|
730
|
-
return
|
731
|
-
raise
|
734
|
+
if value == RobustExcelOle::XlErrName # -2146826259
|
735
|
+
return default_val if default_val
|
736
|
+
raise ExcelError, "cannot evaluate name #{name.inspect} in #{File.basename(self.stored_filename).inspect}"
|
732
737
|
end
|
733
|
-
return
|
738
|
+
return default_val if default_val && value.nil?
|
734
739
|
value
|
735
740
|
end
|
736
741
|
|
@@ -782,15 +787,16 @@ module RobustExcelOle
|
|
782
787
|
|
783
788
|
# returns true, if the workbook is visible, false otherwise
|
784
789
|
def visible
|
785
|
-
@excel.Windows(@ole_workbook.Name).Visible
|
790
|
+
@excel.visible && @ole_workbook.Windows(@ole_workbook.Name).Visible
|
786
791
|
end
|
787
792
|
|
788
|
-
# makes
|
793
|
+
# makes the window of the workbook visible or invisible
|
789
794
|
# @param [Boolean] visible_value value that determines whether the workbook shall be visible
|
790
795
|
def visible= visible_value
|
791
796
|
saved = @ole_workbook.Saved
|
792
|
-
@excel.
|
793
|
-
|
797
|
+
@excel.visible = true if visible_value
|
798
|
+
@ole_workbook.Windows(@ole_workbook.Name).Visible = visible_value if @excel.Visible
|
799
|
+
save if saved && (not self.ReadOnly)
|
794
800
|
end
|
795
801
|
|
796
802
|
# returns true, if the workbook reacts to methods, false otherwise
|
@@ -837,7 +843,7 @@ module RobustExcelOle
|
|
837
843
|
self.class.bookstore
|
838
844
|
end
|
839
845
|
|
840
|
-
def self.
|
846
|
+
def self.all_books # :nodoc: #
|
841
847
|
bookstore.books
|
842
848
|
end
|
843
849
|
|