robust_excel_ole 1.1 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Changelog +26 -12
- data/README.rdoc +35 -27
- data/README_detail.rdoc +66 -50
- data/examples/edit_sheets/example_access_sheets_and_cells.rb +4 -4
- data/examples/edit_sheets/example_adding_sheets.rb +1 -1
- data/examples/edit_sheets/example_concating.rb +2 -2
- data/examples/edit_sheets/example_copying.rb +2 -2
- data/examples/edit_sheets/example_expanding.rb +2 -2
- data/examples/edit_sheets/example_naming.rb +2 -2
- data/examples/edit_sheets/example_saving.rb +4 -4
- data/examples/open_save_close/example_default_excel.rb +5 -5
- data/examples/open_save_close/example_force_excel.rb +4 -4
- data/examples/open_save_close/example_if_obstructed_closeifsaved.rb +3 -3
- data/examples/open_save_close/example_if_obstructed_forget.rb +4 -4
- data/examples/open_save_close/example_if_obstructed_save.rb +3 -3
- data/examples/open_save_close/example_if_unsaved_accept.rb +3 -3
- data/examples/open_save_close/example_if_unsaved_forget.rb +3 -3
- data/examples/open_save_close/example_if_unsaved_forget_more.rb +3 -3
- data/examples/open_save_close/example_read_only.rb +1 -1
- data/examples/open_save_close/example_rename_cells.rb +1 -1
- data/examples/open_save_close/example_reuse.rb +4 -4
- data/examples/open_save_close/example_simple.rb +1 -1
- data/examples/open_save_close/example_unobtrusively.rb +2 -2
- data/lib/reo_console.rb +1 -1
- data/lib/robust_excel_ole/book.rb +56 -23
- data/lib/robust_excel_ole/excel.rb +35 -25
- data/lib/robust_excel_ole/general.rb +1 -1
- data/lib/robust_excel_ole/sheet.rb +99 -66
- data/lib/robust_excel_ole/version.rb +1 -1
- data/reo.bat +1 -1
- data/spec/book_spec.rb +7 -1
- data/spec/book_specs/book_misc_spec.rb +0 -4
- data/spec/data/another_workbook.xls +0 -0
- data/spec/data/workbook.xls +0 -0
- data/spec/excel_spec.rb +11 -17
- data/spec/sheet_spec.rb +11 -11
- metadata +38 -60
@@ -13,7 +13,7 @@ begin
|
|
13
13
|
simple_file = dir + 'workbook.xls'
|
14
14
|
simple_save_file = dir + 'workbook_save.xls'
|
15
15
|
File.delete simple_save_file rescue nil
|
16
|
-
book =
|
16
|
+
book = Workbook.open(simple_file) # open a book
|
17
17
|
sheet = book.sheet(1) # access a sheet via integer
|
18
18
|
cell = sheet[1,1] # access the first cell
|
19
19
|
puts "1st cell: #{cell.Value}" # put the value of the first cell
|
@@ -30,9 +30,9 @@ begin
|
|
30
30
|
i = i + 1
|
31
31
|
item_name =
|
32
32
|
case enum_method
|
33
|
-
when :each
|
34
|
-
when :each_row
|
35
|
-
when :each_column
|
33
|
+
when :each then "cell"
|
34
|
+
when :each_row then "row"
|
35
|
+
when :each_column then "column"
|
36
36
|
end
|
37
37
|
puts "#{item_name} #{i}: #{item.Value}" # put values of the item of the sheet
|
38
38
|
end
|
@@ -13,7 +13,7 @@ begin
|
|
13
13
|
simple_file = dir + 'workbook.xls'
|
14
14
|
simple_save_file = dir + 'workbook_save.xls'
|
15
15
|
File.delete simple_save_file rescue nil
|
16
|
-
@book =
|
16
|
+
@book = Workbook.open(simple_file) # open a book
|
17
17
|
|
18
18
|
def show_sheets
|
19
19
|
@book.each do |sheet| # access each sheet
|
@@ -9,7 +9,7 @@ require "fileutils"
|
|
9
9
|
include RobustExcelOle
|
10
10
|
|
11
11
|
begin
|
12
|
-
dir =
|
12
|
+
dir = File.expand_path('../../spec/data', File.dirname(__FILE__))
|
13
13
|
workbook_name = 'workbook_named.xls'
|
14
14
|
ws = workbook_name.split(".")
|
15
15
|
base_name = ws[0,ws.length-1].join(".")
|
@@ -18,7 +18,7 @@ begin
|
|
18
18
|
extended_file_name = dir + "/" + base_name + "_concat" + "." + suffix
|
19
19
|
FileUtils.copy file_name, extended_file_name
|
20
20
|
|
21
|
-
|
21
|
+
Workbook.unobtrusively(extended_file_name) do |book|
|
22
22
|
book.each do |sheet|
|
23
23
|
sheet.each do |cell|
|
24
24
|
name = cell.Name.Name rescue nil
|
@@ -10,7 +10,7 @@ require "fileutils"
|
|
10
10
|
include RobustExcelOle
|
11
11
|
|
12
12
|
begin
|
13
|
-
dir =
|
13
|
+
dir = File.expand_path('../../spec/data', File.dirname(__FILE__))
|
14
14
|
workbook_name = 'another_workbook.xls'
|
15
15
|
ws = workbook_name.split(".")
|
16
16
|
base_name = ws[0,ws.length-1].join(".")
|
@@ -19,7 +19,7 @@ begin
|
|
19
19
|
extended_file_name = dir + "/" + base_name + "_copied" + "." + suffix
|
20
20
|
FileUtils.copy file_name, extended_file_name
|
21
21
|
|
22
|
-
|
22
|
+
Workbook.unobtrusively(extended_file_name) do |book|
|
23
23
|
book.extend Enumerable
|
24
24
|
sheet_names = book.map { |sheet| sheet.name }
|
25
25
|
|
@@ -12,7 +12,7 @@ require "fileutils"
|
|
12
12
|
include RobustExcelOle
|
13
13
|
|
14
14
|
begin
|
15
|
-
dir =
|
15
|
+
dir = File.expand_path('../../spec/data', File.dirname(__FILE__))
|
16
16
|
workbook_name = 'workbook_named_concat.xls'
|
17
17
|
ws = workbook_name.split(".")
|
18
18
|
base_name = ws[0,ws.length-1].join(".")
|
@@ -21,7 +21,7 @@ begin
|
|
21
21
|
extended_file_name = dir + "/" + base_name + "_expanded" + "." + suffix
|
22
22
|
FileUtils.copy file_name, extended_file_name
|
23
23
|
|
24
|
-
|
24
|
+
Workbook.unobtrusively(extended_file_name) do |book|
|
25
25
|
book.extend Enumerable
|
26
26
|
sheet_names = book.map { |sheet| sheet.name }
|
27
27
|
|
@@ -10,7 +10,7 @@ require "fileutils"
|
|
10
10
|
include RobustExcelOle
|
11
11
|
|
12
12
|
begin
|
13
|
-
dir =
|
13
|
+
dir = File.expand_path('../../spec/data', File.dirname(__FILE__))
|
14
14
|
workbook_name = 'workbook.xls'
|
15
15
|
ws = workbook_name.split(".")
|
16
16
|
base_name = ws[0,ws.length-1].join(".")
|
@@ -25,7 +25,7 @@ begin
|
|
25
25
|
extended_file_name = dir + "/" + base_name + "_named" + "." + suffix
|
26
26
|
FileUtils.copy file_name, extended_file_name
|
27
27
|
|
28
|
-
|
28
|
+
Workbook.unobtrusively(extended_file_name) do |book|
|
29
29
|
book.each do |sheet|
|
30
30
|
sheet.each do |cell_orig|
|
31
31
|
contents = cell_orig.Value
|
@@ -9,8 +9,8 @@ include RobustExcelOle
|
|
9
9
|
|
10
10
|
begin
|
11
11
|
|
12
|
-
dir =
|
13
|
-
workbook_name = '
|
12
|
+
dir = File.expand_path('../../spec/data', File.dirname(__FILE__))
|
13
|
+
workbook_name = 'workbook_new.xls'
|
14
14
|
ws = workbook_name.split(".")
|
15
15
|
base_name = ws[0,ws.length-1].join(".")
|
16
16
|
suffix = ws.last
|
@@ -21,14 +21,14 @@ begin
|
|
21
21
|
file_sheet_name = dir + "/" + base_name + "_" + sheet_orig.name + "." + suffix
|
22
22
|
Excel.current.generate_workbook(file_sheet_name)
|
23
23
|
# delete all existing sheets, and add the sheet
|
24
|
-
book =
|
24
|
+
book = Workbook.open(file_sheet_name)
|
25
25
|
book.add_sheet sheet_orig
|
26
26
|
book.each do |sheet|
|
27
27
|
sheet.Delete unless sheet.name == sheet_orig.name
|
28
28
|
end
|
29
29
|
book.close(:if_unsaved => :save)
|
30
30
|
# alternative: delete all other sheets
|
31
|
-
#book =
|
31
|
+
#book = Workbook.open(file_sheet_name, :force => {:excel => :new}, :visible => true)
|
32
32
|
#book.each do |sheet|
|
33
33
|
# book.sheet(sheet.Name).Delete() unless sheet.Name == sheet_orig.Name
|
34
34
|
#end
|
@@ -14,27 +14,27 @@ begin
|
|
14
14
|
file_name2 = dir + 'different_workbook.xls'
|
15
15
|
file_name3 = dir + 'book_with_blank.xls'
|
16
16
|
file_name4 = dir + 'merge_cells.xls'
|
17
|
-
book1 =
|
17
|
+
book1 = Workbook.open(file_name1) # open a book in a new Excel instance since no Excel is open
|
18
18
|
book1.excel.visible = true # make current Excel visible
|
19
19
|
sleep 2
|
20
20
|
book1.close # close the book
|
21
21
|
sleep 2
|
22
|
-
book2 =
|
22
|
+
book2 = Workbook.open(file_name1) # reopen the book
|
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 =
|
26
|
+
book3 = Workbook.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
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)
|
32
|
-
book4 =
|
32
|
+
book4 = Workbook.open(file_name3, :default => {:excel => new_excel}, :visible => true) # open another book
|
33
33
|
if book4.excel == new_excel then # since this book cannot be reopened, the option :default_excel applies:
|
34
34
|
p "book4 opened in the second Excel" # according to :default_excel => new_excel the book is opened
|
35
35
|
end # in the given Excel, namely the second Excel instance new_excel
|
36
36
|
sleep 2
|
37
|
-
book5 =
|
37
|
+
book5 = Workbook.open(file_name4, :default => {:excel => :new}, :visible => true) # open another book
|
38
38
|
if ((not book5.excel == book1.excel) && (not book5.excel == new_excel)) then # since this book cannot be reopened,
|
39
39
|
p "book5 opened in a third Excel" # the option :default_excel applies. according to :default_excel => :new
|
40
40
|
end # the book is opened in a new Excel
|
@@ -11,17 +11,17 @@ Excel.close_all
|
|
11
11
|
begin
|
12
12
|
dir = create_tmpdir
|
13
13
|
simple_file = dir + 'workbook.xls'
|
14
|
-
book1 =
|
14
|
+
book1 = Workbook.open(simple_file) # open a book in a new Excel instance since no Excel is open
|
15
15
|
book1.excel.visible = true # make current Excel visible
|
16
16
|
sleep 2
|
17
|
-
book2 =
|
17
|
+
book2 = Workbook.open(simple_file) # open a new book in the same Excel instance
|
18
18
|
p "book1 == book2" if book2 == book1 # the books are identical
|
19
19
|
sleep 2
|
20
|
-
book3 =
|
20
|
+
book3 = Workbook.open(simple_file, :force => {:excel => :new, :visible => true}) # open another book in a new Excel instance,
|
21
21
|
p "book3 != book1" if (not (book3 == book1)) # the books are not identical
|
22
22
|
sleep 2
|
23
23
|
new_excel = Excel.new(:reuse => false) # create a third Excel instance
|
24
|
-
book4 =
|
24
|
+
book4 = Workbook.open(simple_file, :force => {:excel => new_excel, :visible => true}) # open another book in the new Excel instance
|
25
25
|
p "book4 != book3 && book4 != book1" if (not (book4 == book3) && (not (book4 == book1)))
|
26
26
|
sleep 2 # (Excel chooses the first Excel application)
|
27
27
|
book4.close # close the books
|
@@ -12,19 +12,19 @@ begin
|
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name = dir + 'workbook.xls'
|
14
14
|
other_file_name = dir + 'more_data/workbook.xls'
|
15
|
-
book =
|
15
|
+
book = Workbook.open(file_name, :visible => true) # open a book, make Excel visible
|
16
16
|
sleep 1
|
17
17
|
sheet = book.sheet(1)
|
18
18
|
first_cell = sheet[1,1].Value # access a sheet
|
19
19
|
sheet[1,1] = first_cell == "simple" ? "complex" : "simple" # change a cell
|
20
20
|
sleep 1
|
21
21
|
begin
|
22
|
-
new_book =
|
22
|
+
new_book = Workbook.open(other_file_name, :if_obstructed => :close_if_saved) # raises an exception since the file is not saved
|
23
23
|
rescue WorkbookNotSaved => msg
|
24
24
|
puts "error: open: #{msg.message}"
|
25
25
|
end
|
26
26
|
book.save # save the unsaved book
|
27
|
-
new_book =
|
27
|
+
new_book = Workbook.open(file_name, :if_obstructed => :close_if_saved) # open the new book, close the saved book
|
28
28
|
sleep 1
|
29
29
|
new_sheet = new_book.sheet(1)
|
30
30
|
new_first_cell = new_sheet[1,1].Value
|
@@ -12,18 +12,18 @@ begin
|
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name = dir + 'workbook.xls'
|
14
14
|
other_file_name = dir + 'more_data/workbook.xls'
|
15
|
-
book =
|
15
|
+
book = Workbook.open(file_name, :visible => true) # open a book, make Excel application visible
|
16
16
|
sleep 3
|
17
17
|
begin
|
18
|
-
new_book =
|
18
|
+
new_book = Workbook.open(other_file_name) # open a book with the same file name in a different path
|
19
19
|
rescue WorkbookBlocked => msg # by default: raises an exception
|
20
20
|
puts "error: open: #{msg.message}"
|
21
21
|
end
|
22
22
|
# open a new book with the same file name in a different path. close the old book before.
|
23
|
-
new_book =
|
23
|
+
new_book = Workbook.open(other_file_name, :if_obstructed => :forget)
|
24
24
|
sleep 3
|
25
25
|
# open another book with the same file name in a different path. Use a new Excel application
|
26
|
-
another_book =
|
26
|
+
another_book = Workbook.open(file_name, :if_obstructed => :new_excel, :visible => true)
|
27
27
|
sleep 3
|
28
28
|
new_book.close # close the books
|
29
29
|
another_book.close
|
@@ -12,15 +12,15 @@ begin
|
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name = dir + 'workbook.xls'
|
14
14
|
other_file_name = dir + 'more_data/workbook.xls'
|
15
|
-
book =
|
15
|
+
book = Workbook.open(file_name, :visible => true) # open a book, make Excel visible
|
16
16
|
sleep 1
|
17
17
|
sheet = book.sheet(1)
|
18
18
|
first_cell = sheet[1,1].value # access a sheet
|
19
19
|
sheet[1,1] = first_cell == "simple" ? "complex" : "simple" # change a cell
|
20
20
|
sleep 1
|
21
|
-
new_book =
|
21
|
+
new_book = Workbook.open(other_file_name, :if_obstructed => :save) # open a book with the same file name in a different path
|
22
22
|
sleep 1 #save the old book, close it, before
|
23
|
-
old_book =
|
23
|
+
old_book = Workbook.open(file_name, :if_obstructed => :forget ,:visible => true) # open the old book
|
24
24
|
sleep 1
|
25
25
|
old_sheet = old_book.sheet(1)
|
26
26
|
old_first_cell = old_sheet[1,1].value
|
@@ -11,15 +11,15 @@ Excel.close_all
|
|
11
11
|
begin
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name = dir + 'workbook.xls'
|
14
|
-
book =
|
14
|
+
book = Workbook.open(file_name) # open a book
|
15
15
|
sheet = book.sheet(1) # access a sheet
|
16
16
|
sheet[1,1] = sheet[1,1].value == "simple" ? "complex" : "simple" # change a cell
|
17
17
|
begin
|
18
|
-
new_book =
|
18
|
+
new_book = Workbook.open(file_name) # open another book with the same file name
|
19
19
|
rescue WorkbookBeingUsed => 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
|
-
new_book =
|
22
|
+
new_book = Workbook.open(file_name, :if_unsaved => :accept) # open another book with the same file name
|
23
23
|
# and let the unsaved book open
|
24
24
|
if book.alive? && new_book.alive? then # check whether the referenced workbooks
|
25
25
|
puts "open with :if_unsaved => :accept : the two books are alive." # respond to methods
|
@@ -11,14 +11,14 @@ Excel.close_all
|
|
11
11
|
begin
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name = dir + 'workbook.xls'
|
14
|
-
book =
|
14
|
+
book = Workbook.open(file_name) # open a book
|
15
15
|
book.excel.visible = true # make current Excel visible
|
16
16
|
sleep 1
|
17
17
|
sheet = book.sheet(1) # access a sheet
|
18
18
|
first_cell = sheet[1,1].value
|
19
19
|
sheet[1,1] = first_cell == "simple" ? "complex" : "simple" # change a cell
|
20
20
|
sleep 1
|
21
|
-
new_book =
|
21
|
+
new_book = Workbook.open(file_name, :if_unsaved => :forget) # open another book with the same file name
|
22
22
|
# and close the unsaved book without saving it
|
23
23
|
sheet_new_book = new_book.sheet(1)
|
24
24
|
if (not book.alive?) && new_book.alive? && sheet_new_book[1,1].value == first_cell then # check whether the unsaved book
|
@@ -27,7 +27,7 @@ begin
|
|
27
27
|
sleep 1
|
28
28
|
sheet_new_book[1,1] = sheet_new_book[1,1].value == "simple" ? "complex" : "simple" # change a cell
|
29
29
|
# open another book in a new Excel application, and make Excel visible, leaving the unsaved book open
|
30
|
-
another_book =
|
30
|
+
another_book = Workbook.open(file_name, :if_unsaved => :new_excel, :visible => true)
|
31
31
|
sleep 3 # leaving the unsaved book open
|
32
32
|
new_book.close(:if_unsaved => :forget )
|
33
33
|
another_book.close
|
@@ -11,13 +11,13 @@ Excel.kill_all
|
|
11
11
|
begin
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name = dir + 'workbook.xls'
|
14
|
-
book =
|
14
|
+
book = Workbook.open(file_name) # open a book
|
15
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
|
19
19
|
sleep 1
|
20
|
-
new_book =
|
20
|
+
new_book = Workbook.open(file_name, :if_unsaved => :new_excel, :visible => true) # open another book with the same file name in a new Excel
|
21
21
|
sheet_new_book = new_book.sheet(1)
|
22
22
|
if (not book.alive?) && new_book.alive? && sheet_new_book[1,1].value == first_cell then # check whether the unsaved book
|
23
23
|
puts "open with :if_unsaved => :forget : the unsaved book is closed and not saved." # is closed and was not saved
|
@@ -25,7 +25,7 @@ begin
|
|
25
25
|
sleep 1
|
26
26
|
sheet_new_book[1,1] = sheet_new_book[1,1].value == "simple" ? "complex" : "simple" # change a cell
|
27
27
|
# open another book in the running Excel application, and make Excel visible, closing the unsaved book
|
28
|
-
another_book =
|
28
|
+
another_book = Workbook.open(file_name, :if_unsaved => :forget, :visible => true)
|
29
29
|
sleep 1
|
30
30
|
sheet_another_book = another_book.sheet(1)
|
31
31
|
sheet_another_book[1,1] = sheet_another_book[1,1].value == "simple" ? "complex" : "simple" # change a cell
|
@@ -11,7 +11,7 @@ begin
|
|
11
11
|
dir = create_tmpdir
|
12
12
|
file_name = dir + 'workbook.xls'
|
13
13
|
other_file_name = dir + 'different_workbook.xls'
|
14
|
-
book =
|
14
|
+
book = Workbook.open(file_name, :read_only => true, :visible => true) # open a book with read_only and make Excel visible
|
15
15
|
sheet = book.sheet(1) # access a sheet
|
16
16
|
sleep 1
|
17
17
|
sheet[1,1] = sheet[1,1].value == "simple" ? "complex" : "simple" # change a cell
|
@@ -11,7 +11,7 @@ Excel.close_all
|
|
11
11
|
begin
|
12
12
|
dir = create_tmpdir
|
13
13
|
file_name = dir + 'workbook.xls'
|
14
|
-
book =
|
14
|
+
book = Workbook.open(file_name) # open a book. default: :read_only => false
|
15
15
|
book.excel.visible = true # make current Excel visible
|
16
16
|
sheet = book.sheet(1)
|
17
17
|
workbook = book.ole_workbook
|
@@ -13,14 +13,14 @@ begin
|
|
13
13
|
file_name2 = dir + 'different_workbook.xls'
|
14
14
|
file_name3 = dir + 'different_workbook.xls'
|
15
15
|
file_name4 = dir + 'book_with_blank.xls'
|
16
|
-
book1 =
|
16
|
+
book1 = Workbook.open(file_name1) # open a book in a new Excel instance since no Excel is open
|
17
17
|
book1.excel.visible = true # make current Excel visible
|
18
18
|
sleep 2
|
19
|
-
book2 =
|
19
|
+
book2 = Workbook.open(file_name2) # open a new book in the same Excel instance
|
20
20
|
sleep 2
|
21
|
-
book3 =
|
21
|
+
book3 = Workbook.open(file_name3, :force_excel => :new, :visible => true) # open another book in a new Excel instance,
|
22
22
|
sleep 2 # make Excel visible
|
23
|
-
book4 =
|
23
|
+
book4 = Workbook.open(file_name4, :visible => true) # open anther book, and use a running Excel application
|
24
24
|
sleep 2 # (Excel chooses the first Excel application)
|
25
25
|
book1.close # close the books
|
26
26
|
book2.close
|
@@ -16,7 +16,7 @@ begin
|
|
16
16
|
dir = create_tmpdir
|
17
17
|
file_name = dir + 'workbook.xls'
|
18
18
|
other_file_name = dir + 'different_workbook.xls'
|
19
|
-
book =
|
19
|
+
book = Workbook.open(file_name) # open a book. default: :read_only => false
|
20
20
|
book.excel.visible = true # make current Excel visible
|
21
21
|
sheet = book.sheet(1) # access a sheet
|
22
22
|
sleep 1
|
@@ -10,11 +10,11 @@ Excel.close_all
|
|
10
10
|
begin
|
11
11
|
dir = create_tmpdir
|
12
12
|
simple_file = dir + 'workbook.xls'
|
13
|
-
book =
|
13
|
+
book = Workbook.open(simple_file, :visible => true) # open a book, make Excel visible
|
14
14
|
old_sheet = book.sheet(1)
|
15
15
|
p "1st cell: #{old_sheet[1,1].value}"
|
16
16
|
sleep 2
|
17
|
-
|
17
|
+
Workbook.unobtrusively(simple_file) do |book| # modify the book and keep its status unchanged
|
18
18
|
sheet = book.sheet(1)
|
19
19
|
sheet[1,1] = sheet[1,1].value == "simple" ? "complex" : "simple"
|
20
20
|
end
|
data/lib/reo_console.rb
CHANGED
@@ -541,11 +541,13 @@ module RobustExcelOle
|
|
541
541
|
end
|
542
542
|
|
543
543
|
# simple save of a workbook.
|
544
|
+
# @option opts [Boolean] states, whether colored ranges shall be discolored
|
544
545
|
# @return [Boolean] true, if successfully saved, nil otherwise
|
545
|
-
def save
|
546
|
+
def save(opts = {:discoloring => false})
|
546
547
|
raise ObjectNotAlive, "workbook is not alive" if (not alive?)
|
547
548
|
raise WorkbookReadOnly, "Not opened for writing (opened with :read_only option)" if @ole_workbook.ReadOnly
|
548
549
|
begin
|
550
|
+
discoloring if opts[:discoloring]
|
549
551
|
@ole_workbook.Save
|
550
552
|
rescue WIN32OLERuntimeError => msg
|
551
553
|
if msg.message =~ /SaveAs/ and msg.message =~ /Workbook/ then
|
@@ -553,7 +555,7 @@ module RobustExcelOle
|
|
553
555
|
else
|
554
556
|
raise UnexpectedError, "unknown WIN32OLERuntimeError:\n#{msg.message}"
|
555
557
|
end
|
556
|
-
end
|
558
|
+
end
|
557
559
|
true
|
558
560
|
end
|
559
561
|
|
@@ -573,6 +575,7 @@ module RobustExcelOle
|
|
573
575
|
# :save -> saves the blocking workbook and closes it
|
574
576
|
# :close_if_saved -> closes the blocking workbook, if it is saved,
|
575
577
|
# otherwise raises an exception
|
578
|
+
# :discoloring states, wheter colored ranges shall be discolored
|
576
579
|
# @return [Book], the book itself, if successfully saved, raises an exception otherwise
|
577
580
|
def save_as(file, opts = { } )
|
578
581
|
raise FileNameNotGiven, "filename is nil" if file.nil?
|
@@ -586,7 +589,7 @@ module RobustExcelOle
|
|
586
589
|
case options[:if_exists]
|
587
590
|
when :overwrite
|
588
591
|
if file == self.filename
|
589
|
-
save
|
592
|
+
save({:discoloring => opts[:discoloring]})
|
590
593
|
return self
|
591
594
|
else
|
592
595
|
begin
|
@@ -628,6 +631,10 @@ module RobustExcelOle
|
|
628
631
|
|
629
632
|
private
|
630
633
|
|
634
|
+
def discoloring
|
635
|
+
self.each{|sheet| sheet.each{|cell| cell.Interior.ColorIndex = XlNone}}
|
636
|
+
end
|
637
|
+
|
631
638
|
def save_as_workbook(file, options) # :nodoc: #
|
632
639
|
begin
|
633
640
|
dirname, basename = File.split(file)
|
@@ -637,6 +644,7 @@ module RobustExcelOle
|
|
637
644
|
when '.xlsx'; RobustExcelOle::XlOpenXMLWorkbook
|
638
645
|
when '.xlsm'; RobustExcelOle::XlOpenXMLWorkbookMacroEnabled
|
639
646
|
end
|
647
|
+
discoloring if options[:discoloring]
|
640
648
|
@ole_workbook.SaveAs(General::absolute_path(file), file_format)
|
641
649
|
bookstore.store(self)
|
642
650
|
rescue WIN32OLERuntimeError => msg
|
@@ -653,7 +661,15 @@ module RobustExcelOle
|
|
653
661
|
|
654
662
|
# closes a given file if it is open
|
655
663
|
def self.close(file, opts = {:if_unsaved => :raise})
|
664
|
+
#puts "self.close:"
|
665
|
+
#puts "file: #{file}"
|
666
|
+
#begin
|
667
|
+
# bookstore.fetch(file)
|
668
|
+
#rescue
|
669
|
+
# puts "#{$!.message}"
|
670
|
+
#end
|
656
671
|
book = bookstore.fetch(file) rescue nil
|
672
|
+
#puts "book after fetch: #{book.inspect}"
|
657
673
|
book.close(opts) if book && book.alive?
|
658
674
|
end
|
659
675
|
|
@@ -685,6 +701,14 @@ module RobustExcelOle
|
|
685
701
|
yield sheet_class.new(sheet)
|
686
702
|
end
|
687
703
|
end
|
704
|
+
|
705
|
+
def each_with_index(offset = 0)
|
706
|
+
i = offset
|
707
|
+
@ole_workbook.Worksheets.each do |sheet|
|
708
|
+
yield sheet_class.new(sheet), i
|
709
|
+
i += 1
|
710
|
+
end
|
711
|
+
end
|
688
712
|
|
689
713
|
# copies a sheet to another position
|
690
714
|
# default: copied sheet is appended
|
@@ -761,7 +785,7 @@ module RobustExcelOle
|
|
761
785
|
# @param [String] name the name of the range
|
762
786
|
# @param [Variant] value the contents of the range
|
763
787
|
def []= (name, value)
|
764
|
-
set_nameval(name,value)
|
788
|
+
set_nameval(name,value, :color => 42) # 42 - aqua-marin, 4-green
|
765
789
|
end
|
766
790
|
|
767
791
|
# returns the contents of a range with given name
|
@@ -774,46 +798,55 @@ module RobustExcelOle
|
|
774
798
|
# @option opts [Symbol] :default the default value that is provided if no contents could be returned
|
775
799
|
# @return [Variant] the contents of a range with given name
|
776
800
|
def nameval(name, opts = {:default => nil})
|
777
|
-
|
778
|
-
begin
|
779
|
-
name_obj
|
780
|
-
rescue WIN32OLERuntimeError
|
781
|
-
return default_val if default_val
|
782
|
-
raise NameNotFound, "name #{name.inspect} not in #{File.basename(self.stored_filename).inspect}"
|
783
|
-
end
|
784
|
-
begin
|
785
|
-
value = name_obj.RefersToRange.Value
|
801
|
+
name_obj = name_object(name)
|
802
|
+
value = begin
|
803
|
+
name_obj.RefersToRange.Value
|
786
804
|
rescue WIN32OLERuntimeError
|
787
805
|
begin
|
788
|
-
|
806
|
+
self.sheet(1).Evaluate(name_obj.Name)
|
789
807
|
rescue WIN32OLERuntimeError
|
790
|
-
return
|
808
|
+
return opts[:default] if opts[:default]
|
791
809
|
raise RangeNotEvaluatable, "cannot evaluate range named #{name.inspect} in #{File.basename(self.stored_filename).inspect}"
|
792
810
|
end
|
793
811
|
end
|
794
812
|
if value.is_a?(Bignum) #RobustExcelOle::XlErrName
|
795
|
-
return
|
813
|
+
return opts[:default] if opts[:default]
|
796
814
|
raise RangeNotEvaluatable, "cannot evaluate range named #{name.inspect} in #{File.basename(self.stored_filename).inspect}"
|
797
815
|
end
|
798
|
-
return
|
816
|
+
return opts[:default] if opts[:default] && value.nil?
|
799
817
|
value
|
800
818
|
end
|
801
819
|
|
802
820
|
# sets the contents of a range
|
803
821
|
# @param [String] name the name of a range
|
804
822
|
# @param [Variant] value the contents of the range
|
805
|
-
|
823
|
+
# @param [FixNum] color the color when setting a value
|
824
|
+
# @param [Hash] opts :color [FixNum] the color when setting the contents
|
825
|
+
def set_nameval(name, value, opts = {:color => 0})
|
806
826
|
begin
|
807
|
-
|
827
|
+
cell = name_object(name).RefersToRange
|
828
|
+
cell.Interior.ColorIndex = opts[:color]
|
829
|
+
cell.Value = value
|
808
830
|
rescue WIN32OLERuntimeError
|
809
|
-
raise
|
831
|
+
raise RangeNotEvaluatable, "cannot assign value to range named #{name.inspect} in #{File.basename(self.stored_filename).inspect}"
|
810
832
|
end
|
833
|
+
end
|
834
|
+
|
835
|
+
private
|
836
|
+
|
837
|
+
def name_object(name)
|
811
838
|
begin
|
812
|
-
|
839
|
+
self.Parent.Names.Item(name)
|
813
840
|
rescue WIN32OLERuntimeError
|
814
|
-
|
841
|
+
begin
|
842
|
+
self.Names.Item(name)
|
843
|
+
rescue WIN32OLERuntimeError
|
844
|
+
raise NameNotFound, "name #{name.inspect} not in #{File.basename(self.stored_filename).inspect}"
|
845
|
+
end
|
815
846
|
end
|
816
|
-
end
|
847
|
+
end
|
848
|
+
|
849
|
+
public
|
817
850
|
|
818
851
|
# renames a range
|
819
852
|
# @param [String] name the previous range name
|