axlsx 1.2.0 → 2.0.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 (208) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +3 -2
  3. data/.yardopts_guide +19 -0
  4. data/CHANGELOG.md +64 -1
  5. data/README.md +105 -87
  6. data/Rakefile +0 -5
  7. data/examples/2010_comments.rb +17 -0
  8. data/examples/anchor_swapping.rb +28 -0
  9. data/examples/auto_filter.rb +16 -0
  10. data/examples/basic_charts.rb +4 -0
  11. data/examples/colored_links.rb +59 -0
  12. data/examples/conditional_formatting/example_conditional_formatting.rb +4 -2
  13. data/examples/example.rb +569 -258
  14. data/examples/ios_preview.rb +14 -0
  15. data/examples/page_setup.rb +11 -0
  16. data/examples/pivot_table.rb +39 -0
  17. data/examples/skydrive/real_example.rb +8 -8
  18. data/examples/styles.rb +66 -0
  19. data/examples/underline.rb +13 -0
  20. data/examples/wrap_text.rb +21 -0
  21. data/lib/axlsx/content_type/abstract_content_type.rb +32 -0
  22. data/lib/axlsx/content_type/content_type.rb +1 -1
  23. data/lib/axlsx/content_type/default.rb +6 -37
  24. data/lib/axlsx/content_type/override.rb +6 -38
  25. data/lib/axlsx/doc_props/app.rb +10 -7
  26. data/lib/axlsx/doc_props/core.rb +6 -1
  27. data/lib/axlsx/drawing/axes.rb +61 -0
  28. data/lib/axlsx/drawing/axis.rb +20 -17
  29. data/lib/axlsx/drawing/bar_3D_chart.rb +31 -22
  30. data/lib/axlsx/drawing/cat_axis.rb +2 -10
  31. data/lib/axlsx/drawing/chart.rb +33 -6
  32. data/lib/axlsx/drawing/d_lbls.rb +21 -31
  33. data/lib/axlsx/drawing/drawing.rb +11 -17
  34. data/lib/axlsx/drawing/graphic_frame.rb +3 -3
  35. data/lib/axlsx/drawing/hyperlink.rb +42 -36
  36. data/lib/axlsx/drawing/line_3D_chart.rb +28 -70
  37. data/lib/axlsx/drawing/line_chart.rb +99 -0
  38. data/lib/axlsx/drawing/line_series.rb +20 -2
  39. data/lib/axlsx/drawing/marker.rb +38 -18
  40. data/lib/axlsx/drawing/num_data.rb +6 -6
  41. data/lib/axlsx/drawing/num_data_source.rb +17 -16
  42. data/lib/axlsx/drawing/one_cell_anchor.rb +28 -21
  43. data/lib/axlsx/drawing/pic.rb +43 -45
  44. data/lib/axlsx/drawing/picture_locking.rb +12 -44
  45. data/lib/axlsx/drawing/pie_3D_chart.rb +2 -1
  46. data/lib/axlsx/drawing/scaling.rb +13 -13
  47. data/lib/axlsx/drawing/scatter_chart.rb +32 -21
  48. data/lib/axlsx/drawing/ser_axis.rb +15 -16
  49. data/lib/axlsx/drawing/series.rb +3 -6
  50. data/lib/axlsx/drawing/str_data.rb +3 -3
  51. data/lib/axlsx/drawing/str_val.rb +7 -8
  52. data/lib/axlsx/drawing/two_cell_anchor.rb +7 -27
  53. data/lib/axlsx/drawing/val_axis.rb +14 -13
  54. data/lib/axlsx/drawing/view_3D.rb +52 -38
  55. data/lib/axlsx/drawing/vml_shape.rb +20 -79
  56. data/lib/axlsx/package.rb +58 -28
  57. data/lib/axlsx/rels/relationship.rb +75 -9
  58. data/lib/axlsx/rels/relationships.rb +8 -1
  59. data/lib/axlsx/stylesheet/border.rb +29 -20
  60. data/lib/axlsx/stylesheet/border_pr.rb +5 -4
  61. data/lib/axlsx/stylesheet/cell_alignment.rb +55 -29
  62. data/lib/axlsx/stylesheet/cell_protection.rb +7 -4
  63. data/lib/axlsx/stylesheet/cell_style.rb +19 -14
  64. data/lib/axlsx/stylesheet/color.rb +20 -17
  65. data/lib/axlsx/stylesheet/dxf.rb +4 -4
  66. data/lib/axlsx/stylesheet/font.rb +22 -22
  67. data/lib/axlsx/stylesheet/gradient_fill.rb +45 -21
  68. data/lib/axlsx/stylesheet/num_fmt.rb +23 -14
  69. data/lib/axlsx/stylesheet/pattern_fill.rb +12 -21
  70. data/lib/axlsx/stylesheet/styles.rb +37 -22
  71. data/lib/axlsx/stylesheet/table_style.rb +17 -16
  72. data/lib/axlsx/stylesheet/table_style_element.rb +15 -11
  73. data/lib/axlsx/stylesheet/table_styles.rb +14 -11
  74. data/lib/axlsx/stylesheet/xf.rb +28 -26
  75. data/lib/axlsx/util/accessors.rb +64 -0
  76. data/lib/axlsx/util/constants.rb +127 -6
  77. data/lib/axlsx/util/options_parser.rb +15 -0
  78. data/lib/axlsx/util/serialized_attributes.rb +79 -0
  79. data/lib/axlsx/util/simple_typed_list.rb +50 -15
  80. data/lib/axlsx/util/validators.rb +51 -16
  81. data/lib/axlsx/version.rb +2 -2
  82. data/lib/axlsx/workbook/defined_name.rb +14 -59
  83. data/lib/axlsx/workbook/shared_strings_table.rb +13 -4
  84. data/lib/axlsx/workbook/workbook.rb +85 -6
  85. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +77 -0
  86. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -0
  87. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +246 -0
  88. data/lib/axlsx/workbook/worksheet/break.rb +37 -0
  89. data/lib/axlsx/workbook/worksheet/cell.rb +109 -107
  90. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +144 -0
  91. data/lib/axlsx/workbook/worksheet/cfvo.rb +15 -15
  92. data/lib/axlsx/workbook/worksheet/cfvos.rb +15 -0
  93. data/lib/axlsx/workbook/worksheet/col.rb +43 -29
  94. data/lib/axlsx/workbook/worksheet/col_breaks.rb +35 -0
  95. data/lib/axlsx/workbook/worksheet/color_scale.rb +62 -28
  96. data/lib/axlsx/workbook/worksheet/comment.rb +28 -37
  97. data/lib/axlsx/workbook/worksheet/comments.rb +3 -3
  98. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +11 -11
  99. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +31 -27
  100. data/lib/axlsx/workbook/worksheet/data_bar.rb +75 -41
  101. data/lib/axlsx/workbook/worksheet/data_validation.rb +61 -62
  102. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +6 -5
  103. data/lib/axlsx/workbook/worksheet/dimension.rb +0 -1
  104. data/lib/axlsx/workbook/worksheet/header_footer.rb +54 -0
  105. data/lib/axlsx/workbook/worksheet/icon_set.rb +20 -20
  106. data/lib/axlsx/workbook/worksheet/page_margins.rb +21 -19
  107. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +44 -0
  108. data/lib/axlsx/workbook/worksheet/page_setup.rb +152 -23
  109. data/lib/axlsx/workbook/worksheet/pane.rb +48 -51
  110. data/lib/axlsx/workbook/worksheet/pivot_table.rb +273 -0
  111. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +66 -0
  112. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +24 -0
  113. data/lib/axlsx/workbook/worksheet/print_options.rb +8 -30
  114. data/lib/axlsx/workbook/worksheet/protected_range.rb +16 -13
  115. data/lib/axlsx/workbook/worksheet/row.rb +59 -83
  116. data/lib/axlsx/workbook/worksheet/row_breaks.rb +33 -0
  117. data/lib/axlsx/workbook/worksheet/selection.rb +30 -38
  118. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +29 -0
  119. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +60 -0
  120. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +49 -4
  121. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +51 -155
  122. data/lib/axlsx/workbook/worksheet/sheet_view.rb +68 -234
  123. data/lib/axlsx/workbook/worksheet/table.rb +25 -19
  124. data/lib/axlsx/workbook/worksheet/table_style_info.rb +51 -0
  125. data/lib/axlsx/workbook/worksheet/tables.rb +1 -1
  126. data/lib/axlsx/workbook/worksheet/worksheet.rb +174 -35
  127. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +6 -5
  128. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +4 -10
  129. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +74 -0
  130. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -0
  131. data/lib/axlsx.rb +55 -5
  132. data/lib/schema/sml.xsd +4 -0
  133. data/test/axlsx.qcachegrind +2226 -0
  134. data/test/benchmark.rb +2 -3
  135. data/test/content_type/tc_default.rb +0 -11
  136. data/test/content_type/tc_override.rb +0 -13
  137. data/test/doc_props/tc_core.rb +7 -0
  138. data/test/drawing/tc_axes.rb +8 -0
  139. data/test/drawing/tc_axis.rb +15 -17
  140. data/test/drawing/tc_bar_3D_chart.rb +6 -0
  141. data/test/drawing/tc_cat_axis.rb +9 -9
  142. data/test/drawing/tc_chart.rb +20 -0
  143. data/test/drawing/tc_d_lbls.rb +14 -4
  144. data/test/drawing/tc_drawing.rb +0 -5
  145. data/test/drawing/tc_graphic_frame.rb +5 -3
  146. data/test/drawing/tc_hyperlink.rb +0 -4
  147. data/test/drawing/tc_line_chart.rb +39 -0
  148. data/test/drawing/tc_line_series.rb +8 -2
  149. data/test/drawing/tc_pic.rb +14 -3
  150. data/test/drawing/tc_ser_axis.rb +13 -12
  151. data/test/drawing/tc_two_cell_anchor.rb +3 -3
  152. data/test/drawing/tc_val_axis.rb +6 -6
  153. data/test/drawing/tc_vml_shape.rb +9 -3
  154. data/test/profile.rb +11 -21
  155. data/test/rels/tc_relationship.rb +32 -9
  156. data/test/rels/tc_relationships.rb +12 -1
  157. data/test/stylesheet/tc_color.rb +6 -0
  158. data/test/stylesheet/tc_styles.rb +15 -2
  159. data/test/tc_axlsx.rb +35 -2
  160. data/test/tc_helper.rb +7 -1
  161. data/test/tc_package.rb +44 -5
  162. data/test/util/tc_serialized_attributes.rb +19 -0
  163. data/test/util/tc_validators.rb +26 -1
  164. data/test/workbook/tc_defined_name.rb +2 -2
  165. data/test/workbook/tc_shared_strings_table.rb +6 -0
  166. data/test/workbook/tc_workbook.rb +38 -1
  167. data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +38 -0
  168. data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +76 -0
  169. data/test/workbook/worksheet/auto_filter/tc_filters.rb +50 -0
  170. data/test/workbook/worksheet/tc_break.rb +49 -0
  171. data/test/workbook/worksheet/tc_cell.rb +40 -6
  172. data/test/workbook/worksheet/tc_col.rb +11 -1
  173. data/test/workbook/worksheet/tc_color_scale.rb +31 -2
  174. data/test/workbook/worksheet/tc_comment.rb +21 -6
  175. data/test/workbook/worksheet/tc_comments.rb +2 -2
  176. data/test/workbook/worksheet/tc_conditional_formatting.rb +7 -0
  177. data/test/workbook/worksheet/tc_data_bar.rb +7 -0
  178. data/test/workbook/worksheet/tc_date_time_converter.rb +3 -11
  179. data/test/workbook/worksheet/tc_header_footer.rb +151 -0
  180. data/test/workbook/worksheet/tc_page_set_up_pr.rb +15 -0
  181. data/test/workbook/worksheet/tc_page_setup.rb +6 -1
  182. data/test/workbook/worksheet/tc_pane.rb +5 -45
  183. data/test/workbook/worksheet/tc_pivot_table.rb +120 -0
  184. data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +54 -0
  185. data/test/workbook/worksheet/tc_row.rb +4 -4
  186. data/test/workbook/worksheet/tc_selection.rb +9 -48
  187. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +18 -0
  188. data/test/workbook/worksheet/tc_sheet_format_pr.rb +88 -0
  189. data/test/workbook/worksheet/tc_sheet_pr.rb +27 -0
  190. data/test/workbook/worksheet/tc_sheet_view.rb +39 -39
  191. data/test/workbook/worksheet/{table/tc_table.rb → tc_table.rb} +8 -3
  192. data/test/workbook/worksheet/tc_table_style_info.rb +53 -0
  193. data/test/workbook/worksheet/tc_worksheet.rb +131 -16
  194. data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +55 -0
  195. metadata +97 -64
  196. data/examples/example.xlsx +0 -0
  197. data/examples/example_streamed.xlsx +0 -0
  198. data/examples/extractive.pdf +0 -0
  199. data/examples/image1.gif +0 -0
  200. data/examples/image1.jpg +0 -0
  201. data/examples/image1.png +0 -0
  202. data/examples/no-use_autowidth.xlsx +0 -0
  203. data/examples/sample.png +0 -0
  204. data/examples/scraping_html.rb +0 -91
  205. data/examples/shared_strings_example.xlsx +0 -0
  206. data/examples/sheet_view.rb +0 -34
  207. data/examples/two_cell_anchor_image.rb +0 -11
  208. data/lib/axlsx/workbook/worksheet/auto_filter.rb +0 -34
