caxlsx 3.2.0 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (301) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +9 -9
  3. data/.yardopts_guide +18 -18
  4. data/CHANGELOG.md +394 -354
  5. data/LICENSE +21 -21
  6. data/README.md +184 -168
  7. data/Rakefile +28 -29
  8. data/examples/generate.rb +15 -15
  9. data/lib/axlsx/content_type/abstract_content_type.rb +29 -32
  10. data/lib/axlsx/content_type/content_type.rb +22 -26
  11. data/lib/axlsx/content_type/default.rb +21 -25
  12. data/lib/axlsx/content_type/override.rb +21 -25
  13. data/lib/axlsx/doc_props/app.rb +230 -235
  14. data/lib/axlsx/doc_props/core.rb +34 -39
  15. data/lib/axlsx/drawing/area_chart.rb +96 -99
  16. data/lib/axlsx/drawing/area_series.rb +107 -110
  17. data/lib/axlsx/drawing/ax_data_source.rb +21 -26
  18. data/lib/axlsx/drawing/axes.rb +60 -61
  19. data/lib/axlsx/drawing/axis.rb +185 -190
  20. data/lib/axlsx/drawing/bar_3D_chart.rb +145 -148
  21. data/lib/axlsx/drawing/bar_chart.rb +135 -138
  22. data/lib/axlsx/drawing/bar_series.rb +91 -97
  23. data/lib/axlsx/drawing/bubble_chart.rb +56 -59
  24. data/lib/axlsx/drawing/bubble_series.rb +60 -63
  25. data/lib/axlsx/drawing/cat_axis.rb +80 -85
  26. data/lib/axlsx/drawing/chart.rb +294 -276
  27. data/lib/axlsx/drawing/d_lbls.rb +92 -90
  28. data/lib/axlsx/drawing/drawing.rb +163 -167
  29. data/lib/axlsx/drawing/graphic_frame.rb +51 -54
  30. data/lib/axlsx/drawing/hyperlink.rb +97 -100
  31. data/lib/axlsx/drawing/line_3D_chart.rb +64 -68
  32. data/lib/axlsx/drawing/line_chart.rb +96 -99
  33. data/lib/axlsx/drawing/line_series.rb +107 -110
  34. data/lib/axlsx/drawing/marker.rb +80 -84
  35. data/lib/axlsx/drawing/num_data.rb +47 -52
  36. data/lib/axlsx/drawing/num_data_source.rb +58 -62
  37. data/lib/axlsx/drawing/num_val.rb +31 -34
  38. data/lib/axlsx/drawing/one_cell_anchor.rb +97 -99
  39. data/lib/axlsx/drawing/pic.rb +244 -211
  40. data/lib/axlsx/drawing/picture_locking.rb +39 -42
  41. data/lib/axlsx/drawing/pie_3D_chart.rb +42 -47
  42. data/lib/axlsx/drawing/pie_series.rb +69 -74
  43. data/lib/axlsx/drawing/scaling.rb +57 -60
  44. data/lib/axlsx/drawing/scatter_chart.rb +71 -74
  45. data/lib/axlsx/drawing/scatter_series.rb +126 -129
  46. data/lib/axlsx/drawing/ser_axis.rb +41 -45
  47. data/lib/axlsx/drawing/series.rb +67 -69
  48. data/lib/axlsx/drawing/series_title.rb +23 -25
  49. data/lib/axlsx/drawing/str_data.rb +37 -42
  50. data/lib/axlsx/drawing/str_val.rb +31 -34
  51. data/lib/axlsx/drawing/title.rb +104 -97
  52. data/lib/axlsx/drawing/two_cell_anchor.rb +95 -97
  53. data/lib/axlsx/drawing/val_axis.rb +34 -37
  54. data/lib/axlsx/drawing/view_3D.rb +115 -115
  55. data/lib/axlsx/drawing/vml_drawing.rb +39 -42
  56. data/lib/axlsx/drawing/vml_shape.rb +63 -66
  57. data/lib/axlsx/package.rb +397 -388
  58. data/lib/axlsx/rels/relationship.rb +127 -130
  59. data/lib/axlsx/rels/relationships.rb +29 -32
  60. data/lib/axlsx/stylesheet/border.rb +70 -73
  61. data/lib/axlsx/stylesheet/border_pr.rb +69 -71
  62. data/lib/axlsx/stylesheet/cell_alignment.rb +124 -132
  63. data/lib/axlsx/stylesheet/cell_protection.rb +38 -41
  64. data/lib/axlsx/stylesheet/cell_style.rb +68 -72
  65. data/lib/axlsx/stylesheet/color.rb +77 -76
  66. data/lib/axlsx/stylesheet/dxf.rb +75 -79
  67. data/lib/axlsx/stylesheet/fill.rb +31 -35
  68. data/lib/axlsx/stylesheet/font.rb +157 -156
  69. data/lib/axlsx/stylesheet/gradient_fill.rb +101 -103
  70. data/lib/axlsx/stylesheet/gradient_stop.rb +36 -37
  71. data/lib/axlsx/stylesheet/num_fmt.rb +83 -86
  72. data/lib/axlsx/stylesheet/pattern_fill.rb +71 -73
  73. data/lib/axlsx/stylesheet/styles.rb +543 -494
  74. data/lib/axlsx/stylesheet/table_style.rb +51 -54
  75. data/lib/axlsx/stylesheet/table_style_element.rb +74 -77
  76. data/lib/axlsx/stylesheet/table_styles.rb +42 -46
  77. data/lib/axlsx/stylesheet/xf.rb +144 -147
  78. data/lib/axlsx/util/accessors.rb +62 -64
  79. data/lib/axlsx/util/constants.rb +414 -410
  80. data/lib/axlsx/util/mime_type_utils.rb +24 -11
  81. data/lib/axlsx/util/options_parser.rb +15 -16
  82. data/lib/axlsx/util/serialized_attributes.rb +88 -89
  83. data/lib/axlsx/util/simple_typed_list.rb +180 -179
  84. data/lib/axlsx/util/storage.rb +142 -146
  85. data/lib/axlsx/util/validators.rb +315 -312
  86. data/lib/axlsx/util/zip_command.rb +71 -73
  87. data/lib/axlsx/version.rb +4 -5
  88. data/lib/axlsx/workbook/defined_name.rb +129 -128
  89. data/lib/axlsx/workbook/defined_names.rb +20 -21
  90. data/lib/axlsx/workbook/shared_strings_table.rb +74 -77
  91. data/lib/axlsx/workbook/workbook.rb +430 -395
  92. data/lib/axlsx/workbook/workbook_view.rb +75 -80
  93. data/lib/axlsx/workbook/workbook_views.rb +20 -22
  94. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +78 -77
  95. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -94
  96. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +243 -244
  97. data/lib/axlsx/workbook/worksheet/border_creator.rb +79 -0
  98. data/lib/axlsx/workbook/worksheet/break.rb +32 -35
  99. data/lib/axlsx/workbook/worksheet/cell.rb +552 -506
  100. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +164 -164
  101. data/lib/axlsx/workbook/worksheet/cfvo.rb +60 -60
  102. data/lib/axlsx/workbook/worksheet/cfvos.rb +16 -18
  103. data/lib/axlsx/workbook/worksheet/col.rb +142 -145
  104. data/lib/axlsx/workbook/worksheet/col_breaks.rb +34 -35
  105. data/lib/axlsx/workbook/worksheet/color_scale.rb +108 -110
  106. data/lib/axlsx/workbook/worksheet/cols.rb +23 -23
  107. data/lib/axlsx/workbook/worksheet/comment.rb +90 -91
  108. data/lib/axlsx/workbook/worksheet/comments.rb +78 -82
  109. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +81 -82
  110. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +216 -220
  111. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +23 -25
  112. data/lib/axlsx/workbook/worksheet/data_bar.rb +127 -129
  113. data/lib/axlsx/workbook/worksheet/data_validation.rb +266 -246
  114. data/lib/axlsx/workbook/worksheet/data_validations.rb +25 -28
  115. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +28 -30
  116. data/lib/axlsx/workbook/worksheet/dimension.rb +65 -64
  117. data/lib/axlsx/workbook/worksheet/header_footer.rb +51 -52
  118. data/lib/axlsx/workbook/worksheet/icon_set.rb +80 -81
  119. data/lib/axlsx/workbook/worksheet/merged_cells.rb +37 -37
  120. data/lib/axlsx/workbook/worksheet/outline_pr.rb +32 -33
  121. data/lib/axlsx/workbook/worksheet/page_margins.rb +97 -97
  122. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +42 -44
  123. data/lib/axlsx/workbook/worksheet/page_setup.rb +237 -240
  124. data/lib/axlsx/workbook/worksheet/pane.rb +138 -139
  125. data/lib/axlsx/workbook/worksheet/pivot_table.rb +332 -296
  126. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +63 -66
  127. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +23 -24
  128. data/lib/axlsx/workbook/worksheet/print_options.rb +38 -39
  129. data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -47
  130. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +37 -37
  131. data/lib/axlsx/workbook/worksheet/rich_text.rb +53 -55
  132. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +266 -250
  133. data/lib/axlsx/workbook/worksheet/row.rb +173 -164
  134. data/lib/axlsx/workbook/worksheet/row_breaks.rb +32 -33
  135. data/lib/axlsx/workbook/worksheet/selection.rb +99 -101
  136. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +28 -29
  137. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -27
  138. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +18 -18
  139. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +87 -87
  140. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +117 -118
  141. data/lib/axlsx/workbook/worksheet/sheet_view.rb +206 -213
  142. data/lib/axlsx/workbook/worksheet/table.rb +100 -102
  143. data/lib/axlsx/workbook/worksheet/table_style_info.rb +48 -49
  144. data/lib/axlsx/workbook/worksheet/tables.rb +34 -34
  145. data/lib/axlsx/workbook/worksheet/worksheet.rb +857 -786
  146. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +58 -58
  147. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +59 -58
  148. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +73 -74
  149. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -38
  150. data/lib/axlsx.rb +218 -185
  151. data/lib/caxlsx.rb +1 -2
  152. data/lib/schema/dc.xsd +118 -118
  153. data/lib/schema/dcmitype.xsd +51 -51
  154. data/lib/schema/dcterms.xsd +331 -331
  155. data/lib/schema/dml-chartDrawing.xsd +146 -146
  156. data/lib/schema/dml-compatibility.xsd +14 -14
  157. data/lib/schema/dml-lockedCanvas.xsd +11 -11
  158. data/lib/schema/dml-main.xsd +3048 -3048
  159. data/lib/schema/dml-picture.xsd +23 -23
  160. data/lib/schema/dml-spreadsheetDrawing.xsd +185 -185
  161. data/lib/schema/dml-wordprocessingDrawing.xsd +185 -185
  162. data/lib/schema/shared-additionalCharacteristics.xsd +28 -28
  163. data/lib/schema/shared-bibliography.xsd +144 -144
  164. data/lib/schema/shared-commonSimpleTypes.xsd +166 -166
  165. data/lib/schema/shared-customXmlDataProperties.xsd +25 -25
  166. data/lib/schema/shared-customXmlSchemaProperties.xsd +18 -18
  167. data/lib/schema/shared-documentPropertiesCustom.xsd +59 -59
  168. data/lib/schema/shared-documentPropertiesExtended.xsd +56 -56
  169. data/lib/schema/shared-documentPropertiesVariantTypes.xsd +195 -195
  170. data/lib/schema/shared-relationshipReference.xsd +25 -25
  171. data/lib/schema/vml-main.xsd +569 -569
  172. data/lib/schema/vml-officeDrawing.xsd +509 -509
  173. data/lib/schema/vml-presentationDrawing.xsd +12 -12
  174. data/lib/schema/vml-spreadsheetDrawing.xsd +108 -108
  175. data/lib/schema/vml-wordprocessingDrawing.xsd +96 -96
  176. data/lib/schema/xml.xsd +116 -116
  177. metadata +5 -252
  178. data/test/benchmark.rb +0 -72
  179. data/test/content_type/tc_content_type.rb +0 -76
  180. data/test/content_type/tc_default.rb +0 -16
  181. data/test/content_type/tc_override.rb +0 -14
  182. data/test/doc_props/tc_app.rb +0 -43
  183. data/test/doc_props/tc_core.rb +0 -42
  184. data/test/drawing/tc_area_chart.rb +0 -39
  185. data/test/drawing/tc_area_series.rb +0 -71
  186. data/test/drawing/tc_axes.rb +0 -8
  187. data/test/drawing/tc_axis.rb +0 -112
  188. data/test/drawing/tc_bar_3D_chart.rb +0 -86
  189. data/test/drawing/tc_bar_chart.rb +0 -86
  190. data/test/drawing/tc_bar_series.rb +0 -46
  191. data/test/drawing/tc_bubble_chart.rb +0 -44
  192. data/test/drawing/tc_bubble_series.rb +0 -21
  193. data/test/drawing/tc_cat_axis.rb +0 -31
  194. data/test/drawing/tc_cat_axis_data.rb +0 -27
  195. data/test/drawing/tc_chart.rb +0 -123
  196. data/test/drawing/tc_d_lbls.rb +0 -57
  197. data/test/drawing/tc_data_source.rb +0 -23
  198. data/test/drawing/tc_drawing.rb +0 -80
  199. data/test/drawing/tc_graphic_frame.rb +0 -27
  200. data/test/drawing/tc_hyperlink.rb +0 -64
  201. data/test/drawing/tc_line_3d_chart.rb +0 -47
  202. data/test/drawing/tc_line_chart.rb +0 -39
  203. data/test/drawing/tc_line_series.rb +0 -71
  204. data/test/drawing/tc_marker.rb +0 -44
  205. data/test/drawing/tc_named_axis_data.rb +0 -27
  206. data/test/drawing/tc_num_data.rb +0 -31
  207. data/test/drawing/tc_num_val.rb +0 -29
  208. data/test/drawing/tc_one_cell_anchor.rb +0 -66
  209. data/test/drawing/tc_pic.rb +0 -103
  210. data/test/drawing/tc_picture_locking.rb +0 -72
  211. data/test/drawing/tc_pie_3D_chart.rb +0 -28
  212. data/test/drawing/tc_pie_series.rb +0 -33
  213. data/test/drawing/tc_scaling.rb +0 -36
  214. data/test/drawing/tc_scatter_chart.rb +0 -48
  215. data/test/drawing/tc_scatter_series.rb +0 -74
  216. data/test/drawing/tc_ser_axis.rb +0 -31
  217. data/test/drawing/tc_series.rb +0 -23
  218. data/test/drawing/tc_series_title.rb +0 -54
  219. data/test/drawing/tc_str_data.rb +0 -18
  220. data/test/drawing/tc_str_val.rb +0 -30
  221. data/test/drawing/tc_title.rb +0 -70
  222. data/test/drawing/tc_two_cell_anchor.rb +0 -36
  223. data/test/drawing/tc_val_axis.rb +0 -24
  224. data/test/drawing/tc_view_3D.rb +0 -54
  225. data/test/drawing/tc_vml_drawing.rb +0 -25
  226. data/test/drawing/tc_vml_shape.rb +0 -106
  227. data/test/fixtures/image1.gif +0 -0
  228. data/test/fixtures/image1.jpeg +0 -0
  229. data/test/fixtures/image1.jpg +0 -0
  230. data/test/fixtures/image1.png +0 -0
  231. data/test/fixtures/image1_fake.jpg +0 -0
  232. data/test/profile.rb +0 -24
  233. data/test/rels/tc_relationship.rb +0 -52
  234. data/test/rels/tc_relationships.rb +0 -37
  235. data/test/stylesheet/tc_border.rb +0 -37
  236. data/test/stylesheet/tc_border_pr.rb +0 -32
  237. data/test/stylesheet/tc_cell_alignment.rb +0 -81
  238. data/test/stylesheet/tc_cell_protection.rb +0 -29
  239. data/test/stylesheet/tc_cell_style.rb +0 -57
  240. data/test/stylesheet/tc_color.rb +0 -43
  241. data/test/stylesheet/tc_dxf.rb +0 -81
  242. data/test/stylesheet/tc_fill.rb +0 -18
  243. data/test/stylesheet/tc_font.rb +0 -133
  244. data/test/stylesheet/tc_gradient_fill.rb +0 -72
  245. data/test/stylesheet/tc_gradient_stop.rb +0 -31
  246. data/test/stylesheet/tc_num_fmt.rb +0 -30
  247. data/test/stylesheet/tc_pattern_fill.rb +0 -43
  248. data/test/stylesheet/tc_styles.rb +0 -309
  249. data/test/stylesheet/tc_table_style.rb +0 -44
  250. data/test/stylesheet/tc_table_style_element.rb +0 -45
  251. data/test/stylesheet/tc_table_styles.rb +0 -29
  252. data/test/stylesheet/tc_xf.rb +0 -120
  253. data/test/tc_axlsx.rb +0 -109
  254. data/test/tc_helper.rb +0 -10
  255. data/test/tc_package.rb +0 -317
  256. data/test/util/tc_mime_type_utils.rb +0 -13
  257. data/test/util/tc_serialized_attributes.rb +0 -19
  258. data/test/util/tc_simple_typed_list.rb +0 -77
  259. data/test/util/tc_validators.rb +0 -210
  260. data/test/workbook/tc_defined_name.rb +0 -49
  261. data/test/workbook/tc_shared_strings_table.rb +0 -59
  262. data/test/workbook/tc_workbook.rb +0 -165
  263. data/test/workbook/tc_workbook_view.rb +0 -50
  264. data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +0 -38
  265. data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +0 -76
  266. data/test/workbook/worksheet/auto_filter/tc_filters.rb +0 -50
  267. data/test/workbook/worksheet/tc_break.rb +0 -49
  268. data/test/workbook/worksheet/tc_cell.rb +0 -465
  269. data/test/workbook/worksheet/tc_cfvo.rb +0 -31
  270. data/test/workbook/worksheet/tc_col.rb +0 -93
  271. data/test/workbook/worksheet/tc_color_scale.rb +0 -58
  272. data/test/workbook/worksheet/tc_comment.rb +0 -72
  273. data/test/workbook/worksheet/tc_comments.rb +0 -57
  274. data/test/workbook/worksheet/tc_conditional_formatting.rb +0 -224
  275. data/test/workbook/worksheet/tc_data_bar.rb +0 -46
  276. data/test/workbook/worksheet/tc_data_validation.rb +0 -265
  277. data/test/workbook/worksheet/tc_date_time_converter.rb +0 -124
  278. data/test/workbook/worksheet/tc_header_footer.rb +0 -151
  279. data/test/workbook/worksheet/tc_icon_set.rb +0 -45
  280. data/test/workbook/worksheet/tc_outline_pr.rb +0 -19
  281. data/test/workbook/worksheet/tc_page_margins.rb +0 -97
  282. data/test/workbook/worksheet/tc_page_set_up_pr.rb +0 -15
  283. data/test/workbook/worksheet/tc_page_setup.rb +0 -143
  284. data/test/workbook/worksheet/tc_pane.rb +0 -54
  285. data/test/workbook/worksheet/tc_pivot_table.rb +0 -180
  286. data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +0 -62
  287. data/test/workbook/worksheet/tc_print_options.rb +0 -72
  288. data/test/workbook/worksheet/tc_protected_range.rb +0 -17
  289. data/test/workbook/worksheet/tc_rich_text.rb +0 -44
  290. data/test/workbook/worksheet/tc_rich_text_run.rb +0 -173
  291. data/test/workbook/worksheet/tc_row.rb +0 -160
  292. data/test/workbook/worksheet/tc_selection.rb +0 -55
  293. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +0 -18
  294. data/test/workbook/worksheet/tc_sheet_format_pr.rb +0 -88
  295. data/test/workbook/worksheet/tc_sheet_pr.rb +0 -49
  296. data/test/workbook/worksheet/tc_sheet_protection.rb +0 -117
  297. data/test/workbook/worksheet/tc_sheet_view.rb +0 -214
  298. data/test/workbook/worksheet/tc_table.rb +0 -77
  299. data/test/workbook/worksheet/tc_table_style_info.rb +0 -53
  300. data/test/workbook/worksheet/tc_worksheet.rb +0 -632
  301. data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +0 -55
