robust_excel_ole 0.2.0.5 → 0.2.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -1,13 +1,19 @@
1
1
  = RobustExcelOle
2
2
 
3
- This is a simple fork from tomiacannondale's wrap_excel adapted to Ruby 1.8.6.
3
+ robust_excel_ole wraps the win32ole, and uses the Excel operations with ruby.
4
+
5
+ == Description
6
+
7
+ robust_excel_ole started as a simple fork from tomiacannondale's wrap_excel adapted to Ruby 1.8.6.
4
8
  The functionality of wrap_excel is optimised and extended by new features.
5
9
 
6
10
  This is work in progress.
7
11
 
8
- == Description
9
-
10
- RobustExcelOle wraps the win32ole, and uses the Excel operations with ruby.
12
+ Notice some features in robust_excel_ole that are not compatible with wrap_excel:
13
+ * +save_as+ instead of +save+.
14
+ * +open+ uses by default a running Excel application instead of creating a new one,
15
+ and opens a book by default in writable mode instead of read_only
16
+ * +close+ closes the workbook instead of closing all workbooks and the Excel application.
11
17
 
12
18
  == Requirements
13
19
 
@@ -20,156 +26,135 @@ RobustExcelOle wraps the win32ole, and uses the Excel operations with ruby.
20
26
 
21
27
  == Usage
22
28
 
23
- === open a book
29
+ === Open a book.
24
30
 
25
- Open a book.
31
+ Example:
26
32
 
27
- book = RobustExcelOle::Book.open('./sample.xls')
33
+ book = RobustExcelOle::Book.open('./sample.xls')
28
34
 
29
- Open a book with a block.
35
+ Open a book with a block.
36
+ The semantics is similar to, e.g., File.open.
30
37
 
31
38
  RobustExcelOle::Book.open('./sample.xls') do |book|
32
39
  # do something
33
40
  end
41
+
34
42
 
35
43
  Options are the following:
36
44
 
37
- [:reuse] boolean (default true) use an already open Excel-application
38
- [:read_only] boolean (default false) open in read-only mode
39
- [:displayalerts] boolean (default false) allow display alerts in Excel
40
- [:visible] boolean (default false) make visibe in Excel
45
+ [:reuse] boolean (default: true). use an already open Excel-application
46
+ [:read_only] boolean (default: false). open in read-only mode
47
+ [:displayalerts] boolean (default: false). allow display alerts in Excel
48
+ [:visible] boolean (default: false). make visibe in Excel
41
49
  [:if_unsaved] :raise (default), :accept, :forget, :new_app, :excel
42
- if an unsaved book with the same name is open
43
-
44
- :raise
45
-
46
- Raise an exception. Don't open the book.
47
-
48
- :accept
49
-
50
- Let the unsaved book open.
51
-
52
- :forget
53
-
54
- Close the unsaved book, open the new book.
55
-
56
- :new_app
57
-
58
- Open the new book in a new Excel application.
59
-
60
- :excel
61
-
62
- Give control to Excel.
63
-
64
-
65
50
  [:if_unsaved_other_book] :raise (default), :save, :forget, :new_app
66
- if an unsaved book with same name in a different path is open,
67
-
68
- :raise
69
-
70
- Raise an exception. Don't open the book.
71
-
72
- :save
51
+
73
52
 
74
- Save and close the unsaved book and open the new book.
53
+ The option :if_unsaved :
75
54
 
76
- :forget
55
+ If an unsaved book with the same name is open, then
56
+
57
+ [:raise ] Raise an exeption. Don't open the book.
58
+ [:accept] Let the unsaved book open.
59
+ [:forget] Close the unsaved book, open the new book.
60
+ [:new_app] Open the new book in a new Excel application
61
+ [:excel] Give control to Excel.
77
62
 
78
- Close the unsaved book, open the new book
79
-
80
- :new_app
63
+ The option :if_unsaved_other_book :
81
64
 
82
- Open the new book in a new Excel application
65
+ If an unsaved book with same name in a different path is open, then
66
+
67
+ [:raise] Raise an exception. Don't open the book.
68
+ [:save] Save and close the unsaved book and open the new book.
69
+ [:forget] Close the unsaved book, open the new book.
70
+ [:new_app] Open the new book in a new Excel application.
83
71
 