@@ -0,0 +1,144 @@
1
+ module Axlsx
2
+
3
+ # The Cell Serializer class contains the logic for serializing cells based on their type.
4
+ class CellSerializer
5
+ class << self
6
+
7
+
8
+ # Calls the proper serialization method based on type.
9
+ # @param [Integer] row_index The index of the cell's row
10
+ # @param [Integer] column_index The index of the cell's column
11
+ # @param [String] str The string to apend serialization to.
12
+ # @return [String]
13
+ def to_xml_string(row_index, column_index, cell, str='')
14
+ str << '<c r="' << Axlsx::cell_r(column_index, row_index) << '" s="' << cell.style.to_s << '" '
15
+ return str << '/>' if cell.value.nil?
16
+ method = (cell.type.to_s << '_type_serialization').to_sym
17
+ self.send(method, cell, str)
18
+ str << '</c>'
19
+ end
20
+
21
+
22
+ # builds an xml text run based on this cells attributes.
23
+ # @param [String] str The string instance this run will be concated to.
24
+ # @return [String]
25
+ def run_xml_string(cell, str = '')
26
+ if cell.is_text_run?
27
+ data = cell.instance_values.reject{|key, value| value == nil || key == 'value' || key == 'type' }
28
+ keys = data.keys & Cell::INLINE_STYLES
29
+ str << "<r><rPr>"
30
+ keys.each do |key|
31
+ case key
32
+ when 'font_name'
33
+ str << "<rFont val='"<< cell.font_name << "'/>"
34
+ when 'color'
35
+ str << data[key].to_xml_string
36
+ else
37
+ str << "<" << key.to_s << " val='" << data[key].to_s << "'/>"
38
+ end
39
+ end
40
+ str << "</rPr>" << "<t>" << cell.value.to_s << "</t></r>"
41
+ else
42
+ str << "<t>" << cell.value.to_s << "</t>"
43
+ end
44
+ str
45
+ end
46
+
47
+ # serializes cells that are type iso_8601
48
+ # @param [Cell] cell The cell that is being serialized
49
+ # @param [String] str The string the serialized content will be appended to.
50
+ # @return [String]
51
+ def iso_8601_type_serialization(cell, str='')
52
+ value_serialization 'd', cell.value, str
53
+ end
54
+
55
+
56
+ # serializes cells that are type date
57
+ # @param [Cell] cell The cell that is being serialized
58
+ # @param [String] str The string the serialized content will be appended to.
59
+ # @return [String]
60
+ def date_type_serialization(cell, str='')
61
+ value_serialization false, DateTimeConverter::date_to_serial(cell.value).to_s, str
62
+ end
63
+
64
+ # Serializes cells that are type time
65
+ # @param [Cell] cell The cell that is being serialized
66
+ # @param [String] str The string the serialized content will be appended to.
67
+ # @return [String]
68
+ def time_type_serialization(cell, str='')
69
+ value_serialization false, DateTimeConverter::time_to_serial(cell.value).to_s, str
70
+ end
71
+
72
+ # Serializes cells that are type boolean
73
+ # @param [Cell] cell The cell that is being serialized
74
+ # @param [String] str The string the serialized content will be appended to.
75
+ # @return [String]
76
+ def boolean_type_serialization(cell, str='')
77
+ value_serialization 'b', cell.value.to_s, str
78
+ end
79
+
80
+ # Serializes cells that are type float
81
+ # @param [Cell] cell The cell that is being serialized
82
+ # @param [String] str The string the serialized content will be appended to.
83
+ # @return [String]
84
+ def float_type_serialization(cell, str='')
85
+ numeric_type_serialization cell, str
86
+ end
87
+
88
+ # Serializes cells that are type integer
89
+ # @param [Cell] cell The cell that is being serialized
90
+ # @param [String] str The string the serialized content will be appended to.
91
+ # @return [String]
92
+ def integer_type_serialization(cell, str = '')
93
+ numeric_type_serialization cell, str
94
+ end
95
+
96
+
97
+ # Serializes cells that are type formula
98
+ # @param [Cell] cell The cell that is being serialized
99
+ # @param [String] str The string the serialized content will be appended to.
100
+ # @return [String]
101
+ def formula_serialization(cell, str='')
102
+ str << 't="str">' << '<f>' << cell.value.to_s.sub('=', '') << '</f>'
103
+ str << '<v>' << cell.formula_value.to_s << '</v>' unless cell.formula_value.nil?
104
+ end
105
+
106
+ # Serializes cells that are type inline_string
107
+ # @param [Cell] cell The cell that is being serialized
108
+ # @param [String] str The string the serialized content will be appended to.
109
+ # @return [String]
110
+ def inline_string_serialization(cell, str = '')
111
+ str << 't="inlineStr">' << '<is>'
112
+ run_xml_string cell, str
113
+ str << '</is>'
114
+ end
115
+
116
+ # Serializes cells that are type string
117
+ # @param [Cell] cell The cell that is being serialized
118
+ # @param [String] str The string the serialized content will be appended to.
119
+ # @return [String]
120
+ def string_type_serialization(cell, str='')
121
+ if cell.is_formula?
122
+ formula_serialization cell, str
123
+ elsif !cell.ssti.nil?
124
+ value_serialization 's', cell.ssti.to_s, str
125
+ else
126
+ inline_string_serialization cell, str
127
+ end
128
+ end
129
+
130
+ private
131
+
132
+ def numeric_type_serialization(cell, str = '')
133
+ value_serialization 'n', cell.value.to_s, str
134
+ end
135
+
136
+ def value_serialization(serialization_type, serialization_value, str = '')
137
+ str << 't="' << serialization_type << '"' if serialization_type
138
+ str << '><v>' << serialization_value << '</v>'
139
+ end
140
+
141
+
142
+ end
143
+ end
144
+ end
@@ -8,35 +8,36 @@ module Axlsx
8
8
  #
