robust_excel_ole 1.1 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +7 -0
  2. data/Changelog +26 -12
  3. data/README.rdoc +35 -27
  4. data/README_detail.rdoc +66 -50
  5. data/examples/edit_sheets/example_access_sheets_and_cells.rb +4 -4
  6. data/examples/edit_sheets/example_adding_sheets.rb +1 -1
  7. data/examples/edit_sheets/example_concating.rb +2 -2
  8. data/examples/edit_sheets/example_copying.rb +2 -2
  9. data/examples/edit_sheets/example_expanding.rb +2 -2
  10. data/examples/edit_sheets/example_naming.rb +2 -2
  11. data/examples/edit_sheets/example_saving.rb +4 -4
  12. data/examples/open_save_close/example_default_excel.rb +5 -5
  13. data/examples/open_save_close/example_force_excel.rb +4 -4
  14. data/examples/open_save_close/example_if_obstructed_closeifsaved.rb +3 -3
  15. data/examples/open_save_close/example_if_obstructed_forget.rb +4 -4
  16. data/examples/open_save_close/example_if_obstructed_save.rb +3 -3
  17. data/examples/open_save_close/example_if_unsaved_accept.rb +3 -3
  18. data/examples/open_save_close/example_if_unsaved_forget.rb +3 -3
  19. data/examples/open_save_close/example_if_unsaved_forget_more.rb +3 -3
  20. data/examples/open_save_close/example_read_only.rb +1 -1
  21. data/examples/open_save_close/example_rename_cells.rb +1 -1
  22. data/examples/open_save_close/example_reuse.rb +4 -4
  23. data/examples/open_save_close/example_simple.rb +1 -1
  24. data/examples/open_save_close/example_unobtrusively.rb +2 -2
  25. data/lib/reo_console.rb +1 -1
  26. data/lib/robust_excel_ole/book.rb +56 -23
  27. data/lib/robust_excel_ole/excel.rb +35 -25
  28. data/lib/robust_excel_ole/general.rb +1 -1
  29. data/lib/robust_excel_ole/sheet.rb +99 -66
  30. data/lib/robust_excel_ole/version.rb +1 -1
  31. data/reo.bat +1 -1
  32. data/spec/book_spec.rb +7 -1
  33. data/spec/book_specs/book_misc_spec.rb +0 -4
  34. data/spec/data/another_workbook.xls +0 -0
  35. data/spec/data/workbook.xls +0 -0
  36. data/spec/excel_spec.rb +11 -17
  37. data/spec/sheet_spec.rb +11 -11
  38. 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 = Book.open(simple_file) # open a 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 : "cell"