84
72
 
85
73
  Examples:
86
74
 
87
75
  Open a book.
88
76
 
89
- book = RobustExcelOle::Book.open('./sample.xls')
77
+ book = RobustExcelOle::Book.open('./sample.xls')
90
78
 
91
79
  Open another book in the same Excel application.
92
80
 
93
- new_book = RobustExcelOle::Book.open('./different.xls')
81
+ new_book = RobustExcelOle::Book.open('./different.xls')
94
82
 
95
83
  Open another book in a new Excel applications.
96
84
 
97
- new_book = RobustExcelOle::Book.open('./different.xls', :reuse => false)
85
+ new_book = RobustExcelOle::Book.open('./different.xls', :reuse => false)
98
86
 
99
87
  Change the book (see below).
100
88
 
101
- sheet = book[0]
102
- book.add_sheet(sheet, :as => 'copyed_name')
89
+ sheet = book[0]
90
+ book.add_sheet(sheet, :as => 'copyed_name')
103
91
 
104
- Let the unsaved book open, when open a book while a book with the same name is unsaved and open.
92
+ Let the unsaved book open, when opening a book and a book with the same name is unsaved and open.
105
93
 
106
- new_book = RobustExcelOle::Book.open('./sample.xls', :if_unsaved => accept)
94
+ new_book = RobustExcelOle::Book.open('./sample.xls', :if_unsaved => accept)
107
95
 
108
- === save a book
96
+ === Save a book.
109
97
 
110
- Save a book.
98
+ Simple save:
111
99
 
112
- book.save
100
+ book.save
113
101
 
114
102
  Save a book with a file name.
115
103
 
116
- book.save_as('./another_sample.xls')
104
+ book.save_as('./another_sample.xls')
117
105
 
118
106
  Options are the following:
119
107
 
120
- [:if_exists] :overwrite, :excel, :raise (default)
121
-
122
- :overwrite:
123
-
124
- Delete the old file and write the file.
108
+ [:if_exists] :raise (default), :overwrite, :excel
125
109
 
126
- :excel
110
+ The option :if_exists :
127
111
 
128
- Give the control to Excel.
112
+ If a book with the file name already exists, then
129
113
 
130
- :raise
114
+ [:raise] Raise an exeption. Don't write the file.
115
+ [:overwrite] Delete the existing file and write the file. If the book is open in an Excel application, then raise an exeption.
116
+ [:excel] Give the control to Excel.
131
117
 
132
- Raise an exception. Don't write the file.
133
118
 
134
119
  Example:
135
120
 
136
121
  Overwrite a book with the same name.
137
122
 
138
- book.save('./another_sample.xls', :if_exists => :overwrite)
123
+ book.save('./another_sample.xls', :if_exists => :overwrite)
139
124
 
140
125
  === == (equal)
141
126
 
142
- Check whether two books are identical.
127
+ Check whether two referenced Excel workbooks are identical.
143
128
 
144
129
  Example.
145
130
 
146
- if (book == new_book) then
147
- puts "the books are identical"
148
- end
131
+ if (book == new_book) then
132
+ puts "the workbooks are identical"
133
+ end
149
134
 
150
135
  === alive?
151
136
 
152
- Check whether the book is alive.
153
-
154
- book.alive?
137
+ Check whether the referenced Excel workbook responds to methods.
155
138
 
156
- Example.
139
+ Example:
157
140
 
158
- if book.alive? then
159
- puts "the book is alive"
160
- end
141
+ if book.alive? then
142
+ puts "the book is alive"
143
+ end
161
144
 
162
145
  === filename
163
146
 
164
147
  Get the file name of the book.
165
148
 
166
- book.filename
149
+ Example:
150
+
151
+ book.filename
167
152
 
168
- === close a book
153
+ === Close a book.
169
154
 
170
- Close a book
155
+ Example:
171
156
 
172
- book.close
157
+ book.close
173
158
 
174
159
  Options are the following:
175
160
 
@@ -178,7 +163,7 @@ Options are the following:
178
163
 
179
164
  :raise
