rubyfromexcel 0.0.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.
Files changed (188) hide show
  1. data/README +22 -0
  2. data/bin/rubyfromexcel +20 -0
  3. data/examples/create_and_test_examples.rb +37 -0
  4. data/examples/ruby-versions/array-formulas-ruby/sheets/sheet1.rb +59 -0
  5. data/examples/ruby-versions/array-formulas-ruby/sheets/sheet2.rb +9 -0
  6. data/examples/ruby-versions/array-formulas-ruby/specs/sheet1_rspec.rb +156 -0
  7. data/examples/ruby-versions/array-formulas-ruby/specs/sheet2_rspec.rb +8 -0
  8. data/examples/ruby-versions/array-formulas-ruby/spreadsheet.rb +9 -0
  9. data/examples/ruby-versions/complex-test-ruby/sheets/sheet1.rb +305 -0
  10. data/examples/ruby-versions/complex-test-ruby/sheets/sheet2.rb +147 -0
  11. data/examples/ruby-versions/complex-test-ruby/specs/sheet1_rspec.rb +876 -0
  12. data/examples/ruby-versions/complex-test-ruby/specs/sheet2_rspec.rb +412 -0
  13. data/examples/ruby-versions/complex-test-ruby/spreadsheet.rb +9 -0
  14. data/examples/ruby-versions/namedReferenceTest-ruby/sheets/sheet1.rb +9 -0
  15. data/examples/ruby-versions/namedReferenceTest-ruby/sheets/sheet2.rb +8 -0
  16. data/examples/ruby-versions/namedReferenceTest-ruby/specs/sheet1_rspec.rb +16 -0
  17. data/examples/ruby-versions/namedReferenceTest-ruby/specs/sheet2_rspec.rb +16 -0
  18. data/examples/ruby-versions/namedReferenceTest-ruby/spreadsheet.rb +9 -0
  19. data/examples/ruby-versions/pruning-ruby/sheets/sheet1.rb +11 -0
  20. data/examples/ruby-versions/pruning-ruby/sheets/sheet2.rb +14 -0
  21. data/examples/ruby-versions/pruning-ruby/sheets/sheet3.rb +7 -0
  22. data/examples/ruby-versions/pruning-ruby/specs/sheet1_rspec.rb +20 -0
  23. data/examples/ruby-versions/pruning-ruby/specs/sheet2_rspec.rb +20 -0
  24. data/examples/ruby-versions/pruning-ruby/specs/sheet3_rspec.rb +8 -0
  25. data/examples/ruby-versions/pruning-ruby/spreadsheet.rb +9 -0
  26. data/examples/ruby-versions/sharedFormulaTest-ruby/sheets/sheet1.rb +15 -0
  27. data/examples/ruby-versions/sharedFormulaTest-ruby/specs/sheet1_rspec.rb +44 -0
  28. data/examples/ruby-versions/sharedFormulaTest-ruby/spreadsheet.rb +9 -0
  29. data/examples/ruby-versions/table-test-ruby/sheets/sheet1.rb +17 -0
  30. data/examples/ruby-versions/table-test-ruby/sheets/sheet2.rb +5 -0
  31. data/examples/ruby-versions/table-test-ruby/sheets/sheet3.rb +5 -0
  32. data/examples/ruby-versions/table-test-ruby/specs/sheet1_rspec.rb +20 -0
  33. data/examples/ruby-versions/table-test-ruby/specs/sheet2_rspec.rb +8 -0
  34. data/examples/ruby-versions/table-test-ruby/specs/sheet3_rspec.rb +8 -0
  35. data/examples/ruby-versions/table-test-ruby/spreadsheet.rb +9 -0
  36. data/examples/sheets/array-formulas.xlsx +0 -0
  37. data/examples/sheets/complex-test.xlsx +0 -0
  38. data/examples/sheets/namedReferenceTest.xlsx +0 -0
  39. data/examples/sheets/pruning.xlsx +0 -0
  40. data/examples/sheets/sharedFormulaTest.xlsx +0 -0
  41. data/examples/sheets/table-test.xlsx +0 -0
  42. data/examples/sheets/~$array-formulas.xlsx +0 -0
  43. data/examples/unzipped-sheets/array-formulas/[Content_Types].xml +2 -0
  44. data/examples/unzipped-sheets/array-formulas/docProps/app.xml +2 -0
  45. data/examples/unzipped-sheets/array-formulas/docProps/core.xml +2 -0
  46. data/examples/unzipped-sheets/array-formulas/docProps/thumbnail.jpeg +0 -0
  47. data/examples/unzipped-sheets/array-formulas/xl/_rels/workbook.xml.rels +2 -0
  48. data/examples/unzipped-sheets/array-formulas/xl/calcChain.xml +2 -0
  49. data/examples/unzipped-sheets/array-formulas/xl/sharedStrings.xml +2 -0
  50. data/examples/unzipped-sheets/array-formulas/xl/styles.xml +2 -0
  51. data/examples/unzipped-sheets/array-formulas/xl/theme/theme1.xml +2 -0
  52. data/examples/unzipped-sheets/array-formulas/xl/workbook.xml +2 -0
  53. data/examples/unzipped-sheets/array-formulas/xl/worksheets/sheet1.xml +2 -0
  54. data/examples/unzipped-sheets/array-formulas/xl/worksheets/sheet2.xml +2 -0
  55. data/examples/unzipped-sheets/complex-test/[Content_Types].xml +2 -0
  56. data/examples/unzipped-sheets/complex-test/docProps/app.xml +2 -0
  57. data/examples/unzipped-sheets/complex-test/docProps/core.xml +2 -0
  58. data/examples/unzipped-sheets/complex-test/xl/_rels/workbook.xml.rels +2 -0
  59. data/examples/unzipped-sheets/complex-test/xl/calcChain.xml +2 -0
  60. data/examples/unzipped-sheets/complex-test/xl/charts/chart1.xml +2 -0
  61. data/examples/unzipped-sheets/complex-test/xl/charts/chart2.xml +2 -0
  62. data/examples/unzipped-sheets/complex-test/xl/comments1.xml +5 -0
  63. data/examples/unzipped-sheets/complex-test/xl/comments2.xml +5 -0
  64. data/examples/unzipped-sheets/complex-test/xl/drawings/_rels/drawing1.xml.rels +2 -0
  65. data/examples/unzipped-sheets/complex-test/xl/drawings/_rels/drawing2.xml.rels +2 -0
  66. data/examples/unzipped-sheets/complex-test/xl/drawings/drawing1.xml +2 -0
  67. data/examples/unzipped-sheets/complex-test/xl/drawings/drawing2.xml +2 -0
  68. data/examples/unzipped-sheets/complex-test/xl/drawings/vmlDrawing1.vml +46 -0
  69. data/examples/unzipped-sheets/complex-test/xl/drawings/vmlDrawing2.vml +46 -0
  70. data/examples/unzipped-sheets/complex-test/xl/sharedStrings.xml +2 -0
  71. data/examples/unzipped-sheets/complex-test/xl/styles.xml +2 -0
  72. data/examples/unzipped-sheets/complex-test/xl/theme/theme1.xml +2 -0
  73. data/examples/unzipped-sheets/complex-test/xl/workbook.xml +2 -0
  74. data/examples/unzipped-sheets/complex-test/xl/worksheets/_rels/sheet1.xml.rels +2 -0
  75. data/examples/unzipped-sheets/complex-test/xl/worksheets/_rels/sheet2.xml.rels +2 -0
  76. data/examples/unzipped-sheets/complex-test/xl/worksheets/sheet1.xml +2 -0
  77. data/examples/unzipped-sheets/complex-test/xl/worksheets/sheet2.xml +2 -0
  78. data/examples/unzipped-sheets/namedReferenceTest/[Content_Types].xml +2 -0
  79. data/examples/unzipped-sheets/namedReferenceTest/docProps/app.xml +2 -0
  80. data/examples/unzipped-sheets/namedReferenceTest/docProps/core.xml +2 -0
  81. data/examples/unzipped-sheets/namedReferenceTest/docProps/thumbnail.jpeg +0 -0
  82. data/examples/unzipped-sheets/namedReferenceTest/xl/_rels/workbook.xml.rels +2 -0
  83. data/examples/unzipped-sheets/namedReferenceTest/xl/calcChain.xml +2 -0
  84. data/examples/unzipped-sheets/namedReferenceTest/xl/styles.xml +2 -0
  85. data/examples/unzipped-sheets/namedReferenceTest/xl/theme/theme1.xml +2 -0
  86. data/examples/unzipped-sheets/namedReferenceTest/xl/workbook.xml +2 -0
  87. data/examples/unzipped-sheets/namedReferenceTest/xl/worksheets/sheet1.xml +2 -0
  88. data/examples/unzipped-sheets/namedReferenceTest/xl/worksheets/sheet2.xml +2 -0
  89. data/examples/unzipped-sheets/pruning/[Content_Types].xml +2 -0
  90. data/examples/unzipped-sheets/pruning/docProps/app.xml +2 -0
  91. data/examples/unzipped-sheets/pruning/docProps/core.xml +2 -0
  92. data/examples/unzipped-sheets/pruning/docProps/thumbnail.jpeg +0 -0
  93. data/examples/unzipped-sheets/pruning/xl/_rels/workbook.xml.rels +2 -0
  94. data/examples/unzipped-sheets/pruning/xl/calcChain.xml +2 -0
  95. data/examples/unzipped-sheets/pruning/xl/sharedStrings.xml +2 -0
  96. data/examples/unzipped-sheets/pruning/xl/styles.xml +2 -0
  97. data/examples/unzipped-sheets/pruning/xl/theme/theme1.xml +2 -0
  98. data/examples/unzipped-sheets/pruning/xl/workbook.xml +2 -0
  99. data/examples/unzipped-sheets/pruning/xl/worksheets/sheet1.xml +2 -0
  100. data/examples/unzipped-sheets/pruning/xl/worksheets/sheet2.xml +2 -0
  101. data/examples/unzipped-sheets/pruning/xl/worksheets/sheet3.xml +2 -0
  102. data/examples/unzipped-sheets/sharedFormulaTest/[Content_Types].xml +2 -0
  103. data/examples/unzipped-sheets/sharedFormulaTest/docProps/app.xml +2 -0
  104. data/examples/unzipped-sheets/sharedFormulaTest/docProps/core.xml +2 -0
  105. data/examples/unzipped-sheets/sharedFormulaTest/docProps/thumbnail.jpeg +0 -0
  106. data/examples/unzipped-sheets/sharedFormulaTest/xl/_rels/workbook.xml.rels +2 -0
  107. data/examples/unzipped-sheets/sharedFormulaTest/xl/calcChain.xml +2 -0
  108. data/examples/unzipped-sheets/sharedFormulaTest/xl/styles.xml +2 -0
  109. data/examples/unzipped-sheets/sharedFormulaTest/xl/theme/theme1.xml +2 -0
  110. data/examples/unzipped-sheets/sharedFormulaTest/xl/workbook.xml +2 -0
  111. data/examples/unzipped-sheets/sharedFormulaTest/xl/worksheets/sheet1.xml +2 -0
  112. data/examples/unzipped-sheets/table-test/[Content_Types].xml +2 -0
  113. data/examples/unzipped-sheets/table-test/docProps/app.xml +2 -0
  114. data/examples/unzipped-sheets/table-test/docProps/core.xml +2 -0
  115. data/examples/unzipped-sheets/table-test/xl/_rels/workbook.xml.rels +2 -0
  116. data/examples/unzipped-sheets/table-test/xl/calcChain.xml +2 -0
  117. data/examples/unzipped-sheets/table-test/xl/printerSettings/printerSettings1.bin +0 -0
  118. data/examples/unzipped-sheets/table-test/xl/sharedStrings.xml +2 -0
  119. data/examples/unzipped-sheets/table-test/xl/styles.xml +2 -0
  120. data/examples/unzipped-sheets/table-test/xl/tables/table1.xml +2 -0
  121. data/examples/unzipped-sheets/table-test/xl/theme/theme1.xml +2 -0
  122. data/examples/unzipped-sheets/table-test/xl/workbook.xml +2 -0
  123. data/examples/unzipped-sheets/table-test/xl/worksheets/_rels/sheet1.xml.rels +2 -0
  124. data/examples/unzipped-sheets/table-test/xl/worksheets/sheet1.xml +2 -0
  125. data/examples/unzipped-sheets/table-test/xl/worksheets/sheet2.xml +2 -0
  126. data/examples/unzipped-sheets/table-test/xl/worksheets/sheet3.xml +2 -0
  127. data/lib/cells/array/array_formula_builder.rb +58 -0
  128. data/lib/cells/array/array_formula_cell.rb +27 -0
  129. data/lib/cells/array/arraying_formula_cell.rb +67 -0
  130. data/lib/cells/array/single_cell_array_formula_builder.rb +9 -0
  131. data/lib/cells/array/single_cell_array_formula_cell.rb +11 -0
  132. data/lib/cells/cell.rb +98 -0
  133. data/lib/cells/cells.rb +9 -0
  134. data/lib/cells/formula/formula_cell.rb +18 -0
  135. data/lib/cells/formula/simple_formula_cell.rb +4 -0
  136. data/lib/cells/shared/shared_formula_builder.rb +15 -0
  137. data/lib/cells/shared/shared_formula_cell.rb +20 -0
  138. data/lib/cells/shared/sharing_formula_cell.rb +36 -0
  139. data/lib/cells/value/value_cell.rb +24 -0
  140. data/lib/excelfile/excelfile.rb +6 -0
  141. data/lib/excelfile/relationships.rb +24 -0
  142. data/lib/excelfile/shared_strings.rb +21 -0
  143. data/lib/excelfile/sheet_names.rb +6 -0
  144. data/lib/excelfile/table.rb +116 -0
  145. data/lib/excelfile/workbook.rb +108 -0
  146. data/lib/excelfile/worksheet.rb +122 -0
  147. data/lib/formulae/compile/formula_builder.rb +316 -0
  148. data/lib/formulae/formulae.rb +6 -0
  149. data/lib/formulae/parse/formula_peg.rb +213 -0
  150. data/lib/formulae/parse/formula_peg.txt +40 -0
  151. data/lib/formulae/run/excel_functions.rb +375 -0
  152. data/lib/formulae/run/excel_matrix.rb +114 -0
  153. data/lib/formulae/run/excel_range.rb +256 -0
  154. data/lib/formulae/run/reference.rb +79 -0
  155. data/lib/optimiser/dependency_builder.rb +86 -0
  156. data/lib/optimiser/optimiser.rb +3 -0
  157. data/lib/optimiser/shared_formula_dependency_builder.rb +43 -0
  158. data/lib/optimiser/workbook_pruner.rb +80 -0
  159. data/lib/rubyfromexcel.rb +105 -0
  160. data/lib/runtime/runtime_formula_builder.rb +32 -0
  161. data/spec/array_formula_builder_spec.rb +35 -0
  162. data/spec/array_formula_cell_spec.rb +17 -0
  163. data/spec/arraying_formula_cell_spec.rb +38 -0
  164. data/spec/dependency_builder_spec.rb +71 -0
  165. data/spec/excel_functions_spec.rb +381 -0
  166. data/spec/excel_matrix_spec.rb +92 -0
  167. data/spec/excel_range_spec.rb +161 -0
  168. data/spec/formula_builder_spec.rb +230 -0
  169. data/spec/formula_peg_spec.rb +165 -0
  170. data/spec/reference_spec.rb +72 -0
  171. data/spec/relationships_spec.rb +51 -0
  172. data/spec/runtime_formula_builder_spec.rb +55 -0
  173. data/spec/shared_formula_builder_spec.rb +29 -0
  174. data/spec/shared_formula_cell_spec.rb +23 -0
  175. data/spec/shared_formula_dependency_builder_spec.rb +48 -0
  176. data/spec/shared_strings_spec.rb +14 -0
  177. data/spec/sharing_formula_cell_spec.rb +79 -0
  178. data/spec/simple_formula_cell_spec.rb +78 -0
  179. data/spec/single_cell_array_formula_builder_spec.rb +19 -0
  180. data/spec/single_cell_array_formula_cell_spec.rb +25 -0
  181. data/spec/spec_helper.rb +2 -0
  182. data/spec/table_spec.rb +100 -0
  183. data/spec/value_cell_spec.rb +49 -0
  184. data/spec/workbook_pruner_spec.rb +27 -0
  185. data/spec/workbook_spec.rb +283 -0
  186. data/spec/worksheet_failiures_spec.rb +41 -0
  187. data/spec/worksheet_spec.rb +486 -0
  188. metadata +291 -0
