excel_to_code 0.3.17 → 0.3.18.beta.1
Sign up to get free protection for your applications and to get access to all the features.
- 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[![Tests Passing](https://travis-ci.org/tamc/excel_to_code.svg?branch=master)](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
|