180
165
 
181
- Raise an exception. Don't close the book
166
+ Raise an exception. Don't close the book.
182
167
 
183
168
  :save
184
169
 
@@ -190,11 +175,11 @@ Close the book.
190
175
 
191
176
  :excel
192
177
 
193
- Give control to Excel
178
+ Give control to Excel.
194
179
 
195
180
 
196
181
 
197
- === access sheet
182
+ === Access a sheet.
198
183
 
199
184
  A sheet object can be accessed with a Book#[] method.
200
185
 
@@ -204,7 +189,7 @@ Access a sheet object with the sheet name.
204
189
 
205
190
  book['Sheet1']
206
191
 
207
- === access row or column
192
+ === Access a row or a column.
208
193
 
209
194
  A sheet object is enumerable. Use the methods Sheet#each_column, Sheet#each_row or Sheet#each.
210
195
 
@@ -221,7 +206,7 @@ A sheet object is enumerable. Use the methods Sheet#each_column, Sheet#each_row
221
206
  # do something with column_range
222
207
  end
223
208
 
224
- === access cell
209
+ === Access a cell.
225
210
 
226
211
  Read a cell from a sheet object.
227
212
 
@@ -241,7 +226,8 @@ If you want to do something that not provide a function, you can use win32ole me
241
226
 
242
227
  == Support
243
228
 
244
- This is work in progress. Please don't hesitate to contact us and to report issues and feature requests to github Issues. https://github.com/Thomas008/robust_excel_ole/issues
229
+ This is work in progress. Please contact us and to report issues and feature requests to github Issues.
230
+ https://github.com/Thomas008/robust_excel_ole/issues
245
231
 
246
232
  == Collaborate
247
233
 