9
9
  class Cfvo
10
10
 
11
+ include Axlsx::OptionsParser
12
+ include Axlsx::SerializedAttributes
13
+
14
+ # Creates a new Cfvo object
15
+ # @option options [Symbol] type The type of conditional formatting value object
16
+ # @option options [Boolean] gte threshold value usage indicator
17
+ # @option options [String] val The value of the conditional formatting object
18
+ def initialize(options={})
19
+ @gte = true
20
+ parse_options options
21
+ end
22
+
23
+ serializable_attributes :type, :gte, :val
24
+
11
25
  # Type (ST_CfvoType)
12
26
  # The type of this conditional formatting value object. options are num, percent, max, min, formula and percentile
13
27
  # @return [Symbol]
14
28
  attr_reader :type
15
29
 
16
-
17
30
  # Type (xsd:boolean)
18
31
  # For icon sets, determines whether this threshold value uses the greater than or equal to operator. 0 indicates 'greater than' is used instead of 'greater than or equal to'.
19
32
  # The default value is true
20
33
  # @return [Boolean]
21
34
  attr_reader :gte
22
35
 
23
-
24
36
  # Type (ST_Xstring)
25
37
  # The value of the conditional formatting object
26
38
  # This library will accept any value so long as it supports to_s
27
39
  attr_reader :val
