axlsx 1.3.1 → 1.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +13 -5
- data/examples/colored_links.rb +59 -0
- data/examples/example.rb +421 -266
- data/examples/example.xlsx +0 -0
- data/examples/example_streamed.xlsx +0 -0
- data/examples/finance.rb +82 -0
- data/examples/finance.xlsx +0 -0
- data/examples/financial.xlsx +0 -0
- data/examples/no-use_autowidth.xlsx +0 -0
- data/examples/shared_strings_example.xlsx +0 -0
- data/examples/where_is_my_color.xlsx +0 -0
- data/lib/axlsx.rb +11 -4
- data/lib/axlsx/content_type/abstract_content_type.rb +32 -0
- data/lib/axlsx/content_type/content_type.rb +1 -1
- data/lib/axlsx/content_type/default.rb +6 -37
- data/lib/axlsx/content_type/override.rb +6 -38
- data/lib/axlsx/doc_props/app.rb +7 -4
- data/lib/axlsx/drawing/axis.rb +3 -3
- data/lib/axlsx/drawing/chart.rb +2 -3
- data/lib/axlsx/drawing/d_lbls.rb +21 -31
- data/lib/axlsx/drawing/drawing.rb +6 -0
- data/lib/axlsx/drawing/hyperlink.rb +40 -32
- data/lib/axlsx/drawing/marker.rb +13 -13
- data/lib/axlsx/drawing/num_data.rb +6 -6
- data/lib/axlsx/drawing/num_data_source.rb +17 -16
- data/lib/axlsx/drawing/one_cell_anchor.rb +20 -22
- data/lib/axlsx/drawing/pic.rb +25 -27
- data/lib/axlsx/drawing/picture_locking.rb +12 -44
- data/lib/axlsx/drawing/scaling.rb +13 -13
- data/lib/axlsx/drawing/scatter_chart.rb +3 -3
- data/lib/axlsx/drawing/series.rb +3 -6
- data/lib/axlsx/drawing/str_data.rb +3 -3
- data/lib/axlsx/drawing/str_val.rb +7 -8
- data/lib/axlsx/drawing/view_3D.rb +51 -37
- data/lib/axlsx/drawing/vml_shape.rb +23 -23
- data/lib/axlsx/package.rb +14 -16
- data/lib/axlsx/stylesheet/border.rb +29 -20
- data/lib/axlsx/stylesheet/border_pr.rb +5 -4
- data/lib/axlsx/stylesheet/cell_alignment.rb +55 -29
- data/lib/axlsx/stylesheet/cell_protection.rb +7 -4
- data/lib/axlsx/stylesheet/cell_style.rb +19 -14
- data/lib/axlsx/stylesheet/color.rb +19 -16
- data/lib/axlsx/stylesheet/dxf.rb +4 -4
- data/lib/axlsx/stylesheet/font.rb +22 -22
- data/lib/axlsx/stylesheet/gradient_fill.rb +45 -21
- data/lib/axlsx/stylesheet/num_fmt.rb +22 -13
- data/lib/axlsx/stylesheet/pattern_fill.rb +12 -21
- data/lib/axlsx/stylesheet/styles.rb +1 -1
- data/lib/axlsx/stylesheet/table_style.rb +17 -16
- data/lib/axlsx/stylesheet/table_style_element.rb +15 -11
- data/lib/axlsx/stylesheet/table_styles.rb +14 -11
- data/lib/axlsx/stylesheet/xf.rb +28 -26
- data/lib/axlsx/util/accessors.rb +49 -0
- data/lib/axlsx/util/options_parser.rb +15 -0
- data/lib/axlsx/util/serialized_attributes.rb +46 -0
- data/lib/axlsx/util/simple_typed_list.rb +16 -4
- data/lib/axlsx/version.rb +1 -1
- data/lib/axlsx/workbook/defined_name.rb +13 -58
- data/lib/axlsx/workbook/workbook.rb +27 -1
- data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +11 -19
- data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +20 -27
- data/lib/axlsx/workbook/worksheet/cell.rb +38 -39
- data/lib/axlsx/workbook/worksheet/cfvo.rb +15 -15
- data/lib/axlsx/workbook/worksheet/cfvos.rb +18 -0
- data/lib/axlsx/workbook/worksheet/col.rb +34 -27
- data/lib/axlsx/workbook/worksheet/color_scale.rb +7 -13
- data/lib/axlsx/workbook/worksheet/comment.rb +14 -11
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +11 -11
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +27 -25
- data/lib/axlsx/workbook/worksheet/data_bar.rb +44 -34
- data/lib/axlsx/workbook/worksheet/data_validation.rb +61 -62
- data/lib/axlsx/workbook/worksheet/dimension.rb +0 -1
- data/lib/axlsx/workbook/worksheet/icon_set.rb +20 -20
- data/lib/axlsx/workbook/worksheet/page_margins.rb +21 -19
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +6 -9
- data/lib/axlsx/workbook/worksheet/page_setup.rb +20 -19
- data/lib/axlsx/workbook/worksheet/pane.rb +48 -51
- data/lib/axlsx/workbook/worksheet/print_options.rb +8 -30
- data/lib/axlsx/workbook/worksheet/protected_range.rb +16 -13
- data/lib/axlsx/workbook/worksheet/selection.rb +30 -38
- data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +6 -26
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +19 -57
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +51 -155
- data/lib/axlsx/workbook/worksheet/sheet_view.rb +68 -234
- data/lib/axlsx/workbook/worksheet/table.rb +16 -18
- data/lib/axlsx/workbook/worksheet/table_style_info.rb +10 -27
- data/lib/axlsx/workbook/worksheet/worksheet.rb +6 -7
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +1 -1
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +11 -33
- data/test/content_type/tc_default.rb +0 -11
- data/test/content_type/tc_override.rb +0 -13
- data/test/drawing/tc_d_lbls.rb +14 -4
- data/test/tc_axlsx.rb +20 -2
- data/test/workbook/tc_defined_name.rb +2 -2
- data/test/workbook/tc_workbook.rb +15 -0
- data/test/workbook/worksheet/tc_col.rb +11 -1
- data/test/workbook/worksheet/tc_pane.rb +5 -45
- data/test/workbook/worksheet/tc_selection.rb +9 -48
- metadata +13 -3
@@ -43,16 +43,16 @@ module Axlsx
|
|
43
43
|
def to_ary
|
44
44
|
@list
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
alias :to_a :to_ary
|
48
|
-
|
48
|
+
|
49
49
|
# Unlock the list
|
50
50
|
# @return [self]
|
51
51
|
def unlock
|
52
52
|
@locked_at = nil
|
53
53
|
self
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
# join operator
|
57
57
|
# @param [Array] v the array to join
|
58
58
|
# @raise [ArgumentError] if any of the values being joined are not
|
@@ -62,7 +62,7 @@ module Axlsx
|
|
62
62
|
v.each do |item|
|
63
63
|
DataTypeValidator.validate "SimpleTypedList.+", @allowed_types, item
|
64
64
|
@list << item
|
65
|
-
end
|
65
|
+
end
|
66
66
|
end
|
67
67
|
|
68
68
|
# Concat operator
|
@@ -107,6 +107,18 @@ module Axlsx
|
|
107
107
|
v
|
108
108
|
end
|
109
109
|
|
110
|
+
# inserts an item at the index specfied
|
111
|
+
# @param [Integer] index
|
112
|
+
# @param [Any] v
|
113
|
+
# @raise [ArgumentError] if the index is protected by locking
|
114
|
+
# @raise [ArgumentError] if the index is not one of the allowed types
|
115
|
+
def insert(index, v)
|
116
|
+
DataTypeValidator.validate "SimpleTypedList.<<", @allowed_types, v
|
117
|
+
raise ArgumentError, "Item is protected and cannot be changed" if protected? index
|
118
|
+
@list.insert(index, v)
|
119
|
+
v
|
120
|
+
end
|
121
|
+
|
110
122
|
# determines if the index is protected
|
111
123
|
# @param [Integer] index
|
112
124
|
def protected? index
|
data/lib/axlsx/version.rb
CHANGED
@@ -49,12 +49,15 @@ module Axlsx
|
|
49
49
|
# @example
|
50
50
|
# For clarification: LOG10 is always a cell reference, LOG10() is always formula, LOGO1000 can be a defined name that overrides a cell reference.
|
51
51
|
class DefinedName
|
52
|
+
include Axlsx::SerializedAttributes
|
53
|
+
include Axlsx::OptionsParser
|
54
|
+
include Axlsx::Accessors
|
52
55
|
# creates a new DefinedName.
|
53
56
|
# @param [String] formula - the formula the defined name references
|
54
57
|
# @param [Hash] options - A hash of key/value pairs that will be mapped to this instances attributes.
|
55
|
-
#
|
58
|
+
#
|
56
59
|
# @option [String] name - Specifies the name that appears in the user interface for the defined name.
|
57
|
-
# This attribute is required.
|
60
|
+
# This attribute is required.
|
58
61
|
# The following built-in names are defined in this SpreadsheetML specification:
|
59
62
|
# Print
|
60
63
|
# _xlnm.Print_Area: this defined name specifies the workbook's print area.
|
@@ -96,10 +99,9 @@ module Axlsx
|
|
96
99
|
# version of the workbook that is published to or rendered on a Web or application server.
|
97
100
|
def initialize(formula, options={})
|
98
101
|
@formula = formula
|
99
|
-
options
|
100
|
-
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
101
|
-
end
|
102
|
+
parse_options options
|
102
103
|
end
|
104
|
+
|
103
105
|
attr_reader :local_sheet_id
|
104
106
|
|
105
107
|
# The local sheet index (0-based)
|
@@ -109,64 +111,17 @@ module Axlsx
|
|
109
111
|
@local_sheet_id = value
|
110
112
|
end
|
111
113
|
|
112
|
-
|
113
|
-
STRING_ATTRIBUTES = [:short_cut_key, :status_bar, :help, :description, :custom_menu, :comment]
|
114
|
-
|
115
|
-
# boolean attributes that will be added when this class is evaluated
|
116
|
-
BOOLEAN_ATTRIBUTES = [:workbook_parameter, :publish_to_server, :xlm, :vb_proceedure, :function, :hidden]
|
117
|
-
|
118
|
-
# Dynamically create string attribute accessors
|
119
|
-
STRING_ATTRIBUTES.each do |attr|
|
120
|
-
class_eval %{
|
121
|
-
# The #{attr} attribute reader
|
122
|
-
# @return [String]
|
123
|
-
attr_reader :#{attr}
|
124
|
-
|
125
|
-
# The #{attr} writer
|
126
|
-
# @param [String] value The value to assign to #{attr}
|
127
|
-
# @return [String]
|
128
|
-
def #{attr}=(value)
|
129
|
-
Axlsx::validate_string(value)
|
130
|
-
@#{attr}= value
|
131
|
-
end
|
132
|
-
}
|
133
|
-
end
|
134
|
-
|
135
|
-
# Dynamically create boolean attribute accessors
|
136
|
-
BOOLEAN_ATTRIBUTES.each do |attr|
|
137
|
-
class_eval %{
|
138
|
-
# The #{attr} attribute reader
|
139
|
-
# @return [Boolean]
|
140
|
-
attr_reader :#{attr}
|
114
|
+
string_attr_accessor :short_cut_key, :status_bar, :help, :description, :custom_menu, :comment, :name, :formula
|
141
115
|
|
142
|
-
|
143
|
-
# @param [Boolean] value The value to assign to #{attr}
|
144
|
-
# @return [Boolean]
|
145
|
-
def #{attr}=(value)
|
146
|
-
Axlsx::validate_boolean(value)
|
147
|
-
@#{attr} = value
|
148
|
-
end
|
149
|
-
}
|
150
|
-
end
|
151
|
-
|
152
|
-
attr_reader :name
|
153
|
-
# The name of this defined name. Please refer to the class documentation for more information
|
154
|
-
def name=(value)
|
155
|
-
Axlsx::RestrictionValidator.validate 'DefinedName.name', %w(_xlnm.Print_Area _xlnm.Print_Titles _xlnm.Criteria _xlnm._FilterDatabase _xlnm.Extract _xlnm.Consolidate_Area _xlnm.Database _xlnm.Sheet_Title), value
|
156
|
-
@name = value
|
157
|
-
end
|
116
|
+
boolean_attr_accessor :workbook_parameter, :publish_to_server, :xlm, :vb_proceedure, :function, :hidden
|
158
117
|
|
159
|
-
|
160
|
-
|
118
|
+
serializable_attributes :short_cut_key, :status_bar, :help, :description, :custom_menu, :comment,
|
119
|
+
:workbook_parameter, :publish_to_server, :xlm, :vb_proceedure, :function, :hidden, :name, :local_sheet_id
|
161
120
|
|
162
121
|
def to_xml_string(str='')
|
163
122
|
raise ArgumentError, 'you must specify the name for this defined name. Please read the documentation for Axlsx::DefinedName for more details' unless name
|
164
|
-
str << '<definedName'
|
165
|
-
|
166
|
-
unless name == 'formula'
|
167
|
-
str << ' ' << Axlsx::camel(name, false) << "='#{value}'"
|
168
|
-
end
|
169
|
-
end
|
123
|
+
str << '<definedName '
|
124
|
+
serialized_attributes str
|
170
125
|
str << '>' << @formula
|
171
126
|
str << '</definedName>'
|
172
127
|
end
|
@@ -11,6 +11,7 @@ require 'axlsx/workbook/worksheet/page_set_up_pr.rb'
|
|
11
11
|
require 'axlsx/workbook/worksheet/page_setup.rb'
|
12
12
|
require 'axlsx/workbook/worksheet/print_options.rb'
|
13
13
|
require 'axlsx/workbook/worksheet/cfvo.rb'
|
14
|
+
require 'axlsx/workbook/worksheet/cfvos.rb'
|
14
15
|
require 'axlsx/workbook/worksheet/color_scale.rb'
|
15
16
|
require 'axlsx/workbook/worksheet/data_bar.rb'
|
16
17
|
require 'axlsx/workbook/worksheet/icon_set.rb'
|
@@ -152,6 +153,14 @@ require 'axlsx/workbook/worksheet/selection.rb'
|
|
152
153
|
@@date1904 = false
|
153
154
|
|
154
155
|
|
156
|
+
# A quick helper to retrive a worksheet by name
|
157
|
+
# @param [String] name The name of the sheet you are looking for
|
158
|
+
# @return [Worksheet] The sheet found, or nil
|
159
|
+
def sheet_by_name(name)
|
160
|
+
index = @worksheets.index { |sheet| sheet.name == name }
|
161
|
+
@worksheets[index] if index
|
162
|
+
end
|
163
|
+
|
155
164
|
# lets come back to this later when we are ready for parsing.
|
156
165
|
#def self.parse entry
|
157
166
|
# io = entry.get_input_stream
|
@@ -160,7 +169,7 @@ require 'axlsx/workbook/worksheet/selection.rb'
|
|
160
169
|
# w.parse_string :date1904, "//xmlns:workbookPr/@date1904"
|
161
170
|
# w
|
162
171
|
#end
|
163
|
-
|
172
|
+
|
164
173
|
# Creates a new Workbook
|
165
174
|
# The recomended way to work with workbooks is via Package#workbook
|
166
175
|
# @option options [Boolean] date1904. If this is not specified, date1904 is set to false. Office 2011 for Mac defaults to false.
|
@@ -206,6 +215,23 @@ require 'axlsx/workbook/worksheet/selection.rb'
|
|
206
215
|
# see @use_autowidth
|
207
216
|
def use_autowidth=(v=true) Axlsx::validate_boolean v; @use_autowidth = v; end
|
208
217
|
|
218
|
+
# inserts a worksheet into this workbook at the position specified.
|
219
|
+
# It the index specified is out of range, the worksheet will be added to the end of the
|
220
|
+
# worksheets collection
|
221
|
+
# @return [Worksheet]
|
222
|
+
# @param index The zero based position to insert the newly created worksheet
|
223
|
+
# @param [Hash] options Options to pass into the worksheed during initialization.
|
224
|
+
# @option options [String] name The name of the worksheet
|
225
|
+
# @option options [Hash] page_margins The page margins for the worksheet
|
226
|
+
def insert_worksheet(index=0, options={})
|
227
|
+
worksheet = Worksheet.new(self, options)
|
228
|
+
@worksheets.delete_at(@worksheets.size - 1)
|
229
|
+
@worksheets.insert(index, worksheet)
|
230
|
+
yield worksheet if block_given?
|
231
|
+
worksheet
|
232
|
+
end
|
233
|
+
|
234
|
+
#
|
209
235
|
# Adds a worksheet to this workbook
|
210
236
|
# @return [Worksheet]
|
211
237
|
# @option options [String] name The name of the worksheet.
|
@@ -5,8 +5,8 @@ module Axlsx
|
|
5
5
|
# then there is no corresponding filterColumn collection expressed for that column.
|
6
6
|
class FilterColumn
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
include Axlsx::OptionsParser
|
9
|
+
include Axlsx::SerializedAttributes
|
10
10
|
|
11
11
|
# Creates a new FilterColumn object
|
12
12
|
# @note This class yeilds its filter object as that is where the vast majority of processing will be done
|
@@ -19,17 +19,20 @@ module Axlsx
|
|
19
19
|
RestrictionValidator.validate 'FilterColumn.filter', FILTERS, filter_type
|
20
20
|
#Axlsx::validate_unsigned_int(col_id)
|
21
21
|
self.col_id = col_id
|
22
|
-
options
|
23
|
-
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
24
|
-
end
|
22
|
+
parse_options options
|
25
23
|
@filter = Axlsx.const_get(Axlsx.camel(filter_type)).new(options)
|
26
24
|
yield @filter if block_given?
|
27
25
|
end
|
28
26
|
|
27
|
+
serializable_attributes :col_id, :hidden_button, :show_button
|
28
|
+
|
29
|
+
# Allowed filters
|
30
|
+
FILTERS = [:filters] #, :top10, :custom_filters, :dynamic_filters, :color_filters, :icon_filters]
|
31
|
+
|
29
32
|
# Zero-based index indicating the AutoFilter column to which this filter information applies.
|
30
33
|
# @return [Integer]
|
31
34
|
attr_reader :col_id
|
32
|
-
|
35
|
+
|
33
36
|
# The actual filter being dealt with here
|
34
37
|
# This could be any one of the allowed filter types
|
35
38
|
attr_reader :filter
|
@@ -42,7 +45,7 @@ module Axlsx
|
|
42
45
|
@show_button ||= true
|
43
46
|
end
|
44
47
|
|
45
|
-
|
48
|
+
# Flag indicating whether the AutoFilter button for this column is hidden.
|
46
49
|
# @return [Boolean]
|
47
50
|
def hidden_button
|
48
51
|
@hidden_button ||= false
|
@@ -62,7 +65,7 @@ module Axlsx
|
|
62
65
|
# @param [Array] row A row from a worksheet that needs to be
|
63
66
|
# filtered.
|
64
67
|
def apply(row, offset)
|
65
|
-
|
68
|
+
row.hidden = @filter.apply(row.cells[offset+col_id.to_i])
|
66
69
|
end
|
67
70
|
# @param [Boolean] hidden Flag indicating whether the AutoFilter button for this column is hidden.
|
68
71
|
# @return [Boolean]
|
@@ -87,16 +90,5 @@ module Axlsx
|
|
87
90
|
@filter.to_xml_string(str)
|
88
91
|
str << "</filterColumn>"
|
89
92
|
end
|
90
|
-
|
91
|
-
private
|
92
|
-
|
93
|
-
def serialized_attributes(str='')
|
94
|
-
instance_values.each do |key, value|
|
95
|
-
if %(show_button hidden_button col_id).include? key.to_s
|
96
|
-
str << "#{Axlsx.camel(key, false)}='#{value}' "
|
97
|
-
end
|
98
|
-
end
|
99
|
-
str
|
100
|
-
end
|
101
93
|
end
|
102
94
|
end
|
@@ -3,9 +3,8 @@ module Axlsx
|
|
3
3
|
# When multiple values are chosen to filter by, or when a group of date values are chosen to filter by,
|
4
4
|
# this object groups those criteria together.
|
5
5
|
class Filters
|
6
|
-
|
7
|
-
|
8
|
-
CALENDAR_TYPES = %w(gregorian gregorianUs gregorianMeFrench gregorianArabic hijri hebrew taiwan japan thai korea saka gregorianXlitEnglish gregorianXlitFrench none)
|
6
|
+
include Axlsx::OptionsParser
|
7
|
+
include Axlsx::SerializedAttributes
|
9
8
|
|
10
9
|
# Creates a new Filters object
|
11
10
|
# @param [Hash] options Options used to set this objects attributes and
|
@@ -18,11 +17,14 @@ module Axlsx
|
|
18
17
|
# @example
|
19
18
|
# ws.auto_filter.add_column(0, :filters, :blank => true, :calendar_type => 'japan', :filter_items => [100, 'a'])
|
20
19
|
def initialize(options={})
|
21
|
-
options
|
22
|
-
self.send("#{key}=", value) if self.respond_to? "#{key}="
|
23
|
-
end
|
20
|
+
parse_options options
|
24
21
|
end
|
25
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
|
+
|
26
28
|
# Flag indicating whether to filter by blank.
|
27
29
|
# @return [Boolean]
|
28
30
|
attr_reader :blank
|
@@ -45,7 +47,7 @@ module Axlsx
|
|
45
47
|
end
|
46
48
|
true
|
47
49
|
end
|
48
|
-
|
50
|
+
|
49
51
|
# The filter values in this filters object
|
50
52
|
def filter_items
|
51
53
|
@filter_items ||= []
|
@@ -100,17 +102,6 @@ module Axlsx
|
|
100
102
|
end
|
101
103
|
end
|
102
104
|
|
103
|
-
private
|
104
|
-
|
105
|
-
def serialized_attributes(str='')
|
106
|
-
instance_values.each do |key, value|
|
107
|
-
if %(blank claendar_type).include? key.to_s
|
108
|
-
str << "#{Axlsx.camel(key, false)}='#{value}' "
|
109
|
-
end
|
110
|
-
end
|
111
|
-
str
|
112
|
-
end
|
113
|
-
|
114
105
|
# This class expresses a filter criteria value.
|
115
106
|
class Filter
|
116
107
|
|
@@ -140,9 +131,8 @@ module Axlsx
|
|
140
131
|
# subsequent dates, even when formatted or represented by other calendar
|
141
132
|
# types, can be correctly compared for the purposes of filtering.
|
142
133
|
class DateGroupItem
|
143
|
-
|
144
|
-
|
145
|
-
DATE_TIME_GROUPING = %w(year month day hour minute second)
|
134
|
+
include Axlsx::OptionsParser
|
135
|
+
include Axlsx::SerializedAttributes
|
146
136
|
|
147
137
|
# Creates a new DateGroupItem
|
148
138
|
# @param [Hash] options A hash of options to use when
|
@@ -158,11 +148,14 @@ module Axlsx
|
|
158
148
|
def initialize(options={})
|
159
149
|
raise ArgumentError, "You must specify a year for date time grouping" unless options[:year]
|
160
150
|
raise ArgumentError, "You must specify a date_time_grouping when creating a DateGroupItem for auto filter" unless options[:date_time_grouping]
|
161
|
-
options
|
162
|
-
self.send("#{key}=", value) if self.respond_to?("#{key}=")
|
163
|
-
end
|
151
|
+
parse_options options
|
164
152
|
end
|
165
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
|
+
|
166
159
|
# Grouping level
|
167
160
|
# This must be one of year, month, day, hour, minute or second.
|
168
161
|
# @return [String]
|
@@ -224,8 +217,8 @@ module Axlsx
|
|
224
217
|
# The minute value for the date group item
|
225
218
|
# This must be between 0 and 59
|
226
219
|
def minute=(value)
|
227
|
-
|
228
|
-
|
220
|
+
RangeValidator.validate "DateGroupItem.minute", 0, 59, value
|
221
|
+
@minute = value
|
229
222
|
end
|
230
223
|
|
231
224
|
# The second value for the date group item
|
@@ -245,7 +238,7 @@ module Axlsx
|
|
245
238
|
# @param [String] str The string object this serialization will be concatenated to.
|
246
239
|
def to_xml_string(str = '')
|
247
240
|
str << '<dateGroupItem '
|
248
|
-
|
241
|
+
serialized_attributes str
|
249
242
|
str << '/>'
|
250
243
|
end
|
251
244
|
end
|
@@ -8,6 +8,38 @@ module Axlsx
|
|
8
8
|
# @see Worksheet#add_row
|
9
9
|
class Cell
|
10
10
|
|
11
|
+
include Axlsx::OptionsParser
|
12
|
+
|
13
|
+
# @param [Row] row The row this cell belongs to.
|
14
|
+
# @param [Any] value The value associated with this cell.
|
15
|
+
# @option options [Symbol] type The intended data type for this cell. If not specified the data type will be determined internally based on the vlue provided.
|
16
|
+
# @option options [Integer] style The index of the cellXfs item to be applied to this cell. If not specified, the default style (0) will be applied.
|
17
|
+
# @option options [String] font_name
|
18
|
+
# @option options [Integer] charset
|
19
|
+
# @option options [String] family
|
20
|
+
# @option options [Boolean] b
|
21
|
+
# @option options [Boolean] i
|
22
|
+
# @option options [Boolean] strike
|
23
|
+
# @option options [Boolean] outline
|
24
|
+
# @option options [Boolean] shadow
|
25
|
+
# @option options [Boolean] condense
|
26
|
+
# @option options [Boolean] extend
|
27
|
+
# @option options [Boolean] u
|
28
|
+
# @option options [Symbol] vertAlign must be one of :baseline, :subscript, :superscript
|
29
|
+
# @option options [Integer] sz
|
30
|
+
# @option options [String] color an 8 letter rgb specification
|
31
|
+
# @option options [Symbol] scheme must be one of :none, major, :minor
|
32
|
+
def initialize(row, value="", options={})
|
33
|
+
self.row=row
|
34
|
+
@value = @font_name = @charset = @family = @b = @i = @strike = @outline = @shadow = nil
|
35
|
+
@condense = @u = @vertAlign = @sz = @color = @scheme = @extend = @ssti = nil
|
36
|
+
@styles = row.worksheet.workbook.styles
|
37
|
+
@row.cells << self
|
38
|
+
parse_options options
|
39
|
+
@style ||= 0
|
40
|
+
@type ||= cell_type_from_value(value)
|
41
|
+
@value = cast_value(value)
|
42
|
+
end
|
11
43
|
|
12
44
|
# An array of available inline styes.
|
13
45
|
# TODO change this to a hash where each key defines attr name and validator (and any info the validator requires)
|
@@ -16,9 +48,9 @@ module Axlsx
|
|
16
48
|
# set_attr method that kicks the suplied validator and updates the instance_variable
|
17
49
|
# for the key
|
18
50
|
INLINE_STYLES = ['value', 'type', 'font_name', 'charset',
|
19
|
-
|
20
|
-
|
21
|
-
|
51
|
+
'family', 'b', 'i', 'strike','outline',
|
52
|
+
'shadow', 'condense', 'extend', 'u',
|
53
|
+
'vertAlign', 'sz', 'color', 'scheme']
|
22
54
|
|
23
55
|
# The index of the cellXfs item to be applied to this cell.
|
24
56
|
# @return [Integer]
|
@@ -174,39 +206,6 @@ module Axlsx
|
|
174
206
|
set_run_style nil, :scheme, v
|
175
207
|
end
|
176
208
|
|
177
|
-
# @param [Row] row The row this cell belongs to.
|
178
|
-
# @param [Any] value The value associated with this cell.
|
179
|
-
# @option options [Symbol] type The intended data type for this cell. If not specified the data type will be determined internally based on the vlue provided.
|
180
|
-
# @option options [Integer] style The index of the cellXfs item to be applied to this cell. If not specified, the default style (0) will be applied.
|
181
|
-
# @option options [String] font_name
|
182
|
-
# @option options [Integer] charset
|
183
|
-
# @option options [String] family
|
184
|
-
# @option options [Boolean] b
|
185
|
-
# @option options [Boolean] i
|
186
|
-
# @option options [Boolean] strike
|
187
|
-
# @option options [Boolean] outline
|
188
|
-
# @option options [Boolean] shadow
|
189
|
-
# @option options [Boolean] condense
|
190
|
-
# @option options [Boolean] extend
|
191
|
-
# @option options [Boolean] u
|
192
|
-
# @option options [Symbol] vertAlign must be one of :baseline, :subscript, :superscript
|
193
|
-
# @option options [Integer] sz
|
194
|
-
# @option options [String] color an 8 letter rgb specification
|
195
|
-
# @option options [Symbol] scheme must be one of :none, major, :minor
|
196
|
-
def initialize(row, value="", options={})
|
197
|
-
self.row=row
|
198
|
-
@value = @font_name = @charset = @family = @b = @i = @strike = @outline = @shadow = nil
|
199
|
-
@condense = @u = @vertAlign = @sz = @color = @scheme = @extend = @ssti = nil
|
200
|
-
@styles = row.worksheet.workbook.styles
|
201
|
-
@row.cells << self
|
202
|
-
options.each do |o|
|
203
|
-
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
204
|
-
end
|
205
|
-
@style ||= 0
|
206
|
-
@type ||= cell_type_from_value(value)
|
207
|
-
@value = cast_value(value)
|
208
|
-
end
|
209
|
-
|
210
209
|
# The Shared Strings Table index for this cell
|
211
210
|
# @return [Integer]
|
212
211
|
attr_reader :ssti
|
@@ -346,9 +345,9 @@ module Axlsx
|
|
346
345
|
# the cell itself. Yes, it is a bit of a hack, but it is much better than using
|
347
346
|
# imagemagick and loading metrics for every character.
|
348
347
|
def font_size
|
349
|
-
|
350
|
-
|
351
|
-
|
348
|
+
font = @styles.fonts[@styles.cellXfs[style].fontId] || @styles.fonts[0]
|
349
|
+
size_from_styles = (font.b || b) ? font.sz * 1.5 : font.sz
|
350
|
+
sz || size_from_styles
|
352
351
|
end
|
353
352
|
|
354
353
|
# Utility method for setting inline style attributes
|