axlsx 1.1.3 → 1.2.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 (187) hide show
  1. data/.yardopts +5 -2
  2. data/CHANGELOG.md +60 -0
  3. data/LICENSE +1 -1
  4. data/README.md +115 -415
  5. data/Rakefile +11 -3
  6. data/examples/basic_charts.rb +54 -0
  7. data/examples/chart_colors.rb +88 -0
  8. data/examples/data_validation.rb +50 -0
  9. data/examples/example.rb +299 -155
  10. data/examples/example.xlsx +0 -0
  11. data/examples/example_streamed.xlsx +0 -0
  12. data/examples/extractive.pdf +0 -0
  13. data/examples/extractive.rb +45 -0
  14. data/examples/no-use_autowidth.xlsx +0 -0
  15. data/examples/scraping_html.rb +91 -0
  16. data/examples/shared_strings_example.xlsx +0 -0
  17. data/examples/sheet_protection.rb +10 -0
  18. data/examples/sheet_view.rb +34 -0
  19. data/examples/two_cell_anchor_image.rb +11 -0
  20. data/lib/axlsx/content_type/content_type.rb +2 -0
  21. data/lib/axlsx/content_type/default.rb +30 -15
  22. data/lib/axlsx/content_type/override.rb +29 -14
  23. data/lib/axlsx/doc_props/app.rb +161 -104
  24. data/lib/axlsx/doc_props/core.rb +9 -5
  25. data/lib/axlsx/drawing/ax_data_source.rb +26 -0
  26. data/lib/axlsx/drawing/axis.rb +92 -37
  27. data/lib/axlsx/drawing/bar_3D_chart.rb +49 -45
  28. data/lib/axlsx/drawing/bar_series.rb +25 -7
  29. data/lib/axlsx/drawing/cat_axis.rb +50 -22
  30. data/lib/axlsx/drawing/chart.rb +69 -56
  31. data/lib/axlsx/drawing/d_lbls.rb +100 -0
  32. data/lib/axlsx/drawing/drawing.rb +28 -12
  33. data/lib/axlsx/drawing/graphic_frame.rb +2 -1
  34. data/lib/axlsx/drawing/line_3D_chart.rb +3 -10
  35. data/lib/axlsx/drawing/line_series.rb +20 -4
  36. data/lib/axlsx/drawing/num_data.rb +52 -0
  37. data/lib/axlsx/drawing/num_data_source.rb +61 -0
  38. data/lib/axlsx/drawing/num_val.rb +32 -0
  39. data/lib/axlsx/drawing/pic.rb +44 -4
  40. data/lib/axlsx/drawing/pie_3D_chart.rb +10 -7
  41. data/lib/axlsx/drawing/pie_series.rb +18 -4
  42. data/lib/axlsx/drawing/scatter_chart.rb +2 -8
  43. data/lib/axlsx/drawing/scatter_series.rb +28 -2
  44. data/lib/axlsx/drawing/ser_axis.rb +1 -1
  45. data/lib/axlsx/drawing/series.rb +1 -1
  46. data/lib/axlsx/drawing/str_data.rb +42 -0
  47. data/lib/axlsx/drawing/str_val.rb +33 -0
  48. data/lib/axlsx/drawing/title.rb +21 -9
  49. data/lib/axlsx/drawing/two_cell_anchor.rb +46 -9
  50. data/lib/axlsx/drawing/view_3D.rb +44 -31
  51. data/lib/axlsx/drawing/vml_drawing.rb +42 -0
  52. data/lib/axlsx/drawing/vml_shape.rb +125 -0
  53. data/lib/axlsx/package.rb +44 -16
  54. data/lib/axlsx/rels/relationship.rb +3 -3
  55. data/lib/axlsx/rels/relationships.rb +1 -11
  56. data/lib/axlsx/stylesheet/gradient_fill.rb +1 -1
  57. data/lib/axlsx/stylesheet/styles.rb +1 -1
  58. data/lib/axlsx/stylesheet/table_style.rb +3 -3
  59. data/lib/axlsx/util/constants.rb +28 -0
  60. data/lib/axlsx/util/simple_typed_list.rb +15 -21
  61. data/lib/axlsx/util/validators.rb +81 -8
  62. data/lib/axlsx/version.rb +2 -7
  63. data/lib/axlsx/workbook/defined_name.rb +174 -0
  64. data/lib/axlsx/workbook/defined_names.rb +21 -0
  65. data/lib/axlsx/workbook/workbook.rb +65 -13
  66. data/lib/axlsx/workbook/worksheet/auto_filter.rb +34 -0
  67. data/lib/axlsx/workbook/worksheet/cell.rb +35 -7
  68. data/lib/axlsx/workbook/worksheet/col.rb +17 -1
  69. data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
  70. data/lib/axlsx/workbook/worksheet/comment.rb +101 -0
  71. data/lib/axlsx/workbook/worksheet/comments.rb +85 -0
  72. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
  73. data/lib/axlsx/workbook/worksheet/data_bar.rb +1 -1
  74. data/lib/axlsx/workbook/worksheet/data_validation.rb +245 -0
  75. data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
  76. data/lib/axlsx/workbook/worksheet/dimension.rb +65 -0
  77. data/lib/axlsx/workbook/worksheet/merged_cells.rb +35 -0
  78. data/lib/axlsx/workbook/worksheet/page_setup.rb +113 -0
  79. data/lib/axlsx/workbook/worksheet/pane.rb +144 -0
  80. data/lib/axlsx/workbook/worksheet/print_options.rb +63 -0
  81. data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -0
  82. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
  83. data/lib/axlsx/workbook/worksheet/row.rb +67 -12
  84. data/lib/axlsx/workbook/worksheet/selection.rb +111 -0
  85. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
  86. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +24 -0
  87. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +224 -0
  88. data/lib/axlsx/workbook/worksheet/sheet_view.rb +379 -0
  89. data/lib/axlsx/workbook/worksheet/table.rb +3 -3
  90. data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
  91. data/lib/axlsx/workbook/worksheet/worksheet.rb +377 -255
  92. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +57 -0
  93. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +64 -0
  94. data/lib/axlsx.rb +30 -15
  95. data/test/content_type/tc_content_type.rb +1 -6
  96. data/test/doc_props/tc_app.rb +31 -1
  97. data/test/doc_props/tc_core.rb +3 -1
  98. data/test/drawing/tc_axis.rb +38 -3
  99. data/test/drawing/tc_bar_3D_chart.rb +12 -12
  100. data/test/drawing/tc_bar_series.rb +17 -13
  101. data/test/drawing/tc_cat_axis.rb +3 -3
  102. data/test/drawing/tc_cat_axis_data.rb +23 -13
  103. data/test/drawing/tc_chart.rb +29 -11
  104. data/test/drawing/tc_d_lbls.rb +47 -0
  105. data/test/drawing/tc_data_source.rb +17 -0
  106. data/test/drawing/tc_drawing.rb +11 -5
  107. data/test/drawing/tc_hyperlink.rb +4 -5
  108. data/test/drawing/tc_line_series.rb +9 -11
  109. data/test/drawing/tc_named_axis_data.rb +27 -0
  110. data/test/drawing/tc_num_data.rb +31 -0
  111. data/test/drawing/tc_num_val.rb +29 -0
  112. data/test/drawing/tc_pic.rb +22 -2
  113. data/test/drawing/tc_pie_3D_chart.rb +4 -8
  114. data/test/drawing/tc_pie_series.rb +11 -13
  115. data/test/drawing/tc_scatter_chart.rb +6 -1
  116. data/test/drawing/tc_scatter_series.rb +6 -5
  117. data/test/drawing/tc_series.rb +1 -1
  118. data/test/drawing/tc_str_data.rb +18 -0
  119. data/test/drawing/tc_str_val.rb +21 -0
  120. data/test/drawing/tc_title.rb +16 -0
  121. data/test/drawing/tc_two_cell_anchor.rb +2 -3
  122. data/test/drawing/tc_view_3D.rb +18 -18
  123. data/test/drawing/tc_vml_drawing.rb +25 -0
  124. data/test/drawing/tc_vml_shape.rb +100 -0
  125. data/test/rels/tc_relationship.rb +1 -0
  126. data/test/stylesheet/tc_gradient_fill.rb +8 -0
  127. data/test/stylesheet/tc_pattern_fill.rb +7 -1
  128. data/test/stylesheet/tc_styles.rb +3 -4
  129. data/test/stylesheet/tc_table_style.rb +8 -0
  130. data/test/stylesheet/tc_table_style_element.rb +10 -1
  131. data/test/tc_helper.rb +1 -0
  132. data/test/tc_package.rb +93 -17
  133. data/test/util/tc_simple_typed_list.rb +13 -0
  134. data/test/util/tc_validators.rb +95 -9
  135. data/test/workbook/tc_defined_name.rb +41 -0
  136. data/test/workbook/tc_workbook.rb +5 -3
  137. data/test/workbook/worksheet/table/tc_table.rb +3 -11
  138. data/test/workbook/worksheet/tc_cell.rb +30 -6
  139. data/test/workbook/worksheet/tc_col.rb +9 -0
  140. data/test/workbook/worksheet/tc_comment.rb +57 -0
  141. data/test/workbook/worksheet/tc_comments.rb +57 -0
  142. data/test/workbook/worksheet/tc_conditional_formatting.rb +44 -0
  143. data/test/workbook/worksheet/tc_data_bar.rb +1 -1
  144. data/test/workbook/worksheet/tc_data_validation.rb +265 -0
  145. data/test/workbook/worksheet/tc_page_setup.rb +138 -0
  146. data/test/workbook/worksheet/tc_pane.rb +94 -0
  147. data/test/workbook/worksheet/tc_print_options.rb +72 -0
  148. data/test/workbook/worksheet/tc_protected_range.rb +17 -0
  149. data/test/workbook/worksheet/tc_row.rb +36 -12
  150. data/test/workbook/worksheet/tc_selection.rb +94 -0
  151. data/test/workbook/worksheet/tc_sheet_protection.rb +117 -0
  152. data/test/workbook/worksheet/tc_sheet_view.rb +214 -0
  153. data/test/workbook/worksheet/tc_worksheet.rb +138 -48
  154. metadata +164 -52
  155. data/examples/example.csv +0 -1000
  156. data/lib/axlsx/drawing/cat_axis_data.rb +0 -34
  157. data/lib/axlsx/drawing/hlink_click.rb~ +0 -0
  158. data/lib/axlsx/drawing/hyperlink.rb~ +0 -64
  159. data/lib/axlsx/drawing/named_axis_data.rb +0 -36
  160. data/lib/axlsx/drawing/picture_locking.rb~ +0 -36
  161. data/lib/axlsx/drawing/val_axis_data.rb +0 -27
  162. data/lib/axlsx/util/cbf.rb +0 -333
  163. data/lib/axlsx/util/cfb.rb~ +0 -201
  164. data/lib/axlsx/util/font_tables.rb~ +0 -0
  165. data/lib/axlsx/util/ms_off_crypto.rb +0 -189
  166. data/lib/axlsx/util/ms_off_crypto.rb~ +0 -3
  167. data/lib/axlsx/util/ms_offcrypto.rb~ +0 -0
  168. data/lib/axlsx/util/parser.rb~ +0 -6
  169. data/lib/axlsx/util/storage.rb~ +0 -0
  170. data/lib/axlsx/workbook/shared_strings_table.rb~ +0 -69
  171. data/lib/axlsx/workbook/worksheet/cfvo.rb~ +0 -0
  172. data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
  173. data/lib/axlsx/workbook/worksheet/color_scale.rb~ +0 -46
  174. data/lib/axlsx/workbook/worksheet/data_bar.rb~ +0 -0
  175. data/lib/axlsx/workbook/worksheet/icon_set.rb~ +0 -95
  176. data/lib/axlsx/workbook/worksheet/shared_strings_table.rb~ +0 -0
  177. data/lib/axlsx/workbook/worksheet/table.rb~ +0 -97
  178. data/lib/schema/dc.xsd~ +0 -118
  179. data/lib/schema/dcterms.xsd~ +0 -331
  180. data/lib/schema/opc-coreProperties.xsd~ +0 -50
  181. data/test/drawing/tc_val_axis_data.rb +0 -17
  182. data/test/workbook/worksheet/table/tc_table.rb~ +0 -72
  183. data/test/workbook/worksheet/tc_cfvo.rb~ +0 -20
  184. data/test/workbook/worksheet/tc_col.rb~ +0 -10
  185. data/test/workbook/worksheet/tc_color_scale.rb~ +0 -0
  186. data/test/workbook/worksheet/tc_data_bar.rb~ +0 -0
  187. data/test/workbook/worksheet/tc_icon_set.rb~ +0 -0