@@ -0,0 +1,35 @@
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
+ module RobustExcelOle
6
+
7
+ ExcelApp.close_all
8
+ begin
9
+ filename = '../spec/data/simple.xls'
10
+ book = RobustExcelOle::Book.open(filename)
11
+ sheet = book[0]
12
+ cell = sheet[0,0]
13
+ i = 0
14
+ sheet.each do |cell|
15
+ i = i + 1
16
+ puts "#{i}. cell: #{cell.value}"
17
+ end
18
+ i = 0
19
+ sheet.each_row do |row|
20
+ i = i + 1
21
+ puts "#{i}. row: #{row.value}"
22
+ end
23
+ i = 0
24
+ sheet.each_column do |column|
25
+ i = i + 1
26
+ puts "#{i}. column: #{column.value}"
27
+ end
28
+ sheet[0,0] = "complex"
29
+ book.save
30
+ book.close
31
+ ensure
32
+ ExcelApp.close_all
33
+ end
34
+
35
+ end
@@ -0,0 +1,33 @@
1
+ # example 2: open a book in a running Excel application and in a new one. make visible
2
+
3
+ require File.join(File.dirname(__FILE__), '../lib/robust_excel_ole')
4
+
5
+ module RobustExcelOle
6
+
7
+ ExcelApp.close_all
8
+ begin
9
+ dir = '../spec/data/'
10
+ file_name1 = dir + 'simple.xls'
11
+ file_name2 = dir + 'different_simple.xls'
12
+ file_name3 = dir + 'different_simple.xls'
13
+ file_name4 = dir + 'book_with_blank.xls'
14
+ book1 = RobustExcelOle::Book.open(file_name1) # open a book in a new Excel application since no Excel is open
15
+ ExcelApp.reuse_if_possible.Visible = true # make Excel visible
16
+ sleep 2
17
+ book2 = RobustExcelOle::Book.open(file_name2) # open a new book in the same Excel application
18
+ sleep 2 # (by default: :reuse => true)
19
+ book3 = RobustExcelOle::Book.open(file_name3, :reuse => false, :visible => true)
20
+ # open another book in a new Excel application, make Excel visible
21
+ sleep 2
22
+ book4 = RobustExcelOle::Book.open(file_name4, :reuse => true, :visible => true)
23
+ # open anther book, and use a running Excel application
24
+ sleep 2 # (Excel chooses the first Excel application)
25
+ book1.close # close the books
26
+ book2.close
27
+ book3.close
28
+ book4.close
29
+ ensure
30
+ ExcelApp.close_all # close workbooks, quit Excel application
31
+ end
32
+
33
+ end
@@ -0,0 +1,32 @@
1
+ # example 3: open a book, simple save, save_as, close
2
+
3
+ require File.join(File.dirname(__FILE__), '../lib/robust_excel_ole')
4
+
5
+ module RobustExcelOle
6
+
7
+ ExcelApp.close_all
8
+ begin
9
+ dir = '../spec/data/'
10
+ file_name = dir + 'simple.xls'
11
+ other_file_name = dir + 'different_simple.xls'
12
+ book = RobustExcelOle::Book.open(file_name) # open a book. default: :read_only => false
13
+ ExcelApp.reuse_if_possible.Visible = true # make Excel visible
14
+ sheet = book[0] # access a sheet
15
+ sleep 1
16
+ sheet[0,0] =
17
+ sheet[0,0].value == "simple" ? "complex" : "simple" # change a cell
18
+ sleep 1
19
+ book.save # simple save
20
+ begin
21
+ book.save_as(other_file_name) # save_as : default :if_exists => :raise
22
+ rescue ExcelErrorSave => msg
23
+ puts "save_as error: #{msg.message}"
24
+ end
25
+ book.save_as(other_file_name, :if_exists => :overwrite) # save_as with :if_exists => :overwrite
26
+ puts "save_as: saved successfully with option :if_exists => :overwrite"
27
+ book.close # close the book
28
+ ensure
29
+ ExcelApp.close_all # close workbooks, quit Excel application
30
+ end
31
+
32
+ end
@@ -0,0 +1,29 @@
1
+ # example 4: open with read_only mode. save, close
2
+
3
+ require File.join(File.dirname(__FILE__), '../lib/robust_excel_ole')
4
+
5
+ module RobustExcelOle
6
+
7
+ ExcelApp.close_all
8
+ begin
9
+ dir = '../spec/data/'
10
+ file_name = dir + 'simple.xls'
11
+ other_file_name = dir + 'different_simple.xls'
12
+ # open a book with read_only and make Excel visible
13
+ book = RobustExcelOle::Book.open(file_name, :read_only => true, :visible => true)
14
+ sheet = book[0] # access a sheet
15
+ sleep 1
16
+ sheet[0,0] =
17
+ sheet[0,0].value == "simple" ? "complex" : "simple" # change a cell
18
+ sleep 1
19
+ begin
20
+ book.save # simple save.
21
+ rescue ExcelErrorSave => msg # raises exception because book is opened in of read_only mode
22
+ puts "save_as error: #{msg.message}"
23
+ end
24
+ book.close # close the book without saving it.
25
+ ensure
26
+ ExcelApp.close_all # close workbooks, quit Excel application
27
+ end
28
+
29
+ end
@@ -0,0 +1,35 @@
1
+ # example 5: open with :if_unsaved => :accept, close with :if_unsaved => :save
2
+
3
+ require File.join(File.dirname(__FILE__), '../lib/robust_excel_ole')
4
+
5
+ module RobustExcelOle
6
+
7
+ ExcelApp.close_all
8
+ begin
9
+ file_name = '../spec/data/simple.xls'
10
+ book = RobustExcelOle::Book.open(file_name) # open a book
11
+ sheet = book[0] # access a sheet
12
+ sheet[0,0] = sheet[0,0].value == "simple" ? "complex" : "simple" # change a cell
13
+ begin
14
+ new_book = RobustExcelOle::Book.open(file_name) # open another book with the same file name
15
+ rescue ExcelErrorOpen => msg # by default: raises an exception:
16
+ puts "open error: #{msg.message}" # a book with the same name is already open and unsaved
17
+ end
18
+ new_book = RobustExcelOle::Book.open(file_name, :if_unsaved => :accept) # open another book with the same file name
19
+ # and let the unsaved book open
20
+ if book.alive? && new_book.alive? then # check whether the referenced workbooks
21
+ puts "open with :if_unsaved => :accept : the two books are alive." # respond to methods
22
+ end
23
+ begin
24
+ book.close # close the book. by default: raises an exception:
25
+ rescue ExcelErrorClose => msg # book is unsaved
26
+ puts "close error: #{msg.message}"
27
+ end
28
+ book.close(:if_unsaved => :save) # save the book before closing it
29
+ puts "closed the book successfully with option :if_unsaved => :save"
30
+ new_book.close # close the other book. It is already saved.
31
+ ensure
32
+ ExcelApp.close_all # close workbooks, quit Excel application
33
+ end
34
+
35
+ end
@@ -41,7 +41,7 @@ module RobustExcelOle
41
41
  :if_unsaved_other_book => :raise