28
40
 
29
- # Creates a new Cfvo object
30
- # @option options [Symbol] type The type of conditional formatting value object
31
- # @option options [Boolean] gte threshold value usage indicator
32
- # @option options [String] val The value of the conditional formatting object
33
- def initialize(options={})
34
- @gte = true
35
- options.each do |o|
36
- self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
37
- end
38
- end
39
-
40
41
  # @see type
41
42
  def type=(v); Axlsx::validate_conditional_formatting_value_object_type(v); @type = v end
42
43
 
@@ -54,9 +55,8 @@ module Axlsx
54
55
  # @return [String]
55
56
  def to_xml_string(str = '')
56
57
  str << '<cfvo '
57
- str << instance_values.map { |key, value| '' << key << '="' << value.to_s << '"' }.join(' ')
58
+ serialized_attributes str
58
59
  str << ' />'
59
60
  end
60
-
61
61
  end
62
62
  end
@@ -0,0 +1,15 @@
1
+ module Axlsx
2
+
3
+ #A collection of Cfvo objects that initializes with the required
4
+ #first two items
5
+ class Cfvos < SimpleTypedList
6
+
7
+ def initialize
8
+ super(Cfvo)
9
+ end
10
+
11
+ def to_xml_string(str='')
12
+ @list.each { |cfvo| cfvo.to_xml_string(str) }
13
+ end
14
+ end
15
+ end
@@ -4,6 +4,27 @@ module Axlsx
4
4
  # The Col class defines column attributes for columns in sheets.