@@ -0,0 +1,65 @@
1
+ module Axlsx
2
+
3
+ # This class manages the dimensions for a worksheet.
4
+ # While this node is optional in the specification some readers like
5
+ # LibraOffice require this node to render the sheet
6
+ class Dimension
7
+
8
+ # the default value for the first cell in the dimension
9
+ # @return [String]
10
+ def self.default_first
11
+ @@default_first ||= 'A1'
12
+ end
13
+
14
+ # the default value for the last cell in the dimension
15
+ # @return [String]
16
+ def self.default_last
17
+ @@default_last ||= 'AA200'
18
+ end
19
+
20
+
21
+ # Creates a new dimension object
22
+ # @param[Worksheet] worksheet - the worksheet this dimension applies
23
+ # to.
24
+ def initialize(worksheet)
25
+ raise ArgumentError, "you must provide a worksheet" unless worksheet.is_a?(Worksheet)
26
+ @worksheet = worksheet
27
+ end
28
+
29
+ attr_reader :worksheet
30
+
31
+ # the full refernece for this dimension
32
+ # @return [String]
33
+ def sqref
34
+ "#{first_cell_reference}:#{last_cell_reference}"
35
+ end
36
+
37
+ # serialize the object
38
+ # @return [String]
39
+ def to_xml_string(str = '')
40
+ return if worksheet.rows.empty?
41
+ str << "<dimension ref=\"%s\"></dimension>" % sqref
42
+ end
43
+
44
+ # The first cell in the dimension
45
+ # @return [String]
46
+ def first_cell_reference
47
+ dimension_reference(worksheet.rows.first.cells.first, Dimension.default_first)
48
+ end
49
+
50
+ # the last cell in the dimension
51
+ # @return [String]
52
+ def last_cell_reference
53
+ dimension_reference(worksheet.rows.last.cells.last, Dimension.default_last)
54
+ end
55
+
56
+ private
57
+
58
+ # Returns the reference of a cell or the default specified
59
+ # @return [String]
60
+ def dimension_reference(cell, default)
61
+ return default unless cell.respond_to?(:r)
62
+ cell.r
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,35 @@
1
+ module Axlsx
2
+
3
+ # A simple list of merged cells
4
+ class MergedCells < SimpleTypedList
5
+
6
+ # creates a new MergedCells object
7
+ # @param [Worksheet] worksheet
8
+ def initialize(worksheet)
9
+ raise ArgumentError, 'you must provide a worksheet' unless worksheet.is_a?(Worksheet)
10
+ super String
11
+ end
12
+
13
+ # adds cells to the merged cells collection
14
+ # @param [Array||String] cells The cells to add to the merged cells
15
+ # collection. This can be an array of actual cells or a string style
16
+ # range like 'A1:C1'
17
+ def add(cells)
18
+ @list << if cells.is_a?(String)
19
+ cells
20
+ elsif cells.is_a?(Array)
21
+ Axlsx::cell_range(cells, false)
22
+ end
23
+ end
24
+
25
+ # serialize the object
26
+ # @param [String] str
27
+ # @return [String]
28
+ def to_xml_string(str = '')
29
+ return if @list.empty?
30
+ str << "<mergeCells count='#{size}'>"
31
+ each { |merged_cell| str << "<mergeCell ref='#{merged_cell}'></mergeCell>" }
32
+ str << '</mergeCells>'
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,113 @@
1
+ module Axlsx
2
+ # Page setup settings for printing a worksheet. All settings are optional.
3
+ #
4
+ # @note The recommended way to manage print options is via Worksheet#page_setup
5
+ # @see Worksheet#print_options
6
+ # @see Worksheet#initialize
7
+ class PageSetup
8
+
9
+ # TODO: Attributes defined by Open XML spec that are not implemented yet:
10
+ #
11
+ # * blackAndWhite
12
+ # * cellComments
13
+ # * copies
14
+ # * draft
15
+ # * errors
16
+ # * firstPageNumber
17
+ # * horizontalDpi
18
+ # * pageOrder
19
+ # * paperSize
20
+ # * useFirstPageNumber
21
+ # * usePrinterDefaults
22
+ # * verticalDpi
23
+
24
+ # Number of vertical pages to fit on.
25
+ # @note PageSetup#fit_to is the recomended way to manage page fitting as only specifying one of fit_to_width/fit_to_height will result in the counterpart
26
+ # being set to 1.
27
+ # @return [Integer]
28
+ attr_reader :fit_to_height
29
+
30
+ # Number of horizontal pages to fit on.
31
+ # @note PageSetup#fit_to is the recomended way to manage page fitting as only specifying one of width/height will result in the counterpart
32
+ # being set to 1.
33
+ # @return [Integer]
34
+ attr_reader :fit_to_width
35
+
36
+ # Orientation of the page (:default, :landscape, :portrait)
37
+ # @return [Symbol]
38
+ attr_reader :orientation
39
+
40
+ # Height of paper (string containing a number followed by a unit identifier: "297mm", "11in")
41
+ # @return [String]
42
+ attr_reader :paper_height
43
+
44
+ # Width of paper (string containing a number followed by a unit identifier: "210mm", "8.5in")
45
+ # @return [String]
46
+ attr_reader :paper_width
47
+
48
+ # Print scaling (percent value, given as integer ranging from 10 to 400)
49
+ # @return [Integer]
50
+ attr_reader :scale
51
+
52
+ # Creates a new PageSetup object
53
+ # @option options [Integer] fit_to_height Number of vertical pages to fit on
54
+ # @option options [Integer] fit_to_width Number of horizontal pages to fit on
55
+ # @option options [Symbol] orientation Orientation of the page (:default, :landscape, :portrait)
56
+ # @option options [String] paper_height Height of paper (number followed by unit identifier: "297mm", "11in")
57
+ # @option options [String] paper_width Width of paper (number followed by unit identifier: "210mm", "8.5in")
58
+ # @option options [Integer] scale Print scaling (percent value, integer ranging from 10 to 400)
59
+ def initialize(options = {})
60
+ set(options)
61
+ end
62
+
63
+ # Set some or all page settings at once.
64
+ # @param [Hash] options The page settings to set (possible keys are :fit_to_height, :fit_to_width, :orientation, :paper_height, :paper_width, and :scale).
65
+ def set(options)
66
+ options.each do |k, v|
67
+ send("#{k}=", v) if respond_to? "#{k}="
68
+ end
69
+ end
70
+
71
+ # @see fit_to_height
72
+ def fit_to_height=(v); Axlsx::validate_unsigned_int(v); @fit_to_height = v; end
73
+ # @see fit_to_width
74
+ def fit_to_width=(v); Axlsx::validate_unsigned_int(v); @fit_to_width = v; end
75
+ # @see orientation
76
+ def orientation=(v); Axlsx::validate_page_orientation(v); @orientation = v; end
77
+ # @see paper_height
78
+ def paper_height=(v); Axlsx::validate_number_with_unit(v); @paper_height = v; end
79
+ # @see paper_width
80
+ def paper_width=(v); Axlsx::validate_number_with_unit(v); @paper_width = v; end
81
+ # @see scale
82
+ def scale=(v); Axlsx::validate_scale_10_400(v); @scale = v; end
83
+
84
+ # convenience method to achieve sanity when setting fit_to_width and fit_to_height
85
+ # as they both default to 1 if only their counterpart is specified.
86
+ # @note This method will overwrite any value you explicitly set via the fit_to_height or fit_to_width methods.
87
+ # @option options [Integer] width The number of pages to fit this worksheet on horizontally. Default 9999
88
+ # @option options [Integer] height The number of pages to fit this worksheet on vertically. Default 9999
89
+ def fit_to(options={})
90
+ self.fit_to_width = options[:width] || 9999
91
+ self.fit_to_height = options[:height] || 9999
92
+ [@fit_to_width, @fit_to_height]
93
+ end
94
+
95
+
96
+ # helper method for worksheet to determine if the page setup is configured for fit to page printing
97
+ # We treat any page set up that has a value set for fit_to_width or fit_to_height value as fit_to_page.
98
+ # @return [Boolean]
99
+ def fit_to_page?
100
+ # is there some better what to express this?
101
+ (fit_to_width != nil || fit_to_height != nil)
102
+ end
103
+
104
+ # Serializes the page settings element.
105
+ # @param [String] str
106
+ # @return [String]
107
+ def to_xml_string(str = '')
108
+ str << '<pageSetup '
109
+ str << instance_values.reject{ |k, v| k == 'worksheet' }.map{ |k,v| k.gsub(/_(.)/){ $1.upcase } << %{="#{v}"} }.join(' ')
110
+ str << '/>'
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,144 @@
1
+ # encoding: UTF-8
2
+ module Axlsx
3
+ # Pane options for a worksheet.
4
+ #
5
+ # @note The recommended way to manage the pane options is via SheetView#pane
6
+ # @see SheetView#pane
7
+ class Pane
8
+
9
+ # Active Pane
10
+ # The pane that is active.
11
+ # Options are
12
+ # * bottom_left: Bottom left pane, when both vertical and horizontal
13
+ # splits are applied. This value is also used when only
14
+ # a horizontal split has been applied, dividing the pane
15
+ # into upper and lower regions. In that case, this value
16
+ # specifies the bottom pane.
17
+ # * bottom_right: Bottom right pane, when both vertical and horizontal
18
+ # splits are applied.
19
+ # * top_left: Top left pane, when both vertical and horizontal splits
20
+ # are applied. This value is also used when only a horizontal
21
+ # split has been applied, dividing the pane into upper and lower
22
+ # regions. In that case, this value specifies the top pane.
23
+ # This value is also used when only a vertical split has
24
+ # been applied, dividing the pane into right and left
25
+ # regions. In that case, this value specifies the left pane
26
+ # * top_right: Top right pane, when both vertical and horizontal
27
+ # splits are applied. This value is also used when only
28
+ # a vertical split has been applied, dividing the pane
29
+ # into right and left regions. In that case, this value
30
+ # specifies the right pane.
31
+ # @see type
32
+ # @return [Symbol]
33
+ # default nil
34
+ attr_reader :active_pane
35
+
36
+
37
+ # Split State
38
+ # Indicates whether the pane has horizontal / vertical
39
+ # splits, and whether those splits are frozen.
40
+ # Options are
41
+ # * frozen: Panes are frozen, but were not split being frozen. In
42
+ # this state, when the panes are unfrozen again, a single
43
+ # pane results, with no split. In this state, the split
44
+ # bars are not adjustable.
45
+ # * frozen_split: Panes are frozen and were split before being frozen. In
46
+ # this state, when the panes are unfrozen again, the split
47
+ # remains, but is adjustable.
48
+ # * split: Panes are split, but not frozen. In this state, the split
49
+ # bars are adjustable by the user.
50
+ # @see type
51
+ # @return [Symbol]
52
+ # default nil
53
+ attr_reader :state
54
+
55
+
56
+ # Top Left Visible Cell
57
+ # Location of the top left visible cell in the bottom
58
+ # right pane (when in Left-To-Right mode).
59
+ # @see type
60
+ # @return [String]
61
+ # default nil
62
+ attr_reader :top_left_cell
63
+
64
+
65
+ # Horizontal Split Position
66
+ # Horizontal position of the split, in 1/20th of a point; 0 (zero)
67
+ # if none. If the pane is frozen, this value indicates the number
68
+ # of columns visible in the top pane.
69
+ # @see type
70
+ # @return [Integer]
71
+ # default 0
72
+ attr_reader :x_split
73
+
74
+
75
+ # Vertical Split Position
76
+ # Vertical position of the split, in 1/20th of a point; 0 (zero)
77
+ # if none. If the pane is frozen, this value indicates the number
78
+ # of rows visible in the left pane.
79
+ # @see type
80
+ # @return [Integer]
81
+ # default 0
82
+ attr_reader :y_split
83
+
84
+
85
+ # Creates a new {Pane} object
86
+ # @option options [Symbol] active_pane Active Pane
87
+ # @option options [Symbol] state Split State
88
+ # @option options [Cell, String] top_left_cell Top Left Visible Cell
89
+ # @option options [Integer] x_split Horizontal Split Position
90
+ # @option options [Integer] y_split Vertical Split Position
91
+ def initialize(options={})
92
+ #defaults
93
+ @active_pane = @state = @top_left_cell = nil
94
+ @x_split = @y_split = 0
95
+
96
+ # write options to instance variables
97
+ options.each do |o|
98
+ self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
99
+ end
100
+ end
101
+
102
+
103
+ # @see active_pane
104
+ def active_pane=(v); Axlsx::validate_pane_type(v); @active_pane = v end
105
+
106
+
107
+ # @see state
108
+ def state=(v); Axlsx::validate_split_state_type(v); @state = v end
109
+
110
+
111
+ # @see top_left_cell
112
+ def top_left_cell=(v)
113
+ cell = (v.class == Axlsx::Cell ? v.r_abs : v)
114
+ Axlsx::validate_string(cell)
115
+ @top_left_cell = cell
116
+ end
117
+
118
+
119
+ # @see x_split
120
+ def x_split=(v); Axlsx::validate_unsigned_int(v); @x_split = v end
121
+
122
+
123
+ # @see y_split
124
+ def y_split=(v); Axlsx::validate_unsigned_int(v); @y_split = v end
125
+
126
+
127
+ # Serializes the data validation
128
+ # @param [String] str
129
+ # @return [String]
130
+ def to_xml_string(str = '')
131
+ if @state == :frozen && @top_left_cell.nil?
132
+ row = @y_split || 0
133
+ column = @x_split || 0
134
+
135
+ @top_left_cell = "#{('A'..'ZZ').to_a[column]}#{row+1}"
136
+ end
137
+
138
+ str << '<pane '
139
+ str << instance_values.map { |key, value| '' << key.gsub(/_(.)/){ $1.upcase } <<
140
+ %{="#{[:active_pane, :state].include?(key.to_sym) ? value.to_s.gsub(/_(.)/){ $1.upcase } : value}"} unless value.nil? }.join(' ')
141
+ str << '/>'
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,63 @@
1
+ module Axlsx
2
+ # Options for printing a worksheet. All options are boolean and false by default.
3
+ #
4
+ # @note The recommended way to manage print options is via Worksheet#print_options
5
+ # @see Worksheet#print_options
6
+ # @see Worksheet#initialize
7
+ class PrintOptions
8
+
9
+ # Whether grid lines should be printed.
10
+ # @return [Boolean]
11
+ attr_reader :grid_lines
12
+
13
+ # Whether row and column headings should be printed.
14
+ # @return [Boolean]
15
+ attr_reader :headings
16
+
17
+ # Whether the content should be centered horizontally on the page.
18
+ # @return [Boolean]
19
+ attr_reader :horizontal_centered
20
+
21
+ # Whether the content should be centered vertically on the page.
22
+ # @return [Boolean]
23
+ attr_reader :vertical_centered
24
+
25
+ # Creates a new PrintOptions object
26
+ # @option options [Boolean] grid_lines Whether grid lines should be printed
27
+ # @option options [Boolean] headings Whether row and column headings should be printed
28
+ # @option options [Boolean] horizontal_centered Whether the content should be centered horizontally
29
+ # @option options [Boolean] vertical_centered Whether the content should be centered vertically
30
+ def initialize(options = {})
31
+ @grid_lines = @headings = @horizontal_centered = @vertical_centered = false
32
+ set(options)
33
+ end
34
+
35
+ # Set some or all options at once.
36
+ # @param [Hash] options The options to set (possible keys are :grid_lines, :headings, :horizontal_centered, and :vertical_centered).
37
+ def set(options)
38
+ options.each do |k, v|
39
+ send("#{k}=", v) if respond_to? "#{k}="
40
+ end
41
+ end
42
+
43
+ # @see grid_lines
44
+ def grid_lines=(v); Axlsx::validate_boolean(v); @grid_lines = v; end
45
+ # @see headings
46
+ def headings=(v); Axlsx::validate_boolean(v); @headings = v; end
47
+ # @see horizontal_centered
48
+ def horizontal_centered=(v); Axlsx::validate_boolean(v); @horizontal_centered = v; end
49
+ # @see vertical_centered
50
+ def vertical_centered=(v); Axlsx::validate_boolean(v); @vertical_centered = v; end
51
+
52
+ # Serializes the page options element.
53
+ # @note As all attributes default to "false" according to the xml schema definition, the generated xml includes only those attributes that are set to true.
54
+ # @param [String] str
55
+ # @return [String]
56
+ def to_xml_string(str = '')
57
+ str << '<printOptions '
58
+ #
59
+ str << instance_values.select{ |k,v| v == true }.map{ |k,v| k.gsub(/_(.)/){ $1.upcase } << %{="#{v}"} }.join(' ')
60
+ str << '/>'
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,46 @@
1
+ module Axlsx
2
+ # The Protected Range class represents a set of cells in the worksheet
3
+ # @note the recommended way to manage protected ranges with via Worksheet#protect_range
4
+ # @see Worksheet#protect_range
5
+ class ProtectedRange
6
+
7
+ # The reference for the protected range
8
+ # @return [String]
9
+ attr_reader :sqref
10
+
11
+ # The name of the protected range
12
+ # @return [String]
13
+ attr_reader :name
14
+
15
+ # Initializes a new protected range object
16
+ # @option [String] sqref The cell range reference to protect. This can be an absolute or a relateve range however, it only applies to the current sheet.
17
+ # @option [String] name An optional name for the protected name.
18
+ def initialize(options={})
19
+ options.each do |o|
20
+ self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
21
+ end
22
+ yield self if block_given?
23
+ end
24
+
25
+ # @see sqref
26
+ def sqref=(v)
27
+ Axlsx.validate_string(v)
28
+ @sqref = v
29
+ end
30
+
31
+ # @see name
32
+ def name=(v)
33
+ Axlsx.validate_string(v)
34
+ @name = v
35
+ end
36
+
37
+ # serializes the proteted range
38
+ # @param [String] str if this string object is provided we append
39
+ # our output to that object. Use this - it helps limit the number of
40
+ # objects created during serialization
41
+ def to_xml_string(str="")
42
+ attrs = self.instance_values.reject{ |key, value| value == nil }
43
+ str << '<protectedRange ' << attrs.map { |key, value| '' << key << '="' << value.to_s << '"' }.join(' ') << '/>'
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,34 @@
1
+ module Axlsx
2
+
3
+ # A self serializing collection of ranges that should be protected in
4
+ # the worksheet
5
+ class ProtectedRanges < SimpleTypedList
6
+
7
+ attr_reader :worksheet
8
+
9
+ def initialize(worksheet)
10
+ raise ArgumentError, 'You must provide a worksheet' unless worksheet.is_a?(Worksheet)
11
+ super ProtectedRange
12
+ @worksheet = worksheet
13
+ end
14
+
15
+ # Adds a protected range
16
+ # @param [Array|String] cells A string range reference or array of cells that will be protected
17
+ def add_range(cells)
18
+ sqref = if cells.is_a?(String)
19
+ cells
20
+ elsif cells.is_a?(SimpleTypedList) || cells.is_a?(Array)
21
+ Axlsx::cell_range(cells, false)
22
+ end
23
+ @list << ProtectedRange.new(:sqref => sqref, :name => "Range#{size}")
24
+ last
25
+ end
26
+
27
+ def to_xml_string(str = '')
28
+ return if empty?
29
+ str << '<protectedRanges>'
30
+ each { |range| range.to_xml_string(str) }
31
+ str << '</protectedRanges>'
32
+ end
33
+ end
34
+ end
@@ -5,6 +5,16 @@ module Axlsx
5
5
  # @see Worksheet#add_row