42
42
  }.merge(opts)
43
43
  excel_app_options = {:reuse => true}.merge(opts).delete_if{|k,v|
44
- k== :if_read_only || k== :unsaved || k == :if_unsaved_other_book}
44
+ k== :read_only || k== :if_unsaved || k == :if_unsaved_other_book}
45
45
  if not File.exist?(file)
46
46
  raise ExcelErrorOpen, "file #{file} not found"
47
47
  end
@@ -50,7 +50,8 @@ module RobustExcelOle
50
50
  @workbook = workbooks.Item(File.basename(file)) rescue nil
51
51
  if @workbook then
52
52
  blocked_by_other_book = (File.basename(file) == File.basename(@workbook.Fullname)) &&
53
- (not (file == @workbook.Fullname.gsub("\\","/")))
53
+ (not (absolute_path(file) == @workbook.Fullname))
54
+ #(not (file == @workbook.Fullname.gsub("\\","/")))
54
55
  if blocked_by_other_book then
55
56
  case @options[:if_unsaved_other_book]
56
57
  when :raise
@@ -60,8 +61,8 @@ module RobustExcelOle
60
61
  when :forget
61
62
  @workbook.Close
62
63
  when :new_app
63
- @options[:reuse] = false
64
- @excel_app = ExcelApp.new(@options)
64
+ excel_app_options[:reuse] = false
65
+ @excel_app = ExcelApp.new(excel_app_options)
65
66
  @workbook = nil
66
67
  else
67
68
  raise ExcelErrorOpen, ":if_unsaved_other_book: invalid option"
@@ -81,8 +82,8 @@ module RobustExcelOle
81
82
  old_displayalerts = @excel_app.DisplayAlerts # :nodoc:
82
83
  @excel_app.DisplayAlerts = true # :nodoc:
83
84
  when :new_app
84
- @options[:reuse] = false
85
- @excel_app = ExcelApp.new(@options)
85
+ excel_app_options[:reuse] = false
86
+ @excel_app = ExcelApp.new(excel_app_options)
86
87
  @workbook = nil
87
88
  else
88
89
  raise ExcelErrorOpen, ":if_unsaved: invalid option"
@@ -119,17 +120,13 @@ module RobustExcelOle
119
120
  #
120
121
  # options:
121
122
  # :if_unsaved if book is unsaved
122
- # :raise -> raise an exception (default)
123
- # :save -> save the book before it is closed
124
- # :forget -> close the book
125
- # :excel -> give control to excel
126
- def close(opts={ })
127
- @options = {
128
- :if_unsaved => :raise,
129
- }.merge(opts)
130
- if ((alive?) && (not @workbook.Saved)) then
131
- #puts "book not saved"
132
- case @options[:if_unsaved]
123
+ # :raise -> raise an exception (default)
124
+ # :save -> save the book before it is closed
125
+ # :forget -> close the book
126
+ # :excel -> give control to excel
127
+ def close(opts = {:if_unsaved => :raise})
128
+ if ((alive?) && (not @workbook.Saved) && (not @options[:read_only])) then
129
+ case opts[:if_unsaved]
133
130
  when :raise
134
131
  raise ExcelErrorClose, "book is unsaved (#{File.basename(filename)})"
135
132
  when :save
@@ -146,9 +143,9 @@ module RobustExcelOle
146
143
  begin
147
144
  @workbook.Close if alive?
148
145
  @workbook = nil unless alive?
