excel_to_code 0.3.17 → 0.3.18.beta.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.
- checksums.yaml +5 -5
- data/README.md +67 -34
- data/bin/excel_to_c +8 -78
- data/bin/excel_to_go +41 -0
- data/bin/excel_to_ruby +2 -69
- data/src/commands.rb +2 -0
- data/src/commands/common_command_line_options.rb +81 -0
- data/src/commands/excel_to_c.rb +3 -0
- data/src/commands/excel_to_go.rb +91 -0
- data/src/commands/excel_to_x.rb +77 -11
- data/src/compile.rb +1 -0
- data/src/compile/c/a.out +0 -0
- data/src/compile/c/a.out.dSYM/Contents/Resources/DWARF/a.out +0 -0
- data/src/compile/c/compile_to_c.rb +2 -0
- data/src/compile/c/excel_to_c_runtime.c +691 -145
- data/src/compile/c/excel_to_c_runtime_test.c +226 -20
- data/src/compile/c/map_formulae_to_c.rb +62 -23
- data/src/compile/c/run_c_unit_tests +3 -0
- data/src/compile/cd.rb +6 -0
- data/src/compile/go.rb +3 -0
- data/src/compile/go/compile_to_go.rb +85 -0
- data/src/compile/go/compile_to_go_test.rb +73 -0
- data/src/compile/go/excel.go +171 -0
- data/src/compile/go/excel_test.go +54 -0
- data/src/compile/go/map_values_to_go.rb +67 -0
- data/src/compile/ruby/map_formulae_to_ruby.rb +30 -12
- data/src/excel/excel_functions.rb +26 -1
- data/src/excel/excel_functions/ceiling.rb +23 -0
- data/src/excel/excel_functions/countif.rb +15 -0
- data/src/excel/excel_functions/countifs.rb +10 -0
- data/src/excel/excel_functions/floor.rb +14 -0
- data/src/excel/excel_functions/hyperlink.rb +9 -0
- data/src/excel/excel_functions/na.rb +7 -0
- data/src/excel/excel_functions/not.rb +13 -0
- data/src/excel/excel_functions/or.rb +30 -0
- data/src/excel/excel_functions/product.rb +8 -0
- data/src/excel/excel_functions/rate.rb +16 -0
- data/src/excel/excel_functions/replace.rb +13 -0
- data/src/excel/excel_functions/scurve.rb +73 -0
- data/src/excel/excel_functions/sqrt.rb +11 -0
- data/src/excel/excel_functions/string_argument.rb +37 -0
- data/src/excel/excel_functions/sumifs.rb +19 -8
- data/src/excel/excel_functions/text.rb +3 -3
- data/src/excel/formula_peg.rb +1 -1
- data/src/excel/formula_peg.txt +2 -3
- data/src/excel/table.rb +15 -15
- data/src/excel_to_code.rb +1 -4
- data/src/extract/extract_data_from_worksheet.rb +8 -1
- data/src/rewrite/ast_expand_array_formulae.rb +4 -0
- data/src/rewrite/caching_formula_parser.rb +16 -11
- data/src/simplify.rb +1 -0
- data/src/simplify/inline_formulae.rb +16 -0
- data/src/simplify/replace_arithmetic_on_ranges.rb +14 -1
- data/src/simplify/replace_arrays_with_single_cells.rb +42 -15
- data/src/simplify/replace_cell_addresses_with_references.rb +70 -0
- data/src/simplify/replace_column_with_column_number.rb +8 -1
- data/src/simplify/replace_table_references.rb +40 -19
- data/src/simplify/simplify_arithmetic.rb +15 -10
- data/src/version.rb +4 -0
- metadata +115 -43
- data/TODO +0 -25
@@ -0,0 +1,70 @@
|
|
1
|
+
class ReplaceCellAddressesWithReferencesAst
|
2
|
+
|
3
|
+
attr_accessor :count_replaced
|
4
|
+
attr_accessor :replacement_made
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@count_replaced = 0
|
8
|
+
end
|
9
|
+
|
10
|
+
def replace(ast)
|
11
|
+
@replacement_made = false
|
12
|
+
map(ast)
|
13
|
+
@replacement_made
|
14
|
+
end
|
15
|
+
|
16
|
+
def map(ast)
|
17
|
+
return ast unless ast.is_a?(Array)
|
18
|
+
function(ast) if ast[0] == :function
|
19
|
+
ast.each { |a| map(a) }
|
20
|
+
ast
|
21
|
+
end
|
22
|
+
|
23
|
+
def function(ast)
|
24
|
+
_, name, info, ref = *ast
|
25
|
+
return unless name == :CELL
|
26
|
+
return unless info.first == :string
|
27
|
+
return unless info.last.downcase == "address"
|
28
|
+
replace_with_reference(ast, ref)
|
29
|
+
end
|
30
|
+
|
31
|
+
def replace_with_reference(ast, ref)
|
32
|
+
case ref.first
|
33
|
+
when :cell
|
34
|
+
ast.replace([:cell, Reference.for(ref.last).unfix])
|
35
|
+
when :sheet_reference
|
36
|
+
replace_with_reference(ref.last, ref.last)
|
37
|
+
ast.replace(ref)
|
38
|
+
when :area
|
39
|
+
ast.replace([:cell, Reference.for(ref[1]).unfix])
|
40
|
+
else
|
41
|
+
ast.replace([:error, "#VALUE!"])
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
class ReplaceCellAddressesWithReferences
|
49
|
+
|
50
|
+
|
51
|
+
def self.replace(*args)
|
52
|
+
self.new.replace(*args)
|
53
|
+
end
|
54
|
+
|
55
|
+
attr_accessor :count_replaced
|
56
|
+
|
57
|
+
def replace(input,output)
|
58
|
+
rewriter = ReplaceCellAddressesWithReferencesAst.new
|
59
|
+
input.each_line do |line|
|
60
|
+
# Looks to match lines with cell
|
61
|
+
if line =~ /:CELL/
|
62
|
+
ref, ast = line.split("\t")
|
63
|
+
output.puts "#{ref}\t#{rewriter.map(eval(ast)).inspect}"
|
64
|
+
else
|
65
|
+
output.puts line
|
66
|
+
end
|
67
|
+
end
|
68
|
+
@count_replaced = rewriter.count_replaced
|
69
|
+
end
|
70
|
+
end
|
@@ -26,8 +26,15 @@ class ReplaceColumnAndRowFunctionsAST
|
|
26
26
|
def function(ast)
|
27
27
|
return unless (ast[1] == :COLUMN || ast[1] == :ROW)
|
28
28
|
if ast[2]
|
29
|
-
if ast[2][0] == :cell
|
29
|
+
if ast[2][0] == :cell || ast[2][0] == :area
|
30
30
|
reference = Reference.for(ast[2][1])
|
31
|
+
elsif ast[2][0] == :array && ast[2][1][0] == :row
|
32
|
+
r = ast[2][1][1]
|
33
|
+
if r[0] == :cell || r[0] == :area
|
34
|
+
reference = Reference.for(r[1])
|
35
|
+
elsif r[0] == :sheet_reference
|
36
|
+
reference = Reference.for(r[2][1])
|
37
|
+
end
|
31
38
|
elsif ast[2][0] == :sheet_reference
|
32
39
|
reference = Reference.for(ast[2][2][1])
|
33
40
|
else
|
@@ -1,29 +1,50 @@
|
|
1
1
|
class ReplaceTableReferenceAst
|
2
|
-
|
3
|
-
attr_accessor :tables, :worksheet, :referring_cell
|
4
|
-
|
2
|
+
|
3
|
+
attr_accessor :tables, :worksheet, :referring_cell, :function_needs_area
|
4
|
+
|
5
5
|
def initialize(tables, worksheet = nil, referring_cell = nil)
|
6
6
|
@tables, @worksheet, @referring_cell = tables, worksheet, referring_cell
|
7
|
+
@function_needs_area = false
|
7
8
|
end
|
8
|
-
|
9
|
+
|
9
10
|
def map(ast)
|
10
11
|
return ast unless ast.is_a?(Array)
|
11
12
|
case ast[0]
|
12
|
-
when :
|
13
|
-
|
13
|
+
when :function;
|
14
|
+
check_function_needs_area(ast)
|
15
|
+
when :table_reference;
|
16
|
+
table_reference(ast)
|
17
|
+
when :local_table_reference;
|
18
|
+
local_table_reference(ast)
|
19
|
+
else
|
20
|
+
ast.each { |a| map(a) }
|
21
|
+
end
|
22
|
+
ast
|
23
|
+
end
|
24
|
+
|
25
|
+
def check_function_needs_area(ast)
|
26
|
+
if ast[1] == :MATCH
|
27
|
+
@function_needs_area = false
|
28
|
+
map(ast[2])
|
29
|
+
@function_needs_area = true
|
30
|
+
map(ast[3])
|
31
|
+
@function_needs_area = false
|
32
|
+
ast[4..-1].each { |a| map(a) }
|
33
|
+
else
|
34
|
+
@function_needs_area = false
|
35
|
+
ast.each { |a| map(a) }
|
14
36
|
end
|
15
|
-
ast.each { |a| map(a) }
|
16
37
|
ast
|
17
38
|
end
|
18
|
-
|
39
|
+
|
19
40
|
# Of the format [:table_reference, table_name, table_reference]
|
20
41
|
def table_reference(ast)
|
21
42
|
table_name = ast[1]
|
22
43
|
table_reference = ast[2]
|
23
44
|
return ast.replace([:error, :"#REF!"]) unless tables.has_key?(table_name.downcase)
|
24
|
-
ast.replace(tables[table_name.downcase].reference_for(table_name,table_reference,worksheet,referring_cell))
|
45
|
+
ast.replace(tables[table_name.downcase].reference_for(table_name,table_reference,worksheet,referring_cell, @function_needs_area))
|
25
46
|
end
|
26
|
-
|
47
|
+
|
27
48
|
# Of the format [:local_table_reference, table_reference]
|
28
49
|
def local_table_reference(ast)
|
29
50
|
table_reference = ast[1]
|
@@ -31,29 +52,29 @@ class ReplaceTableReferenceAst
|
|
31
52
|
table.includes?(worksheet,referring_cell)
|
32
53
|
end
|
33
54
|
return ast.replace([:error, :"#REF!"]) unless table
|
34
|
-
ast.replace(table.reference_for(table.name,table_reference,worksheet,referring_cell))
|
55
|
+
ast.replace(table.reference_for(table.name,table_reference,worksheet,referring_cell, @function_needs_area))
|
35
56
|
end
|
36
|
-
|
57
|
+
|
37
58
|
end
|
38
59
|
|
39
60
|
|
40
61
|
class ReplaceTableReferences
|
41
|
-
|
62
|
+
|
42
63
|
attr_accessor :sheet_name
|
43
|
-
|
64
|
+
|
44
65
|
def self.replace(*args)
|
45
66
|
self.new.replace(*args)
|
46
67
|
end
|
47
|
-
|
68
|
+
|
48
69
|
def replace(input,table_data,output)
|
49
70
|
tables = {}
|
50
71
|
table_data.each do |line|
|
51
72
|
table = Table.new(*line.strip.split("\t"))
|
52
73
|
tables[table.name.downcase] = table
|
53
74
|
end
|
54
|
-
|
75
|
+
|
55
76
|
rewriter = ReplaceTableReferenceAst.new(tables,sheet_name)
|
56
|
-
|
77
|
+
|
57
78
|
input.each_line do |line|
|
58
79
|
# Looks to match shared string lines
|
59
80
|
begin
|
@@ -69,8 +90,8 @@ class ReplaceTableReferences
|
|
69
90
|
rescue Exception => e
|
70
91
|
puts "Exception at line #{line}"
|
71
92
|
raise
|
72
|
-
end
|
93
|
+
end
|
73
94
|
end
|
74
95
|
end
|
75
|
-
|
96
|
+
|
76
97
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
class SimplifyArithmeticAst
|
2
|
-
|
2
|
+
|
3
3
|
def map(ast)
|
4
4
|
@brackets_to_remove = []
|
5
5
|
simplify_arithmetic(ast)
|
6
|
-
remove_brackets
|
6
|
+
remove_brackets(ast)
|
7
7
|
ast
|
8
8
|
end
|
9
9
|
|
10
10
|
def simplify_arithmetic(ast)
|
11
11
|
return ast unless ast.is_a?(Array)
|
12
|
-
ast.each do |a|
|
12
|
+
ast.each do |a|
|
13
13
|
simplify_arithmetic(a) if a.is_a?(Array)
|
14
14
|
end
|
15
15
|
case ast[0]
|
@@ -17,9 +17,14 @@ class SimplifyArithmeticAst
|
|
17
17
|
when :brackets; @brackets_to_remove << ast
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
21
|
-
def remove_brackets
|
22
|
-
|
20
|
+
|
21
|
+
def remove_brackets(ast)
|
22
|
+
return ast unless ast.is_a?(Array)
|
23
|
+
ast.each do |a|
|
24
|
+
remove_brackets(a) if a.is_a?(Array)
|
25
|
+
end
|
26
|
+
case ast[0]
|
27
|
+
when :brackets
|
23
28
|
raise NotSupportedException.new("Multiple arguments not supported in brackets #{ast.inspect}") if ast.size > 2
|
24
29
|
ast.replace(ast[1])
|
25
30
|
end
|
@@ -31,7 +36,7 @@ class SimplifyArithmeticAst
|
|
31
36
|
{:'*' => 2,:'/' => 2},
|
32
37
|
{:'+' => 3,:'-' => 3}
|
33
38
|
]
|
34
|
-
|
39
|
+
|
35
40
|
def arithmetic(ast)
|
36
41
|
# If smaller than 4, will only be a simple operation (e.g., 1+1 or 2*4)
|
37
42
|
# If more than 4, will be like 1+2*3 and so needs turning into 1+(2*3)
|
@@ -54,14 +59,14 @@ class SimplifyArithmeticAst
|
|
54
59
|
end
|
55
60
|
end
|
56
61
|
end
|
57
|
-
|
62
|
+
|
58
63
|
|
59
64
|
class SimplifyArithmetic
|
60
|
-
|
65
|
+
|
61
66
|
def self.replace(*args)
|
62
67
|
self.new.replace(*args)
|
63
68
|
end
|
64
|
-
|
69
|
+
|
65
70
|
def replace(input,output)
|
66
71
|
rewriter = SimplifyArithmeticAst.new
|
67
72
|
input.each_line do |line|
|
data/src/version.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: excel_to_code
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.18.beta.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Counsell, Green on Black Ltd
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubypeg
|
@@ -17,6 +17,9 @@ dependencies:
|
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.0.4
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -24,89 +27,133 @@ dependencies:
|
|
24
27
|
- - "~>"
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.0.4
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: rspec
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
37
|
- - "~>"
|
32
38
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
39
|
+
version: '3.7'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '3.7'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: ffi
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '1.9'
|
34
54
|
- - ">="
|
35
55
|
- !ruby/object:Gem::Version
|
36
|
-
version:
|
56
|
+
version: 1.9.18
|
37
57
|
type: :runtime
|
38
58
|
prerelease: false
|
39
59
|
version_requirements: !ruby/object:Gem::Requirement
|
40
60
|
requirements:
|
41
61
|
- - "~>"
|
42
62
|
- !ruby/object:Gem::Version
|
43
|
-
version: '
|
63
|
+
version: '1.9'
|
44
64
|
- - ">="
|
45
65
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
66
|
+
version: 1.9.18
|
47
67
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
68
|
+
name: ox
|
49
69
|
requirement: !ruby/object:Gem::Requirement
|
50
70
|
requirements:
|
51
71
|
- - "~>"
|
52
72
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
73
|
+
version: '2.8'
|
54
74
|
- - ">="
|
55
75
|
- !ruby/object:Gem::Version
|
56
|
-
version:
|
76
|
+
version: 2.8.2
|
57
77
|
type: :runtime
|
58
78
|
prerelease: false
|
59
79
|
version_requirements: !ruby/object:Gem::Requirement
|
60
80
|
requirements:
|
61
81
|
- - "~>"
|
62
82
|
- !ruby/object:Gem::Version
|
63
|
-
version: '
|
83
|
+
version: '2.8'
|
64
84
|
- - ">="
|
65
85
|
- !ruby/object:Gem::Version
|
66
|
-
version:
|
86
|
+
version: 2.8.2
|
67
87
|
- !ruby/object:Gem::Dependency
|
68
|
-
name:
|
88
|
+
name: minitest
|
69
89
|
requirement: !ruby/object:Gem::Requirement
|
70
90
|
requirements:
|
71
91
|
- - "~>"
|
72
92
|
- !ruby/object:Gem::Version
|
73
|
-
version: '
|
93
|
+
version: '5.11'
|
74
94
|
- - ">="
|
75
95
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
96
|
+
version: 5.11.1
|
77
97
|
type: :runtime
|
78
98
|
prerelease: false
|
79
99
|
version_requirements: !ruby/object:Gem::Requirement
|
80
100
|
requirements:
|
81
101
|
- - "~>"
|
82
102
|
- !ruby/object:Gem::Version
|
83
|
-
version: '
|
103
|
+
version: '5.11'
|
84
104
|
- - ">="
|
85
105
|
- !ruby/object:Gem::Version
|
86
|
-
version:
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
106
|
+
version: 5.11.1
|
107
|
+
- !ruby/object:Gem::Dependency
|
108
|
+
name: rake
|
109
|
+
requirement: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - "~>"
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '12'
|
114
|
+
type: :development
|
115
|
+
prerelease: false
|
116
|
+
version_requirements: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - "~>"
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '12'
|
121
|
+
description: "# Excel to Code\n\n[](https://travis-ci.org/tamc/excel_to_code)\n\nexcel_to_c
|
122
|
+
- roughly translate some Excel files into C.\n\nexcel_to_ruby - roughly translate
|
123
|
+
some Excel files into Ruby.\n\nThis allows spreadsheets to be:\n\n1. Embedded in
|
124
|
+
other programs, such as web servers, or optimisers\n2. Without depending on any
|
125
|
+
Microsoft code\n\nFor example, running [these commands](examples/simple/compile.sh)
|
126
|
+
turns [this spreadsheet](examples/simple/simple.xlsx) into [this Ruby code](examples/simple/ruby/simple.rb)
|
127
|
+
or [this C code](examples/simple/c/simple.c).\n\n# Install\n\nRequires Ruby. Install
|
128
|
+
by:\n\n gem install excel_to_code\n\n# Run\n\nTo just have a go:\n\n\texcel_to_c
|
129
|
+
<excel_file_name>\n\nThis will produce a file called excelspreadsheet.c\n\nFor a
|
130
|
+
more complex spreadsheet:\n\t\n\texcel_to_c --compile --run-tests --settable <name
|
131
|
+
of input worksheet> --prune-except <name of output worksheet> <excel file name>
|
132
|
+
\n\t\nSee the full list of options:\n\n\texcel_to_c --help\n\n# Gotchas, limitations
|
133
|
+
and bugs\n\n0. No custom functions, no macros for generating results\n1. Results
|
134
|
+
are cached. So you must call reset(), then set values, then read values.\n2. It
|
135
|
+
must be possible to replace INDIRECT and OFFSET formula with standard references
|
136
|
+
at compile time (e.g., INDIRECT(\"A\"&\"1\") is fine, INDIRECT(userInput&\"3\")
|
137
|
+
is not.\n3. Doesn't implement all functions. [See which functions are implemented](docs/Which_functions_are_implemented.md).\n4.
|
102
138
|
Doesn't implement references that involve range unions and lists (but does implement
|
103
139
|
standard ranges)\n5. Sometimes gives cells as being empty, when excel would give
|
104
140
|
the cell as having a numeric value of zero\n6. The generated C version does not
|
105
|
-
multithread and will give bad results if you try
|
106
|
-
point, rather than fully precise arithmetic, so results can differ slightly
|
141
|
+
multithread and will give bad results if you try.\n7. The generated code uses floating
|
142
|
+
point, rather than fully precise arithmetic, so results can differ slightly.\n8.
|
107
143
|
The generated code uses the sprintf approach to rounding (even-odd) rather than
|
108
|
-
excel's 0.5 rounds away from zero.\
|
109
|
-
|
144
|
+
excel's 0.5 rounds away from zero.\n9. Ranges like this: Sheet1!A10:Sheet1!B20 and
|
145
|
+
3D ranges don't work.\n\nReport bugs: <https://github.com/tamc/excel_to_code/issues>\n\n#
|
146
|
+
Changelog\n\nSee [Changes](CHANGES.md).\n\n# License\n\nSee [License](LICENSE.md)\n\n#
|
147
|
+
Hacking\n\nSource code: <https://github.com/tamc/excel_to_code>\n\nDocumentation:\n\n*
|
148
|
+
[Installing from source](docs/installing_from_source.md)\n* [Structure of this project](docs/structure_of_this_project.md)\n*
|
149
|
+
[How does the calculation work](docs/how_does_the_calculation_work.md)\n* [How to
|
150
|
+
fix parsing errors](docs/How_to_fix_parsing_errors.md)\n* [How to implement a new
|
151
|
+
Excel function](docs/How_to_add_a_missing_function.md)\n\nSome notes on how Excel
|
152
|
+
works under the hood:\n\n* [The Excel file structure](docs/implementation/excel_file_structure.md)\n*
|
153
|
+
[Relationships](docs/implementation/relationships.md)\n* [Workbooks](docs/implementation/workbook.md)\n*
|
154
|
+
[Worksheets](docs/implementation/worksheets.md)\n* [Cells](docs/implementation/cell.md)\n*
|
155
|
+
[Tables](docs/implementation/tables.md)\n* [Shared Strings](docs/implementation/shared_strings.md)\n*
|
156
|
+
[Array formulae](docs/implementation/array_formulae.md)\n\n"
|
110
157
|
email: tamc@greenonblack.com
|
111
158
|
executables:
|
112
159
|
- excel_to_c
|
@@ -115,11 +162,13 @@ extensions: []
|
|
115
162
|
extra_rdoc_files: []
|
116
163
|
files:
|
117
164
|
- README.md
|
118
|
-
- TODO
|
119
165
|
- bin/excel_to_c
|
166
|
+
- bin/excel_to_go
|
120
167
|
- bin/excel_to_ruby
|
121
168
|
- src/commands.rb
|
169
|
+
- src/commands/common_command_line_options.rb
|
122
170
|
- src/commands/excel_to_c.rb
|
171
|
+
- src/commands/excel_to_go.rb
|
123
172
|
- src/commands/excel_to_ruby.rb
|
124
173
|
- src/commands/excel_to_test.rb
|
125
174
|
- src/commands/excel_to_x.rb
|
@@ -138,6 +187,14 @@ files:
|
|
138
187
|
- src/compile/c/map_sheet_names_to_c_names.rb
|
139
188
|
- src/compile/c/map_values_to_c.rb
|
140
189
|
- src/compile/c/map_values_to_c_structs.rb
|
190
|
+
- src/compile/c/run_c_unit_tests
|
191
|
+
- src/compile/cd.rb
|
192
|
+
- src/compile/go.rb
|
193
|
+
- src/compile/go/compile_to_go.rb
|
194
|
+
- src/compile/go/compile_to_go_test.rb
|
195
|
+
- src/compile/go/excel.go
|
196
|
+
- src/compile/go/excel_test.go
|
197
|
+
- src/compile/go/map_values_to_go.rb
|
141
198
|
- src/compile/ruby.rb
|
142
199
|
- src/compile/ruby/compile_to_ruby.rb
|
143
200
|
- src/compile/ruby/compile_to_ruby_unit_test.rb
|
@@ -155,12 +212,15 @@ files:
|
|
155
212
|
- src/excel/excel_functions/apply_to_range.rb
|
156
213
|
- src/excel/excel_functions/average.rb
|
157
214
|
- src/excel/excel_functions/averageifs.rb
|
215
|
+
- src/excel/excel_functions/ceiling.rb
|
158
216
|
- src/excel/excel_functions/cell.rb
|
159
217
|
- src/excel/excel_functions/char.rb
|
160
218
|
- src/excel/excel_functions/choose.rb
|
161
219
|
- src/excel/excel_functions/cosh.rb
|
162
220
|
- src/excel/excel_functions/count.rb
|
163
221
|
- src/excel/excel_functions/counta.rb
|
222
|
+
- src/excel/excel_functions/countif.rb
|
223
|
+
- src/excel/excel_functions/countifs.rb
|
164
224
|
- src/excel/excel_functions/divide.rb
|
165
225
|
- src/excel/excel_functions/ensure_is_number.rb
|
166
226
|
- src/excel/excel_functions/excel_equal.rb
|
@@ -168,8 +228,10 @@ files:
|
|
168
228
|
- src/excel/excel_functions/excel_match.rb
|
169
229
|
- src/excel/excel_functions/exp.rb
|
170
230
|
- src/excel/excel_functions/find.rb
|
231
|
+
- src/excel/excel_functions/floor.rb
|
171
232
|
- src/excel/excel_functions/forecast.rb
|
172
233
|
- src/excel/excel_functions/hlookup.rb
|
234
|
+
- src/excel/excel_functions/hyperlink.rb
|
173
235
|
- src/excel/excel_functions/iferror.rb
|
174
236
|
- src/excel/excel_functions/index.rb
|
175
237
|
- src/excel/excel_functions/int.rb
|
@@ -193,21 +255,30 @@ files:
|
|
193
255
|
- src/excel/excel_functions/more_than.rb
|
194
256
|
- src/excel/excel_functions/more_than_or_equal.rb
|
195
257
|
- src/excel/excel_functions/multiply.rb
|
258
|
+
- src/excel/excel_functions/na.rb
|
196
259
|
- src/excel/excel_functions/negative.rb
|
260
|
+
- src/excel/excel_functions/not.rb
|
197
261
|
- src/excel/excel_functions/not_equal.rb
|
198
262
|
- src/excel/excel_functions/npv.rb
|
199
263
|
- src/excel/excel_functions/number_argument.rb
|
200
264
|
- src/excel/excel_functions/number_or_zero.rb
|
265
|
+
- src/excel/excel_functions/or.rb
|
201
266
|
- src/excel/excel_functions/pi.rb
|
202
267
|
- src/excel/excel_functions/pmt.rb
|
203
268
|
- src/excel/excel_functions/power.rb
|
269
|
+
- src/excel/excel_functions/product.rb
|
204
270
|
- src/excel/excel_functions/pv.rb
|
205
271
|
- src/excel/excel_functions/rank.rb
|
272
|
+
- src/excel/excel_functions/rate.rb
|
273
|
+
- src/excel/excel_functions/replace.rb
|
206
274
|
- src/excel/excel_functions/reset.rb
|
207
275
|
- src/excel/excel_functions/right.rb
|
208
276
|
- src/excel/excel_functions/round.rb
|
209
277
|
- src/excel/excel_functions/rounddown.rb
|
210
278
|
- src/excel/excel_functions/roundup.rb
|
279
|
+
- src/excel/excel_functions/scurve.rb
|
280
|
+
- src/excel/excel_functions/sqrt.rb
|
281
|
+
- src/excel/excel_functions/string_argument.rb
|
211
282
|
- src/excel/excel_functions/string_join.rb
|
212
283
|
- src/excel/excel_functions/substitute.rb
|
213
284
|
- src/excel/excel_functions/subtotal.rb
|
@@ -258,6 +329,7 @@ files:
|
|
258
329
|
- src/simplify/remove_cells.rb
|
259
330
|
- src/simplify/replace_arithmetic_on_ranges.rb
|
260
331
|
- src/simplify/replace_arrays_with_single_cells.rb
|
332
|
+
- src/simplify/replace_cell_addresses_with_references.rb
|
261
333
|
- src/simplify/replace_column_with_column_number.rb
|
262
334
|
- src/simplify/replace_common_elements_in_formulae.rb
|
263
335
|
- src/simplify/replace_indirects_with_references.rb
|
@@ -276,6 +348,7 @@ files:
|
|
276
348
|
- src/util.rb
|
277
349
|
- src/util/not_supported_exception.rb
|
278
350
|
- src/util/try.rb
|
351
|
+
- src/version.rb
|
279
352
|
homepage: http://github.com/tamc/excel_to_code
|
280
353
|
licenses:
|
281
354
|
- MIT
|
@@ -288,18 +361,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
288
361
|
requirements:
|
289
362
|
- - ">="
|
290
363
|
- !ruby/object:Gem::Version
|
291
|
-
version:
|
364
|
+
version: 2.3.0
|
292
365
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
293
366
|
requirements:
|
294
|
-
- - "
|
367
|
+
- - ">"
|
295
368
|
- !ruby/object:Gem::Version
|
296
|
-
version:
|
369
|
+
version: 1.3.1
|
297
370
|
requirements: []
|
298
371
|
rubyforge_project:
|
299
|
-
rubygems_version: 2.
|
372
|
+
rubygems_version: 2.7.6
|
300
373
|
signing_key:
|
301
374
|
specification_version: 4
|
302
|
-
summary:
|
303
|
-
|
375
|
+
summary: Convert many .xlsx and .xlsm files into equivalent Ruby or C code that can
|
376
|
+
be executed without Excel
|
304
377
|
test_files: []
|
305
|
-
has_rdoc: false
|