rubyXL 3.3.21 → 3.4.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (456) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +60 -0
  3. data/.codeclimate.yml +3 -0
  4. data/Gemfile +3 -2
  5. data/Gemfile.lock +96 -0
  6. data/LICENSE.txt +1 -1
  7. data/README.rdoc +47 -16
  8. data/Rakefile +3 -2
  9. data/VERSION +1 -1
  10. data/lib/rubyXL.rb +1 -0
  11. data/lib/rubyXL/cell.rb +1 -26
  12. data/lib/rubyXL/convenience_methods.rb +5 -982
  13. data/lib/rubyXL/convenience_methods/cell.rb +272 -0
  14. data/lib/rubyXL/convenience_methods/color.rb +160 -0
  15. data/lib/rubyXL/convenience_methods/font.rb +63 -0
  16. data/lib/rubyXL/convenience_methods/workbook.rb +136 -0
  17. data/lib/rubyXL/convenience_methods/worksheet.rb +710 -0
  18. data/lib/rubyXL/objects/border.rb +31 -3
  19. data/lib/rubyXL/objects/calculation_chain.rb +2 -2
  20. data/lib/rubyXL/objects/cell_style.rb +8 -8
  21. data/lib/rubyXL/objects/chartsheet.rb +10 -10
  22. data/lib/rubyXL/objects/color.rb +6 -4
  23. data/lib/rubyXL/objects/column_range.rb +10 -10
  24. data/lib/rubyXL/objects/comments.rb +6 -6
  25. data/lib/rubyXL/objects/connection.rb +175 -0
  26. data/lib/rubyXL/objects/container_nodes.rb +2 -2
  27. data/lib/rubyXL/objects/content_types.rb +2 -2
  28. data/lib/rubyXL/objects/data_validation.rb +4 -2
  29. data/lib/rubyXL/objects/document_properties.rb +3 -3
  30. data/lib/rubyXL/objects/extensions.rb +20 -3
  31. data/lib/rubyXL/objects/external_links.rb +26 -2
  32. data/lib/rubyXL/objects/fill.rb +4 -4
  33. data/lib/rubyXL/objects/filters.rb +12 -12
  34. data/lib/rubyXL/objects/font.rb +2 -60
  35. data/lib/rubyXL/objects/formula.rb +1 -1
  36. data/lib/rubyXL/objects/ooxml_object.rb +15 -3
  37. data/lib/rubyXL/objects/query_table.rb +104 -0
  38. data/lib/rubyXL/objects/relationships.rb +8 -3
  39. data/lib/rubyXL/objects/shared_strings.rb +1 -1
  40. data/lib/rubyXL/objects/sheet_common.rb +4 -4
  41. data/lib/rubyXL/objects/sheet_data.rb +48 -11
  42. data/lib/rubyXL/objects/simple_types.rb +18 -0
  43. data/lib/rubyXL/objects/storage.rb +25 -1
  44. data/lib/rubyXL/objects/stylesheet.rb +14 -14
  45. data/lib/rubyXL/objects/text.rb +8 -8
  46. data/lib/rubyXL/objects/theme.rb +138 -119
  47. data/lib/rubyXL/objects/workbook.rb +153 -43
  48. data/lib/rubyXL/objects/worksheet.rb +118 -107
  49. data/lib/rubyXL/worksheet.rb +19 -13
  50. data/rdoc/README_rdoc.html +109 -103
  51. data/rdoc/RubyXL.html +39 -296
  52. data/rdoc/RubyXL/AExtension.html +21 -60
  53. data/rdoc/RubyXL/AExtensionStorageArea.html +12 -17
  54. data/rdoc/RubyXL/ActiveX.html +154 -0
  55. data/rdoc/RubyXL/ActiveXBinary.html +106 -0
  56. data/rdoc/RubyXL/AdjustHandleList.html +13 -19
  57. data/rdoc/RubyXL/Alignment.html +13 -19
  58. data/rdoc/RubyXL/AlternateContent.html +12 -17
  59. data/rdoc/RubyXL/Authors.html +13 -19
  60. data/rdoc/RubyXL/AutoFilter.html +13 -19
  61. data/rdoc/RubyXL/AutoFilterColumn.html +13 -19
  62. data/rdoc/RubyXL/BinaryImageFile.html +12 -25
  63. data/rdoc/RubyXL/BodyProperties.html +13 -19
  64. data/rdoc/RubyXL/BooleanNode.html +12 -17
  65. data/rdoc/RubyXL/BooleanValue.html +12 -17
  66. data/rdoc/RubyXL/Border.html +76 -53
  67. data/rdoc/RubyXL/BorderEdge.html +71 -17
  68. data/rdoc/RubyXL/Borders.html +19 -39
  69. data/rdoc/RubyXL/Break.html +13 -19
  70. data/rdoc/RubyXL/BreakList.html +13 -19
  71. data/rdoc/RubyXL/CT_AdjPoint2D.html +13 -19
  72. data/rdoc/RubyXL/CT_AlphaBiLevelEffect.html +13 -19
  73. data/rdoc/RubyXL/CT_AlphaModulateEffect.html +13 -19
  74. data/rdoc/RubyXL/CT_AlphaModulateFixedEffect.html +13 -19
  75. data/rdoc/RubyXL/CT_AlphaOutsetEffect.html +13 -19
  76. data/rdoc/RubyXL/CT_AlphaReplaceEffect.html +13 -19
  77. data/rdoc/RubyXL/CT_Backdrop.html +13 -19
  78. data/rdoc/RubyXL/CT_Bevel.html +13 -19
  79. data/rdoc/RubyXL/CT_BiLevelEffect.html +13 -19
  80. data/rdoc/RubyXL/CT_BlendEffect.html +13 -19
  81. data/rdoc/RubyXL/CT_Blip.html +13 -19
  82. data/rdoc/RubyXL/CT_BlipFillProperties.html +13 -19
  83. data/rdoc/RubyXL/CT_BlurEffect.html +13 -19
  84. data/rdoc/RubyXL/CT_Camera.html +13 -19
  85. data/rdoc/RubyXL/CT_Color.html +13 -19
  86. data/rdoc/RubyXL/CT_ColorChangeEffect.html +13 -19
  87. data/rdoc/RubyXL/CT_ColorMapping.html +13 -19
  88. data/rdoc/RubyXL/CT_ColorScheme.html +13 -19
  89. data/rdoc/RubyXL/CT_ColorSchemeAndMapping.html +13 -19
  90. data/rdoc/RubyXL/CT_ConnectionSite.html +13 -19
  91. data/rdoc/RubyXL/CT_ConnectionSiteList.html +13 -19
  92. data/rdoc/RubyXL/CT_DashStop.html +13 -19
  93. data/rdoc/RubyXL/CT_DashStopList.html +13 -19
  94. data/rdoc/RubyXL/CT_DefaultShapeDefinition.html +13 -19
  95. data/rdoc/RubyXL/CT_DuotoneEffect.html +13 -19
  96. data/rdoc/RubyXL/CT_EffectContainer.html +13 -19
  97. data/rdoc/RubyXL/CT_EffectList.html +13 -19
  98. data/rdoc/RubyXL/CT_EffectReference.html +13 -19
  99. data/rdoc/RubyXL/CT_EffectStyleItem.html +13 -19
  100. data/rdoc/RubyXL/CT_EffectStyleList.html +13 -19
  101. data/rdoc/RubyXL/CT_EmbeddedWAVAudioFile.html +13 -19
  102. data/rdoc/RubyXL/CT_FillEffect.html +13 -19
  103. data/rdoc/RubyXL/CT_FillOverlayEffect.html +13 -19
  104. data/rdoc/RubyXL/CT_FillStyleList.html +13 -19
  105. data/rdoc/RubyXL/CT_FlatText.html +13 -19
  106. data/rdoc/RubyXL/CT_FontCollection.html +13 -19
  107. data/rdoc/RubyXL/CT_FontReference.html +13 -19
  108. data/rdoc/RubyXL/CT_GeomGuideList.html +13 -19
  109. data/rdoc/RubyXL/CT_GlowEffect.html +13 -19
  110. data/rdoc/RubyXL/CT_GradientFillProperties.html +13 -19
  111. data/rdoc/RubyXL/CT_GradientStop.html +13 -19
  112. data/rdoc/RubyXL/CT_GradientStopList.html +13 -19
  113. data/rdoc/RubyXL/CT_HSLEffect.html +13 -19
  114. data/rdoc/RubyXL/CT_HslColor.html +13 -19
  115. data/rdoc/RubyXL/CT_Hyperlink.html +13 -19
  116. data/rdoc/RubyXL/CT_InnerShadowEffect.html +13 -19
  117. data/rdoc/RubyXL/CT_LightRig.html +13 -19
  118. data/rdoc/RubyXL/CT_LineEndProperties.html +13 -19
  119. data/rdoc/RubyXL/CT_LineJoinMiterProperties.html +13 -19
  120. data/rdoc/RubyXL/CT_LineProperties.html +13 -19
  121. data/rdoc/RubyXL/CT_LineStyleList.html +13 -19
  122. data/rdoc/RubyXL/CT_LinearShadeProperties.html +13 -19
  123. data/rdoc/RubyXL/CT_LuminanceEffect.html +13 -19
  124. data/rdoc/RubyXL/CT_ObjectStyleDefaults.html +13 -19
  125. data/rdoc/RubyXL/CT_OuterShadowEffect.html +13 -19
  126. data/rdoc/RubyXL/CT_Path2D.html +13 -19
  127. data/rdoc/RubyXL/CT_Path2DArcTo.html +13 -19
  128. data/rdoc/RubyXL/CT_Path2DCubicBezierTo.html +13 -19
  129. data/rdoc/RubyXL/CT_Path2DList.html +13 -19
  130. data/rdoc/RubyXL/CT_Path2DQuadBezierTo.html +13 -19
  131. data/rdoc/RubyXL/CT_Path2DTo.html +13 -19
  132. data/rdoc/RubyXL/CT_PathShadeProperties.html +13 -19
  133. data/rdoc/RubyXL/CT_PatternFillProperties.html +13 -19
  134. data/rdoc/RubyXL/CT_Point3D.html +13 -19
  135. data/rdoc/RubyXL/CT_PolarAdjustHandle.html +13 -19
  136. data/rdoc/RubyXL/CT_PresetColor.html +13 -19
  137. data/rdoc/RubyXL/CT_PresetLineDashProperties.html +13 -19
  138. data/rdoc/RubyXL/CT_PresetShadowEffect.html +13 -19
  139. data/rdoc/RubyXL/CT_PresetTextShape.html +13 -19
  140. data/rdoc/RubyXL/CT_ReflectionEffect.html +13 -19
  141. data/rdoc/RubyXL/CT_RelativeOffsetEffect.html +13 -19
  142. data/rdoc/RubyXL/CT_RelativeRect.html +13 -19
  143. data/rdoc/RubyXL/CT_SRgbColor.html +13 -19
  144. data/rdoc/RubyXL/CT_ScRgbColor.html +13 -19
  145. data/rdoc/RubyXL/CT_Scene3D.html +13 -19
  146. data/rdoc/RubyXL/CT_SchemeColor.html +13 -19
  147. data/rdoc/RubyXL/CT_Shape3D.html +13 -19
  148. data/rdoc/RubyXL/CT_ShapeStyle.html +13 -19
  149. data/rdoc/RubyXL/CT_SoftEdgesEffect.html +13 -19
  150. data/rdoc/RubyXL/CT_SphereCoords.html +13 -19
  151. data/rdoc/RubyXL/CT_StretchInfoProperties.html +13 -19
  152. data/rdoc/RubyXL/CT_StyleMatrix.html +13 -19
  153. data/rdoc/RubyXL/CT_StyleMatrixReference.html +13 -19
  154. data/rdoc/RubyXL/CT_SupplementalFont.html +13 -19
  155. data/rdoc/RubyXL/CT_SystemColor.html +13 -19
  156. data/rdoc/RubyXL/CT_TextAutonumberBullet.html +13 -19
  157. data/rdoc/RubyXL/CT_TextBlipBullet.html +13 -19
  158. data/rdoc/RubyXL/CT_TextCharBullet.html +13 -19
  159. data/rdoc/RubyXL/CT_TextCharacterProperties.html +13 -19
  160. data/rdoc/RubyXL/CT_TextFont.html +13 -19
  161. data/rdoc/RubyXL/CT_TextListStyle.html +13 -19
  162. data/rdoc/RubyXL/CT_TextNormalAutofit.html +13 -19
  163. data/rdoc/RubyXL/CT_TextParagraphProperties.html +13 -19
  164. data/rdoc/RubyXL/CT_TextSpacing.html +13 -19
  165. data/rdoc/RubyXL/CT_TextTabStop.html +13 -19
  166. data/rdoc/RubyXL/CT_TextTabStopList.html +13 -19
  167. data/rdoc/RubyXL/CT_TileInfoProperties.html +13 -19
  168. data/rdoc/RubyXL/CT_TintEffect.html +13 -19
  169. data/rdoc/RubyXL/CT_Transform2D.html +13 -19
  170. data/rdoc/RubyXL/CT_TransformEffect.html +13 -19
  171. data/rdoc/RubyXL/CT_Vector3D.html +13 -19
  172. data/rdoc/RubyXL/CT_XYAdjustHandle.html +13 -19
  173. data/rdoc/RubyXL/CalculationChain.html +17 -45
  174. data/rdoc/RubyXL/CalculationChainCell.html +13 -19
  175. data/rdoc/RubyXL/CalculationProperties.html +13 -19
  176. data/rdoc/RubyXL/Cell.html +144 -204
  177. data/rdoc/RubyXL/CellConvenienceMethods.html +240 -426
  178. data/rdoc/RubyXL/CellExt.html +13 -19
  179. data/rdoc/RubyXL/CellSmartTag.html +13 -19
  180. data/rdoc/RubyXL/CellSmartTagProperty.html +13 -19
  181. data/rdoc/RubyXL/CellSmartTags.html +13 -19
  182. data/rdoc/RubyXL/CellStyle.html +13 -19
  183. data/rdoc/RubyXL/CellStyleXFs.html +18 -38
  184. data/rdoc/RubyXL/CellStyles.html +18 -38
  185. data/rdoc/RubyXL/CellValue.html +18 -38
  186. data/rdoc/RubyXL/CellWatch.html +13 -19
  187. data/rdoc/RubyXL/CellWatches.html +13 -19
  188. data/rdoc/RubyXL/CellXFs.html +19 -39
  189. data/rdoc/RubyXL/ChartColorsFile.html +12 -25
  190. data/rdoc/RubyXL/ChartFile.html +19 -49
  191. data/rdoc/RubyXL/ChartStyleFile.html +12 -25
  192. data/rdoc/RubyXL/ChartUserShapesFile.html +12 -25
  193. data/rdoc/RubyXL/Chartsheet.html +19 -67
  194. data/rdoc/RubyXL/ChartsheetPageSetup.html +13 -19
  195. data/rdoc/RubyXL/ChartsheetProperties.html +13 -19
  196. data/rdoc/RubyXL/ChartsheetProtection.html +13 -19
  197. data/rdoc/RubyXL/ChartsheetView.html +13 -19
  198. data/rdoc/RubyXL/ChartsheetViews.html +13 -19
  199. data/rdoc/RubyXL/Color.html +28 -39
  200. data/rdoc/RubyXL/ColorConvenienceClasses.html +91 -0
  201. data/rdoc/RubyXL/ColorConvenienceClasses/HlsColor.html +242 -0
  202. data/rdoc/RubyXL/ColorConvenienceClasses/RgbColor.html +279 -0
  203. data/rdoc/RubyXL/ColorConvenienceMethods.html +137 -0
  204. data/rdoc/RubyXL/ColorFilter.html +13 -19
  205. data/rdoc/RubyXL/ColorScale.html +13 -19
  206. data/rdoc/RubyXL/ColorSet.html +13 -19
  207. data/rdoc/RubyXL/Colors.html +13 -19
  208. data/rdoc/RubyXL/ColumnRange.html +20 -71
  209. data/rdoc/RubyXL/ColumnRanges.html +20 -79
  210. data/rdoc/RubyXL/Comment.html +13 -19
  211. data/rdoc/RubyXL/CommentList.html +13 -19
  212. data/rdoc/RubyXL/CommentsFile.html +17 -50
  213. data/rdoc/RubyXL/ConditionalFormatValue.html +13 -19
  214. data/rdoc/RubyXL/ConditionalFormatting.html +13 -19
  215. data/rdoc/RubyXL/ConditionalFormattingRule.html +13 -19
  216. data/rdoc/RubyXL/Connection.html +99 -0
  217. data/rdoc/RubyXL/ConnectionTable.html +99 -0
  218. data/rdoc/RubyXL/ConnectionTables.html +99 -0
  219. data/rdoc/RubyXL/ConnectionTextField.html +99 -0
  220. data/rdoc/RubyXL/ConnectionTextFields.html +99 -0
  221. data/rdoc/RubyXL/Connections.html +147 -0
  222. data/rdoc/RubyXL/ContentTypeDefault.html +12 -17
  223. data/rdoc/RubyXL/ContentTypeOverride.html +12 -17
  224. data/rdoc/RubyXL/ContentTypes.html +23 -63
  225. data/rdoc/RubyXL/ControlPropertiesFile.html +14 -22
  226. data/rdoc/RubyXL/CorePropertiesFile.html +26 -162
  227. data/rdoc/RubyXL/CustomColor.html +13 -19
  228. data/rdoc/RubyXL/CustomColorList.html +13 -19
  229. data/rdoc/RubyXL/CustomFilter.html +13 -19
  230. data/rdoc/RubyXL/CustomFilters.html +13 -19
  231. data/rdoc/RubyXL/CustomGeometry.html +13 -19
  232. data/rdoc/RubyXL/CustomProperties.html +13 -19
  233. data/rdoc/RubyXL/CustomPropertiesFile.html +12 -25
  234. data/rdoc/RubyXL/CustomProperty.html +13 -19
  235. data/rdoc/RubyXL/CustomPropertyFile.html +108 -0
  236. data/rdoc/RubyXL/CustomSheetView.html +13 -19
  237. data/rdoc/RubyXL/CustomSheetViews.html +13 -19
  238. data/rdoc/RubyXL/CustomWorkbookView.html +13 -19
  239. data/rdoc/RubyXL/CustomWorkbookViews.html +13 -19
  240. data/rdoc/RubyXL/CustomXMLFile.html +12 -22
  241. data/rdoc/RubyXL/DXF.html +13 -19
  242. data/rdoc/RubyXL/DXFs.html +13 -19
  243. data/rdoc/RubyXL/DataBar.html +13 -19
  244. data/rdoc/RubyXL/DataConsolidate.html +13 -19
  245. data/rdoc/RubyXL/DataConsolidationReference.html +13 -19
  246. data/rdoc/RubyXL/DataConsolidationReferences.html +13 -19
  247. data/rdoc/RubyXL/DataType.html +11 -39
  248. data/rdoc/RubyXL/DataValidation.html +13 -19
  249. data/rdoc/RubyXL/DataValidations.html +13 -19
  250. data/rdoc/RubyXL/DateGroupItem.html +13 -19
  251. data/rdoc/RubyXL/DefinedName.html +13 -19
  252. data/rdoc/RubyXL/DefinedNameExt.html +13 -19
  253. data/rdoc/RubyXL/DefinedNames.html +13 -19
  254. data/rdoc/RubyXL/DefinedNamesExt.html +13 -19
  255. data/rdoc/RubyXL/DocumentPropertiesFile.html +20 -66
  256. data/rdoc/RubyXL/DrawingFile.html +19 -49
  257. data/rdoc/RubyXL/DynamicFilter.html +13 -19
  258. data/rdoc/RubyXL/EmbeddedControl.html +13 -19
  259. data/rdoc/RubyXL/EmbeddedControls.html +13 -19
  260. data/rdoc/RubyXL/Extension.html +13 -19
  261. data/rdoc/RubyXL/ExtensionStorageArea.html +13 -19
  262. data/rdoc/RubyXL/Extents.html +13 -19
  263. data/rdoc/RubyXL/ExternalBook.html +13 -19
  264. data/rdoc/RubyXL/ExternalLinksFile.html +19 -49
  265. data/rdoc/RubyXL/ExternalReference.html +13 -19
  266. data/rdoc/RubyXL/ExternalReferences.html +13 -19
  267. data/rdoc/RubyXL/ExtraColorSchemeList.html +13 -19
  268. data/rdoc/RubyXL/FieldItem.html +13 -19
  269. data/rdoc/RubyXL/FileRecoveryProperties.html +13 -19
  270. data/rdoc/RubyXL/FileSharing.html +13 -19
  271. data/rdoc/RubyXL/FileVersion.html +13 -19
  272. data/rdoc/RubyXL/Fill.html +18 -38
  273. data/rdoc/RubyXL/Fills.html +18 -38
  274. data/rdoc/RubyXL/FilterContainer.html +13 -19
  275. data/rdoc/RubyXL/FloatNode.html +12 -17
  276. data/rdoc/RubyXL/FloatValue.html +12 -17
  277. data/rdoc/RubyXL/Font.html +20 -544
  278. data/rdoc/RubyXL/FontConvenienceMethods.html +414 -0
  279. data/rdoc/RubyXL/FontScheme.html +13 -19
  280. data/rdoc/RubyXL/Fonts.html +19 -39
  281. data/rdoc/RubyXL/Formula.html +13 -19
  282. data/rdoc/RubyXL/FunctionGroup.html +13 -19
  283. data/rdoc/RubyXL/FunctionGroups.html +13 -19
  284. data/rdoc/RubyXL/GenericStorageObject.html +19 -81
  285. data/rdoc/RubyXL/GradientFill.html +13 -19
  286. data/rdoc/RubyXL/HeaderFooterSettings.html +13 -19
  287. data/rdoc/RubyXL/Hyperlink.html +13 -19
  288. data/rdoc/RubyXL/HyperlinkRelFile.html +12 -22
  289. data/rdoc/RubyXL/Hyperlinks.html +13 -19
  290. data/rdoc/RubyXL/IconFilter.html +13 -19
  291. data/rdoc/RubyXL/IconSet.html +13 -19
  292. data/rdoc/RubyXL/IgnoredError.html +13 -19
  293. data/rdoc/RubyXL/IgnoredErrors.html +13 -19
  294. data/rdoc/RubyXL/IndexedColors.html +13 -19
  295. data/rdoc/RubyXL/InputCells.html +13 -19
  296. data/rdoc/RubyXL/IntegerNode.html +12 -17
  297. data/rdoc/RubyXL/IntegerValue.html +12 -17
  298. data/rdoc/RubyXL/LegacyCell.html +14 -66
  299. data/rdoc/RubyXL/LegacyWorksheet.html +40 -100
  300. data/rdoc/RubyXL/MRUColors.html +13 -19
  301. data/rdoc/RubyXL/MacrosFile.html +12 -25
  302. data/rdoc/RubyXL/MergedCell.html +13 -19
  303. data/rdoc/RubyXL/MergedCells.html +13 -19
  304. data/rdoc/RubyXL/NumFmt.html +13 -19
  305. data/rdoc/RubyXL/NumberFormat.html +18 -38
  306. data/rdoc/RubyXL/NumberFormats.html +18 -44
  307. data/rdoc/RubyXL/OLEObject.html +13 -19
  308. data/rdoc/RubyXL/OLEObjectFile.html +12 -25
  309. data/rdoc/RubyXL/OLEObjects.html +13 -19
  310. data/rdoc/RubyXL/OLESize.html +13 -19
  311. data/rdoc/RubyXL/OOXMLContainerObject.html +36 -132
  312. data/rdoc/RubyXL/OOXMLIgnored.html +163 -0
  313. data/rdoc/RubyXL/OOXMLObject.html +15 -25
  314. data/rdoc/RubyXL/OOXMLObjectClassMethods.html +88 -179
  315. data/rdoc/RubyXL/OOXMLObjectInstanceMethods.html +47 -183
  316. data/rdoc/RubyXL/OOXMLRelationshipsFile.html +42 -194
  317. data/rdoc/RubyXL/OOXMLTopLevelObject.html +37 -133
  318. data/rdoc/RubyXL/OdbcOleDbProperties.html +99 -0
  319. data/rdoc/RubyXL/Offset.html +13 -19
  320. data/rdoc/RubyXL/OlapProperties.html +99 -0
  321. data/rdoc/RubyXL/OleItem.html +99 -0
  322. data/rdoc/RubyXL/OleItems.html +99 -0
  323. data/rdoc/RubyXL/OleLink.html +99 -0
  324. data/rdoc/RubyXL/OutlineProperties.html +13 -19
  325. data/rdoc/RubyXL/PageMargins.html +13 -19
  326. data/rdoc/RubyXL/PageSetup.html +13 -19
  327. data/rdoc/RubyXL/PageSetupProperties.html +13 -19
  328. data/rdoc/RubyXL/Pane.html +13 -19
  329. data/rdoc/RubyXL/Parser.html +20 -53
  330. data/rdoc/RubyXL/PatternFill.html +13 -19
  331. data/rdoc/RubyXL/PhoneticProperties.html +13 -19
  332. data/rdoc/RubyXL/PhoneticRun.html +13 -19
  333. data/rdoc/RubyXL/PivotArea.html +13 -19
  334. data/rdoc/RubyXL/PivotCache.html +13 -19
  335. data/rdoc/RubyXL/PivotCacheDefinitionFile.html +14 -30
  336. data/rdoc/RubyXL/PivotCacheRecordsFile.html +12 -25
  337. data/rdoc/RubyXL/PivotCaches.html +13 -19
  338. data/rdoc/RubyXL/PivotReference.html +13 -19
  339. data/rdoc/RubyXL/PivotReferences.html +13 -19
  340. data/rdoc/RubyXL/PivotTableFile.html +14 -30
  341. data/rdoc/RubyXL/PivotTableSelection.html +13 -19
  342. data/rdoc/RubyXL/PresetGeometry.html +13 -19
  343. data/rdoc/RubyXL/PrintOptions.html +13 -19
  344. data/rdoc/RubyXL/PrinterSettingsFile.html +12 -25
  345. data/rdoc/RubyXL/ProtectedRange.html +13 -19
  346. data/rdoc/RubyXL/ProtectedRanges.html +13 -19
  347. data/rdoc/RubyXL/Protection.html +13 -19
  348. data/rdoc/RubyXL/QueryParameter.html +99 -0
  349. data/rdoc/RubyXL/QueryParameters.html +99 -0
  350. data/rdoc/RubyXL/QueryTable.html +155 -0
  351. data/rdoc/RubyXL/QueryTableDeletedField.html +99 -0
  352. data/rdoc/RubyXL/QueryTableDeletedFields.html +99 -0
  353. data/rdoc/RubyXL/QueryTableField.html +99 -0
  354. data/rdoc/RubyXL/QueryTableFields.html +99 -0
  355. data/rdoc/RubyXL/QueryTableRefresh.html +99 -0
  356. data/rdoc/RubyXL/RID.html +12 -17
  357. data/rdoc/RubyXL/RawOOXML.html +19 -58
  358. data/rdoc/RubyXL/Reference.html +31 -215
  359. data/rdoc/RubyXL/Relationship.html +12 -17
  360. data/rdoc/RubyXL/RelationshipSupport.html +32 -126
  361. data/rdoc/RubyXL/RelationshipSupport/ClassMehods.html +15 -33
  362. data/rdoc/RubyXL/RevisionPointer.html +99 -0
  363. data/rdoc/RubyXL/RichText.html +18 -38
  364. data/rdoc/RubyXL/RichTextRun.html +17 -37
  365. data/rdoc/RubyXL/Row.html +53 -152
  366. data/rdoc/RubyXL/RowExt.html +13 -19
  367. data/rdoc/RubyXL/RunProperties.html +13 -19
  368. data/rdoc/RubyXL/Scenario.html +13 -19
  369. data/rdoc/RubyXL/Scenarios.html +13 -19
  370. data/rdoc/RubyXL/Selection.html +20 -40
  371. data/rdoc/RubyXL/ShapeGuide.html +13 -19
  372. data/rdoc/RubyXL/ShapeTextRectangle.html +13 -19
  373. data/rdoc/RubyXL/SharedStringsTable.html +31 -140
  374. data/rdoc/RubyXL/Sheet.html +13 -19
  375. data/rdoc/RubyXL/SheetCalculationProperties.html +13 -19
  376. data/rdoc/RubyXL/SheetData.html +20 -53
  377. data/rdoc/RubyXL/SheetDataExt.html +13 -19
  378. data/rdoc/RubyXL/SheetDataSet.html +13 -19
  379. data/rdoc/RubyXL/SheetName.html +13 -19
  380. data/rdoc/RubyXL/SheetNames.html +13 -19
  381. data/rdoc/RubyXL/Sheets.html +13 -19
  382. data/rdoc/RubyXL/SlicerCacheFile.html +12 -25
  383. data/rdoc/RubyXL/SlicerFile.html +12 -25
  384. data/rdoc/RubyXL/SmartTagProperties.html +13 -19
  385. data/rdoc/RubyXL/SmartTagType.html +13 -19
  386. data/rdoc/RubyXL/SmartTagTypes.html +13 -19
  387. data/rdoc/RubyXL/SmartTags.html +13 -19
  388. data/rdoc/RubyXL/SortCondition.html +13 -19
  389. data/rdoc/RubyXL/SortState.html +13 -19
  390. data/rdoc/RubyXL/Sqref.html +18 -51
  391. data/rdoc/RubyXL/Stop.html +13 -19
  392. data/rdoc/RubyXL/StringNode.html +12 -17
  393. data/rdoc/RubyXL/StringNodeW3C.html +19 -52
  394. data/rdoc/RubyXL/StringValue.html +12 -17
  395. data/rdoc/RubyXL/Stylesheet.html +30 -112
  396. data/rdoc/RubyXL/TableFile.html +12 -25
  397. data/rdoc/RubyXL/TableParts.html +12 -17
  398. data/rdoc/RubyXL/TableStyle.html +13 -19
  399. data/rdoc/RubyXL/TableStyles.html +13 -19
  400. data/rdoc/RubyXL/Text.html +19 -63
  401. data/rdoc/RubyXL/TextImportSettings.html +99 -0
  402. data/rdoc/RubyXL/Theme.html +58 -63
  403. data/rdoc/RubyXL/ThemeElements.html +13 -19
  404. data/rdoc/RubyXL/ThumbnailFile.html +12 -25
  405. data/rdoc/RubyXL/Top10.html +13 -19
  406. data/rdoc/RubyXL/VMLDrawingFile.html +15 -32
  407. data/rdoc/RubyXL/Variant.html +13 -19
  408. data/rdoc/RubyXL/Vector.html +17 -37
  409. data/rdoc/RubyXL/VectorValue.html +12 -17
  410. data/rdoc/RubyXL/VisualProperties.html +13 -19
  411. data/rdoc/RubyXL/WebPublishObject.html +13 -19
  412. data/rdoc/RubyXL/WebPublishObjects.html +13 -19
  413. data/rdoc/RubyXL/WebPublishingItem.html +13 -19
  414. data/rdoc/RubyXL/WebPublishingItems.html +13 -19
  415. data/rdoc/RubyXL/WebPublishingProperties.html +13 -19
  416. data/rdoc/RubyXL/WebQueryProperties.html +99 -0
  417. data/rdoc/RubyXL/Workbook.html +483 -226
  418. data/rdoc/RubyXL/WorkbookConvenienceMethods.html +149 -857
  419. data/rdoc/RubyXL/WorkbookProperties.html +13 -19
  420. data/rdoc/RubyXL/WorkbookProtection.html +13 -19
  421. data/rdoc/RubyXL/WorkbookRoot.html +23 -109
  422. data/rdoc/RubyXL/WorkbookView.html +13 -19
  423. data/rdoc/RubyXL/WorkbookViews.html +13 -19
  424. data/rdoc/RubyXL/Worksheet.html +70 -122
  425. data/rdoc/RubyXL/WorksheetConvenienceMethods.html +398 -1049
  426. data/rdoc/RubyXL/WorksheetDimensions.html +13 -19
  427. data/rdoc/RubyXL/WorksheetFormatProperties.html +12 -17
  428. data/rdoc/RubyXL/WorksheetProperties.html +13 -19
  429. data/rdoc/RubyXL/WorksheetProtection.html +13 -19
  430. data/rdoc/RubyXL/WorksheetView.html +13 -19
  431. data/rdoc/RubyXL/WorksheetViews.html +13 -19
  432. data/rdoc/RubyXL/XF.html +13 -19
  433. data/rdoc/created.rid +45 -38
  434. data/rdoc/css/fonts.css +6 -6
  435. data/rdoc/css/rdoc.css +35 -6
  436. data/rdoc/index.html +43 -363
  437. data/rdoc/js/darkfish.js +23 -100
  438. data/rdoc/js/navigation.js +4 -41
  439. data/rdoc/js/navigation.js.gz +0 -0
  440. data/rdoc/js/search.js +32 -31
  441. data/rdoc/js/search_index.js +1 -1
  442. data/rdoc/js/search_index.js.gz +0 -0
  443. data/rdoc/js/searcher.js +7 -6
  444. data/rdoc/js/searcher.js.gz +0 -0
  445. data/rdoc/table_of_contents.html +368 -75
  446. data/rubyXL.gemspec +60 -26
  447. data/spec/lib/cell_spec.rb +147 -2
  448. data/spec/lib/color_spec.rb +1 -0
  449. data/spec/lib/parser_spec.rb +1 -1
  450. data/spec/lib/rgb_color_spec.rb +16 -0
  451. data/spec/lib/text_spec.rb +8 -0
  452. data/spec/lib/workbook_spec.rb +12 -1
  453. data/spec/lib/worksheet_spec.rb +353 -37
  454. data/test/test_parse_write.rb +15 -15
  455. metadata +63 -9
  456. data/rdoc/js/jquery.js +0 -4