149
- raise ExcelUserCanceled, "close: canceled by user" if alive? && @options[:if_unsaved] == :excel && (not @workbook.Saved)
146
+ raise ExcelUserCanceled, "close: canceled by user" if alive? && opts[:if_unsaved] == :excel && (not @workbook.Saved)
150
147
  ensure
151
- if @options[:if_unsaved] == :excel then
148
+ if opts[:if_unsaved] == :excel then
152
149
  @excel_app.DisplayAlerts = old_displayalerts # :nodoc:
153
150
  end
154
151
  end
@@ -173,7 +170,7 @@ module RobustExcelOle
173
170
  @workbook.Fullname.tr('\\','/') rescue nil
174
171
  end
175
172
 
176
- #returns true, if the full book names and excel appications are identical, false, otherwise
173
+ # returns true, if the full book names and excel appications are identical, false, otherwise
177
174
  def == other_book
178
175
  other_book.is_a?(Book) &&
179
176
  @excel_app == other_book.excel_app &&
@@ -186,7 +183,7 @@ module RobustExcelOle
186
183
  # saves a book.
187
184
  # returns true, if successfully saved, nil otherwise
188
185
  def save
189
- raise IOError, "Not opened for writing(open with :read_only option)" if @options[:read_only]
186
+ raise ExcelErrorSave, "Not opened for writing (opened with :read_only option)" if @options[:read_only]
190
187
  if @workbook then
191
188
  @workbook.Save
192
189
  true
@@ -215,8 +212,14 @@ module RobustExcelOle
215
212
  if File.exist?(file) then
216
213
  case opts[:if_exists]
217
214
  when :overwrite
218
- File.delete(file)
219
- #File.delete(absolute_path(File.join(dirname, basename)))
215
+ # if a book is open with the name of file, then raise error
216
+ open_workbook = ExcelApp.reuse_if_possible.Workbooks(basename) rescue nil
217
+ #workbook_file = @excel_app.Workbooks(basename) rescue nil
218
+ if open_workbook == nil then
219
+ File.delete(file)
220
+ else
221
+ raise ExcelErrorSave, "book is open and used in Excel"
222
+ end
220
223
  when :excel
221
224
  old_displayalerts = @excel_app.DisplayAlerts # :nodoc:
222
225
  @excel_app.DisplayAlerts = true # :nodoc:
@@ -285,23 +288,23 @@ module RobustExcelOle
285
288
 
286
289
  end
287
290
 
288
- class ExcelUserCanceled < RuntimeError
291
+ class ExcelUserCanceled < RuntimeError # :nodoc: #
289
292
  end
290
293
 
291
- class ExcelError < RuntimeError
294
+ class ExcelError < RuntimeError # :nodoc: #
292
295
  end
293
296
 
294
- class ExcelErrorSave < ExcelError
297
+ class ExcelErrorSave < ExcelError # :nodoc: #
295
298
  end
296
299
 
297
- class ExcelErrorSaveFailed < ExcelErrorSave
300
+ class ExcelErrorSaveFailed < ExcelErrorSave # :nodoc: #
298
301
  end
299
302
 
300
- class ExcelErrorSaveUnknown < ExcelErrorSave
303
+ class ExcelErrorSaveUnknown < ExcelErrorSave # :nodoc: #
301
304
  end
302
305
 
303
- class ExcelErrorOpen < ExcelError
306
+ class ExcelErrorOpen < ExcelError # :nodoc: #
304
307
  end
305
308
 
306
- class ExcelErrorClose < ExcelError
309
+ class ExcelErrorClose < ExcelError # :nodoc: #
307
310
  end
@@ -58,9 +58,9 @@ module RobustExcelOle
58
58
  #trc_info :obj_Parent, o.Parent rescue nil
59
59
  begin
60
60
  o.ole_free
61
- puts "olefree OK"
61
+ #puts "olefree OK"
62
62
  rescue
63
- puts "olefree_error: #{$!}"
63
+ #puts "olefree_error: #{$!}"
64
64
  #puts $!.backtrace.first(9).join "\n"
65
65
  end
66
66
  end
@@ -1,3 +1,3 @@
1
1
  module RobustExcelOle
2
- VERSION = "0.2.0.5"
2
+ VERSION = "0.2.0.6"
3
3
  end
