caxlsx 2.0.2

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 (305) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +9 -0
  3. data/.yardopts_guide +19 -0
  4. data/CHANGELOG.md +239 -0
  5. data/LICENSE +22 -0
  6. data/README.md +256 -0
  7. data/Rakefile +31 -0
  8. data/examples/2010_comments.rb +17 -0
  9. data/examples/anchor_swapping.rb +28 -0
  10. data/examples/auto_filter.rb +16 -0
  11. data/examples/basic_charts.rb +58 -0
  12. data/examples/chart_colors.rb +88 -0
  13. data/examples/colored_links.rb +59 -0
  14. data/examples/conditional_formatting/example_conditional_formatting.rb +74 -0
  15. data/examples/conditional_formatting/getting_barred.rb +37 -0
  16. data/examples/conditional_formatting/hitting_the_high_notes.rb +37 -0
  17. data/examples/conditional_formatting/scaled_colors.rb +39 -0
  18. data/examples/conditional_formatting/stop_and_go.rb +37 -0
  19. data/examples/data_validation.rb +50 -0
  20. data/examples/example.rb +777 -0
  21. data/examples/extractive.rb +45 -0
  22. data/examples/image1.jpeg +0 -0
  23. data/examples/ios_preview.rb +14 -0
  24. data/examples/page_setup.rb +11 -0
  25. data/examples/pivot_table.rb +39 -0
  26. data/examples/sheet_protection.rb +10 -0
  27. data/examples/skydrive/real_example.rb +63 -0
  28. data/examples/styles.rb +66 -0
  29. data/examples/underline.rb +13 -0
  30. data/examples/wrap_text.rb +21 -0
  31. data/lib/axlsx.rb +152 -0
  32. data/lib/axlsx/content_type/abstract_content_type.rb +32 -0
  33. data/lib/axlsx/content_type/content_type.rb +26 -0
  34. data/lib/axlsx/content_type/default.rb +25 -0
  35. data/lib/axlsx/content_type/override.rb +25 -0
  36. data/lib/axlsx/doc_props/app.rb +235 -0
  37. data/lib/axlsx/doc_props/core.rb +39 -0
  38. data/lib/axlsx/drawing/ax_data_source.rb +26 -0
  39. data/lib/axlsx/drawing/axes.rb +61 -0
  40. data/lib/axlsx/drawing/axis.rb +187 -0
  41. data/lib/axlsx/drawing/bar_3D_chart.rb +151 -0
  42. data/lib/axlsx/drawing/bar_series.rb +82 -0
  43. data/lib/axlsx/drawing/cat_axis.rb +85 -0
  44. data/lib/axlsx/drawing/chart.rb +232 -0
  45. data/lib/axlsx/drawing/d_lbls.rb +90 -0
  46. data/lib/axlsx/drawing/drawing.rb +162 -0
  47. data/lib/axlsx/drawing/graphic_frame.rb +54 -0
  48. data/lib/axlsx/drawing/hyperlink.rb +102 -0
  49. data/lib/axlsx/drawing/line_3D_chart.rb +68 -0
  50. data/lib/axlsx/drawing/line_chart.rb +99 -0
  51. data/lib/axlsx/drawing/line_series.rb +81 -0
  52. data/lib/axlsx/drawing/marker.rb +84 -0
  53. data/lib/axlsx/drawing/num_data.rb +52 -0
  54. data/lib/axlsx/drawing/num_data_source.rb +62 -0
  55. data/lib/axlsx/drawing/num_val.rb +32 -0
  56. data/lib/axlsx/drawing/one_cell_anchor.rb +98 -0
  57. data/lib/axlsx/drawing/pic.rb +205 -0
  58. data/lib/axlsx/drawing/picture_locking.rb +44 -0
  59. data/lib/axlsx/drawing/pie_3D_chart.rb +48 -0
  60. data/lib/axlsx/drawing/pie_series.rb +74 -0
  61. data/lib/axlsx/drawing/scaling.rb +60 -0
  62. data/lib/axlsx/drawing/scatter_chart.rb +74 -0
  63. data/lib/axlsx/drawing/scatter_series.rb +65 -0
  64. data/lib/axlsx/drawing/ser_axis.rb +45 -0
  65. data/lib/axlsx/drawing/series.rb +69 -0
  66. data/lib/axlsx/drawing/series_title.rb +23 -0
  67. data/lib/axlsx/drawing/str_data.rb +42 -0
  68. data/lib/axlsx/drawing/str_val.rb +32 -0
  69. data/lib/axlsx/drawing/title.rb +78 -0
  70. data/lib/axlsx/drawing/two_cell_anchor.rb +92 -0
  71. data/lib/axlsx/drawing/val_axis.rb +37 -0
  72. data/lib/axlsx/drawing/view_3D.rb +115 -0
  73. data/lib/axlsx/drawing/vml_drawing.rb +42 -0
  74. data/lib/axlsx/drawing/vml_shape.rb +66 -0
  75. data/lib/axlsx/package.rb +352 -0
  76. data/lib/axlsx/rels/relationship.rb +129 -0
  77. data/lib/axlsx/rels/relationships.rb +29 -0
  78. data/lib/axlsx/stylesheet/border.rb +71 -0
  79. data/lib/axlsx/stylesheet/border_pr.rb +71 -0
  80. data/lib/axlsx/stylesheet/cell_alignment.rb +134 -0
  81. data/lib/axlsx/stylesheet/cell_protection.rb +43 -0
  82. data/lib/axlsx/stylesheet/cell_style.rb +74 -0
  83. data/lib/axlsx/stylesheet/color.rb +78 -0
  84. data/lib/axlsx/stylesheet/dxf.rb +79 -0
  85. data/lib/axlsx/stylesheet/fill.rb +35 -0
  86. data/lib/axlsx/stylesheet/font.rb +148 -0
  87. data/lib/axlsx/stylesheet/gradient_fill.rb +103 -0
  88. data/lib/axlsx/stylesheet/gradient_stop.rb +37 -0
  89. data/lib/axlsx/stylesheet/num_fmt.rb +79 -0
  90. data/lib/axlsx/stylesheet/pattern_fill.rb +73 -0
  91. data/lib/axlsx/stylesheet/styles.rb +420 -0
  92. data/lib/axlsx/stylesheet/table_style.rb +54 -0
  93. data/lib/axlsx/stylesheet/table_style_element.rb +79 -0
  94. data/lib/axlsx/stylesheet/table_styles.rb +46 -0
  95. data/lib/axlsx/stylesheet/xf.rb +147 -0
  96. data/lib/axlsx/util/accessors.rb +64 -0
  97. data/lib/axlsx/util/constants.rb +392 -0
  98. data/lib/axlsx/util/options_parser.rb +15 -0
  99. data/lib/axlsx/util/parser.rb +44 -0
  100. data/lib/axlsx/util/serialized_attributes.rb +79 -0
  101. data/lib/axlsx/util/simple_typed_list.rb +203 -0
  102. data/lib/axlsx/util/storage.rb +146 -0
  103. data/lib/axlsx/util/validators.rb +300 -0
  104. data/lib/axlsx/version.rb +5 -0
  105. data/lib/axlsx/workbook/defined_name.rb +129 -0
  106. data/lib/axlsx/workbook/defined_names.rb +21 -0
  107. data/lib/axlsx/workbook/shared_strings_table.rb +77 -0
  108. data/lib/axlsx/workbook/workbook.rb +354 -0
  109. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +77 -0
  110. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -0
  111. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +246 -0
  112. data/lib/axlsx/workbook/worksheet/break.rb +37 -0
  113. data/lib/axlsx/workbook/worksheet/cell.rb +416 -0
  114. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +144 -0
  115. data/lib/axlsx/workbook/worksheet/cfvo.rb +62 -0
  116. data/lib/axlsx/workbook/worksheet/cfvos.rb +15 -0
  117. data/lib/axlsx/workbook/worksheet/col.rb +144 -0
  118. data/lib/axlsx/workbook/worksheet/col_breaks.rb +35 -0
  119. data/lib/axlsx/workbook/worksheet/color_scale.rb +110 -0
  120. data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
  121. data/lib/axlsx/workbook/worksheet/comment.rb +92 -0
  122. data/lib/axlsx/workbook/worksheet/comments.rb +85 -0
  123. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +82 -0
  124. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +220 -0
  125. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
  126. data/lib/axlsx/workbook/worksheet/data_bar.rb +131 -0
  127. data/lib/axlsx/workbook/worksheet/data_validation.rb +244 -0
  128. data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
  129. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +30 -0
  130. data/lib/axlsx/workbook/worksheet/dimension.rb +64 -0
  131. data/lib/axlsx/workbook/worksheet/header_footer.rb +54 -0
  132. data/lib/axlsx/workbook/worksheet/icon_set.rb +83 -0
  133. data/lib/axlsx/workbook/worksheet/merged_cells.rb +35 -0
  134. data/lib/axlsx/workbook/worksheet/page_margins.rb +99 -0
  135. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +44 -0
  136. data/lib/axlsx/workbook/worksheet/page_setup.rb +242 -0
  137. data/lib/axlsx/workbook/worksheet/pane.rb +141 -0
  138. data/lib/axlsx/workbook/worksheet/pivot_table.rb +273 -0
  139. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +66 -0
  140. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +24 -0
  141. data/lib/axlsx/workbook/worksheet/print_options.rb +41 -0
  142. data/lib/axlsx/workbook/worksheet/protected_range.rb +49 -0
  143. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
  144. data/lib/axlsx/workbook/worksheet/row.rb +172 -0
  145. data/lib/axlsx/workbook/worksheet/row_breaks.rb +33 -0
  146. data/lib/axlsx/workbook/worksheet/selection.rb +103 -0
  147. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +29 -0
  148. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
  149. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +60 -0
  150. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +69 -0
  151. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +120 -0
  152. data/lib/axlsx/workbook/worksheet/sheet_view.rb +213 -0
  153. data/lib/axlsx/workbook/worksheet/table.rb +102 -0
  154. data/lib/axlsx/workbook/worksheet/table_style_info.rb +51 -0
  155. data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
  156. data/lib/axlsx/workbook/worksheet/worksheet.rb +769 -0
  157. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +58 -0
  158. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +58 -0
  159. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +74 -0
  160. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -0
  161. data/lib/schema/dc.xsd +118 -0
  162. data/lib/schema/dcmitype.xsd +52 -0
  163. data/lib/schema/dcterms.xsd +331 -0
  164. data/lib/schema/dml-chart.xsd +1499 -0
  165. data/lib/schema/dml-chartDrawing.xsd +146 -0
  166. data/lib/schema/dml-compatibility.xsd +14 -0
  167. data/lib/schema/dml-diagram.xsd +1091 -0
  168. data/lib/schema/dml-lockedCanvas.xsd +11 -0
  169. data/lib/schema/dml-main.xsd +3048 -0
  170. data/lib/schema/dml-picture.xsd +23 -0
  171. data/lib/schema/dml-spreadsheetDrawing.xsd +185 -0
  172. data/lib/schema/dml-wordprocessingDrawing.xsd +185 -0
  173. data/lib/schema/opc-contentTypes.xsd +42 -0
  174. data/lib/schema/opc-coreProperties.xsd +54 -0
  175. data/lib/schema/opc-digSig.xsd +49 -0
  176. data/lib/schema/opc-relationships.xsd +33 -0
  177. data/lib/schema/pml.xsd +1676 -0
  178. data/lib/schema/shared-additionalCharacteristics.xsd +28 -0
  179. data/lib/schema/shared-bibliography.xsd +144 -0
  180. data/lib/schema/shared-commonSimpleTypes.xsd +166 -0
  181. data/lib/schema/shared-customXmlDataProperties.xsd +25 -0
  182. data/lib/schema/shared-customXmlSchemaProperties.xsd +18 -0
  183. data/lib/schema/shared-documentPropertiesCustom.xsd +59 -0
  184. data/lib/schema/shared-documentPropertiesExtended.xsd +56 -0
  185. data/lib/schema/shared-documentPropertiesVariantTypes.xsd +195 -0
  186. data/lib/schema/shared-math.xsd +582 -0
  187. data/lib/schema/shared-relationshipReference.xsd +25 -0
  188. data/lib/schema/sml.xsd +4434 -0
  189. data/lib/schema/vml-main.xsd +569 -0
  190. data/lib/schema/vml-officeDrawing.xsd +509 -0
  191. data/lib/schema/vml-presentationDrawing.xsd +12 -0
  192. data/lib/schema/vml-spreadsheetDrawing.xsd +108 -0
  193. data/lib/schema/vml-wordprocessingDrawing.xsd +96 -0
  194. data/lib/schema/wml.xsd +3644 -0
  195. data/lib/schema/xml.xsd +116 -0
  196. data/test/benchmark.rb +72 -0
  197. data/test/content_type/tc_content_type.rb +76 -0
  198. data/test/content_type/tc_default.rb +16 -0
  199. data/test/content_type/tc_override.rb +14 -0
  200. data/test/doc_props/tc_app.rb +43 -0
  201. data/test/doc_props/tc_core.rb +42 -0
  202. data/test/drawing/tc_axes.rb +8 -0
  203. data/test/drawing/tc_axis.rb +85 -0
  204. data/test/drawing/tc_bar_3D_chart.rb +71 -0
  205. data/test/drawing/tc_bar_series.rb +37 -0
  206. data/test/drawing/tc_cat_axis.rb +31 -0
  207. data/test/drawing/tc_cat_axis_data.rb +27 -0
  208. data/test/drawing/tc_chart.rb +110 -0
  209. data/test/drawing/tc_d_lbls.rb +57 -0
  210. data/test/drawing/tc_data_source.rb +17 -0
  211. data/test/drawing/tc_drawing.rb +80 -0
  212. data/test/drawing/tc_graphic_frame.rb +27 -0
  213. data/test/drawing/tc_hyperlink.rb +64 -0
  214. data/test/drawing/tc_line_3d_chart.rb +47 -0
  215. data/test/drawing/tc_line_chart.rb +39 -0
  216. data/test/drawing/tc_line_series.rb +30 -0
  217. data/test/drawing/tc_marker.rb +44 -0
  218. data/test/drawing/tc_named_axis_data.rb +27 -0
  219. data/test/drawing/tc_num_data.rb +31 -0
  220. data/test/drawing/tc_num_val.rb +29 -0
  221. data/test/drawing/tc_one_cell_anchor.rb +66 -0
  222. data/test/drawing/tc_pic.rb +107 -0
  223. data/test/drawing/tc_picture_locking.rb +72 -0
  224. data/test/drawing/tc_pie_3D_chart.rb +28 -0
  225. data/test/drawing/tc_pie_series.rb +32 -0
  226. data/test/drawing/tc_scaling.rb +36 -0
  227. data/test/drawing/tc_scatter_chart.rb +48 -0
  228. data/test/drawing/tc_scatter_series.rb +21 -0
  229. data/test/drawing/tc_ser_axis.rb +31 -0
  230. data/test/drawing/tc_series.rb +23 -0
  231. data/test/drawing/tc_series_title.rb +33 -0
  232. data/test/drawing/tc_str_data.rb +18 -0
  233. data/test/drawing/tc_str_val.rb +21 -0
  234. data/test/drawing/tc_title.rb +49 -0
  235. data/test/drawing/tc_two_cell_anchor.rb +36 -0
  236. data/test/drawing/tc_val_axis.rb +24 -0
  237. data/test/drawing/tc_view_3D.rb +54 -0
  238. data/test/drawing/tc_vml_drawing.rb +25 -0
  239. data/test/drawing/tc_vml_shape.rb +106 -0
  240. data/test/profile.rb +24 -0
  241. data/test/rels/tc_relationship.rb +44 -0
  242. data/test/rels/tc_relationships.rb +37 -0
  243. data/test/stylesheet/tc_border.rb +37 -0
  244. data/test/stylesheet/tc_border_pr.rb +32 -0
  245. data/test/stylesheet/tc_cell_alignment.rb +81 -0
  246. data/test/stylesheet/tc_cell_protection.rb +29 -0
  247. data/test/stylesheet/tc_cell_style.rb +57 -0
  248. data/test/stylesheet/tc_color.rb +43 -0
  249. data/test/stylesheet/tc_dxf.rb +81 -0
  250. data/test/stylesheet/tc_fill.rb +18 -0
  251. data/test/stylesheet/tc_font.rb +121 -0
  252. data/test/stylesheet/tc_gradient_fill.rb +72 -0
  253. data/test/stylesheet/tc_gradient_stop.rb +31 -0
  254. data/test/stylesheet/tc_num_fmt.rb +30 -0
  255. data/test/stylesheet/tc_pattern_fill.rb +43 -0
  256. data/test/stylesheet/tc_styles.rb +235 -0
  257. data/test/stylesheet/tc_table_style.rb +44 -0
  258. data/test/stylesheet/tc_table_style_element.rb +45 -0
  259. data/test/stylesheet/tc_table_styles.rb +29 -0
  260. data/test/stylesheet/tc_xf.rb +120 -0
  261. data/test/tc_axlsx.rb +72 -0
  262. data/test/tc_helper.rb +10 -0
  263. data/test/tc_package.rb +227 -0
  264. data/test/util/tc_serialized_attributes.rb +19 -0
  265. data/test/util/tc_simple_typed_list.rb +78 -0
  266. data/test/util/tc_validators.rb +186 -0
  267. data/test/workbook/tc_defined_name.rb +41 -0
  268. data/test/workbook/tc_shared_strings_table.rb +44 -0
  269. data/test/workbook/tc_workbook.rb +125 -0
  270. data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +38 -0
  271. data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +76 -0
  272. data/test/workbook/worksheet/auto_filter/tc_filters.rb +50 -0
  273. data/test/workbook/worksheet/tc_break.rb +49 -0
  274. data/test/workbook/worksheet/tc_cell.rb +319 -0
  275. data/test/workbook/worksheet/tc_cfvo.rb +31 -0
  276. data/test/workbook/worksheet/tc_col.rb +78 -0
  277. data/test/workbook/worksheet/tc_color_scale.rb +58 -0
  278. data/test/workbook/worksheet/tc_comment.rb +72 -0
  279. data/test/workbook/worksheet/tc_comments.rb +57 -0
  280. data/test/workbook/worksheet/tc_conditional_formatting.rb +224 -0
  281. data/test/workbook/worksheet/tc_data_bar.rb +46 -0
  282. data/test/workbook/worksheet/tc_data_validation.rb +265 -0
  283. data/test/workbook/worksheet/tc_date_time_converter.rb +124 -0
  284. data/test/workbook/worksheet/tc_header_footer.rb +151 -0
  285. data/test/workbook/worksheet/tc_icon_set.rb +45 -0
  286. data/test/workbook/worksheet/tc_page_margins.rb +97 -0
  287. data/test/workbook/worksheet/tc_page_set_up_pr.rb +15 -0
  288. data/test/workbook/worksheet/tc_page_setup.rb +143 -0
  289. data/test/workbook/worksheet/tc_pane.rb +54 -0
  290. data/test/workbook/worksheet/tc_pivot_table.rb +120 -0
  291. data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +54 -0
  292. data/test/workbook/worksheet/tc_print_options.rb +72 -0
  293. data/test/workbook/worksheet/tc_protected_range.rb +17 -0
  294. data/test/workbook/worksheet/tc_row.rb +117 -0
  295. data/test/workbook/worksheet/tc_selection.rb +55 -0
  296. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +18 -0
  297. data/test/workbook/worksheet/tc_sheet_format_pr.rb +88 -0
  298. data/test/workbook/worksheet/tc_sheet_pr.rb +27 -0
  299. data/test/workbook/worksheet/tc_sheet_protection.rb +117 -0
  300. data/test/workbook/worksheet/tc_sheet_view.rb +214 -0
  301. data/test/workbook/worksheet/tc_table.rb +68 -0
  302. data/test/workbook/worksheet/tc_table_style_info.rb +53 -0
  303. data/test/workbook/worksheet/tc_worksheet.rb +538 -0
  304. data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +55 -0
  305. metadata +546 -0