5
5
  class Col
6
6
 
7
+ include Axlsx::OptionsParser
8
+ include Axlsx::SerializedAttributes
9
+ # Create a new Col objects
10
+ # @param min First column affected by this 'column info' record.
11
+ # @param max Last column affected by this 'column info' record.
12
+ # @option options [Boolean] collapsed see Col#collapsed
13
+ # @option options [Boolean] hidden see Col#hidden
14
+ # @option options [Boolean] outlineLevel see Col#outlineLevel
15
+ # @option options [Boolean] phonetic see Col#phonetic
16
+ # @option options [Integer] style see Col#style
17
+ # @option options [Numeric] width see Col#width
18
+ def initialize(min, max, options={})
19
+ Axlsx.validate_unsigned_int(max)
20
+ Axlsx.validate_unsigned_int(min)
21
+ @min = min
22
+ @max = max
23
+ parse_options options
24
+ end
25
+
26
+ serializable_attributes :collapsed, :hidden, :outline_level, :phonetic, :style, :width, :min, :max, :best_fit, :custom_width
27
+
7
28
  # First column affected by this 'column info' record.
8
29
  # @return [Integer]
9
30
  attr_reader :min
@@ -17,7 +38,8 @@ module Axlsx
17
38
  # 'Best fit' means that when numbers are typed into a cell contained in a 'best fit' column, the column width should
18
39
  # automatically resize to display the number. [Note: In best fit cases, column width must not be made smaller, only larger. end note]
19
40
  # @return [Boolean]
20
- attr_reader :bestFit
41
+ attr_reader :best_fit
42
+ alias :bestFit :best_fit
21
43
 
22
44
  # Flag indicating if the outlining of the affected column(s) is in the collapsed state.
23
45
  # @return [Boolean]
@@ -29,7 +51,8 @@ module Axlsx
29
51
 
30
52
  # Outline level of affected column(s). Range is 0 to 7.
31
53
  # @return [Integer]
32
- attr_reader :outlineLevel
54
+ attr_reader :outline_level
55
+ alias :outlineLevel :outline_level
33
56
 
34
57
  # Flag indicating if the phonetic information should be displayed by default for the affected column(s) of the worksheet.
35
58
  # @return [Boolean]
@@ -44,7 +67,8 @@ module Axlsx
44
67
  attr_reader :width
45
68
 
46
69
  # @return [Boolean]
47
- attr_reader :customWidth
70
+ attr_reader :custom_width
71
+ alias :customWidth :custom_width
48
72
 
49
73
  # @see Col#collapsed
50
74
  def collapsed=(v)
@@ -59,11 +83,12 @@ module Axlsx
59
83
  end
60
84
 
61
85
  # @see Col#outline
62
- def outlineLevel=(v)
86
+ def outline_level=(v)
63
87
  Axlsx.validate_unsigned_numeric(v)
64
88
  raise ArgumentError, 'outlineLevel must be between 0 and 7' unless 0 <= v && v <= 7
