rubyXL 1.2.10 → 3.4.33

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 (518) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +60 -0
  3. data/.codeclimate.yml +3 -0
  4. data/.rubocop.yml +124 -0
  5. data/CHANGELOG.md +12 -0
  6. data/Gemfile +18 -14
  7. data/LICENSE.txt +1 -1
  8. data/README.rdoc +170 -100
  9. data/Rakefile +76 -26
  10. data/VERSION +1 -1
  11. data/lib/rubyXL/cell.rb +13 -447
  12. data/lib/rubyXL/convenience_methods/cell.rb +276 -0
  13. data/lib/rubyXL/convenience_methods/color.rb +156 -0
  14. data/lib/rubyXL/convenience_methods/font.rb +63 -0
  15. data/lib/rubyXL/convenience_methods/workbook.rb +137 -0
  16. data/lib/rubyXL/convenience_methods/worksheet.rb +734 -0
  17. data/lib/rubyXL/convenience_methods.rb +5 -0
  18. data/lib/rubyXL/objects/border.rb +71 -0
  19. data/lib/rubyXL/objects/calculation_chain.rb +31 -0
  20. data/lib/rubyXL/objects/cell_style.rb +63 -0
  21. data/lib/rubyXL/objects/chartsheet.rb +88 -0
  22. data/lib/rubyXL/objects/color.rb +25 -0
  23. data/lib/rubyXL/objects/column_range.rb +93 -0
  24. data/lib/rubyXL/objects/comments.rb +44 -0
  25. data/lib/rubyXL/objects/connection.rb +175 -0
  26. data/lib/rubyXL/objects/container_nodes.rb +131 -0
  27. data/lib/rubyXL/objects/content_types.rb +74 -0
  28. data/lib/rubyXL/objects/data_validation.rb +37 -0
  29. data/lib/rubyXL/objects/document_properties.rb +156 -0
  30. data/lib/rubyXL/objects/extensions.rb +51 -0
  31. data/lib/rubyXL/objects/external_links.rb +115 -0
  32. data/lib/rubyXL/objects/fill.rb +52 -0
  33. data/lib/rubyXL/objects/filters.rb +118 -0
  34. data/lib/rubyXL/objects/font.rb +43 -0
  35. data/lib/rubyXL/objects/formula.rb +22 -0
  36. data/lib/rubyXL/objects/ooxml_object.rb +469 -0
  37. data/lib/rubyXL/objects/query_table.rb +106 -0
  38. data/lib/rubyXL/objects/reference.rb +119 -0
  39. data/lib/rubyXL/objects/relationships.rb +213 -0
  40. data/lib/rubyXL/objects/root.rb +84 -0
  41. data/lib/rubyXL/objects/shared_strings.rb +67 -0
  42. data/lib/rubyXL/objects/sheet_common.rb +49 -0
  43. data/lib/rubyXL/objects/sheet_data.rb +219 -0
  44. data/lib/rubyXL/objects/simple_types.rb +249 -0
  45. data/lib/rubyXL/objects/storage.rb +193 -0
  46. data/lib/rubyXL/objects/stylesheet.rb +224 -0
  47. data/lib/rubyXL/objects/text.rb +92 -0
  48. data/lib/rubyXL/objects/theme.rb +1730 -0
  49. data/lib/rubyXL/objects/workbook.rb +572 -0
  50. data/lib/rubyXL/objects/worksheet.rb +762 -0
  51. data/lib/rubyXL/parser.rb +18 -459
  52. data/lib/rubyXL/worksheet.rb +73 -1461
  53. data/lib/rubyXL.rb +9 -7
  54. data/rdoc/README_rdoc.html +534 -0
  55. data/rdoc/RubyXL/AExtension.html +187 -0
  56. data/rdoc/RubyXL/AExtensionStorageArea.html +97 -0
  57. data/rdoc/RubyXL/ActiveX.html +156 -0
  58. data/rdoc/RubyXL/ActiveXBinary.html +106 -0
  59. data/rdoc/RubyXL/AdjustHandleList.html +99 -0
  60. data/rdoc/RubyXL/Alignment.html +99 -0
  61. data/rdoc/RubyXL/AlternateContent.html +97 -0
  62. data/rdoc/RubyXL/AlternateUrls.html +99 -0
  63. data/rdoc/RubyXL/Authors.html +99 -0
  64. data/rdoc/RubyXL/AutoFilter.html +99 -0
  65. data/rdoc/RubyXL/AutoFilterColumn.html +99 -0
  66. data/rdoc/RubyXL/BinaryImageFile.html +108 -0
  67. data/rdoc/RubyXL/BodyProperties.html +99 -0
  68. data/rdoc/RubyXL/BooleanNode.html +97 -0
  69. data/rdoc/RubyXL/BooleanValue.html +97 -0
  70. data/rdoc/RubyXL/Border.html +223 -0
  71. data/rdoc/RubyXL/BorderEdge.html +160 -0
  72. data/rdoc/RubyXL/Borders.html +138 -0
  73. data/rdoc/RubyXL/Break.html +99 -0
  74. data/rdoc/RubyXL/BreakList.html +99 -0
  75. data/rdoc/RubyXL/CT_AdjPoint2D.html +99 -0
  76. data/rdoc/RubyXL/CT_AlphaBiLevelEffect.html +99 -0
  77. data/rdoc/RubyXL/CT_AlphaModulateEffect.html +99 -0
  78. data/rdoc/RubyXL/CT_AlphaModulateFixedEffect.html +99 -0
  79. data/rdoc/RubyXL/CT_AlphaOutsetEffect.html +99 -0
  80. data/rdoc/RubyXL/CT_AlphaReplaceEffect.html +99 -0
  81. data/rdoc/RubyXL/CT_Backdrop.html +99 -0
  82. data/rdoc/RubyXL/CT_Bevel.html +99 -0
  83. data/rdoc/RubyXL/CT_BiLevelEffect.html +99 -0
  84. data/rdoc/RubyXL/CT_BlendEffect.html +99 -0
  85. data/rdoc/RubyXL/CT_Blip.html +99 -0
  86. data/rdoc/RubyXL/CT_BlipFillProperties.html +99 -0
  87. data/rdoc/RubyXL/CT_BlurEffect.html +99 -0
  88. data/rdoc/RubyXL/CT_Camera.html +99 -0
  89. data/rdoc/RubyXL/CT_Color.html +99 -0
  90. data/rdoc/RubyXL/CT_ColorChangeEffect.html +99 -0
  91. data/rdoc/RubyXL/CT_ColorMapping.html +99 -0
  92. data/rdoc/RubyXL/CT_ColorScheme.html +99 -0
  93. data/rdoc/RubyXL/CT_ColorSchemeAndMapping.html +99 -0
  94. data/rdoc/RubyXL/CT_ConnectionSite.html +99 -0
  95. data/rdoc/RubyXL/CT_ConnectionSiteList.html +99 -0
  96. data/rdoc/RubyXL/CT_DashStop.html +99 -0
  97. data/rdoc/RubyXL/CT_DashStopList.html +99 -0
  98. data/rdoc/RubyXL/CT_DefaultShapeDefinition.html +99 -0
  99. data/rdoc/RubyXL/CT_DuotoneEffect.html +99 -0
  100. data/rdoc/RubyXL/CT_EffectContainer.html +99 -0
  101. data/rdoc/RubyXL/CT_EffectList.html +99 -0
  102. data/rdoc/RubyXL/CT_EffectReference.html +99 -0
  103. data/rdoc/RubyXL/CT_EffectStyleItem.html +99 -0
  104. data/rdoc/RubyXL/CT_EffectStyleList.html +99 -0
  105. data/rdoc/RubyXL/CT_EmbeddedWAVAudioFile.html +99 -0
  106. data/rdoc/RubyXL/CT_FillEffect.html +99 -0
  107. data/rdoc/RubyXL/CT_FillOverlayEffect.html +99 -0
  108. data/rdoc/RubyXL/CT_FillStyleList.html +99 -0
  109. data/rdoc/RubyXL/CT_FlatText.html +99 -0
  110. data/rdoc/RubyXL/CT_FontCollection.html +99 -0
  111. data/rdoc/RubyXL/CT_FontReference.html +99 -0
  112. data/rdoc/RubyXL/CT_GeomGuideList.html +99 -0
  113. data/rdoc/RubyXL/CT_GlowEffect.html +99 -0
  114. data/rdoc/RubyXL/CT_GradientFillProperties.html +99 -0
  115. data/rdoc/RubyXL/CT_GradientStop.html +99 -0
  116. data/rdoc/RubyXL/CT_GradientStopList.html +99 -0
  117. data/rdoc/RubyXL/CT_HSLEffect.html +99 -0
  118. data/rdoc/RubyXL/CT_HslColor.html +99 -0
  119. data/rdoc/RubyXL/CT_Hyperlink.html +99 -0
  120. data/rdoc/RubyXL/CT_InnerShadowEffect.html +99 -0
  121. data/rdoc/RubyXL/CT_LightRig.html +99 -0
  122. data/rdoc/RubyXL/CT_LineEndProperties.html +99 -0
  123. data/rdoc/RubyXL/CT_LineJoinMiterProperties.html +99 -0
  124. data/rdoc/RubyXL/CT_LineProperties.html +99 -0
  125. data/rdoc/RubyXL/CT_LineStyleList.html +99 -0
  126. data/rdoc/RubyXL/CT_LinearShadeProperties.html +99 -0
  127. data/rdoc/RubyXL/CT_LuminanceEffect.html +99 -0
  128. data/rdoc/RubyXL/CT_ObjectStyleDefaults.html +99 -0
  129. data/rdoc/RubyXL/CT_OuterShadowEffect.html +99 -0
  130. data/rdoc/RubyXL/CT_Path2D.html +99 -0
  131. data/rdoc/RubyXL/CT_Path2DArcTo.html +99 -0
  132. data/rdoc/RubyXL/CT_Path2DCubicBezierTo.html +99 -0
  133. data/rdoc/RubyXL/CT_Path2DList.html +99 -0
  134. data/rdoc/RubyXL/CT_Path2DQuadBezierTo.html +99 -0
  135. data/rdoc/RubyXL/CT_Path2DTo.html +99 -0
  136. data/rdoc/RubyXL/CT_PathShadeProperties.html +99 -0
  137. data/rdoc/RubyXL/CT_PatternFillProperties.html +99 -0
  138. data/rdoc/RubyXL/CT_Point3D.html +99 -0
  139. data/rdoc/RubyXL/CT_PolarAdjustHandle.html +99 -0
  140. data/rdoc/RubyXL/CT_PresetColor.html +99 -0
  141. data/rdoc/RubyXL/CT_PresetLineDashProperties.html +99 -0
  142. data/rdoc/RubyXL/CT_PresetShadowEffect.html +99 -0
  143. data/rdoc/RubyXL/CT_PresetTextShape.html +99 -0
  144. data/rdoc/RubyXL/CT_ReflectionEffect.html +99 -0
  145. data/rdoc/RubyXL/CT_RelativeOffsetEffect.html +99 -0
  146. data/rdoc/RubyXL/CT_RelativeRect.html +99 -0
  147. data/rdoc/RubyXL/CT_SRgbColor.html +99 -0
  148. data/rdoc/RubyXL/CT_ScRgbColor.html +99 -0
  149. data/rdoc/RubyXL/CT_Scene3D.html +99 -0
  150. data/rdoc/RubyXL/CT_SchemeColor.html +99 -0
  151. data/rdoc/RubyXL/CT_Shape3D.html +99 -0
  152. data/rdoc/RubyXL/CT_ShapeStyle.html +99 -0
  153. data/rdoc/RubyXL/CT_SoftEdgesEffect.html +99 -0
  154. data/rdoc/RubyXL/CT_SphereCoords.html +99 -0
  155. data/rdoc/RubyXL/CT_StretchInfoProperties.html +99 -0
  156. data/rdoc/RubyXL/CT_StyleMatrix.html +99 -0
  157. data/rdoc/RubyXL/CT_StyleMatrixReference.html +99 -0
  158. data/rdoc/RubyXL/CT_SupplementalFont.html +99 -0
  159. data/rdoc/RubyXL/CT_SystemColor.html +99 -0
  160. data/rdoc/RubyXL/CT_TextAutonumberBullet.html +99 -0
  161. data/rdoc/RubyXL/CT_TextBlipBullet.html +99 -0
  162. data/rdoc/RubyXL/CT_TextCharBullet.html +99 -0
  163. data/rdoc/RubyXL/CT_TextCharacterProperties.html +99 -0
  164. data/rdoc/RubyXL/CT_TextFont.html +99 -0
  165. data/rdoc/RubyXL/CT_TextListStyle.html +99 -0
  166. data/rdoc/RubyXL/CT_TextNormalAutofit.html +99 -0
  167. data/rdoc/RubyXL/CT_TextParagraphProperties.html +99 -0
  168. data/rdoc/RubyXL/CT_TextSpacing.html +99 -0
  169. data/rdoc/RubyXL/CT_TextTabStop.html +99 -0
  170. data/rdoc/RubyXL/CT_TextTabStopList.html +99 -0
  171. data/rdoc/RubyXL/CT_TileInfoProperties.html +99 -0
  172. data/rdoc/RubyXL/CT_TintEffect.html +99 -0
  173. data/rdoc/RubyXL/CT_Transform2D.html +99 -0
  174. data/rdoc/RubyXL/CT_TransformEffect.html +99 -0
  175. data/rdoc/RubyXL/CT_Vector3D.html +99 -0
  176. data/rdoc/RubyXL/CT_XYAdjustHandle.html +99 -0
  177. data/rdoc/RubyXL/CalculationChain.html +149 -0
  178. data/rdoc/RubyXL/CalculationChainCell.html +99 -0
  179. data/rdoc/RubyXL/CalculationProperties.html +99 -0
  180. data/rdoc/RubyXL/Cell.html +510 -0
  181. data/rdoc/RubyXL/CellConvenienceMethods.html +1077 -0
  182. data/rdoc/RubyXL/CellExt.html +99 -0
  183. data/rdoc/RubyXL/CellSmartTag.html +99 -0
  184. data/rdoc/RubyXL/CellSmartTagProperty.html +99 -0
  185. data/rdoc/RubyXL/CellSmartTags.html +99 -0
  186. data/rdoc/RubyXL/CellStyle.html +99 -0
  187. data/rdoc/RubyXL/CellStyleXFs.html +138 -0
  188. data/rdoc/RubyXL/CellStyles.html +138 -0
  189. data/rdoc/RubyXL/CellValue.html +139 -0
  190. data/rdoc/RubyXL/CellWatch.html +99 -0
  191. data/rdoc/RubyXL/CellWatches.html +99 -0
  192. data/rdoc/RubyXL/CellXFs.html +139 -0
  193. data/rdoc/RubyXL/ChartColorsFile.html +108 -0
  194. data/rdoc/RubyXL/ChartFile.html +160 -0
  195. data/rdoc/RubyXL/ChartStyleFile.html +108 -0
  196. data/rdoc/RubyXL/ChartUserShapesFile.html +108 -0
  197. data/rdoc/RubyXL/Chartsheet.html +213 -0
  198. data/rdoc/RubyXL/ChartsheetPageSetup.html +99 -0
  199. data/rdoc/RubyXL/ChartsheetProperties.html +99 -0
  200. data/rdoc/RubyXL/ChartsheetProtection.html +99 -0
  201. data/rdoc/RubyXL/ChartsheetView.html +99 -0
  202. data/rdoc/RubyXL/ChartsheetViews.html +99 -0
  203. data/rdoc/RubyXL/Color.html +151 -0
  204. data/rdoc/RubyXL/ColorConvenienceClasses/HlsColor.html +246 -0
  205. data/rdoc/RubyXL/ColorConvenienceClasses/RgbColor.html +285 -0
  206. data/rdoc/RubyXL/ColorConvenienceClasses.html +91 -0
  207. data/rdoc/RubyXL/ColorConvenienceMethods.html +139 -0
  208. data/rdoc/RubyXL/ColorFilter.html +99 -0
  209. data/rdoc/RubyXL/ColorScale.html +99 -0
  210. data/rdoc/RubyXL/ColorSet.html +99 -0
  211. data/rdoc/RubyXL/Colors.html +99 -0
  212. data/rdoc/RubyXL/ColumnRange.html +230 -0
  213. data/rdoc/RubyXL/ColumnRanges.html +237 -0
  214. data/rdoc/RubyXL/Comment.html +99 -0
  215. data/rdoc/RubyXL/CommentList.html +99 -0
  216. data/rdoc/RubyXL/CommentsFile.html +165 -0
  217. data/rdoc/RubyXL/ConditionalFormatValue.html +99 -0
  218. data/rdoc/RubyXL/ConditionalFormatting.html +99 -0
  219. data/rdoc/RubyXL/ConditionalFormattingRule.html +99 -0
  220. data/rdoc/RubyXL/Connection.html +99 -0
  221. data/rdoc/RubyXL/ConnectionTable.html +99 -0
  222. data/rdoc/RubyXL/ConnectionTables.html +99 -0
  223. data/rdoc/RubyXL/ConnectionTextField.html +99 -0
  224. data/rdoc/RubyXL/ConnectionTextFields.html +99 -0
  225. data/rdoc/RubyXL/Connections.html +149 -0
  226. data/rdoc/RubyXL/ContentTypeDefault.html +97 -0
  227. data/rdoc/RubyXL/ContentTypeOverride.html +97 -0
  228. data/rdoc/RubyXL/ContentTypes.html +211 -0
  229. data/rdoc/RubyXL/ControlPropertiesFile.html +108 -0
  230. data/rdoc/RubyXL/CorePropertiesFile.html +355 -0
  231. data/rdoc/RubyXL/CustomColor.html +99 -0
  232. data/rdoc/RubyXL/CustomColorList.html +99 -0
  233. data/rdoc/RubyXL/CustomFilter.html +99 -0
  234. data/rdoc/RubyXL/CustomFilters.html +99 -0
  235. data/rdoc/RubyXL/CustomGeometry.html +99 -0
  236. data/rdoc/RubyXL/CustomProperties.html +99 -0
  237. data/rdoc/RubyXL/CustomPropertiesFile.html +108 -0
  238. data/rdoc/RubyXL/CustomProperty.html +99 -0
  239. data/rdoc/RubyXL/CustomPropertyFile.html +108 -0
  240. data/rdoc/RubyXL/CustomSheetView.html +99 -0
  241. data/rdoc/RubyXL/CustomSheetViews.html +99 -0
  242. data/rdoc/RubyXL/CustomWorkbookView.html +99 -0
  243. data/rdoc/RubyXL/CustomWorkbookViews.html +99 -0
  244. data/rdoc/RubyXL/CustomXMLFile.html +106 -0
  245. data/rdoc/RubyXL/DXF.html +99 -0
  246. data/rdoc/RubyXL/DXFs.html +99 -0
  247. data/rdoc/RubyXL/DataBar.html +99 -0
  248. data/rdoc/RubyXL/DataConsolidate.html +99 -0
  249. data/rdoc/RubyXL/DataConsolidationReference.html +99 -0
  250. data/rdoc/RubyXL/DataConsolidationReferences.html +99 -0
  251. data/rdoc/RubyXL/DataType.html +114 -0
  252. data/rdoc/RubyXL/DataValidation.html +99 -0
  253. data/rdoc/RubyXL/DataValidations.html +99 -0
  254. data/rdoc/RubyXL/DateGroupItem.html +99 -0
  255. data/rdoc/RubyXL/DefinedName.html +99 -0
  256. data/rdoc/RubyXL/DefinedNameExt.html +99 -0
  257. data/rdoc/RubyXL/DefinedNames.html +99 -0
  258. data/rdoc/RubyXL/DefinedNamesExt.html +99 -0
  259. data/rdoc/RubyXL/DocumentPropertiesFile.html +213 -0
  260. data/rdoc/RubyXL/DrawingFile.html +159 -0
  261. data/rdoc/RubyXL/DynamicFilter.html +99 -0
  262. data/rdoc/RubyXL/EmbeddedControl.html +99 -0
  263. data/rdoc/RubyXL/EmbeddedControls.html +99 -0
  264. data/rdoc/RubyXL/Extension.html +99 -0
  265. data/rdoc/RubyXL/ExtensionStorageArea.html +99 -0
  266. data/rdoc/RubyXL/Extents.html +99 -0
  267. data/rdoc/RubyXL/ExternalBook.html +99 -0
  268. data/rdoc/RubyXL/ExternalLinksFile.html +155 -0
  269. data/rdoc/RubyXL/ExternalReference.html +99 -0
  270. data/rdoc/RubyXL/ExternalReferences.html +99 -0
  271. data/rdoc/RubyXL/ExtraColorSchemeList.html +99 -0
  272. data/rdoc/RubyXL/FieldItem.html +99 -0
  273. data/rdoc/RubyXL/FileRecoveryProperties.html +99 -0
  274. data/rdoc/RubyXL/FileSharing.html +99 -0
  275. data/rdoc/RubyXL/FileVersion.html +99 -0
  276. data/rdoc/RubyXL/Fill.html +138 -0
  277. data/rdoc/RubyXL/Fills.html +138 -0
  278. data/rdoc/RubyXL/FilterContainer.html +99 -0
  279. data/rdoc/RubyXL/FloatNode.html +97 -0
  280. data/rdoc/RubyXL/FloatValue.html +97 -0
  281. data/rdoc/RubyXL/Font.html +148 -0
  282. data/rdoc/RubyXL/FontConvenienceMethods.html +442 -0
  283. data/rdoc/RubyXL/FontScheme.html +99 -0
  284. data/rdoc/RubyXL/Fonts.html +138 -0
  285. data/rdoc/RubyXL/Formula.html +99 -0
  286. data/rdoc/RubyXL/FunctionGroup.html +99 -0
  287. data/rdoc/RubyXL/FunctionGroups.html +99 -0
  288. data/rdoc/RubyXL/GenericStorageObject.html +241 -0
  289. data/rdoc/RubyXL/GradientFill.html +99 -0
  290. data/rdoc/RubyXL/HeaderFooterSettings.html +99 -0
  291. data/rdoc/RubyXL/Hyperlink.html +99 -0
  292. data/rdoc/RubyXL/HyperlinkRelFile.html +106 -0
  293. data/rdoc/RubyXL/Hyperlinks.html +99 -0
  294. data/rdoc/RubyXL/IconFilter.html +99 -0
  295. data/rdoc/RubyXL/IconSet.html +99 -0
  296. data/rdoc/RubyXL/IgnoredError.html +99 -0
  297. data/rdoc/RubyXL/IgnoredErrors.html +99 -0
  298. data/rdoc/RubyXL/IndexedColors.html +99 -0
  299. data/rdoc/RubyXL/InputCells.html +99 -0
  300. data/rdoc/RubyXL/IntegerNode.html +97 -0
  301. data/rdoc/RubyXL/IntegerValue.html +97 -0
  302. data/rdoc/RubyXL/LegacyCell.html +130 -0
  303. data/rdoc/RubyXL/LegacyWorksheet.html +306 -0
  304. data/rdoc/RubyXL/MRUColors.html +99 -0
  305. data/rdoc/RubyXL/MacrosFile.html +108 -0
  306. data/rdoc/RubyXL/MergedCell.html +99 -0
  307. data/rdoc/RubyXL/MergedCells.html +99 -0
  308. data/rdoc/RubyXL/NumFmt.html +99 -0
  309. data/rdoc/RubyXL/NumberFormat.html +139 -0
  310. data/rdoc/RubyXL/NumberFormats.html +147 -0
  311. data/rdoc/RubyXL/OLEObject.html +99 -0
  312. data/rdoc/RubyXL/OLEObjectFile.html +108 -0
  313. data/rdoc/RubyXL/OLEObjects.html +99 -0
  314. data/rdoc/RubyXL/OLESize.html +99 -0
  315. data/rdoc/RubyXL/OOXMLContainerObject.html +309 -0
  316. data/rdoc/RubyXL/OOXMLIgnored.html +167 -0
  317. data/rdoc/RubyXL/OOXMLObject.html +107 -0
  318. data/rdoc/RubyXL/OOXMLObjectClassMethods.html +455 -0
  319. data/rdoc/RubyXL/OOXMLObjectInstanceMethods.html +442 -0
  320. data/rdoc/RubyXL/OOXMLRelationshipsFile.html +470 -0
  321. data/rdoc/RubyXL/OOXMLTopLevelObject.html +297 -0
  322. data/rdoc/RubyXL/OdbcOleDbProperties.html +99 -0
  323. data/rdoc/RubyXL/Offset.html +99 -0
  324. data/rdoc/RubyXL/OlapProperties.html +99 -0
  325. data/rdoc/RubyXL/OleItem.html +99 -0
  326. data/rdoc/RubyXL/OleItems.html +99 -0
  327. data/rdoc/RubyXL/OleLink.html +99 -0
  328. data/rdoc/RubyXL/OutlineProperties.html +99 -0
  329. data/rdoc/RubyXL/PageMargins.html +99 -0
  330. data/rdoc/RubyXL/PageSetup.html +99 -0
  331. data/rdoc/RubyXL/PageSetupProperties.html +99 -0
  332. data/rdoc/RubyXL/Pane.html +99 -0
  333. data/rdoc/RubyXL/Parser.html +174 -0
  334. data/rdoc/RubyXL/PatternFill.html +99 -0
  335. data/rdoc/RubyXL/PersonMetadata.html +108 -0
  336. data/rdoc/RubyXL/PhoneticProperties.html +99 -0
  337. data/rdoc/RubyXL/PhoneticRun.html +99 -0
  338. data/rdoc/RubyXL/PivotArea.html +99 -0
  339. data/rdoc/RubyXL/PivotCache.html +99 -0
  340. data/rdoc/RubyXL/PivotCacheDefinitionFile.html +116 -0
  341. data/rdoc/RubyXL/PivotCacheRecordsFile.html +108 -0
  342. data/rdoc/RubyXL/PivotCaches.html +99 -0
  343. data/rdoc/RubyXL/PivotReference.html +99 -0
  344. data/rdoc/RubyXL/PivotReferences.html +99 -0
  345. data/rdoc/RubyXL/PivotTableFile.html +116 -0
  346. data/rdoc/RubyXL/PivotTableSelection.html +99 -0
  347. data/rdoc/RubyXL/PresetGeometry.html +99 -0
  348. data/rdoc/RubyXL/PrintOptions.html +99 -0
  349. data/rdoc/RubyXL/PrinterSettingsFile.html +108 -0
  350. data/rdoc/RubyXL/ProtectedRange.html +99 -0
  351. data/rdoc/RubyXL/ProtectedRanges.html +99 -0
  352. data/rdoc/RubyXL/Protection.html +99 -0
  353. data/rdoc/RubyXL/QueryParameter.html +99 -0
  354. data/rdoc/RubyXL/QueryParameters.html +99 -0
  355. data/rdoc/RubyXL/QueryTable.html +157 -0
  356. data/rdoc/RubyXL/QueryTableDeletedField.html +99 -0
  357. data/rdoc/RubyXL/QueryTableDeletedFields.html +99 -0
  358. data/rdoc/RubyXL/QueryTableField.html +99 -0
  359. data/rdoc/RubyXL/QueryTableFields.html +99 -0
  360. data/rdoc/RubyXL/QueryTableRefresh.html +99 -0
  361. data/rdoc/RubyXL/RID.html +97 -0
  362. data/rdoc/RubyXL/RawOOXML.html +187 -0
  363. data/rdoc/RubyXL/Reference.html +510 -0
  364. data/rdoc/RubyXL/Relationship.html +97 -0
  365. data/rdoc/RubyXL/RelationshipSupport/ClassMehods.html +131 -0
  366. data/rdoc/RubyXL/RelationshipSupport.html +336 -0
  367. data/rdoc/RubyXL/RevisionPointer.html +99 -0
  368. data/rdoc/RubyXL/RichText.html +141 -0
  369. data/rdoc/RubyXL/RichTextRun.html +138 -0
  370. data/rdoc/RubyXL/Row.html +357 -0
  371. data/rdoc/RubyXL/RowExt.html +99 -0
  372. data/rdoc/RubyXL/RunProperties.html +99 -0
  373. data/rdoc/RubyXL/Scenario.html +99 -0
  374. data/rdoc/RubyXL/Scenarios.html +99 -0
  375. data/rdoc/RubyXL/Selection.html +146 -0
  376. data/rdoc/RubyXL/ShapeGuide.html +99 -0
  377. data/rdoc/RubyXL/ShapeTextRectangle.html +99 -0
  378. data/rdoc/RubyXL/SharedStringsTable.html +328 -0
  379. data/rdoc/RubyXL/Sheet.html +99 -0
  380. data/rdoc/RubyXL/SheetCalculationProperties.html +99 -0
  381. data/rdoc/RubyXL/SheetData.html +162 -0
  382. data/rdoc/RubyXL/SheetDataExt.html +99 -0
  383. data/rdoc/RubyXL/SheetDataSet.html +99 -0
  384. data/rdoc/RubyXL/SheetMetadata.html +108 -0
  385. data/rdoc/RubyXL/SheetName.html +99 -0
  386. data/rdoc/RubyXL/SheetNames.html +99 -0
  387. data/rdoc/RubyXL/Sheets.html +99 -0
  388. data/rdoc/RubyXL/SlicerCacheFile.html +108 -0
  389. data/rdoc/RubyXL/SlicerFile.html +108 -0
  390. data/rdoc/RubyXL/SmartTagProperties.html +99 -0
  391. data/rdoc/RubyXL/SmartTagType.html +99 -0
  392. data/rdoc/RubyXL/SmartTagTypes.html +99 -0
  393. data/rdoc/RubyXL/SmartTags.html +99 -0
  394. data/rdoc/RubyXL/SortCondition.html +99 -0
  395. data/rdoc/RubyXL/SortState.html +99 -0
  396. data/rdoc/RubyXL/Sqref.html +167 -0
  397. data/rdoc/RubyXL/Stop.html +99 -0
  398. data/rdoc/RubyXL/StringNode.html +97 -0
  399. data/rdoc/RubyXL/StringNodeW3C.html +167 -0
  400. data/rdoc/RubyXL/StringValue.html +97 -0
  401. data/rdoc/RubyXL/Stylesheet.html +281 -0
  402. data/rdoc/RubyXL/TableFile.html +108 -0
  403. data/rdoc/RubyXL/TableParts.html +97 -0
  404. data/rdoc/RubyXL/TableStyle.html +99 -0
  405. data/rdoc/RubyXL/TableStyles.html +99 -0
  406. data/rdoc/RubyXL/Text.html +175 -0
  407. data/rdoc/RubyXL/TextImportSettings.html +99 -0
  408. data/rdoc/RubyXL/Theme.html +535 -0
  409. data/rdoc/RubyXL/ThemeElements.html +99 -0
  410. data/rdoc/RubyXL/ThumbnailFile.html +108 -0
  411. data/rdoc/RubyXL/Top10.html +99 -0
  412. data/rdoc/RubyXL/VMLDrawingFile.html +116 -0
  413. data/rdoc/RubyXL/Variant.html +99 -0
  414. data/rdoc/RubyXL/Vector.html +142 -0
  415. data/rdoc/RubyXL/VectorValue.html +97 -0
  416. data/rdoc/RubyXL/VisualProperties.html +99 -0
  417. data/rdoc/RubyXL/WebPublishObject.html +99 -0
  418. data/rdoc/RubyXL/WebPublishObjects.html +99 -0
  419. data/rdoc/RubyXL/WebPublishingItem.html +99 -0
  420. data/rdoc/RubyXL/WebPublishingItems.html +99 -0
  421. data/rdoc/RubyXL/WebPublishingProperties.html +99 -0
  422. data/rdoc/RubyXL/WebQueryProperties.html +99 -0
  423. data/rdoc/RubyXL/Workbook.html +948 -0
  424. data/rdoc/RubyXL/WorkbookConvenienceMethods.html +596 -0
  425. data/rdoc/RubyXL/WorkbookProperties.html +99 -0
  426. data/rdoc/RubyXL/WorkbookProtection.html +99 -0
  427. data/rdoc/RubyXL/WorkbookRoot.html +325 -0
  428. data/rdoc/RubyXL/WorkbookView.html +99 -0
  429. data/rdoc/RubyXL/WorkbookViews.html +99 -0
  430. data/rdoc/RubyXL/Worksheet.html +418 -0
  431. data/rdoc/RubyXL/WorksheetConvenienceMethods.html +2205 -0
  432. data/rdoc/RubyXL/WorksheetDimensions.html +99 -0
  433. data/rdoc/RubyXL/WorksheetFormatProperties.html +97 -0
  434. data/rdoc/RubyXL/WorksheetProperties.html +99 -0
  435. data/rdoc/RubyXL/WorksheetProtection.html +99 -0
  436. data/rdoc/RubyXL/WorksheetView.html +99 -0
  437. data/rdoc/RubyXL/WorksheetViews.html +99 -0
  438. data/rdoc/RubyXL/XF.html +99 -0
  439. data/rdoc/RubyXL.html +338 -0
  440. data/rdoc/created.rid +45 -0
  441. data/rdoc/css/fonts.css +167 -0
  442. data/rdoc/css/rdoc.css +687 -0
  443. data/rdoc/fonts/Lato-Light.ttf +0 -0
  444. data/rdoc/fonts/Lato-LightItalic.ttf +0 -0
  445. data/rdoc/fonts/Lato-Regular.ttf +0 -0
  446. data/rdoc/fonts/Lato-RegularItalic.ttf +0 -0
  447. data/rdoc/fonts/SourceCodePro-Bold.ttf +0 -0
  448. data/rdoc/fonts/SourceCodePro-Regular.ttf +0 -0
  449. data/rdoc/images/add.png +0 -0
  450. data/rdoc/images/arrow_up.png +0 -0
  451. data/rdoc/images/brick.png +0 -0
  452. data/rdoc/images/brick_link.png +0 -0
  453. data/rdoc/images/bug.png +0 -0
  454. data/rdoc/images/bullet_black.png +0 -0
  455. data/rdoc/images/bullet_toggle_minus.png +0 -0
  456. data/rdoc/images/bullet_toggle_plus.png +0 -0
  457. data/rdoc/images/date.png +0 -0
  458. data/rdoc/images/delete.png +0 -0
  459. data/rdoc/images/find.png +0 -0
  460. data/rdoc/images/loadingAnimation.gif +0 -0
  461. data/rdoc/images/macFFBgHack.png +0 -0
  462. data/rdoc/images/package.png +0 -0
  463. data/rdoc/images/page_green.png +0 -0
  464. data/rdoc/images/page_white_text.png +0 -0
  465. data/rdoc/images/page_white_width.png +0 -0
  466. data/rdoc/images/plugin.png +0 -0
  467. data/rdoc/images/ruby.png +0 -0
  468. data/rdoc/images/tag_blue.png +0 -0
  469. data/rdoc/images/tag_green.png +0 -0
  470. data/rdoc/images/transparent.png +0 -0
  471. data/rdoc/images/wrench.png +0 -0
  472. data/rdoc/images/wrench_orange.png +0 -0
  473. data/rdoc/images/zoom.png +0 -0
  474. data/rdoc/index.html +477 -0
  475. data/rdoc/js/darkfish.js +97 -0
  476. data/rdoc/js/navigation.js +105 -0
  477. data/rdoc/js/navigation.js.gz +0 -0
  478. data/rdoc/js/search.js +110 -0
  479. data/rdoc/js/search_index.js +1 -0
  480. data/rdoc/js/search_index.js.gz +0 -0
  481. data/rdoc/js/searcher.js +229 -0
  482. data/rdoc/js/searcher.js.gz +0 -0
  483. data/rdoc/table_of_contents.html +3021 -0
  484. data/rubyXL.gemspec +521 -60
  485. data/spec/lib/cell_spec.rb +386 -143
  486. data/spec/lib/color_spec.rb +11 -4
  487. data/spec/lib/parser_spec.rb +90 -38
  488. data/spec/lib/reference_spec.rb +64 -0
  489. data/spec/lib/rgb_color_spec.rb +29 -0
  490. data/spec/lib/stylesheet_spec.rb +27 -0
  491. data/spec/lib/text_spec.rb +27 -0
  492. data/spec/lib/workbook_spec.rb +168 -22
  493. data/spec/lib/worksheet_spec.rb +1207 -1220
  494. data/spec/spec_helper.rb +13 -0
  495. data/test/input/.gitkeep +0 -0
  496. data/test/output/.gitkeep +0 -0
  497. data/test/test_parse_write.rb +15 -0
  498. data/tmp/.gitignore +1 -0
  499. metadata +634 -168
  500. data/Gemfile.lock +0 -34
  501. data/lib/.DS_Store +0 -0
  502. data/lib/rubyXL/Hash.rb +0 -60
  503. data/lib/rubyXL/color.rb +0 -14
  504. data/lib/rubyXL/private_class.rb +0 -265
  505. data/lib/rubyXL/workbook.rb +0 -450
  506. data/lib/rubyXL/writer/app_writer.rb +0 -62
  507. data/lib/rubyXL/writer/calc_chain_writer.rb +0 -33
  508. data/lib/rubyXL/writer/content_types_writer.rb +0 -77
  509. data/lib/rubyXL/writer/core_writer.rb +0 -51
  510. data/lib/rubyXL/writer/root_rels_writer.rb +0 -25
  511. data/lib/rubyXL/writer/shared_strings_writer.rb +0 -30
  512. data/lib/rubyXL/writer/styles_writer.rb +0 -407
  513. data/lib/rubyXL/writer/theme_writer.rb +0 -343
  514. data/lib/rubyXL/writer/workbook_rels_writer.rb +0 -59
  515. data/lib/rubyXL/writer/workbook_writer.rb +0 -77
  516. data/lib/rubyXL/writer/worksheet_writer.rb +0 -230
  517. data/lib/rubyXL/zip.rb +0 -20
  518. data/spec/lib/hash_spec.rb +0 -28