data/spec/book_spec.rb CHANGED
@@ -10,7 +10,7 @@ describe RobustExcelOle::Book do
10
10
 
11
11
  before(:all) do
12
12
  excel_app = RobustExcelOle::ExcelApp.new(:reuse => true)
13
- open_books = excel_app == nil ? 0 : excel_app.Workbooks.Count
13
+ open_books = excel_app == nil ? 0 : excel_app.Workbooks.Count
14
14
  puts "*** open books *** : #{open_books}" if open_books > 0
15
15
  RobustExcelOle::ExcelApp.close_all
16
16
  end
@@ -156,7 +156,7 @@ describe RobustExcelOle::Book do
156
156
  it "should belong to the same Excel application" do
157
157
  @new_book.excel_app.should == @book.excel_app
158
158
  @different_book.excel_app.should == @book.excel_app
159
- end
159
+ end
160
160
  end
161
161
  end
162
162
  end
@@ -166,7 +166,7 @@ describe RobustExcelOle::Book do
166
166
  before do
167
167
  @book = RobustExcelOle::Book.open(@simple_file)
168
168
  @sheet = @book[0]
169
- @book.add_sheet(@sheet, :as => 'copyed_name')
169
+ @book.add_sheet(@sheet, :as => 'a_name')
170
170
  end
171
171
 
172
172
  after do
@@ -207,7 +207,7 @@ describe RobustExcelOle::Book do
207
207
 
208
208
  it "should open the new book and close the unsaved book, if user answers 'yes'" do
209
209
  # "Yes" is the default. --> language independent
210
- @key_sender.puts "{enter}"
210
+ @key_sender.puts "{enter}"
211
211
  @new_book = RobustExcelOle::Book.open(@simple_file, :if_unsaved => :excel)
212
212
  @book.should_not be_alive
213
213
  @new_book.should be_alive
@@ -258,7 +258,7 @@ describe RobustExcelOle::Book do
258
258
  simple_file_other_path = @dir + '/more_data/simple.xls'
259
259
  @book = RobustExcelOle::Book.open(simple_file_other_path)
260
260
  @sheet = @book[0]
261
- @book.add_sheet(@sheet, :as => 'copyed_name')
261
+ @book.add_sheet(@sheet, :as => 'a_name')
262
262
  end
263
263
 
264
264
  after do
@@ -322,17 +322,35 @@ describe RobustExcelOle::Book do
322
322
 
323
323
  it "should close book" do
324
324
  expect{
325
- @book.close
326
- }.to_not raise_error
327
- @book.should_not be_alive
325
+ @book.close
326
+ }.to_not raise_error
327
+ @book.should_not be_alive
328
+ end
329
+ end
330
+
331
+ context "with unsaved book and with :read_only" do
332
+ before do
333
+ @book = RobustExcelOle::Book.open(@simple_file, :read_only => true)
334
+ @sheet_count = @book.workbook.Worksheets.Count
335
+ @book.add_sheet(@sheet, :as => 'a_name')
336
+ end
337
+
338
+ it "should close the unsaved book without error and without saving" do
339
+ expect{
340
+ @book.close
341
+ }.to_not raise_error
342
+ new_book = RobustExcelOle::Book.open(@simple_file)
343
+ new_book.workbook.Worksheets.Count.should == @sheet_count
344
+ new_book.close
328
345
  end
346
+
329
347
  end
330
348
 
331
349
  context "with unsaved book" do
332
350
  before do
333
351
  @book = RobustExcelOle::Book.open(@simple_file)
334
352
  @sheet_count = @book.workbook.Worksheets.Count
335
- @book.add_sheet(@sheet, :as => 'copyed_name')
353
+ @book.add_sheet(@sheet, :as => 'a_name')
336
354
  @sheet = @book[0]
337
355
  end
338
356
 
@@ -397,7 +415,7 @@ describe RobustExcelOle::Book do
397
415
  # "Yes" is the default. "No" is right of "Yes", "Cancel" is right of "No" --> language independent
398
416
  @key_sender.puts "{right}" * position + "{enter}"
399
417
  ole_workbook = @book.workbook