@@ -0,0 +1,486 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe Worksheet do
4
+
5
+ simple_worksheet_xml =<<END
6
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
7
+ <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="urn:schemas-microsoft-com:mac:vml" mc:Ignorable="mv" mc:PreserveAttributes="mv:*"><dimension ref="A1:A2"/><sheetViews><sheetView view="pageLayout" workbookViewId="0"/></sheetViews><sheetFormatPr baseColWidth="10" defaultRowHeight="13"/><sheetData><row r="1" spans="1:1"><c r="A1" t="str"><f>IF(A2="Hello","hello",Sheet2!B4)</f><v>hello</v></c></row><row r="2" spans="1:1"><c r="A2" t="s"><v>24</v></c></row></sheetData><sheetCalcPr fullCalcOnLoad="1"/><phoneticPr fontId="2" type="noConversion"/><pageMargins left="0.75" right="0.75" top="1" bottom="1" header="0.5" footer="0.5"/><pageSetup paperSize="10" orientation="portrait" horizontalDpi="4294967292" verticalDpi="4294967292"/><extLst><ext xmlns:mx="http://schemas.microsoft.com/office/mac/excel/2008/main" uri="http://schemas.microsoft.com/office/mac/excel/2008/main"><mx:PLV Mode="1" OnePage="0" WScale="0"/></ext></extLst></worksheet>
8
+ END
9
+
10
+ simple_worksheet_ruby =<<END
11
+ # coding: utf-8
12
+ #
13
+ class Sheet1 < Spreadsheet
14
+ def a1; @a1 ||= excel_if(a2=="Hello","hello",sheet2.b4); end
15
+ def a2; "A shared string"; end
16
+ end
17
+
18
+ END
19
+
20
+ simple_worksheet_test =<<END
21
+ # coding: utf-8
22
+ require_relative '../spreadsheet'
23
+ #
24
+ describe 'Sheet1' do
25
+ def sheet1; $spreadsheet ||= Spreadsheet.new; $spreadsheet.sheet1; end
26
+
27
+ it 'cell a1 should equal "hello"' do
28
+ sheet1.a1.should == "hello"
29
+ end
30
+
31
+ end
32
+
33
+ END
34
+
35
+ it 'should create a ruby file from xml, complete with properly interpreted cells' do
36
+ SheetNames.instance['Sheet2'] = 'sheet2'
37
+ SharedStrings.instance[24] = 'A shared string'
38
+ worksheet = Worksheet.new(Nokogiri::XML(simple_worksheet_xml))
39
+ worksheet.workbook = mock(:workbook,:indirects_used => true)
40
+ worksheet.name = 'sheet1'
41
+ worksheet.to_ruby.should == simple_worksheet_ruby
42
+ worksheet.to_test.should == simple_worksheet_test
43
+ end
44
+
45
+ named_reference_simple_worksheet_ruby =<<END
46
+ # coding: utf-8
47
+ #
48
+ class Sheet1 < Spreadsheet
49
+ def a1; @a1 ||= excel_if(a2=="Hello","hello",sheet2.b4); end
50
+ def a2; "A shared string"; end
51
+ def reference_one; sheet2.a1; end
52
+ end
53
+
54
+ END
55
+
56
+ it 'should add any named references that apply just to this sheet' do
57
+ SheetNames.instance['Sheet2'] = 'sheet2'
58
+ SharedStrings.instance[24] = 'A shared string'
59
+ worksheet = Worksheet.new(Nokogiri::XML(simple_worksheet_xml))
60
+ worksheet.workbook = mock(:workbook,:indirects_used => true)
61
+ worksheet.named_references['reference_one'] = 'sheet2.a1'
62
+ worksheet.name = 'sheet1'
63
+ worksheet.to_ruby.should == named_reference_simple_worksheet_ruby
64
+ end
65
+
66
+ shared_formula_worksheet_xml =<<END
67
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
68
+ <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="urn:schemas-microsoft-com:mac:vml" mc:Ignorable="mv" mc:PreserveAttributes="mv:*"><dimension ref="A1:A10"/><sheetViews><sheetView tabSelected="1" view="pageLayout" workbookViewId="0"><selection activeCell="B5" sqref="B5"/></sheetView></sheetViews><sheetFormatPr baseColWidth="10" defaultRowHeight="13"/><sheetData><row r="1" spans="1:1"><c r="A1"><v>1</v></c></row><row r="2" spans="1:1"><c r="A2"><f>A1*2</f><v>2</v></c></row><row r="3" spans="1:1"><c r="A3"><f t="shared" ref="A3:A9" si="0">A2*2</f><v>4</v></c></row><row r="4" spans="1:1"><c r="A4"><f t="shared" si="0"/><v>8</v></c></row><row r="5" spans="1:1"><c r="A5"><f t="shared" si="0"/><v>16</v></c></row><row r="6" spans="1:1"><c r="A6"><f t="shared" si="0"/><v>32</v></c></row><row r="7" spans="1:1"><c r="A7"><f t="shared" si="0"/><v>64</v></c></row><row r="8" spans="1:1"><c r="A8"><f t="shared" si="0"/><v>128</v></c></row><row r="9" spans="1:1"><c r="A9"><f t="shared" si="0"/><v>256</v></c></row><row r="10" spans="1:1"><c r="A10"><f>A9*2</f><v>512</v></c></row></sheetData><phoneticPr fontId="1" type="noConversion"/><pageMargins left="0.75" right="0.75" top="1" bottom="1" header="0.5" footer="0.5"/><pageSetup paperSize="10" orientation="portrait" horizontalDpi="4294967292" verticalDpi="4294967292"/><extLst><ext xmlns:mx="http://schemas.microsoft.com/office/mac/excel/2008/main" uri="http://schemas.microsoft.com/office/mac/excel/2008/main"><mx:PLV Mode="1" OnePage="0" WScale="0"/></ext></extLst></worksheet>
69
+ END
70
+ shared_formula_worksheet_ruby =<<END
71
+ # coding: utf-8
72
+ #
73
+ class Sheet1 < Spreadsheet
74
+ def a1; 1.0; end
75
+ def a2; @a2 ||= a1*2.0; end
76
+ def a3; @a3 ||= a2*2.0; end
77
+ def a4; @a4 ||= a3*2.0; end
78
+ def a5; @a5 ||= a4*2.0; end
79
+ def a6; @a6 ||= a5*2.0; end
80
+ def a7; @a7 ||= a6*2.0; end
81
+ def a8; @a8 ||= a7*2.0; end
82
+ def a9; @a9 ||= a8*2.0; end
83
+ def a10; @a10 ||= a9*2.0; end
84
+ end
85
+
86
+ END
87
+
88
+ shared_formula_worksheet_test =<<END
89
+ # coding: utf-8
90
+ require_relative '../spreadsheet'
91
+ #
92
+ describe 'Sheet1' do
93
+ def sheet1; $spreadsheet ||= Spreadsheet.new; $spreadsheet.sheet1; end
94
+
95
+ it 'cell a2 should equal 2.0' do
96
+ sheet1.a2.should be_close(2.0,0.2)
97
+ end
98
+
99
+ it 'cell a3 should equal 4.0' do
100
+ sheet1.a3.should be_close(4.0,0.4)
101
+ end
102
+
103
+ it 'cell a4 should equal 8.0' do
104
+ sheet1.a4.should be_close(8.0,0.8)
105
+ end
106
+
107
+ it 'cell a5 should equal 16.0' do
108
+ sheet1.a5.should be_close(16.0,1.6)
109
+ end
110
+
111
+ it 'cell a6 should equal 32.0' do
112
+ sheet1.a6.should be_close(32.0,3.2)
113
+ end
114
+
115
+ it 'cell a7 should equal 64.0' do
116
+ sheet1.a7.should be_close(64.0,6.4)
117
+ end
118
+
119
+ it 'cell a8 should equal 128.0' do
120
+ sheet1.a8.should be_close(128.0,12.8)
121
+ end
122
+
123
+ it 'cell a9 should equal 256.0' do
124
+ sheet1.a9.should be_close(256.0,25.6)
125
+ end
126
+
127
+ it 'cell a10 should equal 512.0' do
128
+ sheet1.a10.should be_close(512.0,51.2)
129
+ end
130
+
131
+ end
132
+
133
+ END
134
+
135
+ it 'should create a ruby file from xml, dealing correctly with shared formulas' do
136
+ worksheet = Worksheet.new(Nokogiri::XML(shared_formula_worksheet_xml))
137
+ worksheet.name = 'sheet1'
138
+ worksheet.workbook = mock(:workbook,:indirects_used => true)
139
+ worksheet.to_ruby.should == shared_formula_worksheet_ruby
140
+ worksheet.to_test.should == shared_formula_worksheet_test
141
+ end
142
+
143
+ array_formula_worksheet_xml =<<END
144
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
145
+ <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="urn:schemas-microsoft-com:mac:vml" mc:Ignorable="mv" mc:PreserveAttributes="mv:*"><dimension ref="A1:B5"/><sheetViews><sheetView tabSelected="1" view="pageLayout" workbookViewId="0"><selection activeCell="B6" sqref="B6"/></sheetView></sheetViews><sheetFormatPr baseColWidth="10" defaultRowHeight="13"/><sheetData><row r="1" spans="1:2"><c r="A1"><v>1</v></c><c r="B1"><f t="array" ref="B1:B5">A1:A5</f><v>1</v></c></row><row r="2" spans="1:2"><c r="A2"><v>2</v></c><c r="B2"><v>2</v></c></row><row r="3" spans="1:2"><c r="A3"><v>3</v></c><c r="B3"><v>3</v></c></row><row r="4" spans="1:2"><c r="A4"><v>4</v></c><c r="B4"><v>4</v></c></row><row r="5" spans="1:2"><c r="A5"><v>5</v></c><c r="B5"><v>5</v></c></row></sheetData><phoneticPr fontId="1" type="noConversion"/><pageMargins left="0.75" right="0.75" top="1" bottom="1" header="0.5" footer="0.5"/><pageSetup paperSize="10" orientation="portrait" horizontalDpi="4294967292" verticalDpi="4294967292"/><extLst><ext xmlns:mx="http://schemas.microsoft.com/office/mac/excel/2008/main" uri="http://schemas.microsoft.com/office/mac/excel/2008/main"><mx:PLV Mode="1" OnePage="0" WScale="0"/></ext></extLst></worksheet>
146
+ END
147
+
148
+ array_formula_worksheet_ruby =<<END
149
+ # coding: utf-8
150
+ #
151
+ class Sheet1 < Spreadsheet
152
+ def a1; 1.0; end
153
+ def b1_array; @b1_array ||= a('a1','a5'); end
154
+ def b1; @b1 ||= b1_array.array_formula_offset(0,0); end
155
+ def a2; 2.0; end
156
+ def b2; @b2 ||= b1_array.array_formula_offset(1,0); end
157
+ def a3; 3.0; end
158
+ def b3; @b3 ||= b1_array.array_formula_offset(2,0); end
159
+ def a4; 4.0; end
160
+ def b4; @b4 ||= b1_array.array_formula_offset(3,0); end
161
+ def a5; 5.0; end
162
+ def b5; @b5 ||= b1_array.array_formula_offset(4,0); end
163
+ end
164
+
165
+ END
166
+
167
+ array_formula_worksheet_test =<<END
168
+ # coding: utf-8
169
+ require_relative '../spreadsheet'
170
+ #
171
+ describe 'Sheet1' do
172
+ def sheet1; $spreadsheet ||= Spreadsheet.new; $spreadsheet.sheet1; end
173
+
174
+ it 'cell b1 should equal 1.0' do
175
+ sheet1.b1.should be_close(1.0,0.1)
176
+ end
177
+
178
+ it 'cell b2 should equal 2.0' do
179
+ sheet1.b2.should be_close(2.0,0.2)
180
+ end
181
+
182
+ it 'cell b3 should equal 3.0' do
183
+ sheet1.b3.should be_close(3.0,0.3)
184
+ end
185
+
186
+ it 'cell b4 should equal 4.0' do
187
+ sheet1.b4.should be_close(4.0,0.4)
188
+ end
189
+
190
+ it 'cell b5 should equal 5.0' do
191
+ sheet1.b5.should be_close(5.0,0.5)
192
+ end
193
+
194
+ end
195
+
196
+ END
197
+
198
+ it 'should create a ruby file from xml, dealing correctly with array formulas' do
199
+ worksheet = Worksheet.new(Nokogiri::XML(array_formula_worksheet_xml))
200
+ worksheet.name = 'sheet1'
201
+ worksheet.workbook = mock(:workbook,:indirects_used => true)
202
+ worksheet.to_ruby.should == array_formula_worksheet_ruby
203
+ worksheet.to_test.should == array_formula_worksheet_test
204
+ end
205
+
206
+ table_xml =<<-END
207
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
208
+ <table xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" id="1" name="FirstTable" displayName="FirstTable" ref="B3:D7" totalsRowCount="1">
209
+ <autoFilter ref="B3:D6"/>
210
+ <tableColumns count="3">
211
+ <tableColumn id="1" name="ColA" totalsRowLabel="Total"/>
212
+ <tableColumn id="2" name="ColB" totalsRowFunction="custom" dataDxfId="1">
213
+ <calculatedColumnFormula>FirstTable[[#This Row],[ColA]]+FirstTable[[#This Row],[ColC]]</calculatedColumnFormula>
214
+ <totalsRowFormula>AVERAGE(FirstTable[ColB])</totalsRowFormula>
215
+ </tableColumn>
216
+ <tableColumn id="3" name="ColC" totalsRowFunction="count" dataDxfId="0">
217
+ <calculatedColumnFormula>3*FirstTable[[#This Row],[ColA]]</calculatedColumnFormula>
218
+ </tableColumn>
219
+ </tableColumns>
220
+ <tableStyleInfo name="TableStyleLight16" showFirstColumn="1" showLastColumn="1" showRowStripes="1" showColumnStripes="1"/>
221
+ </table>
222
+ END
223
+
224
+ table_worksheet_xml =<<END
225
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
226
+ <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" mc:Ignorable="x14ac">
227
+ <dimension ref="B3:H10"/>
228
+ <sheetViews>
229
+ <sheetView tabSelected="1" workbookViewId="0">
230
+ <selection activeCell="H4" sqref="H4"/>
231
+ </sheetView>
232
+ </sheetViews>
233
+ <sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25"/>
234
+ <sheetData>
235
+ <row r="3" spans="2:8" x14ac:dyDescent="0.25">
236
+ <c r="B3" t="s">
237
+ <v>0</v>
238
+ </c>
239
+ <c r="C3" t="s">
240
+ <v>1</v>
241
+ </c>
242
+ <c r="D3" t="s">
243
+ <v>2</v>
244
+ </c>
245
+ <c r="F3" t="str">
246
+ <f>FirstTable[[#Headers],[ColB]]</f>
247
+ <v>ColB</v>
248
+ </c>
249
+ <c r="H3">
250
+ <f>+MATCH("ColC",FirstTable[#Headers])</f>
251
+ <v>3</v>
252
+ </c>
253
+ </row>
254
+ <row r="4" spans="2:8" x14ac:dyDescent="0.25">
255
+ <c r="B4">
256
+ <v>1</v>
257
+ </c>
258
+ <c r="C4">
259
+ <f>FirstTable[[#This Row],[ColA]]+FirstTable[[#This Row],[ColC]]</f>
260
+ <v>4</v>
261
+ </c>
262
+ <c r="D4">
263
+ <f>3*FirstTable[[#This Row],[ColA]]</f>
264
+ <v>3</v>
265
+ </c>
266
+ <c r="F4">
267
+ <f>SUM(FirstTable[#This Row])</f>
268
+ <v>8</v>
269
+ </c>
270
+ <c r="H4">
271
+ <f>MATCH(8,FirstTable[[#All],[ColB]])</f>
272
+ <v>3</v>
273
+ </c>
274
+ </row>
275
+ <row r="5" spans="2:8" x14ac:dyDescent="0.25">
276
+ <c r="B5">
277
+ <v>2</v>
278
+ </c>
279
+ <c r="C5">
280
+ <f>FirstTable[[#This Row],[ColA]]+FirstTable[[#This Row],[ColC]]</f>
281
+ <v>8</v>
282
+ </c>
283
+ <c r="D5">
284
+ <f>3*FirstTable[[#This Row],[ColA]]</f>
285
+ <v>6</v>
286
+ </c>
287
+ <c r="F5">
288
+ <f>FirstTable[[#This Row],[ColB]]</f>
289
+ <v>8</v>
290
+ </c>
291
+ </row>
292
+ <row r="6" spans="2:8" x14ac:dyDescent="0.25">
293
+ <c r="B6">
294
+ <v>3</v>
295
+ </c>
296
+ <c r="C6">
297
+ <f>FirstTable[[#This Row],[ColA]]+FirstTable[[#This Row],[ColC]]</f>
298
+ <v>12</v>
299
+ </c>
300
+ <c r="D6">
301
+ <f>3*FirstTable[[#This Row],[ColA]]</f>
302
+ <v>9</v>
303
+ </c>
304
+ </row>
305
+ <row r="7" spans="2:8" x14ac:dyDescent="0.25">
306
+ <c r="B7" t="s">
307
+ <v>3</v>
308
+ </c>
309
+ <c r="C7">
310
+ <f>AVERAGE(FirstTable[ColB])</f>
311
+ <v>8</v>
312
+ </c>
313
+ <c r="D7">
314
+ <f>SUBTOTAL(103,FirstTable[ColC])</f>
315
+ <v>3</v>
316
+ </c>
317
+ </row>
318
+ <row r="10" spans="2:8" x14ac:dyDescent="0.25">
319
+ <c r="B10">
320
+ <f>SUM(FirstTable[ColA])</f>
321
+ <v>6</v>
322
+ </c>
323
+ <c r="C10">
324
+ <f>FirstTable[[#Totals],[ColB]]</f>
325
+ <v>8</v>
326
+ </c>
327
+ <c r="D10">
328
+ <f>FirstTable[[#Totals],[ColC]]</f>
329
+ <v>3</v>
330
+ </c>
331
+ </row>
332
+ </sheetData>
333
+ <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
334
+ <tableParts count="1">
335
+ <tablePart r:id="rId1"/>
336
+ </tableParts>
337
+ </worksheet>
338
+ END
339
+
340
+ table_worksheet_shared_strings =<<END
341
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
342
+ <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="4" uniqueCount="4"><si><t>ColA</t></si><si><t>ColB</t></si><si><t>ColC</t></si><si><t>Total</t></si></sst>
343
+ END
344
+
345
+ table_worksheet_ruby =<<END
346
+ # coding: utf-8
347
+ #
348
+ class Sheet1 < Spreadsheet
349
+ def b3; "ColA"; end
350
+ def c3; "ColB"; end
351
+ def d3; "ColC"; end
352
+ def f3; @f3 ||= sheet1.c3; end
353
+ def h3; @h3 ||= +3.0; end
354
+ def b4; 1.0; end
355
+ def c4; @c4 ||= sheet1.b4+sheet1.d4; end
356
+ def d4; @d4 ||= 3.0*sheet1.b4; end
357
+ def f4; @f4 ||= sum(sheet1.a('b4','d4')); end
358
+ def h4; @h4 ||= match(8.0,sheet1.a('c3','c7')); end
359
+ def b5; 2.0; end
360
+ def c5; @c5 ||= sheet1.b5+sheet1.d5; end
361
+ def d5; @d5 ||= 3.0*sheet1.b5; end
362
+ def f5; @f5 ||= sheet1.c5; end
363
+ def b6; 3.0; end
364
+ def c6; @c6 ||= sheet1.b6+sheet1.d6; end
365
+ def d6; @d6 ||= 3.0*sheet1.b6; end
366
+ def b7; "Total"; end
367
+ def c7; @c7 ||= average(sheet1.a('c4','c6')); end
368
+ def d7; @d7 ||= subtotal(103.0,sheet1.a('d4','d6')); end
369
+ def b10; @b10 ||= sum(sheet1.a('b4','b6')); end
370
+ def c10; @c10 ||= sheet1.c7; end
371
+ def d10; @d10 ||= sheet1.d7; end
372
+ end
373
+
374
+ END
375
+
376
+ table_worksheet_test =<<END
377
+ # coding: utf-8
378
+ require_relative '../spreadsheet'
379
+ #
380
+ describe 'Sheet1' do
381
+ def sheet1; $spreadsheet ||= Spreadsheet.new; $spreadsheet.sheet1; end
382
+
383
+ it 'cell f3 should equal "ColB"' do
384
+ sheet1.f3.should == "ColB"
385
+ end
386
+
387
+ it 'cell h3 should equal 3.0' do
388
+ sheet1.h3.should be_close(3.0,0.3)
389
+ end
390
+
391
+ it 'cell c4 should equal 4.0' do
392
+ sheet1.c4.should be_close(4.0,0.4)
393
+ end
394
+
395
+ it 'cell d4 should equal 3.0' do
396
+ sheet1.d4.should be_close(3.0,0.3)
397
+ end
398
+
399
+ it 'cell f4 should equal 8.0' do
400
+ sheet1.f4.should be_close(8.0,0.8)
401
+ end
402
+
403
+ it 'cell h4 should equal 3.0' do
404
+ sheet1.h4.should be_close(3.0,0.3)
405
+ end
406
+
407
+ it 'cell c5 should equal 8.0' do
408
+ sheet1.c5.should be_close(8.0,0.8)
409
+ end
410
+
411
+ it 'cell d5 should equal 6.0' do
412
+ sheet1.d5.should be_close(6.0,0.6)
413
+ end
414
+
415
+ it 'cell f5 should equal 8.0' do
416
+ sheet1.f5.should be_close(8.0,0.8)
417
+ end
418
+
419
+ it 'cell c6 should equal 12.0' do
420
+ sheet1.c6.should be_close(12.0,1.2)
421
+ end
422
+
423
+ it 'cell d6 should equal 9.0' do
424
+ sheet1.d6.should be_close(9.0,0.9)
425
+ end
426
+
427
+ it 'cell c7 should equal 8.0' do
428
+ sheet1.c7.should be_close(8.0,0.8)
429
+ end
430
+
431
+ it 'cell d7 should equal 3.0' do
432
+ sheet1.d7.should be_close(3.0,0.3)
433
+ end
434
+
435
+ it 'cell b10 should equal 6.0' do
436
+ sheet1.b10.should be_close(6.0,0.6)
437
+ end
438
+
439
+ it 'cell c10 should equal 8.0' do
440
+ sheet1.c10.should be_close(8.0,0.8)
441
+ end
442
+
443
+ it 'cell d10 should equal 3.0' do
444
+ sheet1.d10.should be_close(3.0,0.3)
445
+ end
446
+
447
+ end
448
+
449
+ END
450
+
451
+ it 'should create a ruby file from xml, dealing correctly with tables' do
452
+ worksheet = Worksheet.new(Nokogiri::XML(table_worksheet_xml))
453
+ Table.from_xml(worksheet,Nokogiri::XML(table_xml).root)
454
+ worksheet.workbook = mock(:workbook,:indirects_used => true, :worksheets => { 'sheet1' => worksheet})
455
+ SharedStrings.instance.clear
456
+ SharedStrings.instance.load_strings_from_xml(Nokogiri::XML(table_worksheet_shared_strings))
457
+ worksheet.name = 'sheet1'
458
+ worksheet.to_ruby.should == table_worksheet_ruby
459
+ worksheet.to_test.should == table_worksheet_test
460
+ end
461
+
462
+ table_worksheet_relationships =<<END
463
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
464
+ <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
465
+ <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/table" Target="../tables/table1.xml"/>
466
+ </Relationships>
467
+ END
468
+
469
+ it 'should have a Worksheet#from_file method that also loads the tables' do
470
+ { '/usr/local/excel/xl/worksheets/sheet1.xml' => table_worksheet_xml,
471
+ '/usr/local/excel/xl/worksheets/_rels/sheet1.xml.rels' => table_worksheet_relationships,
472
+ '/usr/local/excel/xl/tables/table1.xml' => table_xml
473
+ }.each do |filename,xml|
474
+ File.should_receive(:open).with(filename).and_yield(StringIO.new(xml))
475
+ end
476
+ File.should_receive(:exist?).with('/usr/local/excel/xl/worksheets/_rels/sheet1.xml.rels').and_return(true)
477
+
478
+ Table.tables.clear
479
+ worksheet = Worksheet.from_file('/usr/local/excel/xl/worksheets/sheet1.xml')
480
+ SharedStrings.instance.clear
481
+ SharedStrings.instance.load_strings_from_xml(Nokogiri::XML(table_worksheet_shared_strings))
482
+ worksheet.workbook = mock(:workbook,:indirects_used => true, :worksheets => { 'sheet1' => worksheet})
483
+ worksheet.name = 'sheet1'
484
+ worksheet.to_ruby.should == table_worksheet_ruby
485
+ end
486
+ end