data/lib/rubyXL/parser.rb CHANGED
@@ -1,468 +1,27 @@
1
- require 'rubygems'
2
- require 'nokogiri'
3
- require 'zip/zip' #rubyzip
4
- require File.expand_path(File.join(File.dirname(__FILE__),'Hash'))
5
-
6
1
  module RubyXL
7
-
8
2
  class Parser
9
- attr_reader :data_only, :num_sheets
10
- @@parsed_column_hash ={}
11
- # converts cell string (such as "AA1") to matrix indices
12
- def Parser.convert_to_index(cell_string)
13
- index = [-1,-1]
14
- if(cell_string =~ /^([A-Z]+)(\d+)$/)
15
-
16
- one = $1
17
- row = $2.to_i - 1 #-1 for 0 indexing
18
- col = 0
19
- i = 0
20
- if @@parsed_column_hash[one].nil?
21
- two = one.reverse #because of 26^i calculation
22
- two.each_byte do |c|
23
- int_val = c - 64 #converts A to 1
24
- col += int_val * 26**(i)
25
- i=i+1
26
- end
27
- @@parsed_column_hash[one] = col
28
- else
29
- col = @@parsed_column_hash[one]
30
- end
31
- col -= 1 #zer0 index
32
- index[0] = row
33
- index[1] = col
3
+ # Parse <tt>.xslx</tt> file by reading it from local disk.
4
+ def self.parse(src_file_path)
5
+ begin
6
+ ::Zip::File.open(src_file_path) { |zip_file|
7
+ root = RubyXL::WorkbookRoot.parse_zip_file(zip_file)
8
+ root.source_file_path = src_file_path
9
+ root.workbook
10
+ }
11
+ rescue ::Zip::Error => e
12
+ raise e, "XLSX file format error: #{e}", e.backtrace
34
13
  end
