robust_excel_ole 1.16 → 1.18.3

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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog +23 -0
  3. data/README.rdoc +17 -0
  4. data/benchmarking/Gemfile +7 -0
  5. data/benchmarking/README.md +131 -0
  6. data/benchmarking/creek_example.rb +33 -0
  7. data/benchmarking/generating_excel_files.rb +28 -0
  8. data/benchmarking/reo_example.rb +26 -0
  9. data/benchmarking/reo_example1.rb +31 -0
  10. data/benchmarking/reo_example2.rb +26 -0
  11. data/benchmarking/roo_example.rb +33 -0
  12. data/benchmarking/ruby_xl_example.rb +36 -0
  13. data/benchmarking/sample_excel_files/xlsx_500_rows.xlsx +0 -0
  14. data/benchmarking/simple_xlsx_reader_example.rb +33 -0
  15. data/benchmarking/spreadsheet_example.rb +36 -0
  16. data/bin/jreo.bat +3 -0
  17. data/bin/reo.bat +3 -0
  18. data/docs/README_excel.rdoc +6 -0
  19. data/docs/README_open.rdoc +4 -0
  20. data/docs/README_ranges.rdoc +15 -0
  21. data/examples/example_ruby_library.rb +27 -0
  22. data/lib/robust_excel_ole.rb +4 -3
  23. data/lib/robust_excel_ole/{address.rb → address_tool.rb} +23 -22
  24. data/lib/robust_excel_ole/{reo_common.rb → base.rb} +2 -90
  25. data/lib/robust_excel_ole/bookstore.rb +2 -2
  26. data/lib/robust_excel_ole/cell.rb +30 -18
  27. data/lib/robust_excel_ole/excel.rb +65 -30
  28. data/lib/robust_excel_ole/general.rb +7 -5
  29. data/lib/robust_excel_ole/range.rb +38 -15
  30. data/lib/robust_excel_ole/range_owners.rb +26 -11
  31. data/lib/robust_excel_ole/vba_objects.rb +30 -0
  32. data/lib/robust_excel_ole/version.rb +1 -1
  33. data/lib/robust_excel_ole/workbook.rb +136 -147
  34. data/lib/robust_excel_ole/worksheet.rb +47 -15
  35. data/lib/rubygems_plugin.rb +3 -0
  36. data/robust_excel_ole.gemspec +1 -1
  37. data/spec/address_tool_spec.rb +175 -0
  38. data/spec/{reo_common_spec.rb → base_spec.rb} +10 -29
  39. data/spec/cell_spec.rb +67 -25
  40. data/spec/data/more_data/workbook.xls +0 -0
  41. data/spec/excel_spec.rb +41 -273
  42. data/spec/general_spec.rb +15 -19
  43. data/spec/range_spec.rb +57 -3
  44. data/spec/workbook_spec.rb +7 -75
  45. data/spec/workbook_specs/workbook_misc_spec.rb +10 -10
  46. data/spec/workbook_specs/workbook_open_spec.rb +228 -14
  47. data/spec/workbook_specs/workbook_unobtr_spec.rb +31 -31
  48. data/spec/worksheet_spec.rb +42 -0
  49. metadata +27 -8
  50. data/spec/address_spec.rb +0 -174
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 87f0b689fc32747c5adbeaeff32f823b2153dc613a2dc27ae6b3a52060241ca0
4
- data.tar.gz: 2d89ef58db655b2a84b95b9dc3622fe1daae6bfafc37c1f03f9de1984cf7958e
3
+ metadata.gz: e27445ccdfcf45a843bf7d4271a36f9ced4b8ab8a0e78212ee4d6f10b5fe4aca
4
+ data.tar.gz: 9aaf9daad0c04d97161dad9bfd3836504812b9581e78ce94eceb1c24ba43705a
5
5
  SHA512:
6
- metadata.gz: 2a0074c2f763882481cdc43bb9a99b0c3b62d8ed2bfea646fc5d6d581719f01df7bb8a223c0d3629d698695b56629f1813b26f363a962707df91c42b51bebee0
7
- data.tar.gz: 863b6380c04612c239bec9ce6998be0e9ed59ec884e2f57107aa2833f11b0ba4bca7258621bc48e818591a6c6d973fe961a5ca591b2dc85cd5a15fa13dbf1ed6
6
+ metadata.gz: 9748c186da786a3af11bb47215891f2082dee540b1ef2870512393db02d8f5f685b14e58668e9047f2dcc4793d128c750bf26ae18f9f19e19bc68a5577d9ef2e
7
+ data.tar.gz: 9e1d163cc6e6c035cb6621aaafbc6701785e553cf8a19f7b0fe7936a0253b1f298864a6905319b4501fb9cece53d512083dd0148abc3571eae9326b9966d8329
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
@@ -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,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rubyXL'
4
+ gem 'roo'
5
+ gem 'creek'
6
+ gem 'spreadsheet'
7
+ gem 'simple_xlsx_reader'
@@ -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'
@@ -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'