65
- @outlineLevel = v
89
+ @outline_level = v
66
90
  end
91
+ alias :outlineLevel= :outline_level=
67
92
 
68
93
  # @see Col#phonetic
69
94
  def phonetic=(v)
@@ -79,30 +104,16 @@ module Axlsx
79
104
 
80
105
  # @see Col#width
81
106
  def width=(v)
82
- Axlsx.validate_unsigned_numeric(v) unless v == nil
83
- @customWidth = @bestFit = v != nil
107
+ # Removing this validation make a 10% difference in performance
108
+ # as it is called EVERY TIME A CELL IS ADDED - the proper solution
109
+ # is to only set this if a calculated value is greated than the
110
+ # current @width value.
111
+ # TODO!!!
112
+ #Axlsx.validate_unsigned_numeric(v) unless v == nil
113
+ @custom_width = @best_fit = v != nil
84
114
  @width = v
85
115
  end
86
116
 
87
- # Create a new Col objects
88
- # @param min First column affected by this 'column info' record.
89
- # @param max Last column affected by this 'column info' record.
90
- # @option options [Boolean] collapsed see Col#collapsed
91
- # @option options [Boolean] hidden see Col#hidden
92
- # @option options [Boolean] outlineLevel see Col#outlineLevel
93
- # @option options [Boolean] phonetic see Col#phonetic
94
- # @option options [Integer] style see Col#style
95
- # @option options [Numeric] width see Col#width
96
- def initialize(min, max, options={})
97
- Axlsx.validate_unsigned_int(max)
98
- Axlsx.validate_unsigned_int(min)
99
- @min = min
100
- @max = max
101
- options.each do |o|
102
- self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
103
- end
104
- end
105
-
106
117
  # updates the width for this col based on the cells autowidth and
107
118
  # an optionally specified fixed width
108
119
  # @param [Cell] cell The cell to use in updating this col's width
@@ -114,7 +125,9 @@ module Axlsx
114
125
  if fixed_width.is_a? Numeric
115
126
  self.width = fixed_width
116
127
  elsif use_autowidth
117
- self.width = [width || 0, cell.autowidth || 0].max
128
+ cell_width = cell.autowidth
129
+ self.width = cell_width unless (width || 0) > (cell_width || 0)
130
+ #self.width = [width || 0, cell.autowidth || 0].max
118
131
  end
119
132
  end
120
133
 
@@ -122,8 +135,9 @@ module Axlsx
122
135
  # @param [String] str
123
136
  # @return [String]
124
137
  def to_xml_string(str = '')
125
- attrs = self.instance_values.reject{ |key, value| value == nil }
126
- str << '<col ' << attrs.map { |key, value| '' << key << '="' << value.to_s << '"' }.join(' ') << '/>'
138
+ str << '<col '
139
+ serialized_attributes str
140
+ str << '/>'
127
141
  end
128
142
 
129
143
  end
@@ -0,0 +1,35 @@
1
+ module Axlsx
2
+
3
+ # A collection of Brake objects.
4
+ # Please do not use this class directly. Instead use
5
+ # Worksheet#add_break
6
+ class ColBreaks < SimpleTypedList
7
+
8
+ # Instantiates a new list restricted to Break types
9
+ def initialize
10
+ super Break
11
+ end
12
+
13
+ # A column break specific helper for adding a break.
14
+ # @param [Hash] options A list of options to pass into the Break object
15
+ # The max and man options are fixed, however any other valid option for
16
+ # Break will be passed to the created break object.
17
+ # @see Break
18
+ def add_break(options)
19
+ @list << Break.new(options.merge(:max => 1048575, :man => true))
20
+ last
21
+ end
22
+
23
+ # Serialize the collection to xml
24
+ # @param [String] str The string to append this lists xml to.
25
+ # <colBreaks count="1" manualBreakCount="1">
26
+ # <brk id="3" max="1048575" man="1"/>
27
+ # </colBreaks>
28
+ def to_xml_string(str='')
29
+ return if empty?
30
+ str << '<colBreaks count="' << @list.size.to_s << '" manualBreakCount="' << @list.size.to_s << '">'
31
+ each { |brk| brk.to_xml_string(str) }
32
+ str << '</colBreaks>'
33
+ end
34
+ end
35
+ end
@@ -7,34 +7,70 @@ module Axlsx
7
7
  # @see ConditionalFormattingRule#initialize
8
8
  class ColorScale
9
9
 
10
+ class << self
11
+
12
+ # These are the default conditional formatting value objects
13
+ # that define a two tone color gradient.
14
+ def default_cfvos
15
+ [{:type => :min, :val => 0, :color => 'FFFF7128'},
16
+ {:type => :max, :val => 0, :color => 'FFFFEF9C'}]
17
+ end
18
+
19
+ # A builder for two tone color gradient
20
+ # @example
21
+ # # this creates a two tone color scale
22
+ # color_scale = Axlsx::ColorScale.two_tone
23
+ # @see examples/example.rb conditional formatting examples.
24
+ def two_tone
25
+ self.new
26
+ end
27
+
28
+ # A builder for three tone color gradient
29
+ # @example
30
+ # #this creates a three tone color scale
31
+ # color_scale = Axlsx::ColorScale.three_tone
32
+ # @see examples/example.rb conditional formatting examples.
33
+ def three_tone
34
+ self.new({:type => :min, :val => 0, :color => 'FFF8696B'},
35
+ {:type => :percent, :val => '50', :color => 'FFFFEB84'},
36
+ {:type => :max, :val => 0, :color => 'FF63BE7B'})
37
+ end
38
+ end
10
39
  # A simple typed list of cfvos