@@ -1,244 +1,243 @@
1
- module Axlsx
2
-
3
- # When multiple values are chosen to filter by, or when a group of date values are chosen to filter by,
4
- # this object groups those criteria together.
5
- class Filters
6
- include Axlsx::OptionsParser
7
- include Axlsx::SerializedAttributes
8
-
9
- # Creates a new Filters object
10
- # @param [Hash] options Options used to set this objects attributes and
11
- # create filter and/or date group items
12
- # @option [Boolean] blank @see blank
13
- # @option [String] calendar_type @see calendar_type
14
- # @option [Array] filter_items An array of values that will be used to create filter objects.
15
- # @option [Array] date_group_items An array of hases defining date group item filters to apply.
16
- # @note The recommended way to interact with filter objects is via AutoFilter#add_column
17
- # @example
18
- # ws.auto_filter.add_column(0, :filters, :blank => true, :calendar_type => 'japan', :filter_items => [100, 'a'])
19
- def initialize(options={})
20
- parse_options options
21
- end
22
-
23
- serializable_attributes :blank, :calendar_type
24
-
25
- # Allowed calendar types
26
- CALENDAR_TYPES = %w(gregorian gregorianUs gregorianMeFrench gregorianArabic hijri hebrew taiwan japan thai korea saka gregorianXlitEnglish gregorianXlitFrench none)
27
-
28
- # Flag indicating whether to filter by blank.
29
- # @return [Boolean]
30
- attr_reader :blank
31
-
32
- # Calendar type for date grouped items.
33
- # Used to interpret the values in dateGroupItem.
34
- # This is the calendar type used to evaluate all dates in the filter column,
35
- # even when those dates are not using the same calendar system / date formatting.
36
- attr_reader :calendar_type
37
-
38
- # Tells us if the row of the cell provided should be filterd as it
39
- # does not meet any of the specified filter_items or
40
- # date_group_items restrictions.
41
- # @param [Cell] cell The cell to test against items
42
- # TODO implement this for date filters as well!
43
- def apply(cell)
44
- return false unless cell
45
- filter_items.each do |filter|
46
- return false if cell.value == filter.val
47
- end
48
- true
49
- end
50
-
51
- # The filter values in this filters object
52
- def filter_items
53
- @filter_items ||= []
54
- end
55
-
56
- # the date group values in this filters object
57
- def date_group_items
58
- @date_group_items ||= []
59
- end
60
-
61
- # @see calendar_type
62
- # @param [String] calendar The calendar type to use. This must be one of the types defined in CALENDAR_TYPES
63
- # @return [String]
64
- def calendar_type=(calendar)
65
- RestrictionValidator.validate 'Filters.calendar_type', CALENDAR_TYPES, calendar
66
- @calendar_type = calendar
67
- end
68
-
69
- # Set the value for blank
70
- # @see blank
71
- def blank=(use_blank)
72
- Axlsx.validate_boolean use_blank
73
- @blank = use_blank
74
- end
75
-
76
- # Serialize the object to xml
77
- def to_xml_string(str = '')
78
- str << "<filters #{serialized_attributes}>"
79
- filter_items.each { |filter| filter.to_xml_string(str) }
80
- date_group_items.each { |date_group_item| date_group_item.to_xml_string(str) }
81
- str << '</filters>'
82
- end
83
-
84
- # not entirely happy with this.
85
- # filter_items should be a simple typed list that overrides << etc
86
- # to create Filter objects from the inserted values. However this
87
- # is most likely so rarely used...(really? do you know that?)
88
- def filter_items=(values)
89
- values.each do |value|
90
- filter_items << Filter.new(value)
91
- end
92
- end
93
-
94
- # Date group items are date group filter items where you specify the
95
- # date_group and a value for that option as part of the auto_filter
96
- # @note This can be specified, but will not be applied to the date
97
- # values in your workbook at this time.
98
- def date_group_items=(options)
99
- options.each do |date_group|
100
- raise ArgumentError, "date_group_items should be an array of hashes specifying the options for each date_group_item" unless date_group.is_a?(Hash)
101
- date_group_items << DateGroupItem.new(date_group)
102
- end
103
- end
104
-
105
- # This class expresses a filter criteria value.
106
- class Filter
107
-
108
- # Creates a new filter value object
109
- # @param [Any] value The value of the filter. This is not restricted, but
110
- # will be serialized via to_s so if you are passing an object
111
- # be careful.
112
- def initialize(value)
113
- @val = value
114
- end
115
-
116
-
117
- #Filter value used in the criteria.
118
- attr_accessor :val
119
-
120
- # Serializes the filter value object
121
- # @param [String] str The string to concact the serialization information to.
122
- def to_xml_string(str = '')
123
- str << "<filter val='#{@val.to_s}' />"
124
- end
125
- end
126
-
127
-
128
- # This collection is used to express a group of dates or times which are
129
- # used in an AutoFilter criteria. Values are always written in the calendar
130
- # type of the first date encountered in the filter range, so that all
131
- # subsequent dates, even when formatted or represented by other calendar
132
- # types, can be correctly compared for the purposes of filtering.
133
- class DateGroupItem
134
- include Axlsx::OptionsParser
135
- include Axlsx::SerializedAttributes
136
-
137
- # Creates a new DateGroupItem
138
- # @param [Hash] options A hash of options to use when
139
- # instanciating the object
140
- # @option [String] date_time_grouping the part of the date this
141
- # filter should apply for grouping
142
- # @option [Integer|String] year @see year
143
- # @option [Integer] month @see month
144
- # @option [Integer] day @see day
145
- # @option [Integer] hour @see hour
146
- # @option [Integer] minute @see minute
147
- # @option [Integer] second @see second
148
- def initialize(options={})
149
- raise ArgumentError, "You must specify a year for date time grouping" unless options[:year]
150
- raise ArgumentError, "You must specify a date_time_grouping when creating a DateGroupItem for auto filter" unless options[:date_time_grouping]
151
- parse_options options
152
- end
153
-
154
- serializable_attributes :date_time_grouping, :year, :month, :day, :hour, :minute, :second
155
-
156
- # Allowed date time groupings
157
- DATE_TIME_GROUPING = %w(year month day hour minute second)
158
-
159
- # Grouping level
160
- # This must be one of year, month, day, hour, minute or second.
161
- # @return [String]
162
- attr_reader :date_time_grouping
163
-
164
- # Year (4 digits)
165
- # @return [Integer|String]
166
- attr_reader :year
167
-
168
- # Month (1..12)
169
- # @return [Integer]
170
- attr_reader :month
171
-
172
- # Day (1-31)
173
- # @return [Integer]
174
- attr_reader :day
175
-
176
- # Hour (0..23)
177
- # @return [Integer]
178
- attr_reader :hour
179
-
180
- # Minute (0..59(
181
- # @return [Integer]
182
- attr_reader :minute
183
-
184
- # Second (0..59)
185
- # @return [Integer]
186
- attr_reader :second
187
-
188
- # The year value for the date group item
189
- # This must be a four digit value
190
- def year=(value)
191
- RegexValidator.validate "DateGroupItem.year", /\d{4}/, value
192
- @year = value
193
- end
194
-
195
- # The month value for the date group item
196
- # This must be between 1 and 12
197
- def month=(value)
198
- RangeValidator.validate "DateGroupItem.month", 0, 12, value
199
- @month = value
200
- end
201
-
202
- # The day value for the date group item
203
- # This must be between 1 and 31
204
- # @note no attempt is made to ensure the date value is valid for any given month
205
- def day=(value)
206
- RangeValidator.validate "DateGroupItem.day", 0, 31, value
207
- @day = value
208
- end
209
-
210
- # The hour value for the date group item
211
- # # this must be between 0 and 23
212
- def hour=(value)
213
- RangeValidator.validate "DateGroupItem.hour", 0, 23, value
214
- @hour = value
215
- end
216
-
217
- # The minute value for the date group item
218
- # This must be between 0 and 59
219
- def minute=(value)
220
- RangeValidator.validate "DateGroupItem.minute", 0, 59, value
221
- @minute = value
222
- end
223
-
224
- # The second value for the date group item
225
- # This must be between 0 and 59
226
- def second=(value)
227
- RangeValidator.validate "DateGroupItem.second", 0, 59, value
228
- @second = value
229
- end
230
-
231
- # The date time grouping for this filter.
232
- def date_time_grouping=(grouping)
233
- RestrictionValidator.validate 'DateGroupItem.date_time_grouping', DATE_TIME_GROUPING, grouping.to_s
234
- @date_time_grouping = grouping.to_s
235
- end
236
-
237
- # Serialize the object to xml
238
- # @param [String] str The string object this serialization will be concatenated to.
239
- def to_xml_string(str = '')
240
- serialized_tag('dateGroupItem', str)
241
- end
242
- end
243
- end
244
- end
1
+ module Axlsx
2
+ # When multiple values are chosen to filter by, or when a group of date values are chosen to filter by,
3
+ # this object groups those criteria together.
4
+ class Filters
5
+ include Axlsx::OptionsParser
6
+ include Axlsx::SerializedAttributes
7
+
8
+ # Creates a new Filters object
9
+ # @param [Hash] options Options used to set this objects attributes and
10
+ # create filter and/or date group items
11
+ # @option [Boolean] blank @see blank
12
+ # @option [String] calendar_type @see calendar_type
13
+ # @option [Array] filter_items An array of values that will be used to create filter objects.
14
+ # @option [Array] date_group_items An array of hases defining date group item filters to apply.
15
+ # @note The recommended way to interact with filter objects is via AutoFilter#add_column
16
+ # @example
17
+ # ws.auto_filter.add_column(0, :filters, :blank => true, :calendar_type => 'japan', :filter_items => [100, 'a'])
18
+ def initialize(options = {})
19
+ parse_options options
20
+ end
21
+
22
+ serializable_attributes :blank, :calendar_type
23
+
24
+ # Allowed calendar types
25
+ CALENDAR_TYPES = %w(gregorian gregorianUs gregorianMeFrench gregorianArabic hijri hebrew taiwan japan thai korea saka gregorianXlitEnglish gregorianXlitFrench none)
26
+
27
+ # Flag indicating whether to filter by blank.
28
+ # @return [Boolean]
29
+ attr_reader :blank
30
+
31
+ # Calendar type for date grouped items.
32
+ # Used to interpret the values in dateGroupItem.
33
+ # This is the calendar type used to evaluate all dates in the filter column,
34
+ # even when those dates are not using the same calendar system / date formatting.
35
+ attr_reader :calendar_type
36
+
37
+ # Tells us if the row of the cell provided should be filterd as it
38
+ # does not meet any of the specified filter_items or
39
+ # date_group_items restrictions.
40
+ # @param [Cell] cell The cell to test against items
41
+ # TODO implement this for date filters as well!
42
+ def apply(cell)
43
+ return false unless cell
44
+
45
+ filter_items.each do |filter|
46
+ return false if cell.value == filter.val
47
+ end
48
+ true
49
+ end
50
+
51
+ # The filter values in this filters object
52
+ def filter_items
53
+ @filter_items ||= []
54
+ end
55
+
56
+ # the date group values in this filters object
57
+ def date_group_items
58
+ @date_group_items ||= []
59
+ end
60
+
61
+ # @see calendar_type
62
+ # @param [String] calendar The calendar type to use. This must be one of the types defined in CALENDAR_TYPES
63
+ # @return [String]
64
+ def calendar_type=(calendar)
65
+ RestrictionValidator.validate 'Filters.calendar_type', CALENDAR_TYPES, calendar
66
+ @calendar_type = calendar
67
+ end
68
+
69
+ # Set the value for blank
70
+ # @see blank
71
+ def blank=(use_blank)
72
+ Axlsx.validate_boolean use_blank
73
+ @blank = use_blank
74
+ end
75
+
76
+ # Serialize the object to xml
77
+ def to_xml_string(str = '')
78
+ str << "<filters #{serialized_attributes}>"
79
+ filter_items.each { |filter| filter.to_xml_string(str) }
80
+ date_group_items.each { |date_group_item| date_group_item.to_xml_string(str) }
81
+ str << '</filters>'
82
+ end
83
+
84
+ # not entirely happy with this.
85
+ # filter_items should be a simple typed list that overrides << etc
86
+ # to create Filter objects from the inserted values. However this
87
+ # is most likely so rarely used...(really? do you know that?)
88
+ def filter_items=(values)
89
+ values.each do |value|
90
+ filter_items << Filter.new(value)
91
+ end
92
+ end
93
+
94
+ # Date group items are date group filter items where you specify the
95
+ # date_group and a value for that option as part of the auto_filter
96
+ # @note This can be specified, but will not be applied to the date
97
+ # values in your workbook at this time.
98
+ def date_group_items=(options)
99
+ options.each do |date_group|
100
+ raise ArgumentError, "date_group_items should be an array of hashes specifying the options for each date_group_item" unless date_group.is_a?(Hash)
101
+
102
+ date_group_items << DateGroupItem.new(date_group)
103
+ end
104
+ end
105
+
106
+ # This class expresses a filter criteria value.
107
+ class Filter
108
+ # Creates a new filter value object
109
+ # @param [Any] value The value of the filter. This is not restricted, but
110
+ # will be serialized via to_s so if you are passing an object
111
+ # be careful.
112
+ def initialize(value)
113
+ @val = value
114
+ end
115
+
116
+ # Filter value used in the criteria.
117
+ attr_accessor :val
118
+
119
+ # Serializes the filter value object
120
+ # @param [String] str The string to concact the serialization information to.
121
+ def to_xml_string(str = '')
122
+ str << "<filter val='#{@val.to_s}' />"
123
+ end
124
+ end
125
+
126
+ # This collection is used to express a group of dates or times which are
127
+ # used in an AutoFilter criteria. Values are always written in the calendar
128
+ # type of the first date encountered in the filter range, so that all
129
+ # subsequent dates, even when formatted or represented by other calendar
130
+ # types, can be correctly compared for the purposes of filtering.
131
+ class DateGroupItem
132
+ include Axlsx::OptionsParser
133
+ include Axlsx::SerializedAttributes
134
+
135
+ # Creates a new DateGroupItem
136
+ # @param [Hash] options A hash of options to use when
137
+ # instanciating the object
138
+ # @option [String] date_time_grouping the part of the date this
139
+ # filter should apply for grouping
140
+ # @option [Integer|String] year @see year
141
+ # @option [Integer] month @see month
142
+ # @option [Integer] day @see day
143
+ # @option [Integer] hour @see hour
144
+ # @option [Integer] minute @see minute
145
+ # @option [Integer] second @see second
146
+ def initialize(options = {})
147
+ raise ArgumentError, "You must specify a year for date time grouping" unless options[:year]
148
+ raise ArgumentError, "You must specify a date_time_grouping when creating a DateGroupItem for auto filter" unless options[:date_time_grouping]
149
+
150
+ parse_options options
151
+ end
152
+
153
+ serializable_attributes :date_time_grouping, :year, :month, :day, :hour, :minute, :second
154
+
155
+ # Allowed date time groupings
156
+ DATE_TIME_GROUPING = %w(year month day hour minute second)
157
+
158
+ # Grouping level
159
+ # This must be one of year, month, day, hour, minute or second.
160
+ # @return [String]
161
+ attr_reader :date_time_grouping
162
+
163
+ # Year (4 digits)
164
+ # @return [Integer|String]
165
+ attr_reader :year
166
+
167
+ # Month (1..12)
168
+ # @return [Integer]
169
+ attr_reader :month
170
+
171
+ # Day (1-31)
172
+ # @return [Integer]
173
+ attr_reader :day
174
+
175
+ # Hour (0..23)
176
+ # @return [Integer]
177
+ attr_reader :hour
178
+
179
+ # Minute (0..59(
180
+ # @return [Integer]
181
+ attr_reader :minute
182
+
183
+ # Second (0..59)
184
+ # @return [Integer]
185
+ attr_reader :second
186
+
187
+ # The year value for the date group item
188
+ # This must be a four digit value
189
+ def year=(value)
190
+ RegexValidator.validate "DateGroupItem.year", /\d{4}/, value
191
+ @year = value
192
+ end
193
+
194
+ # The month value for the date group item
195
+ # This must be between 1 and 12
196
+ def month=(value)
197
+ RangeValidator.validate "DateGroupItem.month", 0, 12, value
198
+ @month = value
199
+ end
200
+
201
+ # The day value for the date group item
202
+ # This must be between 1 and 31
203
+ # @note no attempt is made to ensure the date value is valid for any given month
204
+ def day=(value)
205
+ RangeValidator.validate "DateGroupItem.day", 0, 31, value
206
+ @day = value
207
+ end
208
+
209
+ # The hour value for the date group item
210
+ # # this must be between 0 and 23
211
+ def hour=(value)
212
+ RangeValidator.validate "DateGroupItem.hour", 0, 23, value
213
+ @hour = value
214
+ end
215
+
216
+ # The minute value for the date group item
217
+ # This must be between 0 and 59
218
+ def minute=(value)
219
+ RangeValidator.validate "DateGroupItem.minute", 0, 59, value
220
+ @minute = value
221
+ end
222
+
223
+ # The second value for the date group item
224
+ # This must be between 0 and 59
225
+ def second=(value)
226
+ RangeValidator.validate "DateGroupItem.second", 0, 59, value
227
+ @second = value
228
+ end
229
+
230
+ # The date time grouping for this filter.
231
+ def date_time_grouping=(grouping)
232
+ RestrictionValidator.validate 'DateGroupItem.date_time_grouping', DATE_TIME_GROUPING, grouping.to_s
233
+ @date_time_grouping = grouping.to_s
234
+ end
235
+
236
+ # Serialize the object to xml
237
+ # @param [String] str The string object this serialization will be concatenated to.
238
+ def to_xml_string(str = '')
239
+ serialized_tag('dateGroupItem', str)
240
+ end
241
+ end
242
+ end
243
+ end
@@ -0,0 +1,79 @@
1
+ module Axlsx
2
+ class BorderCreator
3
+ def initialize(worksheet:, cells:, edges: nil, style: nil, color: nil)
4
+ @worksheet = worksheet
5
+ @cells = cells
6
+
7
+ @edges = edges || :all
8
+ @style = style || :thin
9
+ @color = color || "000000"
10
+
11
+ if @edges == :all
12
+ @edges = Axlsx::Border::EDGES
13
+ elsif !@edges.is_a?(Array)
14
+ raise ArgumentError.new("Invalid edges provided, #{@edges}")
15
+ else
16
+ @edges = @edges.map { |x| x&.to_sym }.uniq
17
+
18
+ if !(@edges - Axlsx::Border::EDGES).empty?
19
+ raise ArgumentError.new("Invalid edges provided, #{edges}")
20
+ end
21
+ end
22
+ end
23
+
24
+ def draw
25
+ if @cells.size == 1
26
+ @worksheet.add_style(
27
+ first_cell,
28
+ {
29
+ border: { style: @style, color: @color, edges: @edges }
30
+ }
31
+ )
32
+ else
33
+ @edges.each do |edge|
34
+ @worksheet.add_style(
35
+ border_cells[edge],
36
+ {
37
+ border: { style: @style, color: @color, edges: [edge] }
38
+ }
39
+ )
40
+ end
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def border_cells
47
+ {
48
+ top: "#{first_cell}:#{last_col}#{first_row}",
49
+ right: "#{last_col}#{first_row}:#{last_cell}",
50
+ bottom: "#{first_col}#{last_row}:#{last_cell}",
51
+ left: "#{first_cell}:#{first_col}#{last_row}"
52
+ }
53
+ end
54
+
55
+ def first_cell
56
+ @first_cell ||= @cells.first.r
57
+ end
58
+
59
+ def last_cell
60
+ @last_cell ||= @cells.last.r
61
+ end
62
+
63
+ def first_row
64
+ @first_row ||= first_cell.scan(/\d+/).first
65
+ end
66
+
67
+ def first_col
68
+ @first_col ||= first_cell.scan(/\D+/).first
69
+ end
70
+
71
+ def last_row
72
+ @last_row ||= last_cell.scan(/\d+/).first
73
+ end
74
+
75
+ def last_col
76
+ @last_col ||= last_cell.scan(/\D+/).first
77
+ end
78
+ end
79
+ end
@@ -1,35 +1,32 @@
1
- module Axlsx
2
-
3
- # The Break class stores the details for row and column page breaks.
4
- # @see RowBreaks, ColBreaks
5
- class Break
6
-
7
- include Axlsx::OptionsParser
8
- include Axlsx::Accessors
9
- include Axlsx::SerializedAttributes
10
-
11
- # Creates a new Break object
12
- # @param options A hash of attribute options for this break.
13
- # @option options [Integer] id Zero-based row or column Id of the page break. Breaks occur above the specified row and left of the specified column.
14
- # @option options [Integer] min Zero-based index of start row or column of the break. For row breaks, specifies column index; for column breaks, specifies row index.
15
- # @option options [Integer] max Zero-based index of end row or column of the break. For row breaks, specifies column index; for column breaks, specifies row index.
16
- # @option options [Boolean] man Manual Break flag. 1 means the break is a manually inserted break.
17
- # @option option [Boolean] pt Flag indicating that a PivotTable created this break.
18
- def initialize(options={})
19
- parse_options options
20
- yield self if block_given?
21
- end
22
-
23
- unsigned_int_attr_accessor :id, :min, :max
24
-
25
- boolean_attr_accessor :man, :pt
26
-
27
- serializable_attributes :id, :min, :max, :man, :pt
28
-
29
- # serializes the break to xml
30
- def to_xml_string(str='')
31
- serialized_tag('brk', str)
32
- end
33
- end
34
- end
35
-
1
+ module Axlsx
2
+ # The Break class stores the details for row and column page breaks.
3
+ # @see RowBreaks, ColBreaks
4
+ class Break
5
+ include Axlsx::OptionsParser
6
+ include Axlsx::Accessors
7
+ include Axlsx::SerializedAttributes
8
+
9
+ # Creates a new Break object
10
+ # @param options A hash of attribute options for this break.
11
+ # @option options [Integer] id Zero-based row or column Id of the page break. Breaks occur above the specified row and left of the specified column.
12
+ # @option options [Integer] min Zero-based index of start row or column of the break. For row breaks, specifies column index; for column breaks, specifies row index.
13
+ # @option options [Integer] max Zero-based index of end row or column of the break. For row breaks, specifies column index; for column breaks, specifies row index.
14
+ # @option options [Boolean] man Manual Break flag. 1 means the break is a manually inserted break.
15
+ # @option option [Boolean] pt Flag indicating that a PivotTable created this break.
16
+ def initialize(options = {})
17
+ parse_options options
18
+ yield self if block_given?
19
+ end
20
+
21
+ unsigned_int_attr_accessor :id, :min, :max
22
+
23
+ boolean_attr_accessor :man, :pt
24
+
25
+ serializable_attributes :id, :min, :max, :man, :pt
26
+
27
+ # serializes the break to xml
28
+ def to_xml_string(str = '')
29
+ serialized_tag('brk', str)
30
+ end
31
+ end
32
+ end