robust_excel_ole 0.3.4 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +73 -26
- data/README_detail.rdoc +92 -27
- data/examples/edit_sheets/example_access_sheets_and_cells.rb +3 -3
- data/examples/edit_sheets/example_concating.rb +12 -12
- data/examples/edit_sheets/example_copying.rb +47 -0
- data/examples/edit_sheets/example_expanding.rb +17 -26
- data/examples/edit_sheets/example_naming.rb +13 -10
- data/examples/edit_sheets/example_ranges.rb +2 -2
- data/examples/edit_sheets/example_saving.rb +8 -14
- data/examples/open_save_close/example_control_to_excel.rb +1 -1
- data/examples/open_save_close/example_if_obstructed_closeifsaved.rb +3 -3
- data/examples/open_save_close/example_if_obstructed_save.rb +3 -3
- data/examples/open_save_close/example_if_unsaved_accept.rb +1 -1
- data/examples/open_save_close/example_if_unsaved_forget.rb +4 -4
- data/examples/open_save_close/example_if_unsaved_forget_more.rb +5 -5
- data/examples/open_save_close/example_read_only.rb +1 -1
- data/examples/open_save_close/example_rename_cells.rb +1 -13
- data/examples/open_save_close/example_simple.rb +1 -1
- data/examples/open_save_close/example_unobtrusively.rb +3 -3
- data/lib/robust_excel_ole.rb +81 -2
- data/lib/robust_excel_ole/book.rb +171 -118
- data/lib/robust_excel_ole/{book_store.rb → bookstore.rb} +2 -2
- data/lib/robust_excel_ole/excel.rb +153 -24
- data/lib/robust_excel_ole/range.rb +2 -2
- data/lib/robust_excel_ole/sheet.rb +84 -35
- data/lib/robust_excel_ole/version.rb +1 -1
- data/reo.bat +3 -0
- data/spec/book_close_spec.rb +179 -0
- data/spec/book_misc_spec.rb +365 -0
- data/spec/book_open_spec.rb +793 -0
- data/spec/book_save_spec.rb +257 -0
- data/spec/book_sheet_spec.rb +160 -0
- data/spec/book_spec.rb +145 -1533
- data/spec/book_subclass_spec.rb +50 -0
- data/spec/book_unobtr_spec.rb +950 -0
- data/spec/{book_store_spec.rb → bookstore_spec.rb} +5 -5
- data/spec/cell_spec.rb +6 -6
- data/spec/data/{more_workbook.xls → another_workbook.xls} +0 -0
- data/spec/data/different_workbook.xls +0 -0
- data/spec/data/workbook.xls +0 -0
- data/spec/data/workbook.xlsm +0 -0
- data/spec/data/workbook.xlsx +0 -0
- data/spec/data/workbook_linked.xlsm +0 -0
- data/spec/data/workbook_linked_sub.xlsm +0 -0
- data/spec/excel_spec.rb +204 -5
- data/spec/range_spec.rb +6 -6
- data/spec/sheet_spec.rb +122 -34
- metadata +18 -8
- data/spec/data/workbook_connected_sub.xlsm +0 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
# example_copying.rb:
|
2
|
+
# each named cell is to be copied into another sheet
|
3
|
+
# unnamed cells shall not be copied
|
4
|
+
# if a sheet does not contain any named cell, then the sheet shall not be copied
|
5
|
+
|
6
|
+
require 'rubygems'
|
7
|
+
#require 'robust_excel_ole'
|
8
|
+
require File.join(File.dirname(__FILE__), '../../lib/robust_excel_ole')
|
9
|
+
require "fileutils"
|
10
|
+
|
11
|
+
include RobustExcelOle
|
12
|
+
|
13
|
+
begin
|
14
|
+
dir = "C:/data"
|
15
|
+
workbook_name = 'another_workbook.xls'
|
16
|
+
ws = workbook_name.split(".")
|
17
|
+
base_name = ws[0,ws.length-1].join(".")
|
18
|
+
suffix = ws.last
|
19
|
+
file_name = dir + "/" + workbook_name
|
20
|
+
extended_file_name = dir + "/" + base_name + "_copied" + "." + suffix
|
21
|
+
FileUtils.copy file_name, extended_file_name
|
22
|
+
|
23
|
+
Book.unobtrusively(extended_file_name) do |book|
|
24
|
+
book.extend Enumerable
|
25
|
+
sheet_names = book.map { |sheet| sheet.name }
|
26
|
+
|
27
|
+
book.each do |sheet|
|
28
|
+
new_sheet = book.add_sheet
|
29
|
+
contains_named_cells = false
|
30
|
+
sheet.each do |cell|
|
31
|
+
full_name = cell.Name.Name rescue nil
|
32
|
+
if full_name
|
33
|
+
sheet_name, short_name = full_name.split("!")
|
34
|
+
cell_name = short_name ? short_name : sheet_name
|
35
|
+
contains_named_cells = true
|
36
|
+
new_sheet[cell.Row, cell.Column].Value = cell.Value
|
37
|
+
new_sheet.set_name(cell_name, cell.Row,cell.Column)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
new_sheet.Delete() unless contains_named_cells
|
41
|
+
end
|
42
|
+
|
43
|
+
sheet_names.each do |sheet_name|
|
44
|
+
book[sheet_name].Delete()
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -6,52 +6,43 @@
|
|
6
6
|
# in addition to that, the cell B2 shall be named "name" and get the sheet name as its value
|
7
7
|
|
8
8
|
require 'rubygems'
|
9
|
-
require 'robust_excel_ole'
|
9
|
+
#require 'robust_excel_ole'
|
10
|
+
require File.join(File.dirname(__FILE__), '../../lib/robust_excel_ole')
|
10
11
|
require "fileutils"
|
11
12
|
|
12
13
|
include RobustExcelOle
|
13
14
|
|
14
15
|
begin
|
15
|
-
Excel.close_all
|
16
16
|
dir = "C:/data"
|
17
17
|
workbook_name = 'workbook_named_concat.xls'
|
18
|
-
|
19
|
-
|
18
|
+
ws = workbook_name.split(".")
|
19
|
+
base_name = ws[0,ws.length-1].join(".")
|
20
|
+
suffix = ws.last
|
20
21
|
file_name = dir + "/" + workbook_name
|
21
22
|
extended_file_name = dir + "/" + base_name + "_expanded" + "." + suffix
|
22
|
-
|
23
|
-
|
24
|
-
book_orig.close
|
25
|
-
sheet_names = []
|
23
|
+
FileUtils.copy file_name, extended_file_name
|
24
|
+
|
26
25
|
Book.unobtrusively(extended_file_name) do |book|
|
27
|
-
book.
|
28
|
-
|
29
|
-
|
26
|
+
book.extend Enumerable
|
27
|
+
sheet_names = book.map { |sheet| sheet.name }
|
28
|
+
|
30
29
|
book.Names.each do |excel_name|
|
31
30
|
full_name = excel_name.Name
|
32
31
|
sheet_name, short_name = full_name.split("!")
|
33
32
|
sheet = excel_name.RefersToRange.Worksheet
|
34
|
-
sheet_name = short_name ? short_name :
|
35
|
-
|
36
|
-
sheet_new = book.add_sheet(sheet, :as => sheet_name)
|
37
|
-
rescue ExcelErrorSheet => msg
|
38
|
-
if msg.message == "sheet name already exists"
|
39
|
-
sheet_new = book.add_sheet(sheet, :as => (sheet_name+sheet.name))
|
40
|
-
else
|
41
|
-
puts msg.message
|
42
|
-
end
|
43
|
-
end
|
44
|
-
sheet_new.Names.Add("Name" => "name", "RefersTo" => "=" + "$B$2")
|
45
|
-
sheet_new[1,1].Value = sheet_name
|
33
|
+
sheet_name = short_name ? short_name : sheet_name
|
34
|
+
sheet_new = book.add_sheet sheet
|
46
35
|
begin
|
47
36
|
sheet_new.name = sheet_name
|
48
|
-
rescue
|
49
|
-
sheet_new.name =
|
37
|
+
rescue ExcelErrorSheet => msg
|
38
|
+
sheet_new.name = sheet_name + sheet.name if msg.message == "sheet name already exists"
|
50
39
|
end
|
40
|
+
sheet_new.set_name("name", 2, 2)
|
41
|
+
sheet_new["name"] = sheet_name
|
51
42
|
end
|
43
|
+
|
52
44
|
sheet_names.each do |sheet_name|
|
53
45
|
book[sheet_name].Delete()
|
54
46
|
end
|
55
47
|
end
|
56
|
-
Excel.close_all
|
57
48
|
end
|
@@ -4,29 +4,32 @@
|
|
4
4
|
# the new workbook's name is extended by the suffix "_named"
|
5
5
|
|
6
6
|
require 'rubygems'
|
7
|
-
require 'robust_excel_ole'
|
7
|
+
#require 'robust_excel_ole'
|
8
|
+
require File.join(File.dirname(__FILE__), '../../lib/robust_excel_ole')
|
8
9
|
require "fileutils"
|
9
10
|
|
10
11
|
include RobustExcelOle
|
11
12
|
|
12
13
|
begin
|
13
|
-
Excel.close_all
|
14
14
|
dir = "C:/data"
|
15
15
|
workbook_name = 'workbook.xls'
|
16
|
-
|
17
|
-
|
16
|
+
ws = workbook_name.split(".")
|
17
|
+
base_name = ws[0,ws.length-1].join(".")
|
18
|
+
suffix = ws.last
|
19
|
+
#base_name = File.basename(workbook_name, ".xls*")
|
20
|
+
#workbook_name =~ /^(.*)\.[^.]$/; base_name = $1
|
21
|
+
#base_name = workbook_name.sub(/^.*(\.[^.])$/; '')
|
22
|
+
#base_name = workbook_name[0,workbook_name.rindex('.')]
|
23
|
+
#suffix = workbook_name[workbook_name.rindex('.')+1,workbook_name.length]
|
18
24
|
file_name = dir + "/" + workbook_name
|
19
25
|
extended_file_name = dir + "/" + base_name + "_named" + "." + suffix
|
20
|
-
|
21
|
-
|
22
|
-
book_orig.close
|
26
|
+
FileUtils.copy file_name, extended_file_name
|
27
|
+
|
23
28
|
Book.unobtrusively(extended_file_name) do |book|
|
24
29
|
book.each do |sheet|
|
25
30
|
sheet.each do |cell_orig|
|
26
31
|
contents = cell_orig.Value
|
27
|
-
if contents && contents.
|
28
|
-
sheet.Names.Add("Name" => contents, "RefersTo" => "=" + cell_orig.Address)
|
29
|
-
end
|
32
|
+
sheet.set_name(contents, cell_orig.Row, cell_orig.Column) if contents && contents.is_a?(String)
|
30
33
|
end
|
31
34
|
end
|
32
35
|
end
|
@@ -15,8 +15,8 @@ begin
|
|
15
15
|
File.delete simple_save_file rescue nil
|
16
16
|
book = Book.open(simple_file) # open a book
|
17
17
|
sheet = book['Sheet1'] # access a sheet via the name
|
18
|
-
row_r = sheet.row_range(
|
19
|
-
col_r = sheet.col_range(
|
18
|
+
row_r = sheet.row_range(1) # access the whole range of the first row
|
19
|
+
col_r = sheet.col_range(1, 1..2) # access the first two cells of the range of the first column
|
20
20
|
cell = col_r[0] # access the first cell of these cells
|
21
21
|
puts "row range of 1st row: #{row_r.values}" # puts the values of the first row
|
22
22
|
puts "1st and 2nd cell of the 1st column : #{col_r.values}" # and the first two cells of the first column
|
@@ -2,27 +2,25 @@
|
|
2
2
|
# save the sheets of a book as separate workbooks
|
3
3
|
|
4
4
|
require 'rubygems'
|
5
|
-
require 'robust_excel_ole'
|
5
|
+
#require 'robust_excel_ole'
|
6
|
+
require File.join(File.dirname(__FILE__), '../../lib/robust_excel_ole')
|
6
7
|
require "fileutils"
|
7
8
|
|
8
9
|
include RobustExcelOle
|
9
10
|
|
10
11
|
begin
|
11
|
-
|
12
|
+
|
12
13
|
dir = "C:/data"
|
13
|
-
workbook_name = '
|
14
|
-
|
15
|
-
|
14
|
+
workbook_name = 'workbook_named.xls'
|
15
|
+
ws = workbook_name.split(".")
|
16
|
+
base_name = ws[0,ws.length-1].join(".")
|
17
|
+
suffix = ws.last
|
16
18
|
file_name = dir + "/" + workbook_name
|
19
|
+
|
17
20
|
Book.unobtrusively(file_name) do |book_orig|
|
18
21
|
book_orig.each do |sheet_orig|
|
19
22
|
file_sheet_name = dir + "/" + base_name + "_" + sheet_orig.name + "." + suffix
|
20
23
|
Excel.current.generate_workbook(file_sheet_name)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
Book.unobtrusively(file_name) do |book_orig|
|
24
|
-
book_orig.each do |sheet_orig|
|
25
|
-
file_sheet_name = dir + "/" + base_name + "_" + sheet_orig.name + "." + suffix
|
26
24
|
# delete all existing sheets, and add the sheet
|
27
25
|
book = Book.open(file_sheet_name)
|
28
26
|
book.add_sheet sheet_orig
|
@@ -33,12 +31,8 @@ begin
|
|
33
31
|
# alternative: delete all other sheets
|
34
32
|
#book = Book.open(file_sheet_name, :force_excel => :new, :visible => true)
|
35
33
|
#book.each do |sheet|
|
36
|
-
# p "sheet.Name: #{sheet.Name}"
|
37
34
|
# book[sheet.Name].Delete() unless sheet.Name == sheet_orig.Name
|
38
35
|
#end
|
39
|
-
#sleep 3
|
40
|
-
#book.save_as(file_sheet_name, :if_exists => :overwrite)
|
41
|
-
#book.close
|
42
36
|
end
|
43
37
|
end
|
44
38
|
end
|
@@ -15,7 +15,7 @@ begin
|
|
15
15
|
book.excel.visible = true # make current Excel visible
|
16
16
|
sleep 1
|
17
17
|
sheet = book[0] # access a sheet
|
18
|
-
sheet[
|
18
|
+
sheet[1,1] = sheet[1,1].Value == "simple" ? "complex" : "simple" # change a cell
|
19
19
|
sleep 1
|
20
20
|
begin
|
21
21
|
new_book = Book.open(file_name, :if_unsaved => :alert) # open another book with the same file name
|
@@ -15,8 +15,8 @@ begin
|
|
15
15
|
book = Book.open(file_name, :visible => true) # open a book, make Excel visible
|
16
16
|
sleep 1
|
17
17
|
sheet = book[0]
|
18
|
-
first_cell = sheet[
|
19
|
-
sheet[
|
18
|
+
first_cell = sheet[1,1].Value # access a sheet
|
19
|
+
sheet[1,1] = first_cell == "simple" ? "complex" : "simple" # change a cell
|
20
20
|
sleep 1
|
21
21
|
begin
|
22
22
|
new_book = Book.open(other_file_name, :if_obstructed => :close_if_saved) # raises an exception since the file is not saved
|
@@ -27,7 +27,7 @@ begin
|
|
27
27
|
new_book = Book.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[0]
|
30
|
-
new_first_cell = new_sheet[
|
30
|
+
new_first_cell = new_sheet[1,1].Value
|
31
31
|
puts "the old book was saved" unless new_first_cell == first_cell
|
32
32
|
new_book.close # close the books
|
33
33
|
ensure
|
@@ -15,15 +15,15 @@ begin
|
|
15
15
|
book = Book.open(file_name, :visible => true) # open a book, make Excel visible
|
16
16
|
sleep 1
|
17
17
|
sheet = book[0]
|
18
|
-
first_cell = sheet[
|
19
|
-
sheet[
|
18
|
+
first_cell = sheet[1,1].value # access a sheet
|
19
|
+
sheet[1,1] = first_cell == "simple" ? "complex" : "simple" # change a cell
|
20
20
|
sleep 1
|
21
21
|
new_book = Book.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
23
|
old_book = Book.open(file_name, :if_obstructed => :forget ,:visible => true) # open the old book
|
24
24
|
sleep 1
|
25
25
|
old_sheet = old_book[0]
|
26
|
-
old_first_cell = old_sheet[
|
26
|
+
old_first_cell = old_sheet[1,1].value
|
27
27
|
puts "the old book was saved" unless old_first_cell == first_cell
|
28
28
|
new_book.close # close the books
|
29
29
|
old_book.close
|
@@ -13,7 +13,7 @@ begin
|
|
13
13
|
file_name = dir + 'workbook.xls'
|
14
14
|
book = Book.open(file_name) # open a book
|
15
15
|
sheet = book[0] # access a sheet
|
16
|
-
sheet[
|
16
|
+
sheet[1,1] = sheet[1,1].value == "simple" ? "complex" : "simple" # change a cell
|
17
17
|
begin
|
18
18
|
new_book = Book.open(file_name) # open another book with the same file name
|
19
19
|
rescue ExcelErrorOpen => msg # by default: raises an exception:
|
@@ -15,17 +15,17 @@ begin
|
|
15
15
|
book.excel.visible = true # make current Excel visible
|
16
16
|
sleep 1
|
17
17
|
sheet = book[0] # access a sheet
|
18
|
-
first_cell = sheet[
|
19
|
-
sheet[
|
18
|
+
first_cell = sheet[1,1].value
|
19
|
+
sheet[1,1] = first_cell == "simple" ? "complex" : "simple" # change a cell
|
20
20
|
sleep 1
|
21
21
|
new_book = Book.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[0]
|
24
|
-
if (not book.alive?) && new_book.alive? && sheet_new_book[
|
24
|
+
if (not book.alive?) && new_book.alive? && sheet_new_book[1,1].value == first_cell then # check whether the unsaved book
|
25
25
|
puts "open with :if_unsaved => :forget : the unsaved book is closed and not saved." # is closed and was not saved
|
26
26
|
end
|
27
27
|
sleep 1
|
28
|
-
sheet_new_book[
|
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
30
|
another_book = Book.open(file_name, :if_unsaved => :new_excel, :visible => true)
|
31
31
|
sleep 3 # leaving the unsaved book open
|
@@ -15,21 +15,21 @@ begin
|
|
15
15
|
book.excel.visible = true # make current Excel visible
|
16
16
|
sleep
|
17
17
|
sheet = book[0] # access a sheet
|
18
|
-
first_cell = sheet[
|
19
|
-
sheet[
|
18
|
+
first_cell = sheet[1,1].value
|
19
|
+
sheet[1,1] = first_cell == "simple" ? "complex" : "simple" # change a cell
|
20
20
|
sleep 1
|
21
21
|
new_book = Book.open(file_name, :if_unsaved => :new_excel, :visible => true) # open another book with the same file name in a new Excel
|
22
22
|
sheet_new_book = new_book[0]
|
23
|
-
if (not book.alive?) && new_book.alive? && sheet_new_book[
|
23
|
+
if (not book.alive?) && new_book.alive? && sheet_new_book[1,1].value == first_cell then # check whether the unsaved book
|
24
24
|
puts "open with :if_unsaved => :forget : the unsaved book is closed and not saved." # is closed and was not saved
|
25
25
|
end
|
26
26
|
sleep 1
|
27
|
-
sheet_new_book[
|
27
|
+
sheet_new_book[1,1] = sheet_new_book[1,1].value == "simple" ? "complex" : "simple" # change a cell
|
28
28
|
# open another book in the running Excel application, and make Excel visible, closing the unsaved book
|
29
29
|
another_book = Book.open(file_name, :if_unsaved => :forget, :visible => true)
|
30
30
|
sleep 1
|
31
31
|
sheet_another_book = another_book[0]
|
32
|
-
sheet_another_book[
|
32
|
+
sheet_another_book[1,1] = sheet_another_book[1,1].value == "simple" ? "complex" : "simple" # change a cell
|
33
33
|
another_book.close(:if_unsaved => :forget ) # close the last book without saving it.
|
34
34
|
book.close(:if_unsaved => :save) # close the first book and save it before
|
35
35
|
ensure
|
@@ -14,7 +14,7 @@ begin
|
|
14
14
|
book = Book.open(file_name, :read_only => true, :visible => true) # open a book with read_only and make Excel visible
|
15
15
|
sheet = book[0] # access a sheet
|
16
16
|
sleep 1
|
17
|
-
sheet[
|
17
|
+
sheet[1,1] = sheet[1,1].value == "simple" ? "complex" : "simple" # change a cell
|
18
18
|
sleep 1
|
19
19
|
begin
|
20
20
|
book.save # simple save.
|
@@ -14,12 +14,10 @@ begin
|
|
14
14
|
book = Book.open(file_name) # open a book. default: :read_only => false
|
15
15
|
book.excel.visible = true # make current Excel visible
|
16
16
|
sheet = book[0]
|
17
|
-
#sheet.Names.Add("Wert","$A$1"
|
18
|
-
|
19
17
|
workbook = book.workbook
|
20
18
|
fullname = workbook.Fullname
|
21
19
|
puts "fullname: #{fullname}"
|
22
|
-
|
20
|
+
sheet.add_name(1,1,"a_name") # rename cell A1 to "a_name"
|
23
21
|
number = workbook.Names.Count
|
24
22
|
puts "number of name objects :#{number}"
|
25
23
|
name_object = workbook.Names("a_name")
|
@@ -48,17 +46,7 @@ begin
|
|
48
46
|
new_name_object.Visible = false
|
49
47
|
puts "visible: #{new_name_object.Visible}"
|
50
48
|
sleep 2
|
51
|
-
|
52
|
-
# to do:
|
53
|
-
# read, write contents of the cell (under the old name)
|
54
|
-
# read, write contents in the cell under the new name
|
55
|
-
|
56
|
-
#sheet.Cells
|
57
|
-
# sheet[0,0].value
|
58
|
-
# Worksheets("sheet1").Cells
|
59
|
-
|
60
49
|
new_name_object.Delete
|
61
|
-
|
62
50
|
sleep 2
|
63
51
|
book.close(:if_unsaved => :forget) # close the book
|
64
52
|
|
@@ -16,7 +16,7 @@ begin
|
|
16
16
|
book.excel.visible = true # make current Excel visible
|
17
17
|
sheet = book[0] # access a sheet
|
18
18
|
sleep 1
|
19
|
-
sheet[
|
19
|
+
sheet[1,1] = sheet[1,1].value == "simple" ? "complex" : "simple" # change a cell
|
20
20
|
sleep 1
|
21
21
|
book.save # simple save
|
22
22
|
begin
|
@@ -12,14 +12,14 @@ begin
|
|
12
12
|
simple_file = dir + 'workbook.xls'
|
13
13
|
book = Book.open(simple_file, :visible => true) # open a book, make Excel visible
|
14
14
|
old_sheet = book[0]
|
15
|
-
p "1st cell: #{old_sheet[
|
15
|
+
p "1st cell: #{old_sheet[1,1].value}"
|
16
16
|
sleep 2
|
17
17
|
Book.unobtrusively(simple_file) do |book| # modify the book and keep its status unchanged
|
18
18
|
sheet = book[0]
|
19
|
-
sheet[
|
19
|
+
sheet[1,1] = sheet[1,1].value == "simple" ? "complex" : "simple"
|
20
20
|
end
|
21
21
|
new_sheet = book[0]
|
22
|
-
p "1st cell: #{new_sheet[
|
22
|
+
p "1st cell: #{new_sheet[1,1].value}"
|
23
23
|
p "book saved" if book.Saved
|
24
24
|
book.close # close the book
|
25
25
|
ensure
|
data/lib/robust_excel_ole.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require "win32ole"
|
2
2
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/excel')
|
3
|
-
require File.join(File.dirname(__FILE__), 'robust_excel_ole/
|
3
|
+
require File.join(File.dirname(__FILE__), 'robust_excel_ole/bookstore')
|
4
4
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/book')
|
5
5
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/sheet')
|
6
6
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/cell')
|
@@ -9,6 +9,8 @@ require File.join(File.dirname(__FILE__), 'robust_excel_ole/cygwin') if RUBY_PLA
|
|
9
9
|
#+#require "robust_excel_ole/version"
|
10
10
|
require File.join(File.dirname(__FILE__), 'robust_excel_ole/version')
|
11
11
|
|
12
|
+
REO = RobustExcelOle
|
13
|
+
|
12
14
|
module RobustExcelOle
|
13
15
|
|
14
16
|
def absolute_path(file)
|
@@ -24,8 +26,85 @@ module RobustExcelOle
|
|
24
26
|
|
25
27
|
module_function :absolute_path, :canonize
|
26
28
|
|
27
|
-
|
28
29
|
class VBAMethodMissingError < RuntimeError # :nodoc: #
|
29
30
|
end
|
30
31
|
|
31
32
|
end
|
33
|
+
|
34
|
+
class Object
|
35
|
+
def excel
|
36
|
+
raise ExcelErrorOpen, "provided instance is neither an Excel nor a Book"
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
class ::String
|
42
|
+
def / path_part
|
43
|
+
if empty?
|
44
|
+
path_part
|
45
|
+
else
|
46
|
+
begin
|
47
|
+
File.join self, path_part
|
48
|
+
rescue TypeError
|
49
|
+
raise "Only strings can be parts of paths (given: #{path_part.inspect} of class #{path_part.class})"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# taken from http://apidock.com/rails/ActiveSupport/Inflector/underscore
|
55
|
+
def underscore
|
56
|
+
word = gsub('::', '/')
|
57
|
+
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
|
58
|
+
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
59
|
+
word.tr!("-", "_")
|
60
|
+
word.downcase!
|
61
|
+
word
|
62
|
+
end
|
63
|
+
|
64
|
+
# taken from http://apidock.com/rails/ActiveSupport/Inflector/constantize
|
65
|
+
# File activesupport/lib/active_support/inflector/methods.rb, line 226
|
66
|
+
def constantize #(camel_cased_word)
|
67
|
+
names = self.split('::')
|
68
|
+
|
69
|
+
# Trigger a builtin NameError exception including the ill-formed constant in the message.
|
70
|
+
Object.const_get(self) if names.empty?
|
71
|
+
|
72
|
+
# Remove the first blank element in case of '::ClassName' notation.
|
73
|
+
names.shift if names.size > 1 && names.first.empty?
|
74
|
+
|
75
|
+
names.inject(Object) do |constant, name|
|
76
|
+
if constant == Object
|
77
|
+
constant.const_get(name)
|
78
|
+
else
|
79
|
+
candidate = constant.const_get(name)
|
80
|
+
next candidate if constant.const_defined?(name)
|
81
|
+
next candidate unless Object.const_defined?(name)
|
82
|
+
|
83
|
+
# Go down the ancestors to check it it's owned
|
84
|
+
# directly before we reach Object or the end of ancestors.
|
85
|
+
constant = constant.ancestors.inject do |const, ancestor|
|
86
|
+
break const if ancestor == Object
|
87
|
+
break ancestor if ancestor.const_defined?(name)
|
88
|
+
const
|
89
|
+
end
|
90
|
+
|
91
|
+
# owner is in Object, so raise
|
92
|
+
constant.const_get(name)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# taken from http://api.rubyonrails.org/v2.3.8/classes/ActiveSupport/CoreExtensions/Module.html#M000806
|
99
|
+
class Module
|
100
|
+
def parent_name
|
101
|
+
unless defined? @parent_name
|
102
|
+
@parent_name = name =~ /::[^:]+\Z/ ? $`.freeze : nil
|
103
|
+
end
|
104
|
+
@parent_name
|
105
|
+
end
|
106
|
+
def parent
|
107
|
+
parent_name ? parent_name.constantize : Object
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|