11
40
  # @return [SimpleTypedList]
12
41
  # @see Cfvo
13
- attr_reader :value_objects
42
+ def value_objects
43
+ @value_objects ||= Cfvos.new
44
+ end
14
45
 
15
46
  # A simple types list of colors
16
47
  # @return [SimpleTypedList]
17
48
  # @see Color
18
- attr_reader :colors
49
+ def colors
50
+ @colors ||= SimpleTypedList.new Color
51
+ end
19
52
 
20
53
  # creates a new ColorScale object.
21
- # This method will yield it self so you can alter the properites of the defauls conditional formating value object (cfvo and colors
22
- # Two value objects and two colors are created on initialization and cannot be deleted.
23
54
  # @see Cfvo
24
55
  # @see Color
25
- def initialize
26
- initialize_value_objects
27
- initialize_colors
56
+ # @example
57
+ # color_scale = Axlsx::ColorScale.new({:type => :num, :val => 0.55, :color => 'fff7696c'})
58
+ def initialize(*cfvos)
59
+ initialize_default_cfvos(cfvos)
28
60
  yield self if block_given?
29
61
  end
30
62
 
31
63
  # adds a new cfvo / color pair to the color scale and returns a hash containing
32
64
  # a reference to the newly created cfvo and color objects so you can alter the default properties.
33
65
  # @return [Hash] a hash with :cfvo and :color keys referencing the newly added objects.
66
+ # @param [Hash] options options for the new cfvo and color objects
67
+ # @option [Symbol] type The type of cfvo you to add
68
+ # @option [Any] val The value of the cfvo to add
69
+ # @option [String] The rgb color for the cfvo
34
70
  def add(options={})
35
- @value_objects << Cfvo.new(:type => options[:type] || :min, :val => options[:val] || 0)
36
- @colors << Color.new(:rgb => options[:color] || "FF000000")
37
- {:cfvo => @value_objects.last, :color => @colors.last}
71
+ value_objects << Cfvo.new(:type => options[:type] || :min, :val => options[:val] || 0)
72
+ colors << Color.new(:rgb => options[:color] || "FF000000")
73
+ {:cfvo => value_objects.last, :color => colors.last}
38
74
  end
39
75
 
40
76
 
@@ -42,8 +78,8 @@ module Axlsx
42
78
  # @param [Integer] index The index of the cfvo and color object to delete
43
79
  # @note you cannot remove the first two cfvo and color pairs
44
80
  def delete_at(index=2)
45
- @value_objects.delete_at index
46
- @colors.delete_at index
81
+ value_objects.delete_at index
82
+ colors.delete_at index
47
83
  end
48
84
 
49
85
  # Serialize this color_scale object data to an xml string
@@ -51,26 +87,24 @@ module Axlsx
51
87
  # @return [String]
52
88
  def to_xml_string(str = '')
53
89
  str << '<colorScale>'
54
- @value_objects.each { |cfvo| cfvo.to_xml_string(str) }
55
- @colors.each { |color| color.to_xml_string(str) }
90
+ value_objects.to_xml_string(str)
91
+ colors.each { |color| color.to_xml_string(str) }
56
92
  str << '</colorScale>'
57
93
  end
58
94
 
59
95
  private
60
-
61
- # creates the initial cfvo objects
62
- def initialize_value_objects
63
- @value_objects = SimpleTypedList.new Cfvo
64
- @value_objects.concat [Cfvo.new(:type => :min, :val => 0), Cfvo.new(:type => :max, :val => 0)]
65
- @value_objects.lock
96
+ # There has got to be cleaner way of merging these arrays.
97
+ def initialize_default_cfvos(user_cfvos)
98
+ defaults = self.class.default_cfvos
99
+ user_cfvos.each_with_index do |cfvo, index|
100
+ if index < defaults.size
101
+ cfvo = defaults[index].merge(cfvo)
102
+ end
103
+ add cfvo
104
+ end
105
+ while colors.size < defaults.size
106
+ add defaults[colors.size - 1]
107
+ end
66
108
  end
67
-
68
- # creates the initial color objects
69
- def initialize_colors
70
- @colors = SimpleTypedList.new Color
71
- @colors.concat [Color.new(:rgb => "FFFF0000"), Color.new(:rgb => "FF0000FF")]
72
- @colors.lock
73
- end
74
-
75
109
  end
76
110
  end
@@ -3,22 +3,34 @@ module Axlsx
3
3
  # A comment is the text data for a comment
4
4
  class Comment
5
5
 