35
- return index
36
14
  end
37
15
 
38
-
39
- # data_only allows only the sheet data to be parsed, so as to speed up parsing
40
- # However, using this option will result in date-formatted cells being interpreted as numbers
41
- def Parser.parse(file_path, opts = {})
42
-
43
- # options handling
44
- @data_only = opts.is_a?(TrueClass)||!!opts[:data_only]
45
- skip_filename_check = !!opts[:skip_filename_check]
46
-
47
- files = Parser.decompress(file_path, skip_filename_check)
48
- wb = Parser.fill_workbook(file_path, files)
49
-
50
- if(files['sharedString'] != nil)
51
- wb.num_strings = Integer(files['sharedString'].css('sst').attribute('count').value())
52
- wb.size = Integer(files['sharedString'].css('sst').attribute('uniqueCount').value())
53
-
54
- files['sharedString'].css('si').each do |node|
55
- unless node.css('r').empty?
56
- text = node.css('r t').children.to_a.join
57
- node.children.remove
58
- node << "<t xml:space=\"preserve\">#{text}</t>"
59
- end
60
- end
61
-
62
- string_nodes = files['sharedString'].css('si t')
63
- wb.shared_strings = {}
64
- string_nodes.each_with_index do |node,i|
65
- string = node.children.to_s
66
- wb.shared_strings[i] = string
67
- wb.shared_strings[string] = i
68
- end
69
- end
70
- #styles are needed for formatting reasons as that is how dates are determined
71
- styles = files['styles'].css('cellXfs xf')
72
- style_hash = Hash.xml_node_to_hash(files['styles'].root)
73
- fill_styles(wb,style_hash)
74
-
75
- #will be nil if these files do not exist
76
- wb.external_links = files['externalLinks']
77
- wb.drawings = files['drawings']
78
- wb.printer_settings = files['printerSettings']
79
- wb.worksheet_rels = files['worksheetRels']
80
- wb.macros = files['vbaProject']
81
-
82
- #for each worksheet:
83
- #1. find the dimensions of the data matrix
84
- #2. Fill in the matrix with data from worksheet/shared_string files
85
- #3. Apply styles
86
- wb.worksheets.each_index do |i|
87
- Parser.fill_worksheet(wb,i,files,wb.shared_strings)
16
+ # Parse <tt>.xslx</tt> file contained in a stream (useful for receiving over HTTP).
17
+ def self.parse_buffer(buffer)
18
+ root = nil # Zip::File.open_buffer somehow fails to return the value from the block :(
19
+ begin
20
+ ::Zip::File.open_buffer(buffer) { |zip_file| root = RubyXL::WorkbookRoot.parse_zip_file(zip_file) }
21
+ root.workbook
22
+ rescue ::Zip::Error => e
23
+ raise e, "XLSX file format error: #{e}", e.backtrace
88
24
  end
