caxlsx 3.2.0 → 3.4.0

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 (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