6
- # The text to render
7
- # @return [String]
8
- attr_reader :text
6
+ include Axlsx::OptionsParser
7
+ include Axlsx::Accessors
8
+
9
+ # Creates a new comment object
10
+ # @param [Comments] comments The comment collection this comment belongs to
11
+ # @param [Hash] options
12
+ # @option [String] author the author of the comment
13
+ # @option [String] text The text for the comment
14
+ # @option [String] ref The refence (e.g. 'A3' where this comment will be anchored.
15
+ # @option [Boolean] visible This controls the visiblity of the associated vml_shape.
16
+ def initialize(comments, options={})
17
+ raise ArgumentError, "A comment needs a parent comments object" unless comments.is_a?(Comments)
18
+ @visible = true
19
+ @comments = comments
20
+ parse_options options
21
+ yield self if block_given?
22
+ end
9
23
 
10
- # The author of this comment
11
- # @see Comments
12
- # @return [String]
13
- attr_reader :author
24
+ string_attr_accessor :text, :author
25
+ boolean_attr_accessor :visible
14
26
 
15
- # The owning Comments object
27
+ # The owning Comments object
16
28
  # @return [Comments]
17
29
  attr_reader :comments
18
30
 
19
31
 
20
32
  # The string based cell position reference (e.g. 'A1') that determines the positioning of this comment
21
- # @return [String]
33
+ # @return [String|Cell]
22
34
  attr_reader :ref
23
35
 
24
36
  # TODO
@@ -26,22 +38,12 @@ module Axlsx
26
38
  # rPh (Phonetic Text Run)
27
39
  # phoneticPr (Phonetic Properties)
28
40
 
29
- def initialize(comments, options={})
30
- raise ArgumentError, "A comment needs a parent comments object" unless comments.is_a?(Comments)
31
- @comments = comments
32
- options.each do |o|
33
- self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
34
- end
35
- yield self if block_given?
36
- end
37
-
38
41
  # The vml shape that will render this comment
39
42
  # @return [VmlShape]
40
43
  def vml_shape
41
44
  @vml_shape ||= initialize_vml_shape
42
45
  end
43
46
 
44
- #
45
47
  # The index of this author in a unique sorted list of all authors in
46
48
  # the comment.
47
49
  # @return [Integer]
@@ -56,30 +58,20 @@ module Axlsx
56
58
  @ref = v.r if v.is_a?(Cell)
57
59
  end
58
60
 
59
- # @see text
60
- def text=(v)
61
- Axlsx::validate_string(v)
62
- @text = v
63
- end
64
-
65
- # @see author
66
- def author=(v)
67
- @author = v
68
- end
69
-
70
61
  # serialize the object
71
62
  # @param [String] str
72
63
  # @return [String]
73
64
  def to_xml_string(str = "")
74
65
  author = @comments.authors[author_index]
75
66
  str << '<comment ref="' << ref << '" authorId="' << author_index.to_s << '">'
76
- str << '<text><r>'
77
- str << '<rPr> <b/><color indexed="81"/></rPr>'
78
- str << '<t>' << author.to_s << ':
79
- </t></r>'
67
+ str << '<text>'
68
+ unless author.to_s == ""
69
+ str << '<r><rPr><b/><color indexed="81"/></rPr>'
70
+ str << "<t>" << ::CGI.escapeHTML(author.to_s) << ":\n</t></r>"
71
+ end
80
72
  str << '<r>'
81
73
  str << '<rPr><color indexed="81"/></rPr>'
82
- str << '<t>' << text << '</t></r></text>'
74
+ str << '<t>' << ::CGI.escapeHTML(text) << '</t></r></text>'
83
75
  str << '</comment>'
84
76
  end
85
77
 
@@ -89,13 +81,12 @@ module Axlsx
89
81
  # by default, all columns are 5 columns wide and 5 rows high
90
82
  def initialize_vml_shape
91
83
  pos = Axlsx::name_to_indices(ref)
92
- @vml_shape = VmlShape.new(:row => pos[1], :column => pos[0]) do |vml|
84
+ @vml_shape = VmlShape.new(:row => pos[1], :column => pos[0], :visible => @visible) do |vml|
93
85
  vml.left_column = vml.column
94
86
  vml.right_column = vml.column + 2
95
87
  vml.top_row = vml.row
96
88
  vml.bottom_row = vml.row + 4
97
89
  end
98
90
  end
99
-
100
91
  end
101
92
  end
@@ -56,9 +56,9 @@ module Axlsx
56
56
  # The relationships required by this object
57
57
  # @return [Array]
58
58
  def relationships
59
- [Relationship.new(VML_DRAWING_R, "../#{vml_drawing.pn}"),
60
- Relationship.new(COMMENT_R, "../#{pn}"),
61
- Relationship.new(COMMENT_R_NULL, "NULL")]
59
+ [Relationship.new(self, VML_DRAWING_R, "../#{vml_drawing.pn}"),
60
+ Relationship.new(self, COMMENT_R, "../#{pn}"),
61
+ Relationship.new(self, COMMENT_R_NULL, "NULL")]
62
62
  end
63
63
 
64
64
  # serialize the object