6
6
  class Row
7
7
 
8
+ # No support is provided for the following attributes
9
+ # spans
10
+ # thickTop
11
+ # thickBottom
12
+
13
+
14
+ # A list of serilizable attributes.
15
+ # @note height(ht) and customHeight are manages separately for now. Have a look at Row#height
16
+ SERIALIZABLE_ATTRIBUTES = [:hidden, :outlineLevel, :collapsed, :s, :customFormat, :ph]
17
+
8
18
  # The worksheet this row belongs to
9
19
  # @return [Worksheet]
10
20
  attr_reader :worksheet
@@ -13,22 +23,40 @@ module Axlsx
13
23
  # @return [SimpleTypedList]
14
24
  attr_reader :cells
15
25
 
16
- # The height of this row in points, if set explicitly.
26
+ # Row height measured in point size. There is no margin padding on row height.
17
27
  # @return [Float]
18
28
  attr_reader :height
19
29
 
20
- # TODO 18.3.1.73
21
- # collapsed
22
- # customFormat
23
- # hidden
24
- # outlineLevel
25
- # ph
26
- # s (style)
27
- # spans
28
- # thickTop
29
- # thickBottom
30
+ # Flag indicating if the outlining of row.
31
+ # @return [Boolean]
32
+ attr_reader :collapsed
33
+
34
+ # Flag indicating if the the row is hidden.
35
+ # @return [Boolean]
36
+ attr_reader :hidden
30
37
 