89
-
90
- return wb
91
25
  end
92
-
93
- private
94
-
95
- #fills hashes for various styles
96
- def Parser.fill_styles(wb,style_hash)
97
- ###NUM FORMATS###
98
- if style_hash[:numFmts].nil?
99
- style_hash[:numFmts] = {:attributes => {:count => 0}, :numFmt => []}
100
- elsif style_hash[:numFmts][:attributes][:count]==1
101
- style_hash[:numFmts][:numFmt] = [style_hash[:numFmts][:numFmt]]
102
- end
103
- wb.num_fmts = style_hash[:numFmts]
104
-
105
- ###FONTS###
106
- wb.fonts = {}
107
- if style_hash[:fonts][:attributes][:count]==1
108
- style_hash[:fonts][:font] = [style_hash[:fonts][:font]]
109
- end
110
-
111
- style_hash[:fonts][:font].each_with_index do |f,i|
112
- wb.fonts[i.to_s] = {:font=>f,:count=>0}
113
- end
114
-
115
- ###FILLS###
116
- wb.fills = {}
117
- if style_hash[:fills][:attributes][:count]==1
118
- style_hash[:fills][:fill] = [style_hash[:fills][:fill]]
119
- end
120
-
121
- style_hash[:fills][:fill].each_with_index do |f,i|
122
- wb.fills[i.to_s] = {:fill=>f,:count=>0}
123
- end
124
-
125
- ###BORDERS###
126
- wb.borders = {}
127
- if style_hash[:borders][:attributes][:count] == 1
128
- style_hash[:borders][:border] = [style_hash[:borders][:border]]
129
- end
130
-
131
- style_hash[:borders][:border].each_with_index do |b,i|
132
- wb.borders[i.to_s] = {:border=>b, :count=>0}
133
- end
134
-
135
- wb.cell_style_xfs = style_hash[:cellStyleXfs]
136
- wb.cell_xfs = style_hash[:cellXfs]
137
- wb.cell_styles = style_hash[:cellStyles]
138
-
139
- wb.colors = style_hash[:colors]
140
-
141
- #fills out count information for each font, fill, and border
142
- if wb.cell_xfs[:xf].is_a?(::Hash)
143
- wb.cell_xfs[:xf] = [wb.cell_xfs[:xf]]
144
- end
145
- wb.cell_xfs[:xf].each do |style|
146
- id = style[:attributes][:fontId].to_s
147
- unless id.nil?
148
- wb.fonts[id][:count] += 1
149
- end
150
-
151
- id = style[:attributes][:fillId].to_s
152
- unless id.nil?
153
- wb.fills[id][:count] += 1
154
- end
155
-
156
- id = style[:attributes][:borderId].to_s
157
- unless id.nil?
158
- wb.borders[id][:count] += 1
159
- end
160
- end
161
- end
162
-
163
- # i is the sheet number
164
- # files is the hash which includes information for each worksheet
165
- # shared_strings has group of indexed strings which the cells reference
166
- def Parser.fill_worksheet(wb,i,files,shared_strings)
167
- wb.worksheets[i] = Parser.create_matrix(wb, i, files)
168
- j = i+1
169
-
170
- namespaces = files[j].root.namespaces()
171
- unless @data_only
172
- sheet_views_node= files[j].xpath('/xmlns:worksheet/xmlns:sheetViews[xmlns:sheetView]',namespaces).first
173
- wb.worksheets[i].sheet_view = Hash.xml_node_to_hash(sheet_views_node)[:sheetView]
174
-
175
- ##col styles##
176
- cols_node_set = files[j].xpath('/xmlns:worksheet/xmlns:cols',namespaces)
177
- unless cols_node_set.empty?
178
- wb.worksheets[i].cols= Hash.xml_node_to_hash(cols_node_set.first)[:col]
179
- end
180
- ##end col styles##
181
-
182
- ##merge_cells##
183
- merge_cells_node = files[j].xpath('/xmlns:worksheet/xmlns:mergeCells[xmlns:mergeCell]',namespaces)
184
- unless merge_cells_node.empty?
185
- wb.worksheets[i].merged_cells = Hash.xml_node_to_hash(merge_cells_node.first)[:mergeCell]
186
- end
187
- ##end merge_cells##
188
-
189
- ##sheet_view pane##
190
- pane_data = wb.worksheets[i].sheet_view[:pane]
191
- wb.worksheets[i].pane = pane_data
192
- ##end sheet_view pane##
193
-
194
- ##data_validation##
195
- data_validations_node = files[j].xpath('/xmlns:worksheet/xmlns:dataValidations[xmlns:dataValidation]',namespaces)
196
- unless data_validations_node.empty?
197
- wb.worksheets[i].validations = Hash.xml_node_to_hash(data_validations_node.first)[:dataValidation]
198
- else
199
- wb.worksheets[i].validations=nil
200
- end
201
- ##end data_validation##
202
-
203
- #extLst
204
- ext_list_node=files[j].xpath('/xmlns:worksheet/xmlns:extLst',namespaces)
205
- unless ext_list_node.empty?
206
- wb.worksheets[i].extLst = Hash.xml_node_to_hash(ext_list_node.first)
207
- else
208
- wb.worksheets[i].extLst=nil
209
- end
210
- #extLst
211
-
212
- ##legacy drawing##
213
- legacy_drawing_node = files[j].xpath('/xmlns:worksheet/xmlns:legacyDrawing',namespaces)
214
- unless legacy_drawing_node.empty?
215
- wb.worksheets[i].legacy_drawing = Hash.xml_node_to_hash(legacy_drawing_node.first)
216
- else
217
- wb.worksheets[i].legacy_drawing = nil
218
- end
219
- ##end legacy drawing
220
- end
221
-
222
-
223
- row_data = files[j].xpath('/xmlns:worksheet/xmlns:sheetData/xmlns:row[xmlns:c[xmlns:v]]',namespaces)
224
- row_data.each do |row|
225
- unless @data_only
226
- ##row styles##
227
- row_style = '0'
228
- row_attributes = row.attributes
229
- unless row_attributes['s'].nil?
230
- row_style = row_attributes['s'].value
231
- end
232
-
233
- wb.worksheets[i].row_styles[row_attributes['r'].content] = { :style => row_style }
234
-
235
- if !row_attributes['ht'].nil? && (!row_attributes['ht'].content.nil? || row_attributes['ht'].content.strip != "" )
236
- wb.worksheets[i].change_row_height(Integer(row_attributes['r'].content)-1,
237
- Float(row_attributes['ht'].content))
238
- end
239
- ##end row styles##
240
- end
241
-
242
- unless @data_only
243
- c_row = row.search('./xmlns:c')
244
- else
245
- c_row = row.search('./xmlns:c[xmlns:v[text()]]')
246
- end
247
- c_row.each do |value|
248
- #attributes is from the excel cell(c) and is basically location information and style and type
249
- value_attributes= value.attributes
250
- # r attribute contains the location like A1
251
- cell_index = Parser.convert_to_index(value_attributes['r'].content)
252
- style_index = 0
253
-
254
- # t is optional and contains the type of the cell
255
- data_type = value_attributes['t'].content if value_attributes['t']
256
- element_hash ={}
257
- value.children.each do |node|
258
- element_hash["#{node.name()}_element"]=node
259
- end
260
- # v is the value element that is part of the cell
261
- if element_hash["v_element"]
262
- v_element_content = element_hash["v_element"].content
263
- else
264
- v_element_content=""
265
- end
266
- if v_element_content =="" #no data
267
- cell_data = nil
268
- elsif data_type == 's' #shared string
269
- str_index = Integer(v_element_content)
270
- cell_data = shared_strings[str_index].to_s
271
- elsif data_type=='str' #raw string
272
- cell_data = v_element_content
273
- elsif data_type=='e' #error
274
- cell_data = v_element_content
275
- else# (value.css('v').to_s != "") && (value.css('v').children.to_s != "") #is number
276
- data_type = ''
277
- if(v_element_content =~ /\./ or v_element_content =~ /\d+e\-?\d+/i) #is float
278
- cell_data = Float(v_element_content)
279
- else
280
- cell_data = Integer(v_element_content)
281
- end
282
- end
283
- # f is the formula element
284
- cell_formula = nil
285
- fmla_css = element_hash["f_element"]
286
- if fmla_css && fmla_css.content
287
- fmla_css_content= fmla_css.content
288
- if(fmla_css_content != "")
289
- cell_formula = fmla_css_content
290
- cell_formula_attr = {}
291
- fmla_css_attributes = fmla_css.attributes
292
- cell_formula_attr['t'] = fmla_css_attributes['t'].content if fmla_css_attributes['t']
293
- cell_formula_attr['ref'] = fmla_css_attributes['ref'].content if fmla_css_attributes['ref']
294
- cell_formula_attr['si'] = fmla_css_attributes['si'].content if fmla_css_attributes['si']
295
- end
296
- end
297
-
298
- style_index = value['s'].to_i #nil goes to 0 (default)
299
-
300
- wb.worksheets[i].sheet_data[cell_index[0]][cell_index[1]] =
301
- Cell.new(wb.worksheets[i],cell_index[0],cell_index[1],cell_data,cell_formula,
302
- data_type,style_index,cell_formula_attr)
303
- cell = wb.worksheets[i].sheet_data[cell_index[0]][cell_index[1]]
304
- end
305
- end
306
- end
307
-
308
- def Parser.decompress(file_path, skip_filename_check = false)
309
- #ensures it is an xlsx/xlsm file
310
- if(file_path =~ /(.+)\.xls(x|m)/)
311
- dir_path = $1.to_s
312
- else
313
- if skip_filename_check
314
- dir_path = file_path
315
- else
316
- raise 'Not .xlsx or .xlsm excel file'
317
- end
318
- end
319
-
320
- dir_path = File.join(File.dirname(dir_path), make_safe_name(Time.now.to_s))
321
- #copies excel file to zip file in same directory
322
- zip_path = dir_path + '.zip'
323
-
324
- FileUtils.cp(file_path,zip_path)
325
-
326
- MyZip.new.unzip(zip_path,dir_path)
327
- File.delete(zip_path)
328
-
329
- files = Hash.new
330
-
331
- files['app'] = Nokogiri::XML.parse(File.open(File.join(dir_path,'docProps','app.xml'),'r'))
332
- files['core'] = Nokogiri::XML.parse(File.open(File.join(dir_path,'docProps','core.xml'),'r'))
333
-
334
- files['workbook'] = Nokogiri::XML.parse(File.open(File.join(dir_path,'xl','workbook.xml'),'r'))
335
-
336
- if(File.exist?(File.join(dir_path,'xl','sharedStrings.xml')))
337
- files['sharedString'] = Nokogiri::XML.parse(File.open(File.join(dir_path,'xl','sharedStrings.xml'),'r'))
338
- end
339
-
340
- unless @data_only
341
- #preserves external links
342
- if File.directory?(File.join(dir_path,'xl','externalLinks'))
343
- files['externalLinks'] = {}
344
- ext_links_path = File.join(dir_path,'xl','externalLinks')
345
- FileUtils.mkdir_p(ext_links_path)
346
- files['externalLinks']['rels'] = []
347
- dir = Dir.new(ext_links_path).entries.reject {|f| [".", "..", ".DS_Store", "_rels"].include? f}
348
-
349
- dir.each_with_index do |link,i|
350
- files['externalLinks'][i+1] = File.read(File.join(ext_links_path,link))
351
- end
352
-
353
- if File.directory?(File.join(ext_links_path,'_rels'))
354
- dir = Dir.new(File.join(ext_links_path,'_rels')).entries.reject{|f| [".","..",".DS_Store"].include? f}
355
- dir.each_with_index do |rel,i|
356
- files['externalLinks']['rels'][i+1] = File.read(File.join(ext_links_path,'_rels',rel))
357
- end
358
- end
359
- end
360
-
361
- if File.directory?(File.join(dir_path,'xl','drawings'))
362
- files['drawings'] = {}
363
- drawings_path = File.join(dir_path,'xl','drawings','_rels')
364
- FileUtils.mkdir_p(drawings_path)
365
- dir = Dir.new(drawings_path).entries.reject {|f| [".", "..", ".DS_Store"].include? f}
366
- dir.each_with_index do |draw,i|
367
- files['drawings'][i+1] = File.read(File.join(drawings_path,draw))
368
- end
369
- end
370
-
371
- if File.directory?(File.join(dir_path,'xl','printerSettings'))
372
- files['printerSettings'] = {}
373
- printer_path = File.join(dir_path,'xl','printerSettings')
374
- FileUtils.mkdir_p(printer_path)
375
- dir = Dir.new(printer_path).entries.reject {|f| [".","..",".DS_Store"].include? f}
376
-
377
- dir.each_with_index do |print, i|
378
- files['printerSettings'][i+1] = File.open(File.join(printer_path,print), 'rb').read
379
- end
380
- end
381
-
382
- if File.directory?(File.join(dir_path,"xl",'worksheets','_rels'))
383
- files['worksheetRels'] = {}
384
- worksheet_rels_path = File.join(dir_path,'xl','worksheets','_rels')
385
- FileUtils.mkdir_p(worksheet_rels_path)
386
- dir = Dir.new(worksheet_rels_path).entries.reject {|f| [".","..",".DS_Store"].include? f}
387
- dir.each_with_index do |rel, i|
388
- files['worksheetRels'][i+1] = File.read(File.join(worksheet_rels_path,rel))
389
- end
390
- end
391
-
392
- if File.exist?(File.join(dir_path,'xl','vbaProject.bin'))
393
- files['vbaProject'] = File.open(File.join(dir_path,"xl","vbaProject.bin"),'rb').read
394
- end
395
- end
396
- files['styles'] = Nokogiri::XML.parse(File.open(File.join(dir_path,'xl','styles.xml'),'r'))
397
- @num_sheets = files['workbook'].css('sheets').children.size
398
- @num_sheets = Integer(@num_sheets)
399
-
400
- #adds all worksheet xml files to files hash
401
- i=1
402
- 1.upto(@num_sheets) do
403
- filename = 'sheet'+i.to_s
404
- files[i] = Nokogiri::XML.parse(File.open(File.join(dir_path,'xl','worksheets',filename+'.xml'),'r'))
405
- i=i+1
406
- end
407
-
408
- FileUtils.rm_rf(dir_path)
409
-
410
- return files
411
- end
412
-
413
- def Parser.fill_workbook(file_path, files)
414
- wb = Workbook.new([nil],file_path)
415
-
416
- unless @data_only
417
- wb.creator = files['core'].css('dc|creator').children.to_s
418
- wb.modifier = files['core'].css('cp|last_modified_by').children.to_s
419
- wb.created_at = files['core'].css('dcterms|created').children.to_s
420
- wb.modified_at = files['core'].css('dcterms|modified').children.to_s
421
-
422
- wb.company = files['app'].css('Company').children.to_s
423
- wb.application = files['app'].css('Application').children.to_s
424
- wb.appversion = files['app'].css('AppVersion').children.to_s
425
- end
426
-
427
- wb.shared_strings_XML = files['sharedString'].to_s
428
- wb.defined_names = files['workbook'].css('definedNames').to_s
429
- wb.date1904 = files['workbook'].css('workbookPr').attribute('date1904').to_s == '1'
430
-
431
- wb.worksheets = Array.new(@num_sheets) #array of Worksheet objs
432
- wb
433
- end
434
-
435
- #sheet_names, dimensions
436
- def Parser.create_matrix(wb,i, files)
437
- sheet_names = files['app'].css('TitlesOfParts vt|vector vt|lpstr').children
438
- sheet = Worksheet.new(wb,sheet_names[i].to_s,[])
439
-
440
- dimensions = files[i+1].css('dimension').attribute('ref').to_s
441
- if(dimensions =~ /^([A-Z]+\d+:)?([A-Z]+\d+)$/)
442
- index = convert_to_index($2)
443
-
444
- rows = index[0]+1
445
- cols = index[1]+1
446
-
447
- #creates matrix filled with nils
448
- rows.times {sheet.sheet_data << Array.new(cols)}
449
- else
450
- raise 'invalid file'
451
- end
452
- sheet
453
- end
454
-
455
- def Parser.safe_filename(name, allow_mb_chars=false)
456
- # "\w" represents [0-9A-Za-z_] plus any multi-byte char
457
- regexp = allow_mb_chars ? /[^\w]/ : /[^0-9a-zA-Z\_]/
458
- name.gsub(regexp, "_")
459
- end
460
-
461
- # Turns the passed in string into something safe for a filename
462
- def Parser.make_safe_name(name, allow_mb_chars=false)
463
- ext = safe_filename(File.extname(name), allow_mb_chars).gsub(/^_/, '.')
464
- "#{safe_filename(name.gsub(ext, ""), allow_mb_chars)}#{ext}".gsub(/\(/, '_').gsub(/\)/, '_').gsub(/__+/, '_').gsub(/^_/, '').gsub(/_$/, '')
465
- end
466
-
467
26
  end
468
27
  end