@@ -0,0 +1,20 @@
1
+ module Axlsx
2
+
3
+ # The cols class manages the col object used to manage column widths.
4
+ # This is where the magic happens with autowidth
5
+ class Cols < SimpleTypedList
6
+
7
+ def initialize(worksheet)
8
+ raise ArgumentError, "you must provide a worksheet" unless worksheet.is_a?(Worksheet)
9
+ super Col
10
+ @worksheet = worksheet
11
+ end
12
+
13
+ def to_xml_string(str = '')
14
+ return if empty?
15
+ str << '<cols>'
16
+ each { |item| item.to_xml_string(str) }
17
+ str << '</cols>'
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,92 @@
1
+ module Axlsx
2
+
3
+ # A comment is the text data for a comment
4
+ class Comment
5
+
6
+ include Axlsx::OptionsParser
7
+ include Axlsx::Accessors
8
+
9
+ # Creates a new comment object
10
+ # @param [Comments] comments The comment collection this comment belongs to
11
+ # @param [Hash] options
12
+ # @option [String] author the author of the comment
13
+ # @option [String] text The text for the comment
14
+ # @option [String] ref The refence (e.g. 'A3' where this comment will be anchored.
15
+ # @option [Boolean] visible This controls the visiblity of the associated vml_shape.
16
+ def initialize(comments, options={})
17
+ raise ArgumentError, "A comment needs a parent comments object" unless comments.is_a?(Comments)
18
+ @visible = true
19
+ @comments = comments
20
+ parse_options options
21
+ yield self if block_given?
22
+ end
23
+
24
+ string_attr_accessor :text, :author
25
+ boolean_attr_accessor :visible
26
+
27
+ # The owning Comments object
28
+ # @return [Comments]
29
+ attr_reader :comments
30
+
31
+
32
+ # The string based cell position reference (e.g. 'A1') that determines the positioning of this comment
33
+ # @return [String|Cell]
34
+ attr_reader :ref
35
+
36
+ # TODO
37
+ # r (Rich Text Run)
38
+ # rPh (Phonetic Text Run)
39
+ # phoneticPr (Phonetic Properties)
40
+
41
+ # The vml shape that will render this comment
42
+ # @return [VmlShape]
43
+ def vml_shape
44
+ @vml_shape ||= initialize_vml_shape
45
+ end
46
+
47
+ # The index of this author in a unique sorted list of all authors in
48
+ # the comment.
49
+ # @return [Integer]
50
+ def author_index
51
+ @comments.authors.index(author)
52
+ end
53
+
54
+ # @see ref
55
+ def ref=(v)
56
+ Axlsx::DataTypeValidator.validate "Comment.ref", [String, Cell], v
57
+ @ref = v if v.is_a?(String)
58
+ @ref = v.r if v.is_a?(Cell)
59
+ end
60
+
61
+ # serialize the object
62
+ # @param [String] str
63
+ # @return [String]
64
+ def to_xml_string(str = "")
65
+ author = @comments.authors[author_index]
66
+ str << '<comment ref="' << ref << '" authorId="' << author_index.to_s << '">'
67
+ str << '<text>'
68
+ unless author.to_s == ""
69
+ str << '<r><rPr><b/><color indexed="81"/></rPr>'
70
+ str << "<t>" << ::CGI.escapeHTML(author.to_s) << ":\n</t></r>"
71
+ end
72
+ str << '<r>'
73
+ str << '<rPr><color indexed="81"/></rPr>'
74
+ str << '<t>' << ::CGI.escapeHTML(text) << '</t></r></text>'
75
+ str << '</comment>'
76
+ end
77
+
78
+ private
79
+
80
+ # initialize the vml shape based on this comment's ref/position in the worksheet.
81
+ # by default, all columns are 5 columns wide and 5 rows high
82
+ def initialize_vml_shape
83
+ pos = Axlsx::name_to_indices(ref)
84
+ @vml_shape = VmlShape.new(:row => pos[1], :column => pos[0], :visible => @visible) do |vml|
85
+ vml.left_column = vml.column
86
+ vml.right_column = vml.column + 2
87
+ vml.top_row = vml.row
88
+ vml.bottom_row = vml.row + 4
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,85 @@
1
+ # -*- coding: utf-8 -*-
2
+ module Axlsx
3
+
4
+ # Comments is a collection of Comment objects for a worksheet
5
+ class Comments < SimpleTypedList
6
+
7
+ # the vml_drawing that holds the shapes for comments
8
+ # @return [VmlDrawing]
9
+ attr_reader :vml_drawing
10
+
11
+ # The worksheet that these comments belong to
12
+ # @return [Worksheet]
13
+ attr_reader :worksheet
14
+
15
+ # The index of this collection in the workbook. Effectively the index of the worksheet.
16
+ # @return [Integer]
17
+ def index
18
+ @worksheet.index
19
+ end
20
+
21
+ # The part name for this object
22
+ # @return [String]
23
+ def pn
24
+ "#{COMMENT_PN % (index+1)}"
25
+ end
26
+
27
+ # Creates a new Comments object
28
+ # @param [Worksheet] worksheet The sheet that these comments belong to.
29
+ def initialize(worksheet)
30
+ raise ArgumentError, "you must provide a worksheet" unless worksheet.is_a?(Worksheet)
31
+ super(Comment)
32
+ @worksheet = worksheet
33
+ @vml_drawing = VmlDrawing.new(self)
34
+ end
35
+
36
+ # Adds a new comment to the worksheet that owns these comments.
37
+ # @note the author, text and ref options are required
38
+ # @option options [String] author The name of the author for this comment
39
+ # @option options [String] text The text for this comment
40
+ # @option options [Stirng|Cell] ref The cell that this comment is attached to.
41
+ def add_comment(options={})
42
+ raise ArgumentError, "Comment require an author" unless options[:author]
43
+ raise ArgumentError, "Comment requires text" unless options[:text]
44
+ raise ArgumentError, "Comment requires ref" unless options[:ref]
45
+ @list << Comment.new(self, options)
46
+ yield @list.last if block_given?
47
+ @list.last
48
+ end
49
+
50
+ # A sorted list of the unique authors in the contained comments
51
+ # @return [Array]
52
+ def authors
53
+ @list.map { |comment| comment.author.to_s }.uniq.sort
54
+ end
55
+
56
+ # The relationships required by this object
57
+ # @return [Array]
58
+ def relationships
59
+ [Relationship.new(self, VML_DRAWING_R, "../#{vml_drawing.pn}"),
60
+ Relationship.new(self, COMMENT_R, "../#{pn}"),
61
+ Relationship.new(self, COMMENT_R_NULL, "NULL")]
62
+ end
63
+
64
+ # serialize the object
65
+ # @param [String] str
66
+ # @return [String]
67
+ def to_xml_string(str="")
68
+ str << '<?xml version="1.0" encoding="UTF-8"?>'
69
+ str << '<comments xmlns="' << XML_NS << '">'
70
+ str << '<authors>'
71
+ authors.each do |author|
72
+ str << '<author>' << author.to_s << '</author>'
73
+ end
74
+ str << '</authors>'
75
+ str << '<commentList>'
76
+ @list.each do |comment|
77
+ comment.to_xml_string str
78
+ end
79
+ str << '</commentList></comments>'
80
+
81
+ end
82
+
83
+ end
84
+
85
+ end
@@ -0,0 +1,82 @@
1
+ module Axlsx
2
+ # Conditional formatting allows styling of ranges based on functions
3
+ #
4
+ # @note The recommended way to manage conditional formatting is via Worksheet#add_conditional_formatting
5
+ # @see Worksheet#add_conditional_formatting
6
+ # @see ConditionalFormattingRule
7
+ class ConditionalFormatting
8
+
9
+ include Axlsx::OptionsParser
10
+
11
+ # Creates a new {ConditionalFormatting} object
12
+ # @option options [Array] rules The rules to apply
13
+ # @option options [String] sqref The range to apply the rules to
14
+ def initialize(options={})
15
+ @rules = []
16
+ parse_options options
17
+ end
18
+
19
+ # Range over which the formatting is applied, in "A1:B2" format
20
+ # @return [String]
21
+ attr_reader :sqref
22
+
23
+ # Rules to apply the formatting to. Can be either a hash of
24
+ # options to create a {ConditionalFormattingRule}, an array of hashes
25
+ # for multiple ConditionalFormattingRules, or an array of already
26
+ # created ConditionalFormattingRules.
27
+ # @see ConditionalFormattingRule#initialize
28
+ # @return [Array]
29
+ attr_reader :rules
30
+
31
+ # Add Conditional Formatting Rules to this object. Rules can either
32
+ # be already created {ConditionalFormattingRule} elements or
33
+ # hashes of options for automatic creation. If rules is a hash
34
+ # instead of an array, assume only one rule being added.
35
+ #
36
+ # @example This would apply formatting "1" to cells > 20, and formatting "2" to cells < 1
37
+ # conditional_formatting.add_rules [
38
+ # { :type => :cellIs, :operator => :greaterThan, :formula => "20", :dxfId => 1, :priority=> 1 },
39
+ # { :type => :cellIs, :operator => :lessThan, :formula => "10", :dxfId => 2, :priority=> 2 } ]
40
+ #
41
+ # @param [Array|Hash] rules the rules to apply, can be just one in hash form
42
+ # @see ConditionalFormattingRule#initialize
43
+ def add_rules(rules)
44
+ rules = [rules] if rules.is_a? Hash
45
+ rules.each do |rule|
46
+ add_rule rule
47
+ end
48
+ end
49
+
50
+ # Add a ConditionalFormattingRule. If a hash of options is passed
51
+ # in create a rule on the fly.
52
+ # @param [ConditionalFormattingRule|Hash] rule A rule to use, or the options necessary to create one.
53
+ # @see ConditionalFormattingRule#initialize
54
+ def add_rule(rule)
55
+ if rule.is_a? Axlsx::ConditionalFormattingRule
56
+ @rules << rule
57
+ elsif rule.is_a? Hash
58
+ @rules << ConditionalFormattingRule.new(rule)
59
+ end
60
+ end
61
+
62
+ # @see rules
63
+ def rules=(v); @rules = v end
64
+ # @see sqref
65
+ def sqref=(v); Axlsx::validate_string(v); @sqref = v end
66
+
67
+ # Serializes the conditional formatting element
68
+ # @example Conditional Formatting XML looks like:
69
+ # <conditionalFormatting sqref="E3:E9">
70
+ # <cfRule type="cellIs" dxfId="0" priority="1" operator="greaterThan">
71
+ # <formula>0.5</formula>
72
+ # </cfRule>
73
+ # </conditionalFormatting>
74
+ # @param [String] str
75
+ # @return [String]
76
+ def to_xml_string(str = '')
77
+ str << '<conditionalFormatting sqref="' << sqref << '">'
78
+ str << rules.collect{ |rule| rule.to_xml_string }.join(' ')
79
+ str << '</conditionalFormatting>'
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,220 @@
1
+ # -*- coding: utf-8 -*-
2
+ module Axlsx
3
+ # Conditional formatting rules specify formulas whose evaluations
4
+ # format cells
5
+ #
6
+ # @note The recommended way to manage these rules is via Worksheet#add_conditional_formatting
7
+ # @see Worksheet#add_conditional_formatting
8
+ # @see ConditionalFormattingRule#initialize
9
+ class ConditionalFormattingRule
10
+
11
+ include Axlsx::OptionsParser
12
+ include Axlsx::SerializedAttributes
13
+
14
+ # Creates a new Conditional Formatting Rule object
15
+ # @option options [Symbol] type The type of this formatting rule
16
+ # @option options [Boolean] aboveAverage This is an aboveAverage rule
17
+ # @option options [Boolean] bottom This is a bottom N rule.
18
+ # @option options [Integer] dxfId The formatting id to apply to matches
19
+ # @option options [Boolean] equalAverage Is the aboveAverage or belowAverage rule inclusive
20
+ # @option options [Integer] priority The priority of the rule, 1 is highest
21
+ # @option options [Symbol] operator Which operator to apply
22
+ # @option options [String] text The value to apply a text operator against
23
+ # @option options [Boolean] percent If a top/bottom N rule, evaluate as N% rather than N
24
+ # @option options [Integer] rank If a top/bottom N rule, the value of N
25
+ # @option options [Integer] stdDev The number of standard deviations above or below the average to match
26
+ # @option options [Boolean] stopIfTrue Stop evaluating rules after this rule matches
27
+ # @option options [Symbol] timePeriod The time period in a date occuring... rule
28
+ # @option options [String] formula The formula to match against in i.e. an equal rule. Use a [minimum, maximum] array for cellIs between/notBetween conditionals.
29
+ def initialize(options={})
30
+ @color_scale = @data_bar = @icon_set = @formula = nil
31
+ parse_options options
32
+ end
33
+
34
+ serializable_attributes :type, :aboveAverage, :bottom, :dxfId, :equalAverage,
35
+ :priority, :operator, :text, :percent, :rank, :stdDev,
36
+ :stopIfTrue, :timePeriod
37
+
38
+ # Formula
39
+ # The formula or value to match against (e.g. 5 with an operator of :greaterThan to specify cell_value > 5).
40
+ # If the operator is :between or :notBetween, use an array to specify [minimum, maximum]
41
+ # @return [String]
42
+ attr_reader :formula
43
+
44
+ # Type (ST_CfType)
45
+ # options are expression, cellIs, colorScale, dataBar, iconSet,
46
+ # top10, uniqueValues, duplicateValues, containsText,
47
+ # notContainsText, beginsWith, endsWith, containsBlanks,
48
+ # notContainsBlanks, containsErrors, notContainsErrors,
49
+ # timePeriod, aboveAverage
50
+ # @return [Symbol]
51
+ attr_reader :type
52
+
53
+ # Above average rule
54
+ # Indicates whether the rule is an "above average" rule. True
55
+ # indicates 'above average'. This attribute is ignored if type is
56
+ # not equal to aboveAverage.
57
+ # @return [Boolean]
58
+ attr_reader :aboveAverage
59
+
60
+ # Bottom N rule
61
+ # @return [Boolean]
62
+ attr_reader :bottom
63
+
64
+ # Differential Formatting Id
65
+ # @return [Integer]
66
+ attr_reader :dxfId
67
+
68
+ # Equal Average
69
+ # Flag indicating whether the 'aboveAverage' and 'belowAverage'
70
+ # criteria is inclusive of the average itself, or exclusive of
71
+ # that value.
72
+ # @return [Boolean]
73
+ attr_reader :equalAverage
74
+
75
+ # Operator
76
+ # The operator in a "cell value is" conditional formatting
77
+ # rule. This attribute is ignored if type is not equal to cellIs
78
+ #
79
+ # Operator must be one of lessThan, lessThanOrEqual, equal,
80
+ # notEqual, greaterThanOrEqual, greaterThan, between, notBetween,
81
+ # containsText, notContains, beginsWith, endsWith
82
+ # @return [Symbol]
83
+ attr_reader :operator
84
+
85
+ # Priority
86
+ # The priority of this conditional formatting rule. This value is
87
+ # used to determine which format should be evaluated and
88
+ # rendered. Lower numeric values are higher priority than higher
89
+ # numeric values, where '1' is the highest priority.
90
+ # @return [Integer]
91
+ attr_reader :priority
92
+
93
+ # Text
94
+ # used in a "text contains" conditional formatting
95
+ # rule.
96
+ # @return [String]
97
+ attr_reader :text
98
+
99
+ # percent (Top 10 Percent)
100
+ # indicates whether a "top/bottom n" rule is a "top/bottom n
101
+ # percent" rule. This attribute is ignored if type is not equal to
102
+ # top10.
103
+ # @return [Boolean]
104
+ attr_reader :percent
105
+
106
+ # rank (Rank)
107
+ # The value of "n" in a "top/bottom n" conditional formatting
108
+ # rule. This attribute is ignored if type is not equal to top10.
109
+ # @return [Integer]
110
+ attr_reader :rank
111
+
112
+ # stdDev (StdDev)
113
+ # The number of standard deviations to include above or below the
114
+ # average in the conditional formatting rule. This attribute is
115
+ # ignored if type is not equal to aboveAverage. If a value is
116
+ # present for stdDev and the rule type = aboveAverage, then this
117
+ # rule is automatically an "above or below N standard deviations"
118
+ # rule.
119
+ # @return [Integer]
120
+ attr_reader :stdDev
121
+
122
+ # stopIfTrue (Stop If True)
123
+ # If this flag is '1', no rules with lower priority shall be
124
+ # applied over this rule, when this rule evaluates to true.
125
+ # @return [Boolean]
126
+ attr_reader :stopIfTrue
127
+
128
+ # timePeriod (Time Period)
129
+ # The applicable time period in a "date occurring…" conditional
130
+ # formatting rule. This attribute is ignored if type is not equal
131
+ # to timePeriod.
132
+ # Valid types are today, yesterday, tomorrow, last7Days,
133
+ # thisMonth, lastMonth, nextMonth, thisWeek, lastWeek, nextWeek
134
+ attr_reader :timePeriod
135
+
136
+
137
+ # colorScale (Color Scale)
138
+ # The color scale to apply to this conditional formatting
139
+ # @return [ColorScale]
140
+ def color_scale
141
+ @color_scale ||= ColorScale.new
142
+ end
143
+
144
+ # dataBar (Data Bar)
145
+ # The data bar to apply to this conditional formatting
146
+ # @return [DataBar]
147
+ def data_bar
148
+ @data_bar ||= DataBar.new
149
+ end
150
+
151
+ # iconSet (Icon Set)
152
+ # The icon set to apply to this conditional formatting
153
+ # @return [IconSet]
154
+ def icon_set
155
+ @icon_set ||= IconSet.new
156
+ end
157
+
158
+ # @see type
159
+ def type=(v); Axlsx::validate_conditional_formatting_type(v); @type = v end
160
+ # @see aboveAverage
161
+ def aboveAverage=(v); Axlsx::validate_boolean(v); @aboveAverage = v end
162
+ # @see bottom
163
+ def bottom=(v); Axlsx::validate_boolean(v); @bottom = v end
164
+ # @see dxfId
165
+ def dxfId=(v); Axlsx::validate_unsigned_numeric(v); @dxfId = v end
166
+ # @see equalAverage
167
+ def equalAverage=(v); Axlsx::validate_boolean(v); @equalAverage = v end
168
+ # @see priority
169
+ def priority=(v); Axlsx::validate_unsigned_numeric(v); @priority = v end
170
+ # @see operator
171
+ def operator=(v); Axlsx::validate_conditional_formatting_operator(v); @operator = v end
172
+ # @see text
173
+ def text=(v); Axlsx::validate_string(v); @text = v end
174
+ # @see percent
175
+ def percent=(v); Axlsx::validate_boolean(v); @percent = v end
176
+ # @see rank
177
+ def rank=(v); Axlsx::validate_unsigned_numeric(v); @rank = v end
178
+ # @see stdDev
179
+ def stdDev=(v); Axlsx::validate_unsigned_numeric(v); @stdDev = v end
180
+ # @see stopIfTrue
181
+ def stopIfTrue=(v); Axlsx::validate_boolean(v); @stopIfTrue = v end
182
+ # @see timePeriod
183
+ def timePeriod=(v); Axlsx::validate_time_period_type(v); @timePeriod = v end
184
+ # @see formula
185
+ def formula=(v); [*v].each {|x| Axlsx::validate_string(x) }; @formula = [*v].map { |form| ::CGI.escapeHTML(form) } end
186
+
187
+ # @see color_scale
188
+ def color_scale=(v)
189
+ Axlsx::DataTypeValidator.validate 'conditional_formatting_rule.color_scale', ColorScale, v
190
+ @color_scale = v
191
+ end
192
+
193
+ # @see data_bar
194
+ def data_bar=(v)
195
+ Axlsx::DataTypeValidator.validate 'conditional_formatting_rule.data_bar', DataBar, v
196
+ @data_bar = v
197
+ end
198
+
199
+ # @see icon_set
200
+ def icon_set=(v)
201
+ Axlsx::DataTypeValidator.validate 'conditional_formatting_rule.icon_set', IconSet, v
202
+ @icon_set = v
203
+ end
204
+
205
+
206
+ # Serializes the conditional formatting rule
207
+ # @param [String] str
208
+ # @return [String]
209
+ def to_xml_string(str = '')
210
+ str << '<cfRule '
211
+ serialized_attributes str
212
+ str << '>'
213
+ str << '<formula>' << [*self.formula].join('</formula><formula>') << '</formula>' if @formula
214
+ @color_scale.to_xml_string(str) if @color_scale && @type == :colorScale
215
+ @data_bar.to_xml_string(str) if @data_bar && @type == :dataBar
216
+ @icon_set.to_xml_string(str) if @icon_set && @type == :iconSet
217
+ str << '</cfRule>'
218
+ end
219
+ end
220
+ end