@@ -0,0 +1,136 @@
1
+ module RubyXL
2
+
3
+ module WorkbookConvenienceMethods
4
+
5
+ def each
6
+ worksheets.each{ |i| yield i }
7
+ end
8
+
9
+ def cell_xfs # Stylesheet should be pre-filled with defaults on initialize()
10
+ stylesheet.cell_xfs
11
+ end
12
+
13
+ def fonts # Stylesheet should be pre-filled with defaults on initialize()
14
+ stylesheet.fonts
15
+ end
16
+
17
+ def fills # Stylesheet should be pre-filled with defaults on initialize()
18
+ stylesheet.fills
19
+ end
20
+
21
+ def borders # Stylesheet should be pre-filled with defaults on initialize()
22
+ stylesheet.borders
23
+ end
24
+
25
+ def get_fill_color(xf)
26
+ fill = fills[xf.fill_id]
27
+ pattern = fill && fill.pattern_fill
28
+ color = pattern && pattern.fg_color
29
+ color = color && color.get_rgb(self)
30
+ color && color.to_s || 'ffffff'
31
+ end
32
+
33
+ def register_new_fill(new_fill, old_xf)
34
+ new_xf = old_xf.dup
35
+ new_xf.apply_fill = true
36
+ new_xf.fill_id = fills.find_index { |x| x == new_fill } # Reuse existing fill, if it exists
37
+ new_xf.fill_id ||= fills.size # If this fill has never existed before, add it to collection.
38
+ fills[new_xf.fill_id] = new_fill
39
+ new_xf
40
+ end
41
+
42
+ def register_new_font(new_font, old_xf)
43
+ new_xf = old_xf.dup
44
+ new_xf.font_id = fonts.find_index { |x| x == new_font } # Reuse existing font, if it exists
45
+ new_xf.font_id ||= fonts.size # If this font has never existed before, add it to collection.
46
+ fonts[new_xf.font_id] = new_font
47
+ new_xf.apply_font = true
48
+ new_xf
49
+ end
50
+
51
+ def register_new_xf(new_xf)
52
+ new_xf_id = cell_xfs.find_index { |xf| xf == new_xf } # Reuse existing XF, if it exists
53
+ new_xf_id ||= cell_xfs.size # If this XF has never existed before, add it to collection.
54
+ cell_xfs[new_xf_id] = new_xf
55
+ new_xf_id
56
+ end
57
+
58
+ def modify_alignment(style_index, &block)
59
+ old_xf = cell_xfs[style_index || 0]
60
+ new_xf = old_xf.dup
61
+ if old_xf.alignment then
62
+ new_xf.alignment = old_xf.alignment.dup
63
+ else
64
+ new_xf.alignment = RubyXL::Alignment.new
65
+ end
66
+
67
+ yield(new_xf.alignment)
68
+ new_xf.apply_alignment = true
69
+
70
+ register_new_xf(new_xf)
71
+ end
72
+
73
+ def modify_fill(style_index, rgb)
74
+ xf = cell_xfs[style_index || 0].dup
75
+ new_fill = RubyXL::Fill.new(:pattern_fill =>
76
+ RubyXL::PatternFill.new(:pattern_type => 'solid',
77
+ :fg_color => RubyXL::Color.new(:rgb => rgb)))
78
+ register_new_xf(register_new_fill(new_fill, xf))
79
+ end
80
+
81
+ def modify_border(style_index, direction, weight)
82
+ xf = cell_xfs[style_index || 0].dup
83
+ new_border = borders[xf.border_id || 0].dup
84
+
85
+ edge = new_border.send(direction)
86
+ new_border.send("#{direction}=", edge.dup) if edge
87
+
88
+ new_border.set_edge_style(direction, weight)
89
+
90
+ xf.border_id = borders.find_index { |x| x == new_border } # Reuse existing border, if it exists
91
+ xf.border_id ||= borders.size # If this border has never existed before, add it to collection.
92
+ borders[xf.border_id] = new_border
93
+ xf.apply_border = true
94
+
95
+ register_new_xf(xf)
96
+ end
97
+
98
+ def modify_border_color(style_index, direction, color)
99
+ xf = cell_xfs[style_index || 0].dup
100
+ new_border = borders[xf.border_id || 0].dup
101
+ new_border.set_edge_color(direction, color)
102
+
103
+ xf.border_id = borders.find_index { |x| x == new_border } # Reuse existing border, if it exists
104
+ xf.border_id ||= borders.size # If this border has never existed before, add it to collection.
105
+ borders[xf.border_id] = new_border
106
+ xf.apply_border = true
107
+
108
+ register_new_xf(xf)
109
+ end
110
+
111
+ # Calculate password hash from string for use in 'password' fields.
112
+ # https://www.openoffice.org/sc/excelfileformat.pdf
113
+ def password_hash(pwd)
114
+ hsh = 0
115
+ pwd.reverse.each_char { |c|
116
+ hsh = hsh ^ c.ord
117
+ hsh = hsh << 1
118
+ hsh -= 0x7fff if hsh > 0x7fff
119
+ }
120
+
121
+ (hsh ^ pwd.length ^ 0xCE4B).to_s(16)
122
+ end
123
+
124
+ def define_new_name(name, reference)
125
+ self.defined_names ||= RubyXL::DefinedNames.new
126
+ self.defined_names << RubyXL::DefinedName.new({:name => name, :reference => reference})
127
+ end
128
+
129
+ def get_defined_name(name)
130
+ self.defined_names && self.defined_names.find { |n| n.name == name }
131
+ end
132
+
133
+ end
134
+
135
+ RubyXL::Workbook.send(:include, RubyXL::WorkbookConvenienceMethods) # ruby 2.1 compat
136
+ end
@@ -0,0 +1,710 @@
1
+ module RubyXL
2
+
3
+ module WorksheetConvenienceMethods
4
+ NAME = 0
5
+ SIZE = 1
6
+ COLOR = 2
7
+ ITALICS = 3
8
+ BOLD = 4
9
+ UNDERLINE = 5
10
+ STRIKETHROUGH = 6
11
+
12
+ def insert_cell(row = 0, col = 0, data = nil, formula = nil, shift = nil)
13
+ validate_workbook
14
+ ensure_cell_exists(row, col)
15
+
16
+ case shift
17
+ when nil then # No shifting at all
18
+ when :right then
19
+ sheet_data.rows[row].insert_cell_shift_right(nil, col)
20
+ when :down then
21
+ add_row(sheet_data.size, :cells => Array.new(sheet_data.rows[row].size))
22
+ (sheet_data.size - 1).downto(row + 1) { |index|
23
+ old_row = sheet_data.rows[index - 1]
24
+ if old_row.nil? then
25
+ sheet_data.rows[index] = nil
26
+ else
27
+ new_row = sheet_data.rows[index] || add_row(index)
28
+ new_row.cells[col] = old_row.cells[col]
29
+ end
30
+ }
31
+ else
32
+ raise 'invalid shift option'
33
+ end
34
+
35
+ return add_cell(row, col, data, formula)
36
+ end
37
+
38
+ # by default, only sets cell to nil
39
+ # if :left is specified, method will shift row contents to the right of the deleted cell to the left
40
+ # if :up is specified, method will shift column contents below the deleted cell upward
41
+ def delete_cell(row_index = 0, column_index=0, shift=nil)
42
+ validate_workbook
43
+ validate_nonnegative(row_index)
44
+ validate_nonnegative(column_index)
45
+
46
+ row = sheet_data[row_index]
47
+ old_cell = row && row[column_index]
48
+
49
+ case shift
50
+ when nil then
51
+ row.cells[column_index] = nil if row
52
+ when :left then
53
+ row.delete_cell_shift_left(column_index) if row
54
+ when :up then
55
+ (row_index...(sheet_data.size - 1)).each { |index|
56
+ old_row = sheet_data.rows[index + 1]
57
+ if old_row.nil? then
58
+ sheet_data.rows[index] = nil
59
+ else
60
+ new_row = sheet_data.rows[index] || add_row(index)
61
+ c = new_row.cells[column_index] = old_row.cells[column_index]
62
+ c.row = (index + 1) if c.is_a?(Cell)
63
+ end
64
+ }
65
+ else
66
+ raise 'invalid shift option'
67
+ end
68
+
69
+ return old_cell
70
+ end
71
+
72
+ # Inserts row at row_index, pushes down, copies style from the row above (that's what Excel 2013 does!)
73
+ # NOTE: use of this method will break formulas which reference cells which are being "pushed down"
74
+ def insert_row(row_index = 0)
75
+ validate_workbook
76
+ ensure_cell_exists(row_index)
77
+
78
+ old_row = new_cells = nil
79
+
80
+ if row_index > 0 then
81
+ old_row = sheet_data.rows[row_index - 1]
82
+ if old_row then
83
+ new_cells = old_row.cells.collect { |c|
84
+ if c.nil? then nil
85
+ else nc = RubyXL::Cell.new(:style_index => c.style_index)
86
+ nc.worksheet = self
87
+ nc
88
+ end
89
+ }
90
+ end
91
+ end
92
+
93
+ row0 = sheet_data.rows[0]
94
+ new_cells ||= Array.new((row0 && row0.cells.size) || 0)
95
+
96
+ sheet_data.rows.insert(row_index, nil)
97
+ new_row = add_row(row_index, :cells => new_cells, :style_index => old_row && old_row.style_index)
98
+
99
+ # Update row values for all rows below
100
+ row_index.upto(sheet_data.rows.size - 1) { |r|
101
+ row = sheet_data.rows[r]
102
+ next if row.nil?
103
+ row.cells.each_with_index { |cell, c|
104
+ next if cell.nil?
105
+ cell.r = RubyXL::Reference.new(r, c)
106
+ }
107
+ }
108
+
109
+ # Update merged cells for all rows below
110
+ self.merged_cells ||= RubyXL::MergedCells.new
111
+ merged_cells.each { |mc|
112
+ next if mc.ref.row_range.last < row_index
113
+
114
+ in_merged_cell = mc.ref.row_range.first < row_index
115
+ mc.ref = RubyXL::Reference.new(
116
+ mc.ref.row_range.first + (in_merged_cell ? 0 : 1),
117
+ mc.ref.row_range.last + 1,
118
+ mc.ref.col_range.first,
119
+ mc.ref.col_range.last,
120
+ )
121
+ }
122
+
123
+ return new_row
124
+ end
125
+
126
+ def delete_row(row_index=0)
127
+ validate_workbook
128
+ validate_nonnegative(row_index)
129
+
130
+ deleted = sheet_data.rows.delete_at(row_index)
131
+
132
+ # Update row number of each cell
133
+ row_index.upto(sheet_data.size - 1) { |index|
134
+ row = sheet_data[index]
135
+ row && row.cells.each{ |c| c.row -= 1 unless c.nil? }
136
+ }
137
+
138
+ # Update row number of merged cells
139
+ self.merged_cells ||= RubyXL::MergedCells.new
140
+ merged_cells.delete_if { |mc| mc.ref.row_range == (row_index..row_index) }
141
+ merged_cells.each { |mc|
142
+ next if mc.ref.row_range.last < row_index
143
+
144
+ in_merged_cell = mc.ref.row_range.first <= row_index
145
+ mc.ref = RubyXL::Reference.new(
146
+ mc.ref.row_range.first - (in_merged_cell ? 0 : 1),
147
+ mc.ref.row_range.last - 1,
148
+ mc.ref.col_range.first,
149
+ mc.ref.col_range.last,
150
+ )
151
+ }
152
+ merged_cells.delete_if { |mc| mc.ref.single_cell? }
153
+
154
+ return deleted
155
+ end
156
+
157
+ # Inserts column at +column_index+, pushes everything right, takes styles from column to left
158
+ # NOTE: use of this method will break formulas which reference cells which are being "pushed right"
159
+ def insert_column(column_index = 0)
160
+ validate_workbook
161
+ ensure_cell_exists(0, column_index)
162
+
163
+ old_range = cols.get_range(column_index)
164
+
165
+ # Go through each cell in column
166
+ sheet_data.rows.each_with_index { |row, row_index|
167
+ next if row.nil? # Do not process blank rows
168
+
169
+ old_cell = row[column_index]
170
+ c = nil
171
+
172
+ if old_cell && old_cell.style_index != 0 &&
173
+ old_range && old_range.style_index != old_cell.style_index then
174
+
175
+ c = RubyXL::Cell.new(:style_index => old_cell.style_index, :worksheet => self,
176
+ :row => row_index, :column => column_index,
177
+ :datatype => RubyXL::DataType::SHARED_STRING)
178
+ end
179
+
180
+ row.insert_cell_shift_right(c, column_index)
181
+ }
182
+
183
+ cols.insert_column(column_index)
184
+
185
+ # Update merged cells for all rows below
186
+ self.merged_cells ||= RubyXL::MergedCells.new
187
+ merged_cells.each { |mc|
188
+ next if mc.ref.col_range.last < column_index
189
+
190
+ in_merged_cell = mc.ref.row_range.first < column_index
191
+ mc.ref = RubyXL::Reference.new(
192
+ mc.ref.row_range.first,
193
+ mc.ref.row_range.last,
194
+ mc.ref.col_range.first + (in_merged_cell ? 0 : 1),
195
+ mc.ref.col_range.last + 1,
196
+ )
197
+ }
198
+
199
+ # TODO: update column numbers
200
+ end
201
+
202
+ def delete_column(column_index = 0)
203
+ validate_workbook
204
+ validate_nonnegative(column_index)
205
+
206
+ # Delete column
207
+ sheet_data.rows.each { |row| row && row.cells.delete_at(column_index) }
208
+
209
+ # Update column numbers for cells to the right of the deleted column
210
+ sheet_data.rows.each_with_index { |row, row_index|
211
+ next if row.nil?
212
+ row.cells.each_with_index { |c, ci|
213
+ c.column = ci if c.is_a?(Cell)
214
+ }
215
+ }
216
+
217
+ cols.each { |range| range.delete_column(column_index) }
218
+
219
+ # Update row number of merged cells
220
+ self.merged_cells ||= RubyXL::MergedCells.new
221
+ merged_cells.delete_if { |mc| mc.ref.col_range == (column_index..column_index) }
222
+ merged_cells.each { |mc|
223
+ next if mc.ref.col_range.last < column_index
224
+
225
+ in_merged_cell = mc.ref.col_range.first <= column_index
226
+ mc.ref = RubyXL::Reference.new(
227
+ mc.ref.row_range.first,
228
+ mc.ref.row_range.last,
229
+ mc.ref.col_range.first - (in_merged_cell ? 0 : 1),
230
+ mc.ref.col_range.last - 1,
231
+ )
232
+ }
233
+ merged_cells.delete_if { |mc| mc.ref.single_cell? }
234
+ end
235
+
236
+ def get_row_style(row_index)
237
+ row = sheet_data.rows[row_index]
238
+ (row && row.style_index) || 0
239
+ end
240
+
241
+ def get_row_fill(row = 0)
242
+ (row = sheet_data.rows[row]) && row.get_fill_color
243
+ end
244
+
245
+ def get_row_font_name(row = 0)
246
+ (font = row_font(row)) && font.get_name
247
+ end
248
+
249
+ def get_row_font_size(row = 0)
250
+ (font = row_font(row)) && font.get_size
251
+ end
252
+
253
+ def get_row_font_color(row = 0)
254
+ font = row_font(row)
255
+ color = font && font.color
256
+ color && (color.rgb || '000000')
257
+ end
258
+
259
+ def is_row_italicized(row = 0)
260
+ (font = row_font(row)) && font.is_italic
261
+ end
262
+
263
+ def is_row_bolded(row = 0)
264
+ (font = row_font(row)) && font.is_bold
265
+ end
266
+
267
+ def is_row_underlined(row = 0)
268
+ (font = row_font(row)) && font.is_underlined
269
+ end
270
+
271
+ def is_row_struckthrough(row = 0)
272
+ (font = row_font(row)) && font.is_strikethrough
273
+ end
274
+
275
+ def get_row_height(row = 0)
276
+ validate_workbook
277
+ validate_nonnegative(row)
278
+ row = sheet_data.rows[row]
279
+ row && row.ht || RubyXL::Row::DEFAULT_HEIGHT
280
+ end
281
+
282
+ def get_row_border(row, border_direction)
283
+ validate_workbook
284
+
285
+ border = @workbook.borders[get_row_xf(row).border_id]
286
+ border && border.get_edge_style(border_direction)
287
+ end
288
+
289
+ def get_row_border_color(row, border_direction)
290
+ validate_workbook
291
+
292
+ border = @workbook.borders[get_row_xf(row).border_id]
293
+ border && border.get_edge_color(border_direction)
294
+ end
295
+
296
+ def row_font(row)
297
+ (row = sheet_data.rows[row]) && row.get_font
298
+ end
299
+
300
+ def get_row_alignment(row, is_horizontal)
301
+ validate_workbook
302
+
303
+ xf_obj = get_row_xf(row)
304
+ return nil if xf_obj.alignment.nil?
305
+
306
+ if is_horizontal then return xf_obj.alignment.horizontal
307
+ else return xf_obj.alignment.vertical
308
+ end
309
+ end
310
+
311
+ def get_cols_style_index(column_index)
312
+ validate_nonnegative(column_index)
313
+ range = cols.locate_range(column_index)
314
+ (range && range.style_index) || 0
315
+ end
316
+
317
+ def get_column_font_name(col = 0)
318
+ font = column_font(col)
319
+ font && font.get_name
320
+ end
321
+
322
+ def get_column_font_size(col = 0)
323
+ font = column_font(col)
324
+ font && font.get_size
325
+ end
326
+
327
+ def get_column_font_color(col = 0)
328
+ font = column_font(col)
329
+ font && (font.get_rgb_color || '000000')
330
+ end
331
+
332
+ def is_column_italicized(col = 0)
333
+ font = column_font(col)
334
+ font && font.is_italic
335
+ end
336
+
337
+ def is_column_bolded(col = 0)
338
+ font = column_font(col)
339
+ font && font.is_bold
340
+ end
341
+
342
+ def is_column_underlined(col = 0)
343
+ font = column_font(col)
344
+ font && font.is_underlined
345
+ end
346
+
347
+ def is_column_struckthrough(col = 0)
348
+ font = column_font(col)
349
+ font && font.is_strikethrough
350
+ end
351
+
352
+ # Get raw column width value as stored in the file
353
+ def get_column_width_raw(column_index = 0)
354
+ validate_workbook
355
+ validate_nonnegative(column_index)
356
+
357
+ range = cols.locate_range(column_index)
358
+ range && range.width
359
+ end
360
+
361
+ # Get column width measured in number of digits, as per
362
+ # http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.column%28v=office.14%29.aspx
363
+ def get_column_width(column_index = 0)
364
+ width = get_column_width_raw(column_index)
365
+ return RubyXL::ColumnRange::DEFAULT_WIDTH if width.nil?
366
+ (width - (5.0 / RubyXL::Font::MAX_DIGIT_WIDTH)).round
367
+ end
368
+
369
+ # Set raw column width value
370
+ def change_column_width_raw(column_index, width)
371
+ validate_workbook
372
+ ensure_cell_exists(0, column_index)
373
+ range = cols.get_range(column_index)
374
+ range.width = width
375
+ range.custom_width = true
376
+ end
377
+
378
+ # Get column width measured in number of digits, as per
379
+ # http://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.column%28v=office.14%29.aspx
380
+ def change_column_width(column_index, width_in_chars = RubyXL::ColumnRange::DEFAULT_WIDTH)
381
+ change_column_width_raw(column_index, ((width_in_chars + (5.0 / RubyXL::Font::MAX_DIGIT_WIDTH)) * 256).to_i / 256.0)
382
+ end
383
+
384
+ # Helper method to get the style index for a column
385
+ def get_col_style(column_index)
386
+ range = cols.locate_range(column_index)
387
+ (range && range.style_index) || 0
388
+ end
389
+
390
+ def get_column_fill(col=0)
391
+ validate_workbook
392
+ validate_nonnegative(col)
393
+
394
+ @workbook.get_fill_color(get_col_xf(col))
395
+ end
396
+
397
+ def change_column_fill(column_index, color_code = 'ffffff')
398
+ validate_workbook
399
+ RubyXL::Color.validate_color(color_code)
400
+ ensure_cell_exists(0, column_index)
401
+
402
+ cols.get_range(column_index).style_index = @workbook.modify_fill(get_col_style(column_index), color_code)
403
+
404
+ sheet_data.rows.each { |row|
405
+ next if row.nil?
406
+ c = row[column_index]
407
+ next if c.nil?
408
+ c.change_fill(color_code)
409
+ }
410
+ end
411
+
412
+ def get_column_border(col, border_direction)
413
+ validate_workbook
414
+
415
+ xf = @workbook.cell_xfs[get_cols_style_index(col)]
416
+ border = @workbook.borders[xf.border_id]
417
+ border && border.get_edge_style(border_direction)
418
+ end
419
+
420
+ def get_column_border_color(col, border_direction)
421
+ validate_workbook
422
+
423
+ xf = @workbook.cell_xfs[get_cols_style_index(col)]
424
+ border = @workbook.borders[xf.border_id]
425
+ border && border.get_edge_color(border_direction)
426
+ end
427
+
428
+ def column_font(col)
429
+ validate_workbook
430
+
431
+ @workbook.fonts[@workbook.cell_xfs[get_cols_style_index(col)].font_id]
432
+ end
433
+
434
+ def get_column_alignment(col, type)
435
+ validate_workbook
436
+
437
+ xf = @workbook.cell_xfs[get_cols_style_index(col)]
438
+ xf.alignment && xf.alignment.send(type)
439
+ end
440
+
441
+ def change_row_horizontal_alignment(row = 0, alignment = 'center')
442
+ validate_workbook
443
+ validate_nonnegative(row)
444
+ change_row_alignment(row) { |a| a.horizontal = alignment }
445
+ end
446
+
447
+ def change_row_vertical_alignment(row = 0, alignment = 'center')
448
+ validate_workbook
449
+ validate_nonnegative(row)
450
+ change_row_alignment(row) { |a| a.vertical = alignment }
451
+ end
452
+
453
+ def change_row_border(row, direction, weight)
454
+ validate_workbook
455
+ ensure_cell_exists(row)
456
+
457
+ sheet_data.rows[row].style_index = @workbook.modify_border(get_row_style(row), direction, weight)
458
+
459
+ sheet_data[row].cells.each { |c|
460
+ c.change_border(direction, weight) unless c.nil?
461
+ }
462
+ end
463
+
464
+ def change_row_border_color(row, direction, color = '000000')
465
+ validate_workbook
466
+ ensure_cell_exists(row)
467
+ Color.validate_color(color)
468
+
469
+ sheet_data.rows[row].style_index = @workbook.modify_border_color(get_row_style(row), direction, color)
470
+
471
+ sheet_data[row].cells.each { |c|
472
+ c.change_border_color(direction, color) unless c.nil?
473
+ }
474
+ end
475
+
476
+ def change_row_fill(row_index = 0, rgb = 'ffffff')
477
+ validate_workbook
478
+ ensure_cell_exists(row_index)
479
+ Color.validate_color(rgb)
480
+
481
+ sheet_data.rows[row_index].style_index = @workbook.modify_fill(get_row_style(row_index), rgb)
482
+ sheet_data[row_index].cells.each { |c| c.change_fill(rgb) unless c.nil? }
483
+ end
484
+
485
+ # Helper method to update the row styles array
486
+ # change_type - NAME or SIZE or COLOR etc
487
+ # main method to change font, called from each separate font mutator method
488
+ def change_row_font(row_index, change_type, arg, font)
489
+ validate_workbook
490
+ ensure_cell_exists(row_index)
491
+
492
+ xf = workbook.register_new_font(font, get_row_xf(row_index))
493
+ row = sheet_data[row_index]
494
+ row.style_index = workbook.register_new_xf(xf)
495
+ row.cells.each { |c| c.font_switch(change_type, arg) unless c.nil? }
496
+ end
497
+
498
+ def change_row_font_name(row = 0, font_name = 'Verdana')
499
+ ensure_cell_exists(row)
500
+ font = row_font(row).dup
501
+ font.set_name(font_name)
502
+ change_row_font(row, Worksheet::NAME, font_name, font)
503
+ end
504
+
505
+ def change_row_font_size(row = 0, font_size=10)
506
+ ensure_cell_exists(row)
507
+ font = row_font(row).dup
508
+ font.set_size(font_size)
509
+ change_row_font(row, Worksheet::SIZE, font_size, font)
510
+ end
511
+
512
+ def change_row_font_color(row = 0, font_color = '000000')
513
+ ensure_cell_exists(row)
514
+ Color.validate_color(font_color)
515
+ font = row_font(row).dup
516
+ font.set_rgb_color(font_color)
517
+ change_row_font(row, Worksheet::COLOR, font_color, font)
518
+ end
519
+
520
+ def change_row_italics(row = 0, italicized = false)
521
+ ensure_cell_exists(row)
522
+ font = row_font(row).dup
523
+ font.set_italic(italicized)
524
+ change_row_font(row, Worksheet::ITALICS, italicized, font)
525
+ end
526
+
527
+ def change_row_bold(row = 0, bolded = false)
528
+ ensure_cell_exists(row)
529
+ font = row_font(row).dup
530
+ font.set_bold(bolded)
531
+ change_row_font(row, Worksheet::BOLD, bolded, font)
532
+ end
533
+
534
+ def change_row_underline(row = 0, underlined=false)
535
+ ensure_cell_exists(row)
536
+ font = row_font(row).dup
537
+ font.set_underline(underlined)
538
+ change_row_font(row, Worksheet::UNDERLINE, underlined, font)
539
+ end
540
+
541
+ def change_row_strikethrough(row = 0, struckthrough=false)
542
+ ensure_cell_exists(row)
543
+ font = row_font(row).dup
544
+ font.set_strikethrough(struckthrough)
545
+ change_row_font(row, Worksheet::STRIKETHROUGH, struckthrough, font)
546
+ end
547
+
548
+ def change_row_height(row = 0, height = 10)
549
+ validate_workbook
550
+ ensure_cell_exists(row)
551
+
552
+ c = sheet_data.rows[row]
553
+ c.ht = height
554
+ c.custom_height = true
555
+ end
556
+
557
+ # Helper method to update the fonts and cell styles array
558
+ # main method to change font, called from each separate font mutator method
559
+ def change_column_font(column_index, change_type, arg, font, xf)
560
+ validate_workbook
561
+ ensure_cell_exists(0, column_index)
562
+
563
+ xf = workbook.register_new_font(font, xf)
564
+ cols.get_range(column_index).style_index = workbook.register_new_xf(xf)
565
+
566
+ sheet_data.rows.each { |row|
567
+ c = row && row[column_index]
568
+ c.font_switch(change_type, arg) unless c.nil?
569
+ }
570
+ end
571
+
572
+ def change_column_font_name(column_index = 0, font_name = 'Verdana')
573
+ xf = get_col_xf(column_index)
574
+ font = @workbook.fonts[xf.font_id].dup
575
+ font.set_name(font_name)
576
+ change_column_font(column_index, Worksheet::NAME, font_name, font, xf)
577
+ end
578
+
579
+ def change_column_font_size(column_index, font_size=10)
580
+ xf = get_col_xf(column_index)
581
+ font = @workbook.fonts[xf.font_id].dup
582
+ font.set_size(font_size)
583
+ change_column_font(column_index, Worksheet::SIZE, font_size, font, xf)
584
+ end
585
+
586
+ def change_column_font_color(column_index, font_color='000000')
587
+ Color.validate_color(font_color)
588
+
589
+ xf = get_col_xf(column_index)
590
+ font = @workbook.fonts[xf.font_id].dup
591
+ font.set_rgb_color(font_color)
592
+ change_column_font(column_index, Worksheet::COLOR, font_color, font, xf)
593
+ end
594
+
595
+ def change_column_italics(column_index, italicized = false)
596
+ xf = get_col_xf(column_index)
597
+ font = @workbook.fonts[xf.font_id].dup
598
+ font.set_italic(italicized)
599
+ change_column_font(column_index, Worksheet::ITALICS, italicized, font, xf)
600
+ end
601
+
602
+ def change_column_bold(column_index, bolded = false)
603
+ xf = get_col_xf(column_index)
604
+ font = @workbook.fonts[xf.font_id].dup
605
+ font.set_bold(bolded)
606
+ change_column_font(column_index, Worksheet::BOLD, bolded, font, xf)
607
+ end
608
+
609
+ def change_column_underline(column_index, underlined = false)
610
+ xf = get_col_xf(column_index)
611
+ font = @workbook.fonts[xf.font_id].dup
612
+ font.set_underline(underlined)
613
+ change_column_font(column_index, Worksheet::UNDERLINE, underlined, font, xf)
614
+ end
615
+
616
+ def change_column_strikethrough(column_index, struckthrough=false)
617
+ xf = get_col_xf(column_index)
618
+ font = @workbook.fonts[xf.font_id].dup
619
+ font.set_strikethrough(struckthrough)
620
+ change_column_font(column_index, Worksheet::STRIKETHROUGH, struckthrough, font, xf)
621
+ end
622
+
623
+ def change_column_horizontal_alignment(column_index, alignment = 'center')
624
+ change_column_alignment(column_index) { |a| a.horizontal = alignment }
625
+ end
626
+
627
+ def change_column_vertical_alignment(column_index, alignment = 'center')
628
+ change_column_alignment(column_index) { |a| a.vertical = alignment }
629
+ end
630
+
631
+ def change_column_border(column_index, direction, weight)
632
+ validate_workbook
633
+ ensure_cell_exists(0, column_index)
634
+
635
+ cols.get_range(column_index).style_index = @workbook.modify_border(get_col_style(column_index), direction, weight)
636
+
637
+ sheet_data.rows.each { |row|
638
+ next if row.nil?
639
+ c = row.cells[column_index]
640
+ next if c.nil?
641
+ c.change_border(direction, weight)
642
+ }
643
+ end
644
+
645
+ def change_column_border_color(column_index, direction, color)
646
+ validate_workbook
647
+ ensure_cell_exists(0, column_index)
648
+ Color.validate_color(color)
649
+
650
+ cols.get_range(column_index).style_index = @workbook.modify_border_color(get_col_style(column_index), direction, color)
651
+
652
+ sheet_data.rows.each { |row|
653
+ c = row.cells[column_index]
654
+ c.change_border_color(direction, color) unless c.nil?
655
+ }
656
+ end
657
+
658
+ def change_row_alignment(row, &block)
659
+ validate_workbook
660
+ validate_nonnegative(row)
661
+ ensure_cell_exists(row)
662
+
663
+ sheet_data.rows[row].style_index = @workbook.modify_alignment(get_row_style(row), &block)
664
+
665
+ sheet_data[row].cells.each { |c|
666
+ next if c.nil?
667
+ c.style_index = @workbook.modify_alignment(c.style_index, &block)
668
+ }
669
+ end
670
+
671
+ def change_column_alignment(column_index, &block)
672
+ validate_workbook
673
+ ensure_cell_exists(0, column_index)
674
+
675
+ cols.get_range(column_index).style_index = @workbook.modify_alignment(get_col_style(column_index), &block)
676
+ # Excel gets confused if width is not explicitly set for a column that had alignment changes
677
+ change_column_width(column_index) if get_column_width_raw(column_index).nil?
678
+
679
+ sheet_data.rows.each { |row|
680
+ next if row.nil?
681
+ c = row[column_index]
682
+ next if c.nil?
683
+ c.style_index = @workbook.modify_alignment(c.style_index, &block)
684
+ }
685
+ end
686
+
687
+ # Merges cells within a rectangular area
688
+ def merge_cells(start_row, start_col, end_row, end_col)
689
+ validate_workbook
690
+
691
+ self.merged_cells ||= RubyXL::MergedCells.new
692
+ # TODO: add validation to make sure ranges are not intersecting with existing ones
693
+ merged_cells << RubyXL::MergedCell.new(:ref => RubyXL::Reference.new(start_row, end_row, start_col, end_col))
694
+ end
695
+
696
+ def add_validation_list(ref, list_arr)
697
+ # "Any double quote characters in the value should be escaped with another double quote.
698
+ # If the value does not contain a comma, newline or double quote, then the String value should be returned unchanged.
699
+ # If the value contains a comma, newline or double quote, then the String value should be returned enclosed in double quotes."
700
+ expr = '"' + list_arr.collect{|str| str.gsub('"', '""')}.join(',') + '"'
701
+ self.data_validations ||= RubyXL::DataValidations.new
702
+ self.data_validations <<
703
+ RubyXL::DataValidation.new({:sqref => RubyXL::Reference.new(ref),
704
+ :formula1 => RubyXL::Formula.new(:expression => expr),
705
+ :type => 'list'})
706
+ end
707
+ end
708
+
709
+ RubyXL::Worksheet.send(:include, RubyXL::WorksheetConvenienceMethods) # ruby 2.1 compat
710
+ end