robust_excel_ole 1.35 → 1.36
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Changelog +20 -2
- data/README.rdoc +31 -95
- data/docs/README_excel.rdoc +5 -6
- data/docs/README_listobjects.rdoc +8 -15
- data/docs/README_open.rdoc +48 -25
- data/docs/README_ranges.rdoc +7 -10
- data/docs/README_save_close.rdoc +4 -5
- data/docs/README_sheet.rdoc +4 -8
- data/examples/introductory_examples/example_introductory.rb +1 -1
- data/examples/introductory_examples/example_open.rb +1 -1
- data/lib/robust_excel_ole/excel.rb +98 -16
- data/lib/robust_excel_ole/general.rb +18 -6
- data/lib/robust_excel_ole/list_object.rb +11 -19
- data/lib/robust_excel_ole/list_row.rb +74 -19
- data/lib/robust_excel_ole/range.rb +6 -1
- data/lib/robust_excel_ole/range_owners.rb +24 -17
- data/lib/robust_excel_ole/version.rb +1 -1
- data/lib/robust_excel_ole/workbook.rb +107 -42
- data/lib/robust_excel_ole/worksheet.rb +1 -1
- data/robust_excel_ole.gemspec +0 -1
- data/spec/bookstore_spec.rb +1 -2
- data/spec/data/more_data/workbook.xls +0 -0
- data/spec/data/workbook_linked3.xlsm +0 -0
- data/spec/data/workbook_listobjects.xlsx +0 -0
- data/spec/data/workbook_unsaved.xlsm +0 -0
- data/spec/excel_spec.rb +4 -4
- data/spec/general_spec.rb +1 -2
- data/spec/list_object_spec.rb +26 -9
- data/spec/list_row_spec.rb +34 -20
- data/spec/range_spec.rb +9 -0
- data/spec/workbook_spec.rb +2 -2
- data/spec/workbook_specs/workbook_misc_spec.rb +249 -2
- data/spec/workbook_specs/workbook_open_spec.rb +307 -16
- data/spec/workbook_specs/workbook_unobtr_spec.rb +196 -42
- metadata +4 -16
@@ -68,22 +68,23 @@ module RobustExcelOle
|
|
68
68
|
# :visible true, false, or nil (default)
|
69
69
|
# alternatives: :default_excel, :force_excel, :visible, :d, :f, :e, :v
|
70
70
|
# :if_unsaved if an unsaved workbook with the same name is open, then
|
71
|
-
# :raise ->
|
72
|
-
# :forget -> close the unsaved workbook, open the
|
73
|
-
# :accept ->
|
74
|
-
# :alert or :excel ->
|
75
|
-
# :new_excel ->
|
71
|
+
# :raise -> raise an exception
|
72
|
+
# :forget -> close the unsaved workbook, re-open the workbook
|
73
|
+
# :accept -> let the unsaved workbook open
|
74
|
+
# :alert or :excel -> give control to Excel
|
75
|
+
# :new_excel -> open the workbook in a new Excel instance
|
76
76
|
# :if_obstructed if a workbook with the same name in a different path is open, then
|
77
|
-
# or :raise ->
|
78
|
-
# :if_blocked :forget ->
|
79
|
-
# :
|
80
|
-
# :
|
81
|
-
#
|
82
|
-
#
|
83
|
-
#
|
84
|
-
#
|
85
|
-
#
|
86
|
-
# :
|
77
|
+
# or :raise -> raise an exception
|
78
|
+
# :if_blocked :forget -> close the workbook, re-open the workbook
|
79
|
+
# :accept -> let the blocked workbook open
|
80
|
+
# :save -> save the blocked workbook, close it, re-open the workbook
|
81
|
+
# :close_if_saved -> close the blocked workbook and re-open the workbook, if the blocked workbook is saved,
|
82
|
+
# otherwise raise an exception.
|
83
|
+
# :new_excel -> open the workbook in a new Excel instance
|
84
|
+
# :if_absent :raise -> raise an exception , if the file does not exists
|
85
|
+
# :create -> create a new Excel file, if it does not exists
|
86
|
+
# :read_only true -> open in read-only mode
|
87
|
+
# :visible true -> make the workbook visible
|
87
88
|
# :check_compatibility true -> check compatibility when saving
|
88
89
|
# :update_links true -> user is being asked how to update links, false -> links are never updated
|
89
90
|
# @return [Workbook] a representation of a workbook
|
@@ -259,8 +260,9 @@ module RobustExcelOle
|
|
259
260
|
@ole_workbook = workbooks.Item(File.basename(filename)) rescue nil if @ole_workbook.nil?
|
260
261
|
if @ole_workbook && alive?
|
261
262
|
set_was_open options, true
|
263
|
+
#open_or_create_workbook(filename,options) if (!options[:read_only].nil?) && options[:read_only]
|
264
|
+
manage_changing_readonly_mode(options) if (!options[:read_only].nil?) && options[:read_only] != @ole_workbook.ReadOnly
|
262
265
|
manage_blocking_or_unsaved_workbook(filename,options)
|
263
|
-
open_or_create_workbook(filename,options) if (!options[:read_only].nil?) && options[:read_only] != @ole_workbook.ReadOnly
|
264
266
|
else
|
265
267
|
if (excel_option.nil? || excel_option == :current) &&
|
266
268
|
!(::CONNECT_JRUBY_BUG && filename[0] == '/')
|
@@ -277,8 +279,8 @@ module RobustExcelOle
|
|
277
279
|
def apply_options(filename, options)
|
278
280
|
# changing read-only mode
|
279
281
|
if (!options[:read_only].nil?) && options[:read_only] != @ole_workbook.ReadOnly
|
280
|
-
ensure_workbook(filename, options)
|
281
|
-
|
282
|
+
# ensure_workbook(filename, options)
|
283
|
+
manage_changing_readonly_mode(options)
|
282
284
|
end
|
283
285
|
retain_saved do
|
284
286
|
self.visible = options[:force][:visible].nil? ? @excel.Visible : options[:force][:visible]
|
@@ -312,6 +314,45 @@ module RobustExcelOle
|
|
312
314
|
@excel = excel_class.new(ole_excel)
|
313
315
|
end
|
314
316
|
|
317
|
+
def manage_changing_readonly_mode(options)
|
318
|
+
if !ole_workbook.Saved && options[:read_only]
|
319
|
+
manage_unsaved_workbook_when_changing_readonly_mode(options)
|
320
|
+
end
|
321
|
+
change_readonly_mode(options)
|
322
|
+
end
|
323
|
+
|
324
|
+
def change_readonly_mode(options)
|
325
|
+
read_write_value = options[:read_only] ? RobustExcelOle::XlReadOnly : RobustExcelOle::XlReadWrite
|
326
|
+
give_control_to_excel = !ole_workbook.Saved && options[:read_only] &&
|
327
|
+
(options[:if_unsaved] == :excel || options[:if_unsaved] == :alert)
|
328
|
+
displayalerts = give_control_to_excel ? true : @excel.Displayalerts
|
329
|
+
@excel.with_displayalerts(displayalerts) {
|
330
|
+
@ole_workbook.ChangeFileAccess('Mode' => read_write_value)
|
331
|
+
}
|
332
|
+
end
|
333
|
+
|
334
|
+
def manage_unsaved_workbook_when_changing_readonly_mode(options)
|
335
|
+
case options[:if_unsaved]
|
336
|
+
when :raise
|
337
|
+
if options[:read_only]
|
338
|
+
raise WorkbookNotSaved, "workbook is not saved" +
|
339
|
+
"\nHint: Use the option :if_unsaved with values :forget or :save,
|
340
|
+
to allow changing to ReadOnly mode (with discarding or saving the workbook before, respectively),
|
341
|
+
or option :excel to give control to Excel."
|
342
|
+
end
|
343
|
+
when :save
|
344
|
+
save
|
345
|
+
when :forget
|
346
|
+
@ole_workbook.Saved = true
|
347
|
+
when :alert, :excel
|
348
|
+
# displayalerts = true
|
349
|
+
# nothing
|
350
|
+
else
|
351
|
+
raise OptionInvalid, ":if_unsaved: invalid option: #{options[:if_unsaved].inspect}" +
|
352
|
+
"\nHint: Valid values are :raise, :forget, :save, :excel"
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
315
356
|
def manage_nonexisting_file(filename, options)
|
316
357
|
return if File.exist?(filename)
|
317
358
|
abs_filename = General.absolute_path(filename)
|
@@ -354,10 +395,12 @@ module RobustExcelOle
|
|
354
395
|
raise WorkbookBlocked, "can't open workbook #{filename},
|
355
396
|
because it is being blocked by #{blocked_filename.call} with the same name in a different path." +
|
356
397
|
"\nHint: Use the option :if_blocked with values :forget or :save,
|
357
|
-
to allow automatic closing of the
|
358
|
-
before the
|
398
|
+
to allow automatic closing of the blocking workbook (without or with saving before, respectively),
|
399
|
+
before reopening the workbook."
|
359
400
|
when :forget
|
360
401
|
manage_forgetting_workbook(filename, options)
|
402
|
+
when :accept
|
403
|
+
# do nothing
|
361
404
|
when :save
|
362
405
|
manage_saving_workbook(filename, options)
|
363
406
|
when :close_if_saved
|
@@ -378,12 +421,7 @@ module RobustExcelOle
|
|
378
421
|
def manage_unsaved_workbook(filename, options)
|
379
422
|
case options[:if_unsaved]
|
380
423
|
when :raise
|
381
|
-
|
382
|
-
"cannot change read-only mode of the workbook #{File.basename(filename).inspect}, because it contains unsaved changes"
|
383
|
-
else
|
384
|
-
"workbook is already open but not saved: #{File.basename(filename).inspect}"
|
385
|
-
end
|
386
|
-
raise WorkbookNotSaved, msg +
|
424
|
+
raise WorkbookNotSaved, "workbook is already open but not saved: #{File.basename(filename).inspect}" +
|
387
425
|
"\nHint: Use the option :if_unsaved with values :forget to close the unsaved workbook,
|
388
426
|
:accept to let it open, or :save to save it, respectivly"
|
389
427
|
when :forget
|
@@ -410,7 +448,7 @@ module RobustExcelOle
|
|
410
448
|
|
411
449
|
def manage_saving_workbook(filename, options)
|
412
450
|
save unless @ole_workbook.Saved
|
413
|
-
manage_forgetting_workbook(filename, options)
|
451
|
+
manage_forgetting_workbook(filename, options) if options[:if_obstructed] == :save
|
414
452
|
end
|
415
453
|
|
416
454
|
def manage_new_excel(filename, options)
|
@@ -507,11 +545,11 @@ module RobustExcelOle
|
|
507
545
|
# @option opts [Symbol] :if_unsaved :raise (default), :save, :forget, :keep_open, or :alert
|
508
546
|
# options:
|
509
547
|
# :if_unsaved if the workbook is unsaved
|
510
|
-
# :raise ->
|
511
|
-
# :save ->
|
512
|
-
# :forget ->
|
548
|
+
# :raise -> raise an exception
|
549
|
+
# :save -> save the workbook before it is closed
|
550
|
+
# :forget -> close the workbook
|
513
551
|
# :keep_open -> keep the workbook open
|
514
|
-
# :alert or :excel ->
|
552
|
+
# :alert or :excel -> give control to excel
|
515
553
|
# @raise WorkbookNotSaved if the option :if_unsaved is :raise and the workbook is unsaved
|
516
554
|
# @raise OptionInvalid if the options is invalid
|
517
555
|
def close(opts = {if_unsaved: :raise})
|
@@ -622,7 +660,10 @@ module RobustExcelOle
|
|
622
660
|
was_saved = book.saved
|
623
661
|
was_check_compatibility = book.check_compatibility
|
624
662
|
was_calculation = book.excel.properties[:calculation]
|
625
|
-
opts[:read_only] = !opts[:writable] unless (!opts[:read_only].nil? || opts[:writable].nil? || open_opts[:was_open])
|
663
|
+
#opts[:read_only] = !opts[:writable] unless (!opts[:read_only].nil? || opts[:writable].nil? || open_opts[:was_open])
|
664
|
+
if (opts[:read_only].nil? && !opts[:writable].nil? && !open_opts[:was_open] && (was_saved || opts[:if_unsaved]==:save))
|
665
|
+
opts[:read_only] = !opts[:writable]
|
666
|
+
end
|
626
667
|
book.send :apply_options, file, opts
|
627
668
|
yield book
|
628
669
|
ensure
|
@@ -649,12 +690,14 @@ module RobustExcelOle
|
|
649
690
|
|
650
691
|
# reopens a closed workbook
|
651
692
|
# @options options
|
652
|
-
def
|
693
|
+
def open(options = { })
|
653
694
|
book = self.class.open(@stored_filename, options)
|
654
695
|
raise WorkbookREOError("cannot reopen workbook\n#{$!.message}") unless book && book.alive?
|
655
696
|
book
|
656
697
|
end
|
657
698
|
|
699
|
+
alias reopen open # :deprecated: #
|
700
|
+
|
658
701
|
# simple save of a workbook.
|
659
702
|
# @return [Boolean] true, if successfully saved, nil otherwise
|
660
703
|
def save(opts = { }) # option opts is deprecated #
|
@@ -683,10 +726,10 @@ module RobustExcelOle
|
|
683
726
|
# :overwrite -> writes the file, delete the old file
|
684
727
|
# :alert or :excel -> gives control to Excel
|
685
728
|
# :if_obstructed if a workbook with the same name and different path is already open and blocks the saving, then
|
686
|
-
# or :raise ->
|
687
|
-
# :if_blocked :forget ->
|
688
|
-
# :save ->
|
689
|
-
# :close_if_saved ->
|
729
|
+
# or :raise -> raise an exception
|
730
|
+
# :if_blocked :forget -> close the blocking workbook
|
731
|
+
# :save -> save the blocking workbook and close it
|
732
|
+
# :close_if_saved -> close the blocking workbook, if it is saved,
|
690
733
|
# otherwise raises an exception
|
691
734
|
# @return [Workbook], the book itself, if successfully saved, raises an exception otherwise
|
692
735
|
def save_as(file, options = { })
|
@@ -900,12 +943,12 @@ module RobustExcelOle
|
|
900
943
|
public
|
901
944
|
|
902
945
|
# for compatibility to older versions
|
903
|
-
def add_sheet(sheet = nil, opts = { })
|
946
|
+
def add_sheet(sheet = nil, opts = { }) # :deprecated: #
|
904
947
|
add_or_copy_sheet(sheet, opts)
|
905
948
|
end
|
906
949
|
|
907
|
-
# for compatibility to older versions
|
908
|
-
def copy_sheet(sheet, opts = { })
|
950
|
+
# for compatibility to older versions
|
951
|
+
def copy_sheet(sheet, opts = { }) # :deprecated: #
|
909
952
|
add_or_copy_sheet(sheet, opts)
|
910
953
|
end
|
911
954
|
|
@@ -975,14 +1018,36 @@ module RobustExcelOle
|
|
975
1018
|
|
976
1019
|
# returns the full file name of the workbook
|
977
1020
|
def filename
|
978
|
-
General.canonize(@ole_workbook.Fullname.tr('\\','/')) rescue nil
|
1021
|
+
@filename ||= General.canonize(@ole_workbook.Fullname.tr('\\','/')) rescue nil
|
979
1022
|
end
|
980
1023
|
|
981
|
-
# @
|
1024
|
+
# @returns true, if the workbook is not in read-only mode
|
982
1025
|
def writable
|
983
1026
|
!@ole_workbook.ReadOnly if @ole_workbook
|
984
1027
|
end
|
985
1028
|
|
1029
|
+
# sets the writable mode
|
1030
|
+
# @param [Bool] writable mode (true: read-write-mode, false: read-only mode)
|
1031
|
+
# @options [Symbol] :if_unsaved if the workbook is unsaved, then
|
1032
|
+
# :raise -> raise an exception (default)
|
1033
|
+
# :forget -> close the unsaved workbook, re-open the workbook
|
1034
|
+
# :accept -> let the unsaved workbook open
|
1035
|
+
# :alert or :excel -> give control to Excel
|
1036
|
+
def writable=(value_and_opts)
|
1037
|
+
writable_value, unsaved_opts = *value_and_opts
|
1038
|
+
if @ole_workbook && !value_and_opts.nil?
|
1039
|
+
options = {:if_unsaved => :raise}
|
1040
|
+
options = options.merge(unsaved_opts) if unsaved_opts
|
1041
|
+
options = {:read_only => !writable_value}.merge(options)
|
1042
|
+
if options[:read_only] != @ole_workbook.ReadOnly
|
1043
|
+
manage_changing_readonly_mode(options)
|
1044
|
+
manage_unsaved_workbook(filename,options) if !@ole_workbook.Saved && unsaved_opts
|
1045
|
+
end
|
1046
|
+
end
|
1047
|
+
writable_value
|
1048
|
+
end
|
1049
|
+
|
1050
|
+
|
986
1051
|
# @private
|
987
1052
|
def saved
|
988
1053
|
@ole_workbook.Saved if @ole_workbook
|
@@ -119,7 +119,7 @@ module RobustExcelOle
|
|
119
119
|
end
|
120
120
|
rescue
|
121
121
|
address2_string = (address2.nil? || address2 == :__not_provided) ? "" : ", #{address2.inspect}"
|
122
|
-
raise RangeNotCreated, "cannot find name or address #{name_or_address.inspect}#{address2_string}
|
122
|
+
raise RangeNotCreated, "cannot find name or address #{name_or_address.inspect}#{address2_string}"
|
123
123
|
end
|
124
124
|
end
|
125
125
|
end
|
data/robust_excel_ole.gemspec
CHANGED
@@ -33,7 +33,6 @@ Gem::Specification.new do |s|
|
|
33
33
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
34
34
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
35
35
|
s.require_paths = ["lib"]
|
36
|
-
s.add_runtime_dependency 'win32api', '~> 0.1'
|
37
36
|
s.add_runtime_dependency 'pry', '~> 0.12', '>= 0.12.1'
|
38
37
|
s.add_runtime_dependency 'pry-bond', '~> 0.0', '>= 0.0.1'
|
39
38
|
s.add_development_dependency 'rspec', '~> 2.6', '>= 2.6.0'
|
data/spec/bookstore_spec.rb
CHANGED
@@ -60,8 +60,7 @@ describe Bookstore do
|
|
60
60
|
@network_path = "N:/data/workbook.xls"
|
61
61
|
network = WIN32OLE.new('WScript.Network')
|
62
62
|
computer_name = network.ComputerName
|
63
|
-
|
64
|
-
@hostname_share_path = "//#{computer_name}/#{absolute_path('spec/data/workbook.xls').tr('\\','/').gsub('C:','c$')}"
|
63
|
+
@hostname_share_path = "//#{computer_name}/spec/data/workbook.xls"
|
65
64
|
@network_path_not_existing = "M:/data/workbook.xls"
|
66
65
|
@hostname_not_existing_share_path = "//DESKTOP_not_existing/spec/data/workbook.xls"
|
67
66
|
@hostname_share_not_existing_path = "//#{computer_name}/c$/gim/ats/aSrc/gems/robust_excel_ole/spec_not_existing/data/workbook.xls"
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/spec/excel_spec.rb
CHANGED
@@ -457,7 +457,7 @@ module RobustExcelOle
|
|
457
457
|
@excel1.Visible.should be false
|
458
458
|
@excel1.DisplayAlerts.should be false
|
459
459
|
@book1.should_not be_alive
|
460
|
-
@book1.
|
460
|
+
@book1.open
|
461
461
|
@book1.should be_alive
|
462
462
|
@excel1.close
|
463
463
|
@excel1.should_not be_alive
|
@@ -473,7 +473,7 @@ module RobustExcelOle
|
|
473
473
|
@excel1.should be_alive
|
474
474
|
@excel1.Visible.should be true
|
475
475
|
@excel1.DisplayAlerts.should be true
|
476
|
-
@book1.
|
476
|
+
@book1.open
|
477
477
|
@book1.should be_alive
|
478
478
|
@excel1.close
|
479
479
|
@excel1.should_not be_alive
|
@@ -487,7 +487,7 @@ module RobustExcelOle
|
|
487
487
|
@excel1.should be_alive
|
488
488
|
@excel1.Visible.should be true
|
489
489
|
@excel1.DisplayAlerts.should be true
|
490
|
-
@book1.
|
490
|
+
@book1.open
|
491
491
|
@book1.should be_alive
|
492
492
|
@excel1.close
|
493
493
|
@excel1.should_not be_alive
|
@@ -539,7 +539,7 @@ module RobustExcelOle
|
|
539
539
|
@excel3.should be_a Excel
|
540
540
|
@excel3.Visible.should be true
|
541
541
|
@excel3.DisplayAlerts.should be true
|
542
|
-
@book3.
|
542
|
+
@book3.open
|
543
543
|
@book3.should be_alive
|
544
544
|
@book3.excel.should == @excel3
|
545
545
|
@excel1.close(:if_unsaved => :forget)
|
data/spec/general_spec.rb
CHANGED
@@ -45,8 +45,7 @@ module RobustExcelOle
|
|
45
45
|
@simple_file_xlsx = @dir + '/workbook.xlsx'
|
46
46
|
@network_path = "N:/data/workbook.xls"
|
47
47
|
computer_name = NETWORK.ComputerName
|
48
|
-
|
49
|
-
@hostname_share_path = "//#{computer_name}/#{absolute_path('spec/data/workbook.xls').tr('\\','/').gsub('C:','c$')}"
|
48
|
+
@hostname_share_path = "//#{computer_name}/spec/data/workbook.xls"
|
50
49
|
@network_path_downcase = @network_path.downcase
|
51
50
|
@hostname_share_path_downcase = @hostname_share_path.downcase
|
52
51
|
@simple_file_extern = "D:/data/workbook.xls"
|
data/spec/list_object_spec.rb
CHANGED
@@ -128,6 +128,15 @@ describe ListObject do
|
|
128
128
|
|
129
129
|
end
|
130
130
|
|
131
|
+
describe "workbook" do
|
132
|
+
|
133
|
+
it "should access the workbook" do
|
134
|
+
table = @sheet.table(1)
|
135
|
+
table.workbook.should == @book
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
|
131
140
|
describe "each" do
|
132
141
|
|
133
142
|
before do
|
@@ -137,7 +146,7 @@ describe ListObject do
|
|
137
146
|
it "should traverse through list rows" do
|
138
147
|
@table1.each.with_index do |listrow, i|
|
139
148
|
listrow.values.should == [3.0, "John", 50.0, 0.5, 30] if i == 0
|
140
|
-
listrow.values.should == [2.0, "Fred",
|
149
|
+
listrow.values.should == [2.0, "Fred", 0.0, 0.5416666666666666, 40] if i == 1
|
141
150
|
listrow.values.should == [nil, nil, nil, nil, nil] if i == 2
|
142
151
|
end
|
143
152
|
end
|
@@ -173,7 +182,7 @@ describe ListObject do
|
|
173
182
|
it "should access a listrow given its number" do
|
174
183
|
listrow = @table1[2]
|
175
184
|
listrow.should be_a ListRow
|
176
|
-
listrow.values.should == [2.0, "Fred",
|
185
|
+
listrow.values.should == [2.0, "Fred", 0.0, 0.5416666666666666, 40]
|
177
186
|
end
|
178
187
|
|
179
188
|
it "should access a listrow via a multiple-column key" do
|
@@ -189,6 +198,14 @@ describe ListObject do
|
|
189
198
|
@table1[{:person => "Angel"}].values.should == [3.0, "Angel", 100, 0.6666666666666666, 60]
|
190
199
|
end
|
191
200
|
|
201
|
+
it "should access a listrow with key value which constitutes a number, type-independent" do
|
202
|
+
@table1[{"Amount" => 100}].values.should == [3.0, "Angel", 100, 0.6666666666666666, 60]
|
203
|
+
@table1[{"Amount" => "100"}].values.should == [3.0, "Angel", 100, 0.6666666666666666, 60]
|
204
|
+
@table1[{"Amount" => 0}].values.should == [2.0, "Fred", 0, 0.5416666666666666, 40.0]
|
205
|
+
@table1[{"Amount" => "0"}].values.should == [2.0, "Fred", 0, 0.5416666666666666, 40.0]
|
206
|
+
@table1[{"Amount" => "hello"}].should == nil
|
207
|
+
end
|
208
|
+
|
192
209
|
it "should yield nil if there is no match" do
|
193
210
|
@table1[{"Number" => 5, "Person" => "Angel"}].should == nil
|
194
211
|
@table1[{"Number" => 5, "Person" => "Angel"}, limit: :first].should == nil
|
@@ -252,7 +269,7 @@ describe ListObject do
|
|
252
269
|
table_value = [
|
253
270
|
["Number", "Person", "Amount", "Time", "Price"],
|
254
271
|
[3.0, "John", 50.0, 0.5, 30.0],
|
255
|
-
[2.0, "Fred",
|
272
|
+
[2.0, "Fred", 0.0, 0.5416666666666666, 40.0],
|
256
273
|
[nil, nil, nil, nil, nil],
|
257
274
|
[3.0, "Angel", 100.0, 0.6666666666666666, 60.0],
|
258
275
|
[nil, nil, nil, nil, nil],
|
@@ -387,7 +404,7 @@ describe ListObject do
|
|
387
404
|
listrows = @table.ListRows
|
388
405
|
listrows.Item(1).Range.Value.first.should == [3.0, "John", 50.0, 0.5, 30]
|
389
406
|
listrows.Item(2).Range.Value.first.should == [nil,nil,nil,nil,nil]
|
390
|
-
listrows.Item(3).Range.Value.first.should == [2.0, "Fred",
|
407
|
+
listrows.Item(3).Range.Value.first.should == [2.0, "Fred", 0.0, 0.5416666666666666, 40]
|
391
408
|
expect{
|
392
409
|
@table.add_row(16)
|
393
410
|
}.to raise_error(TableError)
|
@@ -398,7 +415,7 @@ describe ListObject do
|
|
398
415
|
listrows = @table.ListRows
|
399
416
|
listrows.Item(1).Range.Value.first.should == [3.0, "John", 50.0, 0.5, 30]
|
400
417
|
listrows.Item(2).Range.Value.first.should == [2.0, "Herbert", 30.0, 0.25, 40]
|
401
|
-
listrows.Item(3).Range.Value.first.should == [2.0, "Fred",
|
418
|
+
listrows.Item(3).Range.Value.first.should == [2.0, "Fred", 0.0, 0.5416666666666666, 40]
|
402
419
|
end
|
403
420
|
|
404
421
|
it "should add a row with contents with umlauts" do
|
@@ -417,7 +434,7 @@ describe ListObject do
|
|
417
434
|
end
|
418
435
|
|
419
436
|
it "should delete the contents of a column" do
|
420
|
-
@table.ListColumns.Item(3).Range.Value.should == [["Amount"],[50],[
|
437
|
+
@table.ListColumns.Item(3).Range.Value.should == [["Amount"],[50],[0],[nil],[100],[nil],[40],[50],[nil],[nil],[nil],[nil],[40],[20]]
|
421
438
|
@table.delete_column_values(3)
|
422
439
|
@table.HeaderRowRange.Value.first.should == ["Number","Person", "Amount", "Time","Price"]
|
423
440
|
@table.ListColumns.Item(3).Range.Value.should == [["Amount"],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil],[nil]]
|
@@ -430,7 +447,7 @@ describe ListObject do
|
|
430
447
|
end
|
431
448
|
|
432
449
|
it "should delete the contents of a row" do
|
433
|
-
@table.ListRows.Item(2).Range.Value.first.should == [2.0, "Fred",
|
450
|
+
@table.ListRows.Item(2).Range.Value.first.should == [2.0, "Fred", 0.0, 0.5416666666666666, 40]
|
434
451
|
@table.delete_row_values(2)
|
435
452
|
@table.ListRows.Item(2).Range.Value.first.should == [nil,nil,nil,nil,nil]
|
436
453
|
@table.ListRows.Item(1).Range.Value.first.should == [3.0, "John", 50.0, 0.5, 30]
|
@@ -445,7 +462,7 @@ describe ListObject do
|
|
445
462
|
@table.delete_empty_rows
|
446
463
|
@table.ListRows.Count.should == 9
|
447
464
|
@table.ListRows.Item(1).Range.Value.first.should == [3.0, "John", 50.0, 0.5, 30]
|
448
|
-
@table.ListRows.Item(2).Range.Value.first.should == [2.0, "Fred",
|
465
|
+
@table.ListRows.Item(2).Range.Value.first.should == [2.0, "Fred", 0.0, 0.5416666666666666, 40]
|
449
466
|
@table.ListRows.Item(3).Range.Value.first.should == [3, "Angel", 100, 0.6666666666666666, 60]
|
450
467
|
@table.ListRows.Item(4).Range.Value.first.should == [1,"Werner",40,0.5, 80]
|
451
468
|
end
|
@@ -525,7 +542,7 @@ describe ListObject do
|
|
525
542
|
@table.sort("Number")
|
526
543
|
@table.ListRows.Item(1).Range.Value.first.should == [1, "Werner",40,0.5, 80]
|
527
544
|
@table.ListRows.Item(2).Range.Value.first.should == [1, "Napoli", 20.0, 0.4166666666666667, 70.0]
|
528
|
-
@table.ListRows.Item(3).Range.Value.first.should == [2, "Fred",
|
545
|
+
@table.ListRows.Item(3).Range.Value.first.should == [2, "Fred", 0.0, 0.5416666666666666, 40]
|
529
546
|
@table.ListRows.Item(4).Range.Value.first.should == [3, "John", 50.0, 0.5, 30]
|
530
547
|
@table.ListRows.Item(5).Range.Value.first.should == [3, "Angel", 100, 0.6666666666666666, 60]
|
531
548
|
@table.ListRows.Item(6).Range.Value.first.should == [3, "Eiffel", 50.0, 0.5, 30]
|
data/spec/list_row_spec.rb
CHANGED
@@ -29,6 +29,34 @@ describe ListRow do
|
|
29
29
|
rm_tmp(@dir)
|
30
30
|
end
|
31
31
|
|
32
|
+
describe "accessing several tables" do
|
33
|
+
|
34
|
+
it "should preserve ole_table" do
|
35
|
+
table1 = @sheet.table(1)
|
36
|
+
table1[1].values.should == [3.0, "John", 50.0, 0.5, 30.0]
|
37
|
+
table2 = Table.new(@sheet, "table_name", [1,1], 3, ["Person","Amount"])
|
38
|
+
table2[1].values.should == [nil, nil]
|
39
|
+
table1[1].values.should == [3.0, "John", 50.0, 0.5, 30.0]
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#methods, #respond_to?" do
|
45
|
+
|
46
|
+
before do
|
47
|
+
@table1 = @sheet.table(1)
|
48
|
+
@tablerow1 = @table1[2]
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should contain column name as methods" do
|
52
|
+
column_names_both_cases = @table1.column_names + @table1.column_names.map{|c| c.downcase}
|
53
|
+
column_names_both_cases.map{|c| c.to_sym}.each do |column_name_method|
|
54
|
+
@tablerow1.methods.include?(column_name_method).should be true
|
55
|
+
@tablerow1.respond_to?(column_name_method)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
32
60
|
describe "==" do
|
33
61
|
|
34
62
|
before do
|
@@ -45,27 +73,14 @@ describe ListRow do
|
|
45
73
|
|
46
74
|
end
|
47
75
|
|
48
|
-
describe "accessing several tables" do
|
49
|
-
|
50
|
-
it "should preserve the table when accessing table rows in several tables" do
|
51
|
-
table1 = @sheet.table(1)
|
52
|
-
values1 = table1[1].values
|
53
|
-
table2 = Table.new(@sheet, "table_name", [1,1], 3, ["Person","Amount"])
|
54
|
-
values2 = table2[1].values
|
55
|
-
table1[1].values.should == values1
|
56
|
-
table1[1].values.should_not == values2
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|
60
|
-
|
61
76
|
describe "promote" do
|
62
77
|
|
63
78
|
it "should promote a win32ole tablerow" do
|
64
79
|
table1 = @sheet.table(1)
|
65
80
|
tablerow1 = table1[2]
|
66
81
|
ole_tablerow1 = tablerow1.ole_tablerow
|
67
|
-
ListRow.new(ole_tablerow1).values.should == [2.0, "Fred",
|
68
|
-
ListRow.new(tablerow1).values.should == [2.0, "Fred",
|
82
|
+
ListRow.new(ole_tablerow1).values.should == [2.0, "Fred", 0, 0.5416666666666666, 40]
|
83
|
+
ListRow.new(tablerow1).values.should == [2.0, "Fred", 0, 0.5416666666666666, 40]
|
69
84
|
end
|
70
85
|
end
|
71
86
|
|
@@ -76,13 +91,13 @@ describe ListRow do
|
|
76
91
|
end
|
77
92
|
|
78
93
|
it "should yield values of a row" do
|
79
|
-
@table1[2].to_a.should == [2.0, "Fred",
|
80
|
-
@table1[2].values.should == [2.0, "Fred",
|
94
|
+
@table1[2].to_a.should == [2.0, "Fred", 0, 0.5416666666666666, 40]
|
95
|
+
@table1[2].values.should == [2.0, "Fred", 0, 0.5416666666666666, 40]
|
81
96
|
end
|
82
97
|
|
83
98
|
it "should yield key-value pairs of a row" do
|
84
|
-
@table1[2].to_h.should == {"Number" => 2.0, "Person" => "Fred", "Amount" =>
|
85
|
-
@table1[2].keys_values.should == {"Number" => 2.0, "Person" => "Fred", "Amount" =>
|
99
|
+
@table1[2].to_h.should == {"Number" => 2.0, "Person" => "Fred", "Amount" => 0, "Time" => 0.5416666666666666, "Price" => 40}
|
100
|
+
@table1[2].keys_values.should == {"Number" => 2.0, "Person" => "Fred", "Amount" => 0, "Time" => 0.5416666666666666, "Price" => 40}
|
86
101
|
end
|
87
102
|
|
88
103
|
it "should yield values and key-value pairs of a row with umlauts" do
|
@@ -187,7 +202,6 @@ describe ListRow do
|
|
187
202
|
@table_row1.verkaeufer.should be nil
|
188
203
|
@table_row1.verkaeufer = "John"
|
189
204
|
@table_row1.verkaeufer.should == "John"
|
190
|
-
@table_row1.verkäufer.should == "John"
|
191
205
|
@sheet[2,1].should == "John"
|
192
206
|
@table_row1.Verkaeufer = "Herbert"
|
193
207
|
@table_row1.Verkaeufer.should == "Herbert"
|
data/spec/range_spec.rb
CHANGED
@@ -47,6 +47,15 @@ describe RobustExcelOle::Range do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
+
describe "#workbook, worksheet" do
|
51
|
+
|
52
|
+
it "should access workbook" do
|
53
|
+
@range2.worksheet.should == @sheet
|
54
|
+
@range2.workbook.should == @book
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
50
59
|
describe "#each" do
|
51
60
|
|
52
61
|
it "items is RobustExcelOle::Cell" do
|
data/spec/workbook_spec.rb
CHANGED
@@ -675,7 +675,7 @@ describe Workbook do
|
|
675
675
|
book1 = @book
|
676
676
|
@book.close
|
677
677
|
@book.should_not be_alive
|
678
|
-
@book.
|
678
|
+
@book.open
|
679
679
|
@book.should be_a Workbook
|
680
680
|
@book.should be_alive
|
681
681
|
@book.should === book1
|
@@ -826,7 +826,7 @@ describe Workbook do
|
|
826
826
|
book2 = Workbook.open(@different_file, :force => {:excel => :new})
|
827
827
|
@book.close
|
828
828
|
book2.close
|
829
|
-
@book.
|
829
|
+
@book.open
|
830
830
|
Workbook.unobtrusively(@simple_file1) do |book|
|
831
831
|
book.should be_a Workbook
|
832
832
|
book.should be_alive
|