38
+ # Outlining level of the row, when outlining is on
39
+ # @return [Integer]
40
+ attr_reader :outlineLevel
31
41
 
42
+ # The style applied ot the row. This affects the entire row.
43
+ # @return [Integer]
44
+ attr_reader :s
45
+
46
+ # indicates that a style has been applied directly to the row via Row#s
47
+ # @return [Boolean]
48
+ attr_reader :customFormat
49
+
50
+ # indicates if the row should show phonetic
51
+ # @return [Boolean]
52
+ attr_reader :ph
53
+
54
+ # NOTE removing this from the api as it is actually incorrect.
55
+ # having a method to style a row's cells is fine, but it is not an attribute on the row.
56
+ # The proper attribute is ':s'
57
+ # attr_reader style
58
+ #
59
+
32
60
  # Creates a new row. New Cell objects are created based on the values, types and style options.
33
61
  # A new cell is created for each item in the values array. style and types options are applied as follows:
34
62
  # If the types option is defined and is a symbol it is applied to all the cells created.
@@ -53,6 +81,30 @@ module Axlsx
53
81
  array_to_cells(values, options)
54
82
  end
55
83
 
84
+ # @see Row#collapsed
85
+ def collapsed=(v)
86
+ Axlsx.validate_boolean(v)
87
+ @collapsed = v
88
+ end
89
+
90
+ # @see Row#hidden
91
+ def hidden=(v)
92
+ Axlsx.validate_boolean(v)
93
+ @hidden = v
94
+ end
95
+
96
+ # @see Row#ph
97
+ def ph=(v) Axlsx.validate_boolean(v); @ph = v end
98
+
99
+ # @see Row#s
100
+ def s=(v) Axlsx.validate_unsigned_numeric(v); @s = v; @customFormat = true end
101
+
102
+ # @see Row#outline
103
+ def outlineLevel=(v)
104
+ Axlsx.validate_unsigned_numeric(v)
105
+ @outlineLevel = v
106
+ end
107
+
56
108
  # The index of this row in the worksheet
57
109
  # @return [Integer]
58
110
  def index
@@ -65,6 +117,9 @@ module Axlsx
65
117
  # @return [String]
66
118
  def to_xml_string(r_index, str = '')
67
119
  str << '<row r="' << (r_index + 1 ).to_s << '" '
120
+ instance_values.select { |key, value| SERIALIZABLE_ATTRIBUTES.include? key.to_sym }.each do |key, value|
121
+ str << key << '="' << value.to_s << '" '
122
+ end
68
123
  if custom_height?
69
124
  str << 'customHeight="1" ht="' << height.to_s << '">'
70
125
  else
@@ -79,7 +134,7 @@ module Axlsx
79
134
  # @return [Cell]
80
135
  def add_cell(value="", options={})
81
136
  c = Cell.new(self, value, options)
82
- worksheet.send(:update_column_info, self.cells, self.cells.map(&:style))
137
+ worksheet.send(:update_column_info, self.cells, [])
83
138
  c
84
139
  end
85
140