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,2 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink><a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Arial"/><a:font script="Hebr" typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><fileVersion appName="xl" lastEdited="4" lowestEdited="4" rupBuild="4505"/><workbookPr defaultThemeVersion="124226"/><bookViews><workbookView xWindow="120" yWindow="45" windowWidth="14175" windowHeight="5325"/></bookViews><sheets><sheet name="Sheet1" sheetId="1" r:id="rId1"/><sheet name="Sheet2" sheetId="2" r:id="rId2"/><sheet name="Sheet3" sheetId="3" r:id="rId3"/></sheets><calcPr calcId="125725"/></workbook>
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/table" Target="../tables/table1.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings" Target="../printerSettings/printerSettings1.bin"/></Relationships>
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><dimension ref="B2:D5"/><sheetViews><sheetView tabSelected="1" workbookViewId="0"><selection activeCell="B15" sqref="B15"/></sheetView></sheetViews><sheetFormatPr defaultRowHeight="12.75"/><cols><col min="2" max="2" width="11.28515625" customWidth="1"/><col min="3" max="3" width="11.85546875" customWidth="1"/><col min="4" max="4" width="11.28515625" customWidth="1"/></cols><sheetData><row r="2" spans="2:4"><c r="B2" t="s"><v>0</v></c><c r="C2" t="s"><v>1</v></c><c r="D2" t="s"><v>2</v></c></row><row r="3" spans="2:4"><c r="B3"><v>1</v></c><c r="C3"><v>2</v></c><c r="D3" s="1"><f>[Column A]+[[Column B ]]</f><v>3</v></c></row><row r="4" spans="2:4"><c r="B4"><v>3</v></c><c r="C4"><v>4</v></c><c r="D4" s="1"><f>[Column A]+[[Column B ]]</f><v>7</v></c></row><row r="5" spans="2:4"><c r="B5"><v>5</v></c><c r="C5"><v>6</v></c><c r="D5" s="1"><f>[Column A]+[[Column B ]]</f><v>11</v></c></row></sheetData><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/><pageSetup paperSize="9" orientation="portrait" r:id="rId1"/><tableParts count="1"><tablePart r:id="rId2"/></tableParts></worksheet>
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><dimension ref="A1"/><sheetViews><sheetView workbookViewId="0"><selection activeCell="B5" sqref="B5"/></sheetView></sheetViews><sheetFormatPr defaultRowHeight="12.75"/><sheetData/><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/></worksheet>
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><dimension ref="A1"/><sheetViews><sheetView workbookViewId="0"/></sheetViews><sheetFormatPr defaultRowHeight="12.75"/><sheetData/><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/></worksheet>
@@ -0,0 +1,58 @@
1
+ module RubyFromExcel
2
+ class ArrayFormulaBuilder < FormulaBuilder
3
+
4
+ def sum_function(*args)
5
+ "sum(#{args.map {|a| a.visit(self)}.join(',')})"
6
+ end
7
+
8
+ def sumif_function(check_range,criteria,sum_range = nil)
9
+ if sum_range
10
+ "m(#{criteria.visit(self)}) { |r1| sumif(#{check_range.visit(self)},r1,#{sum_range.visit(self)}) }"
11
+ else
12
+ "m(#{criteria.visit(self)}) { |r1| sumif(#{check_range.visit(self)},r1) }"
13
+ end
14
+ end
15
+
16
+ def sumifs_function(sum_range,*args)
17
+ checks = Hash[*args]
18
+ "m(#{checks.values.map {|a| a.visit(self) }.join(',')}) { |#{checks.values.map.with_index {|a,i| "r#{i+1}"}.join(',')}| sumifs(#{sum_range.visit(self)},#{checks.map.with_index { |a,i| "#{a.first.visit(self)},r#{i+1}" }.join(',')}) }"
19
+ end
20
+
21
+ def standard_function(name_to_use_in_ruby,args)
22
+ arg_names = (1..(args.size)).map { |i| "r#{i}" }
23
+ "m(#{args.map {|a| a.visit(self) }.join(',')}) { |#{arg_names.join(',')}| #{name_to_use_in_ruby}(#{arg_names.join(',')}) }"
24
+ end
25
+
26
+ def index_function(index_range,*args)
27
+ arg_names = (1..(args.size)).map { |i| "r#{i}" }
28
+ "m(#{args.map {|a| a.visit(self) }.join(',')}) { |#{arg_names.join(',')}| index(#{index_range.visit(self)},#{arg_names.join(',')}) }"
29
+ end
30
+
31
+ def match_function(lookup_value,lookup_array,match_type = nil)
32
+ if match_type
33
+ "m(#{lookup_value.visit(self)},#{match_type.visit(self)}) { |r1,r2| match(r1,#{lookup_array.visit(self)},r2) }"
34
+ else
35
+ "m(#{lookup_value.visit(self)}) { |r1| match(r1,#{lookup_array.visit(self)}) }"
36
+ end
37
+ end
38
+
39
+ def comparison(left,comparison,right)
40
+ "m(#{left.visit(self)},#{right.visit(self)}) { |r1,r2| r1#{comparison.visit(self)}r2 }"
41
+ end
42
+
43
+ def arithmetic(*strings)
44
+ matrix_strings = []
45
+ matrix_string_references = []
46
+ strings = strings.map do |s|
47
+ if s.type == :operator
48
+ s.visit(self)
49
+ else
50
+ matrix_strings << s.visit(self)
51
+ matrix_string_references << "r#{matrix_string_references.size+1}"
52
+ matrix_string_references.last
53
+ end
54
+ end
55
+ "m(#{matrix_strings.join(',')}) { |#{matrix_string_references.join(',')}| #{strings.join} }"
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,27 @@
1
+ module RubyFromExcel
2
+ class ArrayFormulaCell < FormulaCell
3
+
4
+ def ArrayFormulaCell.from_other_cell(cell)
5
+ afc = ArrayFormulaCell.new(cell.worksheet)
6
+ afc.reference = cell.reference
7
+ afc.xml_value = cell.xml_value
8
+ afc.xml_type = cell.xml_type
9
+ afc
10
+ end
11
+
12
+ attr_accessor :array_formula_reference
13
+ attr_accessor :array_formula_offset
14
+
15
+ def parse_xml(xml)
16
+ # No
17
+ end
18
+
19
+ def work_out_dependencies
20
+ # No
21
+ end
22
+
23
+ def ruby_value
24
+ "@#{reference.to_ruby} ||= #{array_formula_reference}.array_formula_offset(#{array_formula_offset.join(',')})"
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,67 @@
1
+ require_relative 'array_formula_builder'
2
+
3
+ module RubyFromExcel
4
+ class ArrayingFormulaCell < FormulaCell
5
+
6
+ attr_accessor :array_range
7
+ attr_accessor :array_formula_reference
8
+ attr_accessor :array_formula_offset
9
+
10
+ def parse_xml(xml)
11
+ super
12
+ self.array_range = Area.new(worksheet,*xml.at_css("f")['ref'].split(':'))
13
+ end
14
+
15
+ def alter_other_cells_if_required
16
+ self.array_formula_offset = [0,0]
17
+ self.array_formula_reference = reference.to_ruby + "_array"
18
+ array_formula_from_this_cell_onto_range
19
+ end
20
+
21
+ def array_formula_from_this_cell_onto_range
22
+ each_array_formula do |array_formula_reference,value_cell|
23
+ array_cell = ArrayFormulaCell.from_other_cell(value_cell)
24
+ array_formula_onto_cell array_cell
25
+ worksheet.replace_cell(array_formula_reference,array_cell)
26
+ end
27
+ end
28
+
29
+ def array_formula_onto_cell(cell)
30
+ cell.array_formula_reference = self.array_formula_reference
31
+ cell.array_formula_offset = offset_from(cell)
32
+ end
33
+
34
+ def offset_from(cell)
35
+ cell.reference - self.reference
36
+ end
37
+
38
+ def work_out_dependencies
39
+ super
40
+ each_array_formula do |array_formula_reference,array_cell|
41
+ next unless array_cell
42
+ array_cell.dependencies = self.dependencies
43
+ end
44
+ end
45
+
46
+ def each_array_formula
47
+ array_range.to_reference_enum.each do |array_formula_reference|
48
+ next if array_formula_reference == reference.to_s
49
+ yield array_formula_reference, worksheet.cell(array_formula_reference)
50
+ end
51
+ end
52
+
53
+ def to_ruby(r = RubyScriptWriter.new)
54
+ r.put_simple_method array_formula_reference, "@#{array_formula_reference} ||= #{ruby_array_value}"
55
+ r.put_simple_method reference.to_ruby, ruby_value
56
+ r.to_s
57
+ end
58
+
59
+ def ruby_value
60
+ "@#{reference.to_ruby} ||= #{array_formula_reference}.array_formula_offset(#{array_formula_offset.join(',')})"
61
+ end
62
+
63
+ def ruby_array_value
64
+ ast.visit(ArrayFormulaBuilder.new(self))
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,9 @@
1
+ module RubyFromExcel
2
+ class SingleCellArrayFormulaBuilder < ArrayFormulaBuilder
3
+
4
+ def formula(*expressions)
5
+ expressions.map { |e| e.visit(self) }.join
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ require_relative 'single_cell_array_formula_builder'
2
+
3
+ module RubyFromExcel
4
+ class SingleCellArrayFormulaCell < FormulaCell
5
+
6
+ def ruby_value
7
+ "@#{reference.to_ruby} ||= #{ast.visit(SingleCellArrayFormulaBuilder.new(self))}"
8
+ end
9
+
10
+ end
11
+ end
data/lib/cells/cell.rb ADDED
@@ -0,0 +1,98 @@
1
+ module RubyFromExcel
2
+ class Cell
3
+
4
+ attr_accessor :worksheet, :reference, :dependencies, :xml_value, :xml_type
5
+
6
+ def initialize(worksheet,xml = nil)
7
+ self.worksheet = worksheet
8
+ parse_xml xml
9
+ end
10
+
11
+ def parse_xml(xml)
12
+ return nil unless xml
13
+ self.reference = Reference.new(xml['r'],worksheet)
14
+ self.xml_value = xml.at_css("v").content
15
+ self.xml_type = xml['t']
16
+ end
17
+
18
+ def alter_other_cells_if_required
19
+ # nil
20
+ end
21
+
22
+ def work_out_dependencies
23
+ self.dependencies = []
24
+ end
25
+
26
+ def to_ruby(r = RubyScriptWriter.new)
27
+ r.put_simple_method reference.to_ruby, ruby_value
28
+ r.to_s
29
+ end
30
+
31
+ def to_test(r = RubySpecWriter.new)
32
+ r.put_spec "cell #{reference.to_ruby} should equal #{value}" do
33
+ r.puts "#{worksheet}.#{reference.to_ruby}.should #{test}"
34
+ end
35
+ r.to_s
36
+ end
37
+
38
+ def test
39
+ return "== #{value}" if xml_type
40
+ "be_close(#{value.to_f},#{tolerance_for(value.to_f)})"
41
+ end
42
+
43
+ def tolerance_for(value,tolerance = 0.1, maximum = 1e-8)
44
+ tolerance = value.abs * tolerance
45
+ tolerance = maximum if tolerance < maximum
46
+ tolerance
47
+ end
48
+
49
+ def can_be_replaced_with_value?
50
+ false
51
+ end
52
+
53
+ def value
54
+ value = xml_value
55
+ case xml_type
56
+ when 'str'
57
+ return value.inspect
58
+ when 's'
59
+ return SharedStrings.shared_string_for(value.to_i).inspect
60
+ when 'e'
61
+ return ":#{value.gsub(/[^a-zA-Z]/,'').downcase}"
62
+ when 'b'
63
+ return 'true' if value == '1'
64
+ return 'false' if value == '0'
65
+ return Formula.parse(value).visit(FormulaBuilder.new)
66
+ else
67
+ return Formula.parse(value).visit(FormulaBuilder.new)
68
+ end
69
+ end
70
+
71
+ def value_for_including
72
+ value = xml_value
73
+ case xml_type
74
+ when 'str'
75
+ return value
76
+ when 's'
77
+ return SharedStrings.shared_string_for(value.to_i)
78
+ when 'e'
79
+ return ":#{value.gsub(/[^a-zA-Z]/,'').downcase}"
80
+ when 'b'
81
+ return 'true' if value == '1'
82
+ return 'false' if value == '0'
83
+ return Formula.parse(value).visit(FormulaBuilder.new)
84
+ else
85
+ return Formula.parse(value).visit(FormulaBuilder.new)
86
+ end
87
+ end
88
+
89
+ def to_s
90
+ "#{worksheet}.#{reference}"
91
+ end
92
+
93
+ def inspect
94
+ "(cell: #{to_s} with formula:#{respond_to?(:ast) ? ast.inspect : "na"} and value '#{value}' of type '#{xml_type}')"
95
+ end
96
+
97
+ end
98
+ end
@@ -0,0 +1,9 @@
1
+ require_relative 'cell'
2
+ require_relative 'value/value_cell'
3
+ require_relative 'formula/formula_cell'
4
+ require_relative 'formula/simple_formula_cell'
5
+ require_relative 'shared/sharing_formula_cell'
6
+ require_relative 'shared/shared_formula_cell'
7
+ require_relative 'array/arraying_formula_cell'
8
+ require_relative 'array/array_formula_cell'
9
+ require_relative 'array/single_cell_array_formula_cell'
@@ -0,0 +1,18 @@
1
+ module RubyFromExcel
2
+ class FormulaCell < Cell
3
+ attr_accessor :ast
4
+
5
+ def parse_xml(xml)
6
+ super
7
+ self.ast = Formula.parse(xml.at_css("f").content)
8
+ end
9
+
10
+ def work_out_dependencies
11
+ self.dependencies ||= ast.visit(DependencyBuilder.new(self))
12
+ end
13
+
14
+ def ruby_value
15
+ "@#{reference.to_ruby} ||= #{ast.visit(FormulaBuilder.new(self))}"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,4 @@
1
+ module RubyFromExcel
2
+ class SimpleFormulaCell < FormulaCell
3
+ end
4
+ end
@@ -0,0 +1,15 @@
1
+ module RubyFromExcel
2
+ class SharedFormulaBuilder < FormulaBuilder
3
+ attr_accessor :shared_formula_offset
4
+
5
+ def initialize(formula_cell = nil, shared_formula_offset = nil)
6
+ super formula_cell
7
+ self.shared_formula_offset = shared_formula_offset
8
+ end
9
+
10
+ def cell(reference)
11
+ Reference.new(reference).shift!(shared_formula_offset).to_ruby
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,20 @@
1
+ require_relative 'shared_formula_builder'
2
+
3
+ module RubyFromExcel
4
+ class SharedFormulaCell < FormulaCell
5
+ attr_accessor :shared_formula
6
+ attr_accessor :shared_formula_offset
7
+
8
+ def parse_formula
9
+ # No
10
+ end
11
+
12
+ def work_out_dependencies
13
+ self.dependencies ||= shared_formula.visit(SharedFormulaDependencyBuilder.new(self,shared_formula_offset))
14
+ end
15
+
16
+ def ruby_value
17
+ "@#{reference.to_ruby} ||= #{shared_formula.visit(SharedFormulaBuilder.new(self, shared_formula_offset))}"
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,36 @@
1
+ module RubyFromExcel
2
+ class SharingFormulaCell < FormulaCell
3
+
4
+ attr_accessor :sharing_range
5
+
6
+ def parse_xml(xml)
7
+ super
8
+ sharing_range = xml.at_css("f")['ref']
9
+ sharing_range = "#{sharing_range}:#{sharing_range}" unless sharing_range =~ /:/
10
+ self.sharing_range = Area.new(worksheet,*sharing_range.split(':'))
11
+ end
12
+
13
+ def alter_other_cells_if_required
14
+ share_formula
15
+ end
16
+
17
+ def share_formula
18
+ sharing_range.to_reference_enum.each do |shared_formula_reference|
19
+ next if shared_formula_reference == reference.to_s
20
+ share_formula_with_cell worksheet.cell(shared_formula_reference)
21
+ end
22
+ end
23
+
24
+ def share_formula_with_cell(cell)
25
+ return unless cell
26
+ return unless cell.is_a?(SharedFormulaCell)
27
+ cell.shared_formula = self.ast
28
+ cell.shared_formula_offset = offset_from(cell)
29
+ end
30
+
31
+ def offset_from(cell)
32
+ cell.reference - self.reference
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,24 @@
1
+ module RubyFromExcel
2
+ class ValueCell < Cell
3
+
4
+ def self.for(other_cell)
5
+ vc = ValueCell.new(other_cell.worksheet)
6
+ vc.reference = other_cell.reference
7
+ vc.xml_value = other_cell.xml_value
8
+ vc.xml_type = other_cell.xml_type
9
+ vc
10
+ end
11
+
12
+ def ruby_value
13
+ value
14
+ end
15
+
16
+ def can_be_replaced_with_value?
17
+ true
18
+ end
19
+
20
+ def to_test( r = RubySpecWriter.new)
21
+ nil # i.e., don't bother with tests for simple_values
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,6 @@
1
+ require_relative 'table'
2
+ require_relative 'shared_strings'
3
+ require_relative 'sheet_names'
4
+ require_relative 'relationships'
5
+ require_relative 'worksheet'
6
+ require_relative 'workbook'
@@ -0,0 +1,24 @@
1
+ module RubyFromExcel
2
+ class Relationships < Hash
3
+
4
+ attr_reader :shared_strings
5
+
6
+ def self.for_file(filename)
7
+ root_directory = File.dirname(filename)
8
+ relationships_xml_file = File.join(root_directory,'_rels',"#{File.basename(filename)}.rels")
9
+ return Relationships.new unless File.exist?(relationships_xml_file)
10
+ xml = File.open(relationships_xml_file) { |f| Nokogiri::XML(f) }
11
+ Relationships.new(xml,root_directory)
12
+ end
13
+
14
+ def initialize(xml = nil, root_directory = nil)
15
+ return unless xml
16
+ xml.css("Relationship").each do |relationship|
17
+ filename = root_directory ? File.expand_path(File.join(root_directory,relationship['Target'])) : relationship['Target']
18
+ self[relationship['Id']] = filename
19
+ @shared_strings = filename if relationship['Type'] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings"
20
+ end
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ # FIXME: This is obviously bad programming. What if we multithread?!
2
+ module RubyFromExcel
3
+ class SharedStrings < Array
4
+ include Singleton
5
+
6
+ def self.shared_string_for(index)
7
+ self.instance.shared_string_for(index)
8
+ end
9
+
10
+ def load_strings_from_xml(xml)
11
+ xml.css("si").each do |si|
12
+ push si.css("t").map(&:content).join
13
+ end
14
+ end
15
+
16
+ def shared_string_for(index)
17
+ at(index.to_i)
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,6 @@
1
+ # FIXME: This is obviously bad programming. What if we multithread?!
2
+ module RubyFromExcel
3
+ class SheetNames < Hash
4
+ include Singleton
5
+ end
6
+ end
@@ -0,0 +1,116 @@
1
+ module RubyFromExcel
2
+
3
+ class TableNotFoundException < Exception
4
+ end
5
+
6
+ class Table
7
+
8
+ def self.reference_for(table_name,structured_reference,cell_making_the_reference = nil)
9
+ return ":ref" unless tables.include?(table_name)
10
+ tables[table_name].reference_for(structured_reference,cell_making_the_reference)
11
+ end
12
+
13
+ def self.reference_for_local_reference(cell,structured_reference)
14
+ table = tables.find { |n,t| t.include?(cell) }
15
+ return ":ref" unless table
16
+ table.last.reference_for(structured_reference,cell.reference)
17
+ end
18
+
19
+ def self.tables
20
+ @@tables ||= {}
21
+ end
22
+
23
+ def self.add(table)
24
+ tables[table.name] = table
25
+ end
26
+
27
+ attr_reader :worksheet, :name, :reference, :column_name_array, :number_of_total_rows, :all, :data, :headers, :totals, :column_names
28
+
29
+ def self.from_xml(worksheet,xml)
30
+ Table.new(worksheet,xml['name'],xml['ref'],xml.css('tableColumn').map {|c| c['name']}.to_a,xml['totalsRowCount'])
31
+ end
32
+
33
+ def initialize(worksheet,name,reference,column_name_array,number_of_total_rows)
34
+ @worksheet = worksheet
35
+ @name = name
36
+ @reference = reference
37
+ @column_name_array = column_name_array
38
+ @number_of_total_rows = number_of_total_rows
39
+ @all = Area.new(worksheet,*reference.split(':'))
40
+ index_of_first_total_row = -number_of_total_rows.to_i
41
+ @data = @all.rows(1,index_of_first_total_row - 1)
42
+ @headers = @all.row(0)
43
+ @totals = @all.rows(index_of_first_total_row,-1)
44
+ @column_names = {}
45
+ column_name_array.each_with_index do |name,index|
46
+ @column_names[name.strip] = index # column['id'].to_i
47
+ end
48
+ Table.add(self)
49
+ end
50
+
51
+ def column(name)
52
+ name = $1 if name.to_s =~ /^(\d+)\.0+$/
53
+ return :na unless column = column_names[name]
54
+ data.column(column)
55
+ end
56
+
57
+ def reference_for(structured_reference,cell_making_the_reference = nil)
58
+ structured_reference.strip!
59
+ return this_row(cell_making_the_reference) if structured_reference == '#This Row'
60
+ if structured_reference =~ /\[(.*?)\],\[(.*?)\]/
61
+ return this_row_intersection(cell_making_the_reference,area_for_simple_reference($2)) if $1 == '#This Row'
62
+ return all.column(column_names[$2]) if $1 == '#All'
63
+ return intersection(area_for_simple_reference($1),area_for_simple_reference($2))
64
+ end
65
+ if cell_making_the_reference
66
+ if cell_making_the_reference.worksheet == self.worksheet
67
+ if data.include?(cell_making_the_reference)
68
+ case structured_reference
69
+ when /#totals/i, /#headers/i
70
+ return this_column_intersection(cell_making_the_reference,area_for_simple_reference(structured_reference))
71
+ when /^#/i
72
+ return area_for_simple_reference(structured_reference)
73
+ else
74
+ return this_row_intersection(cell_making_the_reference,area_for_simple_reference(structured_reference))
75
+ end
76
+ end
77
+ end
78
+ end
79
+ return area_for_simple_reference(structured_reference)
80
+ end
81
+
82
+ def inspect
83
+ %Q{'Table.new(#{worksheet},#{name.inspect},#{reference.inspect},#{column_name_array.inspect},#{number_of_total_rows})'}
84
+ end
85
+
86
+ def include?(cell)
87
+ @all.include_cell?(cell)
88
+ end
89
+
90
+ private
91
+
92
+ def this_row(cell_making_the_reference)
93
+ data.row(cell_making_the_reference.row_number - data.start_cell.row_number)
94
+ end
95
+
96
+ def this_row_intersection(cell_making_the_reference,column_area)
97
+ "#{worksheet}.#{Reference.ruby_for(column_area.start_cell.column_number,cell_making_the_reference.row_number)}"
98
+ end
99
+
100
+ def this_column_intersection(cell_making_the_reference,row_area)
101
+ "#{worksheet}.#{Reference.ruby_for(cell_making_the_reference.column_number,row_area.start_cell.row_number)}"
102
+ end
103
+
104
+ def intersection(row_area,colum_area)
105
+ row_area, colum_area = colum_area, row_area unless row_area.single_row?
106
+ "#{worksheet}.#{Reference.ruby_for(colum_area.start_cell.column_number,row_area.start_cell.row_number)}"
107
+ end
108
+
109
+ def area_for_simple_reference(structured_reference)
110
+ structured_reference.strip!
111
+ return self.send(structured_reference.downcase[1..-1]) if structured_reference.start_with?('#')
112
+ column(structured_reference)
113
+ end
114
+
115
+ end
116
+ end