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
@@ -0,0 +1,106 @@
1
+ require 'rubyXL/objects/ooxml_object'
2
+ require 'rubyXL/objects/simple_types'
3
+ require 'rubyXL/objects/extensions'
4
+ require 'rubyXL/objects/relationships'
5
+ require 'rubyXL/objects/sheet_common'
6
+
7
+ # Query Tables
8
+ # https://msdn.microsoft.com/en-us/library/hh643563(v=office.12).aspx
9
+
10
+ module RubyXL
11
+ # http://www.datypic.com/sc/ooxml/e-ssml_queryTableField-1.html
12
+ class QueryTableField < OOXMLObject
13
+ define_attribute(:id, :uint, :required => true)
14
+ define_attribute(:name, RubyXL::ST_Xstring)
15
+ define_attribute(:dataBound, :bool, :default => true)
16
+ define_attribute(:rowNumbers, :bool, :default => false)
17
+ define_attribute(:fillFormulas, :bool, :default => false)
18
+ define_attribute(:clipped, :bool, :default => false)
19
+ define_attribute(:tableColumnId, :uint, :default => 0)
20
+
21
+ define_child_node(RubyXL::ExtensionStorageArea)
22
+
23
+ define_element_name 'queryTableField'
24
+ end
25
+
26
+ # http://www.datypic.com/sc/ooxml/e-ssml_queryTableFields-1.html
27
+ class QueryTableFields < OOXMLObject
28
+ define_child_node(RubyXL::QueryTableField, :collection => :with_count,
29
+ :accessor => :fields, :node_name => :queryTableField)
30
+ define_element_name 'queryTableFields'
31
+ end
32
+
33
+ # http://www.datypic.com/sc/ooxml/e-ssml_deletedField-1.html
34
+ class QueryTableDeletedField < OOXMLObject
35
+ define_attribute(:name, RubyXL::ST_Xstring, :required => true)
36
+
37
+ define_element_name 'deletedField'
38
+ end
39
+
40
+ # http://www.datypic.com/sc/ooxml/e-ssml_queryTableDeletedFields-1.html
41
+ class QueryTableDeletedFields < OOXMLObject
42
+ define_child_node(RubyXL::QueryTableDeletedField, :collection => :with_count,
43
+ :accessor => :deleted_fields, :node_name => :deletedField)
44
+ define_element_name 'queryTableDeletedFields'
45
+ end
46
+
47
+ # http://www.datypic.com/sc/ooxml/e-ssml_queryTableRefresh-1.html
48
+ class QueryTableRefresh < OOXMLObject
49
+ define_attribute(:preserveSortFilterLayout, :bool, :default => true)
50
+ define_attribute(:fieldIdWrapped, :bool, :default => false)
51
+ define_attribute(:headersInLastRefresh, :bool, :default => true)
52
+ define_attribute(:minimumVersion, :uint, :default => 0)
53
+ define_attribute(:nextId, :uint, :default => 1)
54
+ define_attribute(:unboundColumnsLeft, :uint, :default => 0)
55
+ define_attribute(:unboundColumnsRight, :uint, :default => 0)
56
+
57
+ define_child_node(RubyXL::QueryTableFields) # [1..1]
58
+ define_child_node(RubyXL::QueryTableDeletedFields)
59
+ define_child_node(RubyXL::SortState)
60
+ define_child_node(RubyXL::ExtensionStorageArea)
61
+
62
+ define_element_name 'queryTableRefresh'
63
+ end
64
+
65
+ # http://www.datypic.com/sc/ooxml/e-ssml_queryTable.html
66
+ class QueryTable < OOXMLTopLevelObject
67
+ CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml'.freeze
68
+ REL_TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/queryTable'.freeze
69
+
70
+ include RubyXL::RelationshipSupport
71
+
72
+ define_attribute(:name, RubyXL::ST_Xstring, :required => true)
73
+ define_attribute(:headers, :bool, :default => true)
74
+ define_attribute(:rowNumbers, :bool, :default => false)
75
+ define_attribute(:disableRefresh, :bool, :default => false)
76
+ define_attribute(:backgroundRefresh, :bool, :default => true)
77
+ define_attribute(:firstBackgroundRefresh, :bool, :default => false)
78
+ define_attribute(:refreshOnLoad, :bool, :default => false)
79
+ define_attribute(:growShrinkType, RubyXL::ST_GrowShrinkType, :default => 'insertDelete')
80
+ define_attribute(:fillFormulas, :bool, :default => false)
81
+ define_attribute(:removeDataOnSave, :bool, :default => false)
82
+ define_attribute(:disableEdit, :bool, :default => false)
83
+ define_attribute(:preserveFormatting, :bool, :default => true)
84
+ define_attribute(:adjustColumnWidth, :bool, :default => true)
85
+ define_attribute(:intermediate, :bool, :default => false)
86
+ define_attribute(:connectionId, :uint, :required => true)
87
+ define_attribute(:autoFormatId, :uint)
88
+ define_attribute(:applyNumberFormats, :bool)
89
+ define_attribute(:applyBorderFormats, :bool)
90
+ define_attribute(:applyFontFormats, :bool)
91
+ define_attribute(:applyPatternFormats, :bool)
92
+ define_attribute(:applyAlignmentFormats, :bool)
93
+ define_attribute(:applyWidthHeightFormats, :bool)
94
+
95
+ define_child_node(RubyXL::QueryTableRefresh)
96
+ define_child_node(RubyXL::ExtensionStorageArea)
97
+
98
+ define_element_name 'queryTable'
99
+ set_namespaces('http://schemas.openxmlformats.org/spreadsheetml/2006/main' => nil,
100
+ 'http://schemas.openxmlformats.org/officeDocument/2006/relationships' => 'r')
101
+
102
+ def xlsx_path
103
+ ROOT.join('xl', 'queryTables', "queryTable#{file_index}.xml")
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,119 @@
1
+ module RubyXL
2
+ class Reference
3
+ ROW_MAX = 1024 * 1024
4
+ COL_MAX = 16393
5
+
6
+ attr_reader :row_range, :col_range
7
+
8
+ # RubyXL::Reference.new(row, col)
9
+ # RubyXL::Reference.new(row_from, row_to, col_from, col_to)
10
+ # RubyXL::Reference.new(reference_string)
11
+ # RubyXL::Reference.new(row_from:, row_to:, col_from:, col_to:)
12
+ def initialize(*params)
13
+ row_from = row_to = col_from = col_to = nil
14
+
15
+ case params.size
16
+ when 4 then row_from, row_to, col_from, col_to = params
17
+ when 2 then row_from, col_from = params
18
+ when 1 then
19
+ case params.first
20
+ when Hash then
21
+ row_from, row_to, col_from, col_to = params.first.fetch_values(:row_from, :row_to, :col_from, :col_to)
22
+ when String then
23
+ from, to = params[0].split(':')
24
+ row_from, col_from = self.class.ref2ind(from)
25
+ row_to, col_to = self.class.ref2ind(to) unless to.nil?
26
+ else
27
+ raise ArgumentError.new("invalid value for #{self.class}: #{params[0].inspect}") unless params[0].is_a?(String)
28
+ end
29
+ end
30
+
31
+ @row_range = Range.new(row_from || 0, row_to || row_from || ROW_MAX)
32
+ @col_range = Range.new(col_from || 0, col_to || col_from || COL_MAX)
33
+ end
34
+
35
+ def single_cell?
36
+ (@row_range.begin == @row_range.end) && (@col_range.begin == @col_range.end)
37
+ end
38
+
39
+ def valid?
40
+ !(row_range.begin.negative? || col_range.begin.negative?)
41
+ end
42
+
43
+ def first_row
44
+ @row_range.begin
45
+ end
46
+
47
+ def last_row
48
+ @row_range.end
49
+ end
50
+
51
+ def first_col
52
+ @col_range.begin
53
+ end
54
+
55
+ def last_col
56
+ @col_range.end
57
+ end
58
+
59
+ def ==(other)
60
+ !other.nil? && (@row_range == other.row_range) && (@col_range == other.col_range)
61
+ end
62
+
63
+ def cover?(other)
64
+ !other.nil? && (@row_range.cover?(other.row_range.begin) &&
65
+ @row_range.cover?(other.row_range.end) &&
66
+ @col_range.cover?(other.col_range.begin) &&
67
+ @col_range.cover?(other.col_range.end))
68
+ end
69
+
70
+ def to_s
71
+ if single_cell? then
72
+ self.class.ind2ref(@row_range.begin, @col_range.begin)
73
+ else
74
+ self.class.ind2ref(@row_range.begin, @col_range.begin) + ':' +
75
+ self.class.ind2ref(@row_range.end, @col_range.end)
76
+ end
77
+ end
78
+
79
+ def inspect
80
+ if single_cell? then
81
+ "#<#{self.class} @row=#{@row_range.begin} @col=#{@col_range.begin}>"
82
+ else
83
+ "#<#{self.class} @row_range=#{@row_range} @col_range=#{@col_range}>"
84
+ end
85
+ end
86
+
87
+ # Converts +row+ and +col+ zero-based indices to Excel-style cell reference
88
+ # <0> A...Z, AA...AZ, BA... ...ZZ, AAA... ...AZZ, BAA... ...XFD <16383>
89
+ def self.ind2ref(row = 0, col = 0)
90
+ str = ''
91
+
92
+ loop do
93
+ x = col % 26
94
+ str = ('A'.ord + x).chr + str
95
+ col = (col / 26).floor - 1
96
+ break if col < 0
97
+ end
98
+
99
+ str += (row + 1).to_s
100
+ end
101
+
102
+ # Converts Excel-style cell reference to +row+ and +col+ zero-based indices.
103
+ def self.ref2ind(str)
104
+ return [ -1, -1 ] unless str =~ /\A([A-Z]+)(\d+)\Z/
105
+ [ Regexp.last_match(2).to_i - 1,
106
+ Regexp.last_match(1).each_byte.inject(0) { |col, chr| (col * 26) + (chr - 64) } - 1 ]
107
+ end
108
+ end
109
+
110
+ class Sqref < Array
111
+ def initialize(str)
112
+ str.split.each { |ref_str| self << RubyXL::Reference.new(ref_str) }
113
+ end
114
+
115
+ def to_s
116
+ self.collect(&:to_s).join(' ')
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,213 @@
1
+ require 'pathname'
2
+ require 'rubyXL/objects/ooxml_object'
3
+
4
+ module RubyXL
5
+ class RID < OOXMLObject
6
+ define_relationship(:required => true)
7
+ end
8
+
9
+ class Relationship < OOXMLObject
10
+ define_attribute(:Id, :string)
11
+ define_attribute(:Type, :string)
12
+ define_attribute(:Target, :string)
13
+ define_attribute(:TargetMode, :string)
14
+ define_element_name 'Relationship'
15
+ end
16
+
17
+ class OOXMLRelationshipsFile < OOXMLTopLevelObject
18
+ CONTENT_TYPE = 'application/vnd.openxmlformats-package.relationships+xml'.freeze
19
+ SAVE_ORDER = 100
20
+
21
+ define_child_node(RubyXL::Relationship, :collection => true, :accessor => :relationships)
22
+ define_element_name 'Relationships'
23
+ set_namespaces('http://schemas.openxmlformats.org/package/2006/relationships' => nil)
24
+
25
+ attr_accessor :related_files, :owner
26
+
27
+ @@debug_indent = ($DEBUG ? 0 : nil)
28
+
29
+ def new_relationship(target, type)
30
+ RubyXL::Relationship.new(:id => "rId#{relationships.size + 1}",
31
+ :type => type,
32
+ :target => target)
33
+ end
34
+ protected :new_relationship
35
+
36
+ def add_relationship(obj)
37
+ return if obj.nil? || !defined?(obj.class::REL_TYPE) || (obj.respond_to?(:empty?) && obj.empty?)
38
+
39
+ relationships << RubyXL::Relationship.new(:id => "rId#{relationships.size + 1}",
40
+ :type => obj.class::REL_TYPE,
41
+ :target => obj.xlsx_path.relative_path_from(owner.xlsx_path.dirname))
42
+ end
43
+ protected :add_relationship
44
+
45
+ def find_by_rid(r_id)
46
+ relationships.find { |r| r.id == r_id }
47
+ end
48
+
49
+ def find_by_target(target)
50
+ relationships.find { |r|
51
+ (r.target == target) || (r.target == target.relative_path_from(owner.xlsx_path.dirname))
52
+ }
53
+ end
54
+
55
+ def self.get_class_by_rel_type(rel_type)
56
+ unless defined?(@@rel_hash)
57
+ @@rel_hash = {}
58
+ RubyXL.constants.each { |c|
59
+ klass = RubyXL.const_get(c)
60
+
61
+ if klass.is_a?(Class) && klass.const_defined?(:REL_TYPE) then
62
+ @@rel_hash[klass::REL_TYPE] = klass
63
+ end
64
+ }
65
+ end
66
+
67
+ @@rel_hash[rel_type]
68
+ end
69
+
70
+ def load_related_files(zipdir_path, base_file_name)
71
+ self.related_files = {}
72
+
73
+ @@debug_indent += 2 if @@debug_indent
74
+
75
+ self.relationships.each { |rel|
76
+ next if rel.target_mode == 'External'
77
+
78
+ file_path = ::Pathname.new(rel.target)
79
+ file_path = (base_file_name.dirname + file_path).cleanpath if file_path.relative?
80
+
81
+ klass = RubyXL::OOXMLRelationshipsFile.get_class_by_rel_type(rel.type)
82
+
83
+ if klass.nil? then
84
+ if !RubyXL.class_variable_get(:@@suppress_warnings) then
85
+ puts "*** WARNING: storage class not found for #{rel.target} (#{rel.type})"
86
+ end
87
+
88
+ klass = GenericStorageObject
89
+ end
90
+
91
+ puts "--> DEBUG:#{' ' * @@debug_indent}Loading #{klass} (#{rel.id}): #{file_path}" if @@debug_indent
92
+
93
+ obj = klass.parse_file(zipdir_path, file_path)
94
+ obj.load_relationships(zipdir_path, file_path) if obj.respond_to?(:load_relationships)
95
+ self.related_files[rel.id] = obj
96
+ }
97
+
98
+ @@debug_indent -= 2 if @@debug_indent
99
+
100
+ related_files
101
+ end
102
+
103
+ def self.load_relationship_file(zipdir_path, base_file_path)
104
+ rel_file_path = rel_file_path(base_file_path)
105
+
106
+ puts "--> DEBUG: #{' ' * @@debug_indent}Loading .rel file: #{rel_file_path}" if @@debug_indent
107
+
108
+ parse_file(zipdir_path, rel_file_path)
109
+ end
110
+
111
+ def xlsx_path
112
+ self.class.rel_file_path(owner.xlsx_path)
113
+ end
114
+
115
+ def before_write_xml
116
+ case owner
117
+ when RubyXL::WorkbookRoot, RubyXL::Workbook then
118
+ # Fully implemented objects with no generic (unhandled) relationships -
119
+ # (re)generating relationships from scratch.
120
+ related_objects = owner.related_objects
121
+ related_objects += owner.generic_storage if owner.generic_storage
122
+
123
+ self.relationships = []
124
+ related_objects.compact.each { |f| add_relationship(f) }
125
+ end
126
+ super
127
+ end
128
+
129
+ def self.rel_file_path(base_file_path)
130
+ basename = base_file_path.root? ? '' : base_file_path.basename
131
+ base_file_path.dirname.join('_rels', "#{basename}.rels").cleanpath
132
+ end
133
+ end
134
+
135
+ # +RelationshipSupport+ module enables automatic loading and saving of _rels for the respective file
136
+ module RelationshipSupport
137
+ module ClassMehods
138
+ def define_relationship(klass, accessor = nil)
139
+ class_variable_get(:@@ooxml_relationships)[klass] = accessor
140
+ attr_accessor(accessor) if accessor
141
+ end
142
+ end
143
+
144
+ def self.included(klass)
145
+ klass.class_variable_set(:@@ooxml_relationships, {})
146
+ klass.extend RubyXL::RelationshipSupport::ClassMehods
147
+ end
148
+
149
+ attr_accessor :generic_storage, :relationship_container
150
+
151
+ def related_objects # Override this method
152
+ []
153
+ end
154
+
155
+ def collect_related_objects
156
+ res = related_objects.compact # Avoid tainting +related_objects+ array
157
+ res.concat(generic_storage) if generic_storage
158
+
159
+ if relationship_container then
160
+ relationship_container.owner = self
161
+ res << relationship_container
162
+ end
163
+
164
+ related = []
165
+
166
+ res.each { |obj|
167
+ next if obj.respond_to?(:empty?) && obj.empty?
168
+ related << obj
169
+ related.concat(obj.collect_related_objects) if obj.respond_to?(:collect_related_objects)
170
+ }
171
+
172
+ related
173
+ end
174
+
175
+ def load_relationships(dir_path, base_file_name)
176
+ self.relationship_container = RubyXL::OOXMLRelationshipsFile.load_relationship_file(dir_path, base_file_name)
177
+ return if relationship_container.nil?
178
+
179
+ relationship_container.load_related_files(dir_path, base_file_name).each_pair { |rid, related_file|
180
+ attach_relationship(rid, related_file) if related_file
181
+ }
182
+ end
183
+
184
+ def attach_relationship(rid, rf)
185
+ relationships = self.class.class_variable_get(:@@ooxml_relationships)
186
+ klass = rf.class
187
+ if relationships.has_key?(klass) then
188
+ accessor = relationships[klass]
189
+ case accessor
190
+ when NilClass then
191
+ # Relationship is known, but we don't have a special accessor for it, store as generic
192
+ store_relationship(rf)
193
+ when false then
194
+ # Do nothing, the code will perform attaching on its own
195
+ else
196
+ container = self.send(accessor)
197
+ if container.is_a?(Array) then container << rf
198
+ else self.send("#{accessor}=", rf)
199
+ end
200
+ end
201
+ else store_relationship(rf, :unknown)
202
+ end
203
+ end
204
+
205
+ def store_relationship(related_file, unknown = false)
206
+ self.generic_storage ||= []
207
+ if unknown && !RubyXL.class_variable_get(:@@suppress_warnings) then
208
+ puts "WARNING: #{self.class} is not aware how to process #{related_file.class}"
209
+ end
210
+ self.generic_storage << related_file
211
+ end
212
+ end
213
+ end
@@ -0,0 +1,84 @@
1
+ require 'zip'
2
+ require 'rubyXL/objects/relationships'
3
+ require 'rubyXL/objects/document_properties'
4
+ require 'rubyXL/objects/content_types'
5
+ require 'rubyXL/objects/workbook'
6
+
7
+ module RubyXL
8
+ class WorkbookRoot
9
+ @@debug = $DEBUG
10
+
11
+ attr_accessor :source_file_path, :content_types, :rels_hash
12
+
13
+ include RubyXL::RelationshipSupport
14
+
15
+ define_relationship(RubyXL::ThumbnailFile, :thumbnail)
16
+ define_relationship(RubyXL::CorePropertiesFile, :core_properties)
17
+ define_relationship(RubyXL::DocumentPropertiesFile, :document_properties)
18
+ define_relationship(RubyXL::CustomPropertiesFile, :custom_properties)
19
+ define_relationship(RubyXL::Workbook, :workbook)
20
+
21
+ def related_objects
22
+ [ content_types, thumbnail, core_properties, document_properties, custom_properties, workbook ]
23
+ end
24
+
25
+ def self.default
26
+ obj = self.new
27
+ obj.document_properties = RubyXL::DocumentPropertiesFile.new
28
+ obj.core_properties = RubyXL::CorePropertiesFile.new
29
+ obj.relationship_container = RubyXL::OOXMLRelationshipsFile.new
30
+ obj.content_types = RubyXL::ContentTypes.new
31
+ obj
32
+ end
33
+
34
+ # Write <tt>.xlsx</tt> to a stream (useful for sending over HTTP)
35
+ def stream
36
+ stream = Zip::OutputStream.write_buffer { |zipstream|
37
+ self.rels_hash = {}
38
+ self.relationship_container.owner = self
39
+ collect_related_objects.compact.each { |obj|
40
+ puts "<-- DEBUG: adding relationship to #{obj.class}" if @@debug
41
+ obj.root = self if obj.respond_to?(:root=)
42
+ self.rels_hash[obj.class] ||= []
43
+ self.rels_hash[obj.class] << obj
44
+ }
45
+
46
+ self.rels_hash.keys.sort_by{ |c| c::SAVE_ORDER }.each { |klass|
47
+ puts "<-- DEBUG: saving related #{klass} files" if @@debug
48
+ self.rels_hash[klass].select! { |obj|
49
+ puts "<-- DEBUG: > #{obj.xlsx_path}" if @@debug
50
+ obj.add_to_zip(zipstream)
51
+ }
52
+ }
53
+ }
54
+ stream.rewind
55
+ stream
56
+ end
57
+
58
+ def xlsx_path
59
+ OOXMLTopLevelObject::ROOT
60
+ end
61
+
62
+ def self.parse_zip_file(zip_file)
63
+ root = self.new
64
+ root.content_types = RubyXL::ContentTypes.parse_file(zip_file, ContentTypes::XLSX_PATH)
65
+ root.load_relationships(zip_file, OOXMLTopLevelObject::ROOT)
66
+
67
+ wb = root.workbook
68
+ wb.root = root
69
+
70
+ wb.sheets.each_with_index { |sheet, i|
71
+ sheet_obj = wb.relationship_container.related_files[sheet.r_id]
72
+
73
+ wb.worksheets[i] = sheet_obj # Must be done first so the sheet becomes aware of its number
74
+ sheet_obj.workbook = wb
75
+
76
+ sheet_obj.sheet_name = sheet.name
77
+ sheet_obj.sheet_id = sheet.sheet_id
78
+ sheet_obj.state = sheet.state
79
+ }
80
+
81
+ root
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,67 @@
1
+ require 'rubyXL/objects/ooxml_object'
2
+ require 'rubyXL/objects/text'
3
+ require 'rubyXL/objects/extensions'
4
+
5
+ module RubyXL
6
+ # http://www.datypic.com/sc/ooxml/e-ssml_sst.html
7
+ class SharedStringsTable < OOXMLTopLevelObject
8
+ CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml'.freeze
9
+ REL_TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings'.freeze
10
+
11
+ # According to http://msdn.microsoft.com/en-us/library/office/gg278314.aspx,
12
+ # +count+ and +uniqueCount+ may be either both missing, or both present. Need to validate.
13
+ define_attribute(:uniqueCount, :int)
14
+ define_child_node(RubyXL::RichText, :collection => :with_count, :node_name => 'si', :accessor => :strings)
15
+ define_child_node(RubyXL::ExtensionStorageArea)
16
+ define_element_name 'sst'
17
+ set_namespaces('http://schemas.openxmlformats.org/spreadsheetml/2006/main' => nil)
18
+
19
+ def initialize(*params)
20
+ super
21
+ # So far, going by the structure that the original creator had in mind. However,
22
+ # since the actual implementation is now extracted into a separate class,
23
+ # we will be able to transparently change it later if needs be.
24
+ @index_by_content = {}
25
+ end
26
+
27
+ def before_write_xml
28
+ super
29
+ self.unique_count = self.count
30
+ self.count > 0
31
+ end
32
+
33
+ def [](index)
34
+ strings[index]
35
+ end
36
+
37
+ def empty?
38
+ strings.empty?
39
+ end
40
+
41
+ def add(v, index = nil)
42
+ index ||= strings.size
43
+
44
+ strings[index] =
45
+ case v
46
+ when RubyXL::RichText then v
47
+ when String then RubyXL::RichText.new(:t => RubyXL::Text.new(:value => v))
48
+ when RubyXL::Text then RubyXL::RichText.new(:t => v)
49
+ when RubyXL::RichTextRun then RubyXL::RichText.new(:r => [ v ])
50
+ when RubyXL::PhoneticRun then RubyXL::RichText.new(:r_ph => [ v ])
51
+ when RubyXL::PhoneticProperties then RubyXL::RichText.new(:phonetic_pr => v)
52
+ end
53
+
54
+ @index_by_content[v.to_s] = index
55
+ end
56
+
57
+ def get_index(str, add_if_missing = false)
58
+ index = @index_by_content[str]
59
+ index = add(str) if index.nil? && add_if_missing
60
+ index
61
+ end
62
+
63
+ def xlsx_path
64
+ ROOT.join('xl', 'sharedStrings.xml')
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,49 @@
1
+ require 'rubyXL/objects/ooxml_object'
2
+ require 'rubyXL/objects/storage'
3
+
4
+ module RubyXL
5
+ # http://www.datypic.com/sc/ooxml/e-ssml_webPublishItem-1.html
6
+ class WebPublishingItem < OOXMLObject
7
+ define_attribute(:id, :int, :required => true)
8
+ define_attribute(:divId, :int, :required => true)
9
+ define_attribute(:sourceType, RubyXL::ST_WebSourceType, :required => true)
10
+ define_attribute(:sourceRef, :ref)
11
+ define_attribute(:sourceObject, :string)
12
+ define_attribute(:destinationFile, :string, :required => true)
13
+ define_attribute(:title, :string)
14
+ define_attribute(:autoRepublish, :bool, :default => false)
15
+ define_element_name 'webPublishItem'
16
+ end
17
+
18
+ # http://www.datypic.com/sc/ooxml/e-ssml_webPublishItems-1.html
19
+ class WebPublishingItems < OOXMLContainerObject
20
+ define_child_node(RubyXL::WebPublishingItem, :collection => :with_count)
21
+ define_element_name 'webPublishItems'
22
+ end
23
+
24
+ # http://www.datypic.com/sc/ooxml/e-ssml_pageMargins-1.html
25
+ class PageMargins < OOXMLObject
26
+ define_attribute(:left, :double, :required => true)
27
+ define_attribute(:right, :double, :required => true)
28
+ define_attribute(:top, :double, :required => true)
29
+ define_attribute(:bottom, :double, :required => true)
30
+ define_attribute(:header, :double, :required => true)
31
+ define_attribute(:footer, :double, :required => true)
32
+ define_element_name 'pageMargins'
33
+ end
34
+
35
+ # http://www.datypic.com/sc/ooxml/e-ssml_headerFooter-1.html
36
+ class HeaderFooterSettings < OOXMLObject
37
+ define_attribute(:differentOddEven, :bool, :default => false)
38
+ define_attribute(:differentFirst, :bool, :default => false)
39
+ define_attribute(:scaleWithDoc, :bool, :default => true)
40
+ define_attribute(:alignWithMargins, :bool, :default => true)
41
+ define_child_node(RubyXL::StringNode, :node_name => :oddHeader)
42
+ define_child_node(RubyXL::StringNode, :node_name => :oddFooter)
43
+ define_child_node(RubyXL::StringNode, :node_name => :evenHeader)
44
+ define_child_node(RubyXL::StringNode, :node_name => :evenFooter)
45
+ define_child_node(RubyXL::StringNode, :node_name => :firstHeader)
46
+ define_child_node(RubyXL::StringNode, :node_name => :firstFooter)
47
+ define_element_name 'headerFooter'
48
+ end
49
+ end