robust_excel_ole 1.0 → 1.0.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.
- data/Changelog +14 -0
- data/README.rdoc +94 -351
- data/README_detail.rdoc +791 -0
- data/examples/edit_sheets/example_saving.rb +1 -1
- data/examples/open_save_close/example_default_excel.rb +5 -5
- data/examples/open_save_close/example_force_excel.rb +2 -2
- data/lib/robust_excel_ole/book.rb +237 -161
- data/lib/robust_excel_ole/excel.rb +96 -68
- data/lib/robust_excel_ole/reo_common.rb +19 -1
- data/lib/robust_excel_ole/sheet.rb +2 -3
- data/lib/robust_excel_ole/version.rb +1 -1
- data/robust_excel_ole.gemspec +2 -2
- data/spec/book_spec.rb +71 -16
- data/spec/book_specs/book_misc_spec.rb +244 -7
- data/spec/book_specs/book_open_spec.rb +472 -33
- data/spec/book_specs/book_save_spec.rb +19 -0
- data/spec/book_specs/book_unobtr_spec.rb +46 -4
- data/spec/data/another_workbook.xls +0 -0
- data/spec/data/book_with_blank.xls +0 -0
- data/spec/data/different_workbook.xls +0 -0
- data/spec/data/workbook.xls +0 -0
- data/spec/excel_spec.rb +134 -31
- metadata +7 -6
- data/spec/data/refed_wb.xls +0 -0
@@ -23,12 +23,14 @@ describe Book do
|
|
23
23
|
@simple_save_file = @dir + '/workbook_save.xls'
|
24
24
|
@different_file = @dir + '/different_workbook.xls'
|
25
25
|
@simple_file_other_path = @dir + '/more_data/workbook.xls'
|
26
|
+
@another_simple_file_other_path = @dir + '/more_data/another_workbook.xls'
|
26
27
|
@another_simple_file = @dir + '/another_workbook.xls'
|
27
28
|
@linked_file = @dir + '/workbook_linked.xlsm'
|
28
29
|
@simple_file_xlsm = @dir + '/workbook.xls'
|
29
30
|
@simple_file_xlsx = @dir + '/workbook.xlsx'
|
30
31
|
@simple_file1 = @simple_file
|
31
32
|
@simple_file_other_path1 = @simple_file_other_path
|
33
|
+
@another_simple_file_other_path1 = @another_simple_file_other_path
|
32
34
|
@simple_save_file1 = @simple_save_file
|
33
35
|
end
|
34
36
|
|
@@ -135,6 +137,23 @@ describe Book do
|
|
135
137
|
end
|
136
138
|
end
|
137
139
|
|
140
|
+
context "with saving with the same name in another directory" do
|
141
|
+
|
142
|
+
before do
|
143
|
+
@book = Book.open(@simple_file1)
|
144
|
+
end
|
145
|
+
|
146
|
+
it "should save with the same name in another directory" do
|
147
|
+
File.delete @simple_file_other_path1 rescue nil
|
148
|
+
File.open(@simple_file_other_path1,"w") do | file |
|
149
|
+
file.puts "garbage"
|
150
|
+
end
|
151
|
+
File.exist?(@simple_file_other_path1).should be_true
|
152
|
+
@book.save_as(@simple_file_other_path1, :if_exists => :overwrite, :if_obstructed => :forget)
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
138
157
|
context "with blocked by another file" do
|
139
158
|
|
140
159
|
before do
|
@@ -120,20 +120,62 @@ describe Book do
|
|
120
120
|
Book.unobtrusively(@simple_file, :visible => true) do |book|
|
121
121
|
book.should be_a Book
|
122
122
|
book.should be_alive
|
123
|
-
book.excel.
|
123
|
+
book.excel.Visible.should be_true
|
124
|
+
book.Windows(book.Name).Visible.should be_true
|
124
125
|
end
|
125
126
|
end
|
126
127
|
|
127
|
-
it "should be visible" do
|
128
|
+
it "should be visible and displayalerts" do
|
128
129
|
excel = Excel.new(:reuse => false, :displayalerts => true)
|
129
130
|
Book.unobtrusively(@simple_file, :visible => true) do |book|
|
130
131
|
book.should be_a Book
|
131
132
|
book.should be_alive
|
132
|
-
book.excel.
|
133
|
-
book.
|
133
|
+
book.excel.Visible.should be_true
|
134
|
+
book.Windows(book.Name).Visible.should be_true
|
135
|
+
book.excel.DisplayAlerts.should be_true
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should do default-visible" do
|
140
|
+
excel = Excel.new(:reuse => false, :visible => false)
|
141
|
+
Book.unobtrusively(@simple_file, :default => {:visible => true}) do |book|
|
142
|
+
book.should be_a Book
|
143
|
+
book.should be_alive
|
144
|
+
book.excel.Visible.should_not be_true
|
145
|
+
book.Windows(book.Name).Visible.should be_true
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should do default-invisible" do
|
150
|
+
excel = Excel.new(:reuse => false, :visible => true)
|
151
|
+
Book.unobtrusively(@simple_file, :default => {:visible => false}) do |book|
|
152
|
+
book.should be_a Book
|
153
|
+
book.should be_alive
|
154
|
+
book.excel.Visible.should be_true
|
155
|
+
book.Windows(book.Name).Visible.should be_false
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should do force-visible" do
|
160
|
+
excel = Excel.new(:reuse => false, :visible => false)
|
161
|
+
Book.unobtrusively(@simple_file, :force => {:visible => true}) do |book|
|
162
|
+
book.should be_a Book
|
163
|
+
book.should be_alive
|
164
|
+
book.excel.Visible.should be_true
|
165
|
+
book.Windows(book.Name).Visible.should be_true
|
134
166
|
end
|
135
167
|
end
|
136
168
|
|
169
|
+
it "should do force-invisible" do
|
170
|
+
excel = Excel.new(:reuse => false, :visible => true)
|
171
|
+
Book.unobtrusively(@simple_file, :force => {:visible => false}) do |book|
|
172
|
+
book.should be_a Book
|
173
|
+
book.should be_alive
|
174
|
+
book.excel.Visible.should be_true
|
175
|
+
book.Windows(book.Name).Visible.should be_false
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
137
179
|
end
|
138
180
|
|
139
181
|
context "with an open book" do
|
Binary file
|
Binary file
|
Binary file
|
data/spec/data/workbook.xls
CHANGED
Binary file
|
data/spec/excel_spec.rb
CHANGED
@@ -1277,61 +1277,128 @@ module RobustExcelOle
|
|
1277
1277
|
|
1278
1278
|
end
|
1279
1279
|
|
1280
|
+
context "with screen updating" do
|
1281
|
+
|
1282
|
+
it "should set screen updating" do
|
1283
|
+
excel1 = Excel.new
|
1284
|
+
excel1.ScreenUpdating.should be_true
|
1285
|
+
excel2 = Excel.create(:screenupdating => false)
|
1286
|
+
excel2.ScreenUpdating.should be_false
|
1287
|
+
excel3 = Excel.new
|
1288
|
+
excel3.ScreenUpdating.should be_true
|
1289
|
+
excel4 = Excel.new(:screenupdating => false)
|
1290
|
+
excel4.ScreenUpdating.should be_false
|
1291
|
+
end
|
1292
|
+
|
1293
|
+
end
|
1294
|
+
|
1280
1295
|
context "with calculation" do
|
1281
1296
|
|
1282
|
-
|
1283
|
-
|
1297
|
+
it "should create and reuse Excel with calculation mode" do
|
1298
|
+
excel1 = Excel.create(:calculation => :manual)
|
1299
|
+
excel1.calculation.should == :manual
|
1300
|
+
excel2 = Excel.create(:calculation => :automatic)
|
1301
|
+
excel2.calculation.should == :automatic
|
1302
|
+
excel3 = Excel.current
|
1303
|
+
excel3.calculation.should == :manual
|
1304
|
+
excel4 = Excel.current(:calculation => :automatic)
|
1305
|
+
excel4.calculation.should == :automatic
|
1306
|
+
excel5 = Excel.new(:reuse => false)
|
1307
|
+
excel5.calculation.should == nil
|
1308
|
+
excel6 = Excel.new(:reuse => false, :calculation => :manual)
|
1309
|
+
excel6.calculation.should == :manual
|
1284
1310
|
end
|
1285
1311
|
|
1286
|
-
it "should
|
1312
|
+
it "should do with_calculation mode without workbooks" do
|
1313
|
+
@excel1 = Excel.new
|
1287
1314
|
old_calculation_mode = @excel1.Calculation
|
1315
|
+
old_calculatebeforesave = @excel1.CalculateBeforeSave
|
1288
1316
|
@excel1.with_calculation(:automatic) do
|
1289
1317
|
@excel1.Calculation.should == old_calculation_mode
|
1318
|
+
@excel1.CalculateBeforeSave.should == old_calculatebeforesave
|
1290
1319
|
end
|
1291
1320
|
@excel1.with_calculation(:manual) do
|
1292
1321
|
@excel1.Calculation.should == old_calculation_mode
|
1322
|
+
@excel1.CalculateBeforeSave.should == old_calculatebeforesave
|
1293
1323
|
end
|
1294
|
-
|
1295
|
-
|
1296
|
-
|
1324
|
+
end
|
1325
|
+
|
1326
|
+
it "should set calculation mode without workbooks" do
|
1327
|
+
@excel1 = Excel.new
|
1328
|
+
old_calculation_mode = @excel1.Calculation
|
1329
|
+
old_calculatebeforesave = @excel1.CalculateBeforeSave
|
1330
|
+
@excel1.calculation = :automatic
|
1331
|
+
@excel1.calculation.should == :automatic
|
1332
|
+
@excel1.Calculation.should == old_calculation_mode
|
1333
|
+
@excel1.CalculateBeforeSave.should == old_calculatebeforesave
|
1334
|
+
@excel1.calculation = :manual
|
1335
|
+
@excel1.calculation.should == :manual
|
1297
1336
|
@excel1.Calculation.should == old_calculation_mode
|
1337
|
+
@excel1.CalculateBeforeSave.should == old_calculatebeforesave
|
1298
1338
|
end
|
1299
1339
|
|
1300
|
-
it "should
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1340
|
+
it "should do with_calculation with workbook" do
|
1341
|
+
@excel1 = Excel.new
|
1342
|
+
book = Book.open(@simple_file)
|
1343
|
+
book.Windows(book.Name).Visible = true
|
1344
|
+
old_calculation_mode = @excel1.Calculation
|
1304
1345
|
@excel1.with_calculation(:manual) do
|
1346
|
+
@excel1.calculation.should == :manual
|
1305
1347
|
@excel1.Calculation.should == -4135
|
1306
1348
|
@excel1.CalculateBeforeSave.should be_false
|
1307
1349
|
end
|
1308
|
-
@excel1.Calculation.should ==
|
1309
|
-
@excel1.CalculateBeforeSave.should
|
1350
|
+
@excel1.Calculation.should == old_calculation_mode
|
1351
|
+
@excel1.CalculateBeforeSave.should be_false
|
1352
|
+
@excel1.with_calculation(:automatic) do
|
1353
|
+
@excel1.calculation.should == :automatic
|
1354
|
+
@excel1.Calculation.should == -4105
|
1355
|
+
@excel1.CalculateBeforeSave.should be_false
|
1356
|
+
end
|
1357
|
+
@excel1.Calculation.should == old_calculation_mode
|
1358
|
+
@excel1.CalculateBeforeSave.should be_false
|
1310
1359
|
end
|
1311
1360
|
|
1312
|
-
it "should set calculation mode to manual" do
|
1313
|
-
|
1314
|
-
|
1315
|
-
|
1316
|
-
@excel1.
|
1361
|
+
it "should set calculation mode to manual with workbook" do
|
1362
|
+
@excel1 = Excel.new
|
1363
|
+
book = Book.open(@simple_file)
|
1364
|
+
book.Windows(book.Name).Visible = true
|
1365
|
+
@excel1.calculation = :manual
|
1366
|
+
@excel1.calculation.should == :manual
|
1317
1367
|
@excel1.Calculation.should == -4135
|
1318
1368
|
@excel1.CalculateBeforeSave.should be_false
|
1319
1369
|
end
|
1320
1370
|
|
1321
|
-
it "should set calculation mode automatic" do
|
1371
|
+
it "should set calculation mode to automatic with workbook" do
|
1372
|
+
@excel1 = Excel.new
|
1373
|
+
book = Book.open(@simple_file)
|
1374
|
+
book.Windows(book.Name).Visible = true
|
1375
|
+
@excel1.calculation = :automatic
|
1376
|
+
@excel1.calculation.should == :automatic
|
1377
|
+
@excel1.Calculation.should == -4105
|
1378
|
+
@excel1.CalculateBeforeSave.should be_false
|
1379
|
+
end
|
1380
|
+
|
1381
|
+
it "should set Calculation without workbooks" do
|
1382
|
+
@excel1 = Excel.new
|
1383
|
+
expect{
|
1384
|
+
@excel1.Calculation = -4135
|
1385
|
+
}.to raise_error(WIN32OLERuntimeError)
|
1386
|
+
end
|
1387
|
+
|
1388
|
+
it "should do Calculation to manual with workbook" do
|
1389
|
+
@excel1 = Excel.new
|
1322
1390
|
b = Book.open(@simple_file)
|
1323
|
-
@excel1.
|
1324
|
-
|
1325
|
-
|
1326
|
-
end
|
1391
|
+
@excel1.Calculation = -4135
|
1392
|
+
@excel1.calculation.should == :manual
|
1393
|
+
@excel1.Calculation.should == -4135
|
1327
1394
|
end
|
1328
1395
|
|
1329
|
-
it "should
|
1396
|
+
it "should do Calculation to automatic with workbook" do
|
1397
|
+
@excel1 = Excel.new
|
1330
1398
|
b = Book.open(@simple_file)
|
1331
|
-
@excel1.
|
1332
|
-
|
1333
|
-
|
1334
|
-
end
|
1399
|
+
@excel1.Calculation = -4105
|
1400
|
+
@excel1.calculation.should == :automatic
|
1401
|
+
@excel1.Calculation.should == -4105
|
1335
1402
|
end
|
1336
1403
|
|
1337
1404
|
end
|
@@ -1359,8 +1426,9 @@ module RobustExcelOle
|
|
1359
1426
|
context "with hwnd and hwnd2excel" do
|
1360
1427
|
|
1361
1428
|
before do
|
1362
|
-
|
1363
|
-
@
|
1429
|
+
Excel.kill_all
|
1430
|
+
@excel1 = Excel.new(:visible => true)
|
1431
|
+
@excel2 = Excel.new(:reuse => false, :visible => false)
|
1364
1432
|
end
|
1365
1433
|
|
1366
1434
|
it "should yield the correct hwnd" do
|
@@ -1374,8 +1442,42 @@ module RobustExcelOle
|
|
1374
1442
|
excel4 = Excel.hwnd2excel(@excel2.hwnd)
|
1375
1443
|
@excel1.should == excel3
|
1376
1444
|
@excel2.should == excel4
|
1377
|
-
excel3.should_not == excel4
|
1445
|
+
excel3.should_not == excel4
|
1446
|
+
end
|
1447
|
+
|
1448
|
+
=begin
|
1449
|
+
# does not work yet
|
1450
|
+
it "should not say 'probably recycled'" do
|
1451
|
+
e1_hwnd = @excel1.hwnd
|
1452
|
+
@excel1.close_workbooks
|
1453
|
+
weak_xl = WeakRef.new(@excel1.ole_excel)
|
1454
|
+
@excel1.Quit
|
1455
|
+
@excel1 = nil
|
1456
|
+
GC.start
|
1457
|
+
sleep 2
|
1458
|
+
process_id = Win32API.new("user32", "GetWindowThreadProcessId", ["I","P"], "I")
|
1459
|
+
pid_puffer = " " * 32
|
1460
|
+
process_id.call(e1_hwnd, pid_puffer)
|
1461
|
+
pid = pid_puffer.unpack("L")[0]
|
1462
|
+
begin
|
1463
|
+
Process.kill("KILL", pid)
|
1464
|
+
rescue
|
1465
|
+
trace "kill_error: #{$!}"
|
1466
|
+
end
|
1467
|
+
if weak_xl.weakref_alive? then
|
1468
|
+
#if WIN32OLE.ole_reference_count(weak_xlapp) > 0
|
1469
|
+
begin
|
1470
|
+
#weak_xl.ole_free
|
1471
|
+
rescue
|
1472
|
+
trace "weakref_probl_olefree"
|
1473
|
+
end
|
1474
|
+
end
|
1475
|
+
excel5 = Excel.new(:reuse => false)
|
1476
|
+
e1_again = Excel.hwnd2excel(e1_hwnd)
|
1477
|
+
e1_again.Hwnd.should == e1_hwnd
|
1478
|
+
e1_again.should == nil
|
1378
1479
|
end
|
1480
|
+
=end
|
1379
1481
|
end
|
1380
1482
|
|
1381
1483
|
describe "generate workbook" do
|
@@ -1447,6 +1549,7 @@ module RobustExcelOle
|
|
1447
1549
|
|
1448
1550
|
before do
|
1449
1551
|
@book1 = Book.open(@dir + '/another_workbook.xls')
|
1552
|
+
@book1.Windows(@book1.Name).Visible = true
|
1450
1553
|
@excel1 = @book1.excel
|
1451
1554
|
end
|
1452
1555
|
|
@@ -1480,7 +1583,7 @@ module RobustExcelOle
|
|
1480
1583
|
excel2.nameval("one")
|
1481
1584
|
}.to raise_error(NameNotFound, /cannot find name "one"/)
|
1482
1585
|
expect {
|
1483
|
-
excel3 = Excel.create
|
1586
|
+
excel3 = Excel.create(:visible => true)
|
1484
1587
|
excel3["one"]
|
1485
1588
|
}.to raise_error(NameNotFound, /cannot find name "one"/)
|
1486
1589
|
end
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: robust_excel_ole
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
|
9
|
+
- 1
|
10
|
+
version: 1.0.1
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- traths
|
@@ -14,7 +15,7 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date:
|
18
|
+
date: 2017-04-16 00:00:00 +02:00
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
@@ -34,10 +35,10 @@ dependencies:
|
|
34
35
|
type: :development
|
35
36
|
version_requirements: *id001
|
36
37
|
description: |-
|
37
|
-
RobustExcelOle automates modifying, reading and writing Excel files.
|
38
|
+
RobustExcelOle automates modifying, reading and writing Excel files in Windows by using the win32ole library.
|
38
39
|
It supports simultaneously running Excel instances and user interactions.
|
39
40
|
RobustExcelOle deals with various cases of Excel (and user) behaviour,
|
40
|
-
supplies workarounds for some Excel bugs, and supports referenced libraries
|
41
|
+
supplies workarounds for some Excel bugs, and supports referenced libraries.
|
41
42
|
email:
|
42
43
|
- Thomas.Raths@gmx.net
|
43
44
|
executables: []
|
@@ -55,6 +56,7 @@ files:
|
|
55
56
|
- Guardfile
|
56
57
|
- LICENSE
|
57
58
|
- README.rdoc
|
59
|
+
- README_detail.rdoc
|
58
60
|
- Rakefile
|
59
61
|
- TodoList.md
|
60
62
|
- examples/edit_sheets/example_access_sheets_and_cells.rb
|
@@ -114,7 +116,6 @@ files:
|
|
114
116
|
- spec/data/merge_cells.xls
|
115
117
|
- spec/data/more_data/workbook.xls
|
116
118
|
- spec/data/protected_sheet.xls
|
117
|
-
- spec/data/refed_wb.xls
|
118
119
|
- spec/data/reference_workbook.xls
|
119
120
|
- spec/data/referencing_wb.xls
|
120
121
|
- spec/data/workbook.xls
|
data/spec/data/refed_wb.xls
DELETED
Binary file
|