400
- excel_app = @book.excel_app
418
+ excel_app = @book.excel_app
401
419
  displayalert_value = @book.excel_app.DisplayAlerts
402
420
  if answer == :cancel then
403
421
  expect {
@@ -440,11 +458,11 @@ describe RobustExcelOle::Book do
440
458
  end
441
459
 
442
460
  describe "save" do
443
-
461
+
444
462
  context "with simple save" do
445
463
  it "should save for a file opened without :read_only" do
446
464
  @book = RobustExcelOle::Book.open(@simple_file)
447
- @book.add_sheet(@sheet, :as => 'copyed_name')
465
+ @book.add_sheet(@sheet, :as => 'a_name')
448
466
  @new_sheet_count = @book.workbook.Worksheets.Count
449
467
  expect {
450
468
  @book.save
@@ -457,8 +475,7 @@ describe RobustExcelOle::Book do
457
475
  @book = RobustExcelOle::Book.open(@simple_file, :read_only => true)
458
476
  expect {
459
477
  @book.save
460
- }.to raise_error(IOError,
461
- "Not opened for writing(open with :read_only option)")
478
+ }.to raise_error(ExcelErrorSave, "Not opened for writing (opened with :read_only option)")
462
479
  @book.close
463
480
  end
464
481
  end
@@ -527,6 +544,17 @@ describe RobustExcelOle::Book do
527
544
  @book.close
528
545
  end
529
546
 
547
+ it "should raise an error if the book is open" do
548
+ File.delete @simple_save_file rescue nil
549
+ FileUtils.copy @simple_file, @simple_save_file
550
+ # fails with :reuse => false
551
+ book_save = RobustExcelOle::Book.open(@simple_save_file, :reuse => false)
552
+ expect{
553
+ @book.save_as(@simple_save_file, :if_exists => :overwrite)
554
+ }.to raise_error(ExcelErrorSave, "book is open and used in Excel")
555
+ book_save.close
556
+ end
557
+
530
558
  it "should save to simple_save_file.xls with :if_exists => :overwrite" do
531
559
  File.delete @simple_save_file rescue nil
532
560
  File.open(@simple_save_file,"w") do | file |
@@ -621,7 +649,6 @@ describe RobustExcelOle::Book do
621
649
  @book.excel_app.DisplayAlerts.should == displayalert_value
622
650
  end
623
651
 
624
-
625
652
  end
626
653
 
627
654
  it "should save to 'simple_save_file.xls' with :if_exists => nil" do
@@ -658,12 +685,12 @@ describe RobustExcelOle::Book do
658
685
  end
659
686
 
660
687
  after do
661
- @book.close
688
+ @book.close
662
689
  end
663
690
 
664
691
  it "should return right absoute path name" do
665
692
  @book.absolute_path(@simple_file).gsub("\\","/").should == @book.filename
666
- end
693
+ end
667
694
  end
668
695
 
669
696
  context "with alive?" do
@@ -673,7 +700,7 @@ describe RobustExcelOle::Book do
673
700
  end
674
701
 
675
702
  after do
676
- @book.close
703
+ @book.close
677
704
  end
678
705
 
679
706
  it "should return true, if book is alive" do
Binary file
Binary file
data/spec/data/simple.xls CHANGED
Binary file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: robust_excel_ole
3
3
  version: !ruby/object:Gem::Version
4
- hash: 85
4
+ hash: 83
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
9
  - 0
10
- - 5
11
- version: 0.2.0.5
10
+ - 6
11
+ version: 0.2.0.6
12
12
  platform: ruby
13
13
  authors:
14
14
  - traths
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2014-09-25 00:00:00 +02:00
19
+ date: 2014-09-28 00:00:00 +02:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -132,6 +132,11 @@ files:
132
132
  - LICENSE
133
133
  - README.rdoc
134
134
  - Rakefile
135
+ - examples/example1.rb
136
+ - examples/example2.rb
137
+ - examples/example3.rb
138
+ - examples/example4.rb
139
+ - examples/example5.rb
135
140
  - lib/robust_excel_ole.rb
136
141
  - lib/robust_excel_ole/book.rb
137
142
  - lib/robust_excel_ole/cell.rb