robust_excel_ole 1.17 → 1.18.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Changelog +23 -0
- data/README.rdoc +17 -0
- data/benchmarking/Gemfile +7 -0
- data/benchmarking/README.md +131 -0
- data/benchmarking/creek_example.rb +33 -0
- data/benchmarking/generating_excel_files.rb +28 -0
- data/benchmarking/reo_example.rb +26 -0
- data/benchmarking/reo_example1.rb +31 -0
- data/benchmarking/reo_example2.rb +26 -0
- data/benchmarking/roo_example.rb +33 -0
- data/benchmarking/ruby_xl_example.rb +36 -0
- data/benchmarking/sample_excel_files/xlsx_500_rows.xlsx +0 -0
- data/benchmarking/simple_xlsx_reader_example.rb +33 -0
- data/benchmarking/spreadsheet_example.rb +36 -0
- data/bin/jreo +3 -0
- data/bin/reo +3 -0
- data/docs/README_excel.rdoc +6 -0
- data/docs/README_ranges.rdoc +0 -30
- data/docs/README_sheet.rdoc +72 -0
- data/examples/example_ruby_library.rb +27 -0
- data/lib/robust_excel_ole.rb +1 -1
- data/lib/robust_excel_ole/cell.rb +13 -5
- data/lib/robust_excel_ole/excel.rb +1 -4
- data/lib/robust_excel_ole/range.rb +23 -8
- data/lib/robust_excel_ole/range_owners.rb +8 -5
- data/lib/robust_excel_ole/vba_objects.rb +30 -0
- data/lib/robust_excel_ole/version.rb +1 -1
- data/lib/robust_excel_ole/workbook.rb +17 -21
- data/lib/robust_excel_ole/worksheet.rb +40 -8
- data/lib/rubygems_plugin.rb +3 -0
- data/robust_excel_ole.gemspec +1 -1
- data/spec/excel_spec.rb +16 -0
- data/spec/general_spec.rb +0 -1
- data/spec/range_spec.rb +56 -2
- data/spec/worksheet_spec.rb +42 -0
- metadata +23 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf35f3fb5a6a208f408a41bfb4dd72424030458ecbbf51590e457ce63cdaef55
|
4
|
+
data.tar.gz: 04357d405ae6d393480457ffb4d2e21fde6cd8b87a123be6467f1389c83d6727
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8702bb3c42465b1c3c04ccb248fdc6d17f415193fba5ef12d05820517420970b8da04f042de4a562390e21ee8b1f90325eb5826bd012d3aeea0ca3a8640292e5
|
7
|
+
data.tar.gz: 84ce7e871aeb7005441832c97ef68e67da3ef46e20c024ae3c7a51dcef946de13d89902e6a40c8173bd486d9c2a44a9db2e3f8139c2ed0501133b503066821af
|
data/Changelog
CHANGED
@@ -1,6 +1,29 @@
|
|
1
1
|
# Change Log
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
|
5
|
+
## [1.19] 2020-30-5
|
6
|
+
|
7
|
+
### Added
|
8
|
+
- Workheet#values, each_rowvalue
|
9
|
+
|
10
|
+
|
11
|
+
## [1.18] 2020-30-4
|
12
|
+
|
13
|
+
### Added
|
14
|
+
- Workbook#worksheets, worksheets_count
|
15
|
+
- Worksheet#each_value
|
16
|
+
- Range#value, value=
|
17
|
+
- Range#initialize: optional paramter worksheet
|
18
|
+
|
19
|
+
## [1.17]
|
20
|
+
|
21
|
+
### Added
|
22
|
+
- Excel#active_workbook
|
23
|
+
|
24
|
+
### Changed
|
25
|
+
- Excel#namevalue, set_namevalue, namevalue_glob, set_namevalue_glob are being removed
|
26
|
+
|
4
27
|
## [1.16]
|
5
28
|
|
6
29
|
### Added
|
data/README.rdoc
CHANGED
@@ -14,6 +14,23 @@ Library references are supported.
|
|
14
14
|
RobustExcelOle works by sending VBA methods via Win32OLE.
|
15
15
|
Therefore, it runs on Windows only.
|
16
16
|
|
17
|
+
== Feature list
|
18
|
+
|
19
|
+
- opening and processing workbooks across various Excel instances
|
20
|
+
- reading and writing workbooks (cells and ranges)
|
21
|
+
- reopening and unobtrusively opening workbooks
|
22
|
+
- convenient methods for standard tasks (like opening, reading, writing, closing, saving workbooks, naming, adding, and copying ranges and worksheets)
|
23
|
+
- dealing with various cases of Excel and user behaviour, e.g. managing conflicts when opening workbooks (e.g. blocking or unsaved workbooks),
|
24
|
+
even with simultanously happening user interactions
|
25
|
+
- workarounds for Excel bugs and JRuby bugs
|
26
|
+
- various workbook formats, e.g. .xlsx, .xls, .xlsm are supported
|
27
|
+
- library references are supported
|
28
|
+
- console for convenient usage
|
29
|
+
|
30
|
+
== What's new?
|
31
|
+
|
32
|
+
- removing methods to operate on ranges directly from an Excel instance. However, you can use the method Excel.active_workbook to do so.
|
33
|
+
See ChangeLogs.
|
17
34
|
|
18
35
|
== Requirements
|
19
36
|
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# ruby-excel-library-examples
|
2
|
+
This project contains sample code for reading Excel files with different Ruby libraries.
|
3
|
+
|
4
|
+
## `.xlsx` File Examples
|
5
|
+
Below are code samples for reading current OOXML Excel files using [**rubyXL**](https://github.com/weshatheleopard/rubyXL), [**roo**](https://github.com/roo-rb/roo), [**creek**](https://github.com/pythonicrubyist/creek), and [**simple_xlsx_reader**](https://github.com/woahdae/simple_xlsx_reader).
|
6
|
+
|
7
|
+
### [rubyXL](https://github.com/weshatheleopard/rubyXL)
|
8
|
+
```ruby
|
9
|
+
require 'rubyXL'
|
10
|
+
|
11
|
+
workbook = RubyXL::Parser.parse './sample_excel_files/xlsx_500_rows.xlsx'
|
12
|
+
worksheets = workbook.worksheets
|
13
|
+
puts "Found #{worksheets.count} worksheets"
|
14
|
+
|
15
|
+
worksheets.each do |worksheet|
|
16
|
+
puts "Reading: #{worksheet.sheet_name}"
|
17
|
+
num_rows = 0
|
18
|
+
|
19
|
+
worksheet.each do |row|
|
20
|
+
row_cells = row.cells.map{ |cell| cell.value }
|
21
|
+
num_rows += 1
|
22
|
+
|
23
|
+
# uncomment to print out row values
|
24
|
+
# puts row_cells.join " "
|
25
|
+
end
|
26
|
+
puts "Read #{num_rows} rows"
|
27
|
+
end
|
28
|
+
|
29
|
+
puts 'Done'
|
30
|
+
```
|
31
|
+
### [roo](https://github.com/roo-rb/roo)
|
32
|
+
```ruby
|
33
|
+
require 'roo'
|
34
|
+
|
35
|
+
workbook = Roo::Spreadsheet.open './sample_excel_files/xlsx_500_rows.xlsx'
|
36
|
+
worksheets = workbook.sheets
|
37
|
+
puts "Found #{worksheets.count} worksheets"
|
38
|
+
|
39
|
+
worksheets.each do |worksheet|
|
40
|
+
puts "Reading: #{worksheet}"
|
41
|
+
num_rows = 0
|
42
|
+
|
43
|
+
workbook.sheet(worksheet).each_row_streaming do |row|
|
44
|
+
row_cells = row.map { |cell| cell.value }
|
45
|
+
num_rows += 1
|
46
|
+
|
47
|
+
# uncomment to print out row values
|
48
|
+
# puts row_cells.join ' '
|
49
|
+
end
|
50
|
+
puts "Read #{num_rows} rows"
|
51
|
+
end
|
52
|
+
|
53
|
+
puts 'Done'
|
54
|
+
```
|
55
|
+
### [creek](https://github.com/pythonicrubyist/creek)
|
56
|
+
```ruby
|
57
|
+
require 'creek'
|
58
|
+
|
59
|
+
workbook = Creek::Book.new './sample_excel_files/xlsx_500_rows.xlsx'
|
60
|
+
worksheets = workbook.sheets
|
61
|
+
puts "Found #{worksheets.count} worksheets"
|
62
|
+
|
63
|
+
worksheets.each do |worksheet|
|
64
|
+
puts "Reading: #{worksheet.name}"
|
65
|
+
num_rows = 0
|
66
|
+
|
67
|
+
worksheet.rows.each do |row|
|
68
|
+
row_cells = row.values
|
69
|
+
num_rows += 1
|
70
|
+
|
71
|
+
# uncomment to print out row values
|
72
|
+
# puts row_cells.join " "
|
73
|
+
end
|
74
|
+
puts "Read #{num_rows} rows"
|
75
|
+
end
|
76
|
+
|
77
|
+
puts 'Done'
|
78
|
+
```
|
79
|
+
### [simple_xlsx_reader](https://github.com/woahdae/simple_xlsx_reader)
|
80
|
+
```ruby
|
81
|
+
require 'simple_xlsx_reader'
|
82
|
+
|
83
|
+
workbook = SimpleXlsxReader.open './sample_excel_files/xlsx_500000_rows.xlsx'
|
84
|
+
worksheets = workbook.sheets
|
85
|
+
puts "Found #{worksheets.count} worksheets"
|
86
|
+
|
87
|
+
worksheets.each do |worksheet|
|
88
|
+
puts "Reading: #{worksheet.name}"
|
89
|
+
num_rows = 0
|
90
|
+
|
91
|
+
worksheet.rows.each do |row|
|
92
|
+
row_cells = row
|
93
|
+
num_rows += 1
|
94
|
+
|
95
|
+
# uncomment to print out row values
|
96
|
+
# puts row_cells.join ' '
|
97
|
+
end
|
98
|
+
puts "Read #{num_rows} rows"
|
99
|
+
end
|
100
|
+
|
101
|
+
puts 'Done'
|
102
|
+
```
|
103
|
+
|
104
|
+
## Legacy `.xls` Files
|
105
|
+
Below are code samples for reading legacy Excel files using [**spreadsheet**](https://github.com/zdavatz/spreadsheet)
|
106
|
+
|
107
|
+
### [spreadsheet](https://github.com/zdavatz/spreadsheet)
|
108
|
+
```ruby
|
109
|
+
require 'spreadsheet'
|
110
|
+
|
111
|
+
# Note: spreadsheet only supports .xls files (not .xlsx)
|
112
|
+
workbook = Spreadsheet.open './sample_excel_files/xls_500_rows.xls'
|
113
|
+
worksheets = workbook.worksheets
|
114
|
+
puts "Found #{worksheets.count} worksheets"
|
115
|
+
|
116
|
+
worksheets.each do |worksheet|
|
117
|
+
puts "Reading: #{worksheet.name}"
|
118
|
+
num_rows = 0
|
119
|
+
|
120
|
+
worksheet.rows.each do |row|
|
121
|
+
row_cells = row.to_a.map{ |v| v.methods.include?(:value) ? v.value : v }
|
122
|
+
num_rows += 1
|
123
|
+
|
124
|
+
# uncomment to print out row values
|
125
|
+
# puts row_cells.join " "
|
126
|
+
end
|
127
|
+
puts "Read #{num_rows} rows"
|
128
|
+
end
|
129
|
+
|
130
|
+
puts 'Done'
|
131
|
+
```
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
require 'creek'
|
3
|
+
|
4
|
+
start_time = Time.now
|
5
|
+
|
6
|
+
# ============================================
|
7
|
+
# =========== Read Example ===============
|
8
|
+
# ============================================
|
9
|
+
|
10
|
+
workbook = Creek::Book.new './sample_excel_files/xlsx_500_rows.xlsx'
|
11
|
+
|
12
|
+
worksheets = workbook.sheets
|
13
|
+
puts "Found #{worksheets.count} worksheets"
|
14
|
+
|
15
|
+
worksheets.each do |worksheet|
|
16
|
+
puts "Reading: #{worksheet.name}"
|
17
|
+
num_rows = 0
|
18
|
+
|
19
|
+
worksheet.rows.each do |row|
|
20
|
+
row_cells = row.values
|
21
|
+
num_rows += 1
|
22
|
+
|
23
|
+
# uncomment to print out row values
|
24
|
+
# puts row_cells.join " "
|
25
|
+
end
|
26
|
+
puts "Read #{num_rows} rows"
|
27
|
+
end
|
28
|
+
|
29
|
+
end_time = Time.now
|
30
|
+
running_time = end_time - start_time
|
31
|
+
puts "time: #{running_time} sec."
|
32
|
+
|
33
|
+
puts 'Done'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative '../lib/robust_excel_ole'
|
2
|
+
|
3
|
+
include RobustExcelOle
|
4
|
+
|
5
|
+
begin
|
6
|
+
|
7
|
+
filename = './large_excel_files/xlsx_10_rows.xlsx'
|
8
|
+
Excel.kill_all
|
9
|
+
|
10
|
+
Workbook.open(filename, :if_absent => :create) do |workbook|
|
11
|
+
# default: 3 worksheets
|
12
|
+
num_worksheets = 1
|
13
|
+
workbook.each do |worksheet|
|
14
|
+
puts "worksheet-number #{num_worksheets}"
|
15
|
+
num_rows = 1
|
16
|
+
(1..10).each do |row|
|
17
|
+
puts "row-number: #{num_rows}"
|
18
|
+
(1..10).each do |column|
|
19
|
+
worksheet[num_rows,column].value = (num_rows-1)*10+column
|
20
|
+
end
|
21
|
+
num_rows += 1
|
22
|
+
end
|
23
|
+
num_worksheets += 1
|
24
|
+
end
|
25
|
+
workbook.save
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../lib/robust_excel_ole')
|
2
|
+
|
3
|
+
start_time = Time.now
|
4
|
+
|
5
|
+
workbook = RobustExcelOle::Workbook.open './sample_excel_files/xlsx_500_rows.xlsx'
|
6
|
+
|
7
|
+
puts "Found #{workbook.worksheets_count} worksheets"
|
8
|
+
|
9
|
+
workbook.each do |worksheet|
|
10
|
+
puts "Reading: #{worksheet.name}"
|
11
|
+
num_rows = 0
|
12
|
+
|
13
|
+
worksheet.values.each do |row_vals|
|
14
|
+
row_cells = row_vals
|
15
|
+
num_rows += 1
|
16
|
+
end
|
17
|
+
|
18
|
+
puts "Read #{num_rows} rows"
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end_time = Time.now
|
23
|
+
running_time = end_time - start_time
|
24
|
+
puts "time: #{running_time} sec."
|
25
|
+
|
26
|
+
puts 'Done'
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#require 'robust_excel_ole'
|
2
|
+
require File.join(File.dirname(__FILE__), '../lib/robust_excel_ole')
|
3
|
+
|
4
|
+
start_time = Time.now
|
5
|
+
|
6
|
+
workbook = RobustExcelOle::Workbook.open './sample_excel_files/xlsx_500_rows.xlsx'
|
7
|
+
|
8
|
+
puts "Found #{workbook.Worksheets.Count} worksheets"
|
9
|
+
|
10
|
+
workbook.each do |worksheet|
|
11
|
+
puts "Reading: #{worksheet.name}"
|
12
|
+
num_rows = 0
|
13
|
+
|
14
|
+
worksheet.each_row do |row|
|
15
|
+
row_cells = row.map{ |cell| cell.value }
|
16
|
+
num_rows += 1
|
17
|
+
|
18
|
+
# uncomment to print out row values
|
19
|
+
# puts row_cells.join " "
|
20
|
+
end
|
21
|
+
puts "Read #{num_rows} rows"
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
end_time = Time.now
|
28
|
+
running_time = end_time - start_time
|
29
|
+
puts "time: #{running_time} sec."
|
30
|
+
|
31
|
+
puts 'Done'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../lib/robust_excel_ole')
|
2
|
+
|
3
|
+
start_time = Time.now
|
4
|
+
|
5
|
+
workbook = RobustExcelOle::Workbook.open './sample_excel_files/xlsx_500_rows.xlsx'
|
6
|
+
|
7
|
+
puts "Found #{workbook.worksheets_count} worksheets"
|
8
|
+
|
9
|
+
workbook.each do |worksheet|
|
10
|
+
puts "Reading: #{worksheet.name}"
|
11
|
+
num_rows = 0
|
12
|
+
|
13
|
+
worksheet.each_rowvalue do |row_vals|
|
14
|
+
row_cells = row_vals
|
15
|
+
num_rows += 1
|
16
|
+
end
|
17
|
+
|
18
|
+
puts "Read #{num_rows} rows"
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end_time = Time.now
|
23
|
+
running_time = end_time - start_time
|
24
|
+
puts "time: #{running_time} sec."
|
25
|
+
|
26
|
+
puts 'Done'
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'roo'
|
2
|
+
|
3
|
+
# ============================================
|
4
|
+
# =========== Read Example ===============
|
5
|
+
# ============================================
|
6
|
+
|
7
|
+
start_time = Time.now
|
8
|
+
|
9
|
+
workbook = Roo::Spreadsheet.open './sample_excel_files/xlsx_500_rows.xlsx'
|
10
|
+
|
11
|
+
worksheets = workbook.sheets
|
12
|
+
puts "Found #{worksheets.count} worksheets"
|
13
|
+
|
14
|
+
worksheets.each do |worksheet|
|
15
|
+
puts "Reading: #{worksheet}"
|
16
|
+
num_rows = 0
|
17
|
+
|
18
|
+
workbook.sheet(worksheet).each_row_streaming do |row|
|
19
|
+
row_cells = row.map { |cell| cell.value }
|
20
|
+
#puts row_cells.inspect
|
21
|
+
num_rows += 1
|
22
|
+
|
23
|
+
# uncomment to print out row values
|
24
|
+
# puts row_cells.join ' '
|
25
|
+
end
|
26
|
+
puts "Read #{num_rows} rows"
|
27
|
+
end
|
28
|
+
|
29
|
+
end_time = Time.now
|
30
|
+
running_time = end_time - start_time
|
31
|
+
puts "time: #{running_time} sec."
|
32
|
+
|
33
|
+
puts 'Done'
|
@@ -0,0 +1,36 @@
|
|
1
|
+
|
2
|
+
require 'rubyXL'
|
3
|
+
|
4
|
+
start_time = Time.now
|
5
|
+
|
6
|
+
# ============================================
|
7
|
+
# =========== Read Example ===============
|
8
|
+
# ============================================
|
9
|
+
|
10
|
+
workbook = RubyXL::Parser.parse './sample_excel_files/xlsx_500_rows.xlsx'
|
11
|
+
|
12
|
+
worksheets = workbook.worksheets
|
13
|
+
puts "Found #{worksheets.count} worksheets"
|
14
|
+
|
15
|
+
worksheets.each do |worksheet|
|
16
|
+
puts "Reading: #{worksheet.sheet_name}"
|
17
|
+
num_rows = 0
|
18
|
+
|
19
|
+
worksheet.each do |row|
|
20
|
+
row_cells = row.cells.map{ |cell| cell.value }
|
21
|
+
num_rows += 1
|
22
|
+
|
23
|
+
# uncomment to print out row values
|
24
|
+
# puts row_cells.join " "
|
25
|
+
end
|
26
|
+
puts "Read #{num_rows} rows"
|
27
|
+
end
|
28
|
+
|
29
|
+
end_time = Time.now
|
30
|
+
running_time = end_time - start_time
|
31
|
+
puts "time: #{running_time} sec."
|
32
|
+
|
33
|
+
puts 'Done'
|
34
|
+
|
35
|
+
|
36
|
+
puts 'Done'
|
Binary file
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
require 'simple_xlsx_reader'
|
3
|
+
|
4
|
+
start_time = Time.now
|
5
|
+
|
6
|
+
# ============================================
|
7
|
+
# =========== Read Example ==============
|
8
|
+
# ============================================
|
9
|
+
|
10
|
+
workbook = SimpleXlsxReader.open './sample_excel_files/xlsx_500_rows.xlsx'
|
11
|
+
|
12
|
+
worksheets = workbook.sheets
|
13
|
+
puts "Found #{worksheets.count} worksheets"
|
14
|
+
|
15
|
+
worksheets.each do |worksheet|
|
16
|
+
puts "Reading: #{worksheet.name}"
|
17
|
+
num_rows = 0
|
18
|
+
|
19
|
+
worksheet.rows.each do |row|
|
20
|
+
row_cells = row
|
21
|
+
num_rows += 1
|
22
|
+
|
23
|
+
# uncomment to print out row values
|
24
|
+
# puts row_cells.join ' '
|
25
|
+
end
|
26
|
+
puts "Read #{num_rows} rows"
|
27
|
+
end
|
28
|
+
|
29
|
+
end_time = Time.now
|
30
|
+
running_time = end_time - start_time
|
31
|
+
puts "time: #{running_time} sec."
|
32
|
+
|
33
|
+
puts 'Done'
|