34
- when :each_row : "row"
35
- when :each_column : "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 = Book.open(simple_file) # open a 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 = "C:/data"
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
- Book.unobtrusively(extended_file_name) do |book|
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 = "C:/data"
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
- Book.unobtrusively(extended_file_name) do |book|
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 = "C:/data"
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
- Book.unobtrusively(extended_file_name) do |book|
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 = "C:/data"
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
- Book.unobtrusively(extended_file_name) do |book|
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 = "C:/data"
13
- workbook_name = 'workbook_named.xls'
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 = Book.open(file_sheet_name)
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 = Book.open(file_sheet_name, :force => {:excel => :new}, :visible => true)
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 = Book.open(file_name1) # open a book in a new Excel instance since no Excel is open
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 = Book.open(file_name1) # reopen the book
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 = Book.open(file_name2, :default => {:excel => :current}, :visible => true) # open another book
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 = Book.open(file_name3, :default => {:excel => new_excel}, :visible => true) # open another book
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 = Book.open(file_name4, :default => {:excel => :new}, :visible => true) # open another book
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 = Book.open(simple_file) # open a book in a new Excel instance since no Excel is open
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 = Book.open(simple_file) # open a new book in the same Excel instance
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 = Book.open(simple_file, :force => {:excel => :new, :visible => true}) # open another book in a new Excel instance,
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 = Book.open(simple_file, :force => {:excel => new_excel, :visible => true}) # open another book in the new Excel instance
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 = Book.open(file_name, :visible => true) # open a book, make Excel visible
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 = Book.open(other_file_name, :if_obstructed => :close_if_saved) # raises an exception since the file is not saved
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 = Book.open(file_name, :if_obstructed => :close_if_saved) # open the new book, close the saved 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 = Book.open(file_name, :visible => true) # open a book, make Excel application visible
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 = Book.open(other_file_name) # open a book with the same file name in a different path
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 = Book.open(other_file_name, :if_obstructed => :forget)
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 = Book.open(file_name, :if_obstructed => :new_excel, :visible => true)
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 = Book.open(file_name, :visible => true) # open a book, make Excel visible
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 = Book.open(other_file_name, :if_obstructed => :save) # open a book with the same file name in a different path
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 = Book.open(file_name, :if_obstructed => :forget ,:visible => true) # open the 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 = Book.open(file_name) # open a 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 = Book.open(file_name) # open another book with the same file name
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 = Book.open(file_name, :if_unsaved => :accept) # open another book with the same file name
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 = Book.open(file_name) # open a 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 = Book.open(file_name, :if_unsaved => :forget) # open another book with the same file name
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 = Book.open(file_name, :if_unsaved => :new_excel, :visible => true)
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 = Book.open(file_name) # open a 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 = Book.open(file_name, :if_unsaved => :new_excel, :visible => true) # open another book with the same file name in a new Excel
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 = Book.open(file_name, :if_unsaved => :forget, :visible => true)
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 = Book.open(file_name, :read_only => true, :visible => true) # open a book with read_only and make Excel visible
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 = Book.open(file_name) # open a book. default: :read_only => false
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 = Book.open(file_name1) # open a book in a new Excel instance since no Excel is open
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 = Book.open(file_name2) # open a new book in the same Excel instance
19
+ book2 = Workbook.open(file_name2) # open a new book in the same Excel instance
20
20
  sleep 2
21
- book3 = Book.open(file_name3, :force_excel => :new, :visible => true) # open another book in a new Excel instance,
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 = Book.open(file_name4, :visible => true) # open anther book, and use a running Excel application
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 = Book.open(file_name) # open a book. default: :read_only => false
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 = Book.open(simple_file, :visible => true) # open a book, make Excel visible
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
- Book.unobtrusively(simple_file) do |book| # modify the book and keep its status unchanged
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
@@ -1,4 +1,4 @@
1
- #require 'lib/robust_excel_ole'
1
+ #require '../robust_excel_ole/lib/robust_excel_ole'
2
2
  include REO
3
3
  #include RobustExcelOle
4
4
  include General
@@ -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
- default_val = opts[:default]
778
- begin
779
- name_obj = self.Names.Item(name)
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
- value = self.sheet(1).Evaluate(name_obj.Name)
806
+ self.sheet(1).Evaluate(name_obj.Name)
789
807
  rescue WIN32OLERuntimeError
790
- return default_val if default_val
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 default_val if default_val
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 default_val if default_val && value.nil?
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
- def set_nameval(name, value)
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
- name_obj = self.Names.Item(name)
827
+ cell = name_object(name).RefersToRange
828
+ cell.Interior.ColorIndex = opts[:color]
829
+ cell.Value = value
808
830
  rescue WIN32OLERuntimeError
809
- raise NameNotFound, "name #{name.inspect} not in #{File.basename(self.stored_filename).inspect}"
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
- name_obj.RefersToRange.Value = value
839
+ self.Parent.Names.Item(name)
813
840
  rescue WIN32OLERuntimeError
814
- raise RangeNotEvaluatable, "cannot assign value to range named #{name.inspect} in #{File.basename(self.stored_filename).inspect}"
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