axlsx 2.0.1 → 2.1.0.pre
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.
- checksums.yaml +4 -4
- data/README.md +6 -3
- data/Rakefile +9 -10
- data/examples/IMAGE1UP.JPEG +0 -0
- data/examples/auto_filter.rb +10 -1
- data/examples/conditional_formatting/example_conditional_formatting.rb +3 -3
- data/examples/example.rb +72 -4
- data/examples/merge_cells.rb +17 -0
- data/examples/no_grid_with_borders.rb +18 -0
- data/examples/pivot_test.rb +63 -0
- data/examples/split.rb +16 -0
- data/lib/axlsx.rb +30 -16
- data/lib/axlsx/content_type/abstract_content_type.rb +1 -1
- data/lib/axlsx/content_type/content_type.rb +1 -1
- data/lib/axlsx/doc_props/app.rb +1 -1
- data/lib/axlsx/doc_props/core.rb +5 -5
- data/lib/axlsx/drawing/axes.rb +1 -1
- data/lib/axlsx/drawing/axis.rb +12 -9
- data/lib/axlsx/drawing/bar_3D_chart.rb +13 -13
- data/lib/axlsx/drawing/bar_series.rb +9 -9
- data/lib/axlsx/drawing/bubble_chart.rb +59 -0
- data/lib/axlsx/drawing/bubble_series.rb +63 -0
- data/lib/axlsx/drawing/cat_axis.rb +5 -5
- data/lib/axlsx/drawing/chart.rb +44 -7
- data/lib/axlsx/drawing/drawing.rb +3 -1
- data/lib/axlsx/drawing/graphic_frame.rb +3 -3
- data/lib/axlsx/drawing/hyperlink.rb +1 -3
- data/lib/axlsx/drawing/line_3D_chart.rb +2 -2
- data/lib/axlsx/drawing/line_chart.rb +10 -10
- data/lib/axlsx/drawing/line_series.rb +14 -2
- data/lib/axlsx/drawing/marker.rb +1 -1
- data/lib/axlsx/drawing/num_data.rb +4 -4
- data/lib/axlsx/drawing/num_data_source.rb +6 -6
- data/lib/axlsx/drawing/num_val.rb +1 -1
- data/lib/axlsx/drawing/one_cell_anchor.rb +1 -1
- data/lib/axlsx/drawing/pic.rb +2 -3
- data/lib/axlsx/drawing/picture_locking.rb +1 -3
- data/lib/axlsx/drawing/pie_3D_chart.rb +5 -6
- data/lib/axlsx/drawing/pie_series.rb +6 -6
- data/lib/axlsx/drawing/scaling.rb +4 -4
- data/lib/axlsx/drawing/scatter_chart.rb +10 -10
- data/lib/axlsx/drawing/scatter_series.rb +26 -7
- data/lib/axlsx/drawing/ser_axis.rb +2 -2
- data/lib/axlsx/drawing/series.rb +3 -3
- data/lib/axlsx/drawing/series_title.rb +2 -2
- data/lib/axlsx/drawing/str_data.rb +3 -3
- data/lib/axlsx/drawing/str_val.rb +1 -1
- data/lib/axlsx/drawing/title.rb +3 -3
- data/lib/axlsx/drawing/val_axis.rb +1 -1
- data/lib/axlsx/drawing/vml_drawing.rb +1 -1
- data/lib/axlsx/package.rb +39 -28
- data/lib/axlsx/rels/relationship.rb +1 -1
- data/lib/axlsx/rels/relationships.rb +2 -2
- data/lib/axlsx/stylesheet/border_pr.rb +2 -2
- data/lib/axlsx/stylesheet/cell_alignment.rb +1 -3
- data/lib/axlsx/stylesheet/cell_protection.rb +1 -3
- data/lib/axlsx/stylesheet/cell_style.rb +1 -3
- data/lib/axlsx/stylesheet/color.rb +1 -3
- data/lib/axlsx/stylesheet/font.rb +1 -1
- data/lib/axlsx/stylesheet/gradient_stop.rb +1 -1
- data/lib/axlsx/stylesheet/num_fmt.rb +1 -3
- data/lib/axlsx/stylesheet/pattern_fill.rb +1 -1
- data/lib/axlsx/stylesheet/styles.rb +6 -6
- data/lib/axlsx/stylesheet/table_style_element.rb +1 -3
- data/lib/axlsx/util/accessors.rb +6 -6
- data/lib/axlsx/util/constants.rb +106 -101
- data/lib/axlsx/util/options_parser.rb +2 -1
- data/lib/axlsx/util/parser.rb +4 -4
- data/lib/axlsx/util/serialized_attributes.rb +16 -6
- data/lib/axlsx/util/simple_typed_list.rb +28 -52
- data/lib/axlsx/util/storage.rb +4 -4
- data/lib/axlsx/util/string.rb +7 -0
- data/lib/axlsx/util/validators.rb +20 -13
- data/lib/axlsx/version.rb +1 -1
- data/lib/axlsx/workbook/defined_name.rb +11 -12
- data/lib/axlsx/workbook/defined_names.rb +2 -2
- data/lib/axlsx/workbook/shared_strings_table.rb +5 -5
- data/lib/axlsx/workbook/workbook.rb +19 -12
- data/lib/axlsx/workbook/workbook_view.rb +78 -0
- data/lib/axlsx/workbook/workbook_views.rb +22 -0
- data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +2 -2
- data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +1 -3
- data/lib/axlsx/workbook/worksheet/break.rb +1 -3
- data/lib/axlsx/workbook/worksheet/cell.rb +128 -73
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +50 -40
- data/lib/axlsx/workbook/worksheet/cfvo.rb +1 -3
- data/lib/axlsx/workbook/worksheet/cfvos.rb +1 -1
- data/lib/axlsx/workbook/worksheet/col.rb +7 -10
- data/lib/axlsx/workbook/worksheet/col_breaks.rb +2 -2
- data/lib/axlsx/workbook/worksheet/comment.rb +5 -6
- data/lib/axlsx/workbook/worksheet/comments.rb +9 -12
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +1 -1
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +1 -1
- data/lib/axlsx/workbook/worksheet/data_bar.rb +4 -6
- data/lib/axlsx/workbook/worksheet/data_validation.rb +6 -4
- data/lib/axlsx/workbook/worksheet/dimension.rb +2 -2
- data/lib/axlsx/workbook/worksheet/header_footer.rb +6 -8
- data/lib/axlsx/workbook/worksheet/icon_set.rb +3 -5
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +2 -2
- data/lib/axlsx/workbook/worksheet/page_margins.rb +1 -3
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +1 -1
- data/lib/axlsx/workbook/worksheet/page_setup.rb +21 -23
- data/lib/axlsx/workbook/worksheet/pane.rb +1 -3
- data/lib/axlsx/workbook/worksheet/pivot_table.rb +17 -24
- data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +4 -4
- data/lib/axlsx/workbook/worksheet/print_options.rb +1 -3
- data/lib/axlsx/workbook/worksheet/protected_range.rb +1 -3
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +1 -1
- data/lib/axlsx/workbook/worksheet/rich_text.rb +35 -0
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +254 -0
- data/lib/axlsx/workbook/worksheet/row.rb +33 -51
- data/lib/axlsx/workbook/worksheet/row_breaks.rb +2 -2
- data/lib/axlsx/workbook/worksheet/selection.rb +1 -3
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +3 -1
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +1 -3
- data/lib/axlsx/workbook/worksheet/table.rb +6 -6
- data/lib/axlsx/workbook/worksheet/table_style_info.rb +1 -3
- data/lib/axlsx/workbook/worksheet/tables.rb +1 -1
- data/lib/axlsx/workbook/worksheet/worksheet.rb +59 -30
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +3 -3
- data/test/drawing/tc_axis.rb +27 -0
- data/test/drawing/tc_bubble_chart.rb +44 -0
- data/test/drawing/tc_bubble_series.rb +21 -0
- data/test/drawing/tc_data_source.rb +6 -0
- data/test/drawing/tc_line_chart.rb +5 -5
- data/test/drawing/tc_line_series.rb +10 -2
- data/test/drawing/tc_pic.rb +4 -0
- data/test/drawing/tc_scatter_series.rb +25 -1
- data/test/tc_helper.rb +1 -1
- data/test/tc_package.rb +7 -1
- data/test/util/tc_simple_typed_list.rb +1 -2
- data/test/workbook/tc_defined_name.rb +12 -4
- data/test/workbook/tc_workbook.rb +16 -2
- data/test/workbook/tc_workbook_view.rb +50 -0
- data/test/workbook/worksheet/auto_filter/tc_filters.rb +1 -1
- data/test/workbook/worksheet/tc_break.rb +1 -1
- data/test/workbook/worksheet/tc_cell.rb +30 -4
- data/test/workbook/worksheet/tc_col.rb +2 -2
- data/test/workbook/worksheet/tc_conditional_formatting.rb +2 -2
- data/test/workbook/worksheet/tc_data_bar.rb +1 -1
- data/test/workbook/worksheet/tc_data_validation.rb +11 -11
- data/test/workbook/worksheet/tc_header_footer.rb +2 -2
- data/test/workbook/worksheet/tc_icon_set.rb +1 -1
- data/test/workbook/worksheet/tc_page_setup.rb +3 -3
- data/test/workbook/worksheet/tc_print_options.rb +1 -1
- data/test/workbook/worksheet/tc_rich_text.rb +44 -0
- data/test/workbook/worksheet/tc_rich_text_run.rb +172 -0
- data/test/workbook/worksheet/tc_row.rb +2 -2
- data/test/workbook/worksheet/tc_sheet_calc_pr.rb +1 -1
- data/test/workbook/worksheet/tc_sheet_format_pr.rb +4 -4
- data/test/workbook/worksheet/tc_sheet_protection.rb +5 -5
- data/test/workbook/worksheet/tc_sheet_view.rb +4 -4
- data/test/workbook/worksheet/tc_worksheet.rb +49 -10
- metadata +81 -55
- data/test/axlsx.qcachegrind +0 -2226
|
@@ -3,10 +3,10 @@ module Axlsx
|
|
|
3
3
|
# A Row is a single row in a worksheet.
|
|
4
4
|
# @note The recommended way to manage rows and cells is to use Worksheet#add_row
|
|
5
5
|
# @see Worksheet#add_row
|
|
6
|
-
class Row
|
|
7
|
-
|
|
6
|
+
class Row < SimpleTypedList
|
|
8
7
|
include SerializedAttributes
|
|
9
8
|
include Accessors
|
|
9
|
+
|
|
10
10
|
# No support is provided for the following attributes
|
|
11
11
|
# spans
|
|
12
12
|
# thickTop
|
|
@@ -28,11 +28,10 @@ module Axlsx
|
|
|
28
28
|
# @see Row#array_to_cells
|
|
29
29
|
# @see Cell
|
|
30
30
|
def initialize(worksheet, values=[], options={})
|
|
31
|
-
@ht = nil
|
|
32
31
|
self.worksheet = worksheet
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
super(Cell, nil, values.size)
|
|
33
|
+
self.height = options.delete(:height)
|
|
34
|
+
worksheet.rows << self
|
|
36
35
|
array_to_cells(values, options)
|
|
37
36
|
end
|
|
38
37
|
|
|
@@ -46,14 +45,10 @@ module Axlsx
|
|
|
46
45
|
# @return [Worksheet]
|
|
47
46
|
attr_reader :worksheet
|
|
48
47
|
|
|
49
|
-
# The cells this row holds
|
|
50
|
-
# @return [SimpleTypedList]
|
|
51
|
-
attr_reader :cells
|
|
52
|
-
|
|
53
48
|
# Row height measured in point size. There is no margin padding on row height.
|
|
54
49
|
# @return [Float]
|
|
55
50
|
def height
|
|
56
|
-
@ht
|
|
51
|
+
defined?(@ht) ? @ht : nil
|
|
57
52
|
end
|
|
58
53
|
|
|
59
54
|
# Outlining level of the row, when outlining is on
|
|
@@ -77,11 +72,12 @@ module Axlsx
|
|
|
77
72
|
Axlsx.validate_unsigned_numeric(v)
|
|
78
73
|
@outline_level = v
|
|
79
74
|
end
|
|
75
|
+
|
|
80
76
|
alias :outlineLevel= :outline_level=
|
|
81
77
|
|
|
82
78
|
# The index of this row in the worksheet
|
|
83
79
|
# @return [Integer]
|
|
84
|
-
def
|
|
80
|
+
def row_index
|
|
85
81
|
worksheet.rows.index(self)
|
|
86
82
|
end
|
|
87
83
|
|
|
@@ -90,50 +86,48 @@ module Axlsx
|
|
|
90
86
|
# @param [String] str The string this rows xml will be appended to.
|
|
91
87
|
# @return [String]
|
|
92
88
|
def to_xml_string(r_index, str = '')
|
|
93
|
-
str
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
89
|
+
serialized_tag('row', str, :r => r_index + 1) do
|
|
90
|
+
tmp = '' # time / memory tradeoff, lots of calls to rubyzip costs more
|
|
91
|
+
# time..
|
|
92
|
+
each_with_index { |cell, c_index| cell.to_xml_string(r_index, c_index, tmp) }
|
|
93
|
+
str << tmp
|
|
94
|
+
end
|
|
98
95
|
end
|
|
99
96
|
|
|
100
|
-
# Adds a single
|
|
97
|
+
# Adds a single cell to the row based on the data provided and updates the worksheet's autofit data.
|
|
101
98
|
# @return [Cell]
|
|
102
|
-
def add_cell(value=
|
|
99
|
+
def add_cell(value = '', options = {})
|
|
103
100
|
c = Cell.new(self, value, options)
|
|
104
|
-
|
|
101
|
+
self << c
|
|
102
|
+
worksheet.send(:update_column_info, self, [])
|
|
105
103
|
c
|
|
106
104
|
end
|
|
107
105
|
|
|
108
106
|
# sets the style for every cell in this row
|
|
109
107
|
def style=(style)
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
cell.style = s
|
|
108
|
+
each_with_index do | cell, index |
|
|
109
|
+
cell.style = style.is_a?(Array) ? style[index] : style
|
|
113
110
|
end
|
|
114
111
|
end
|
|
115
112
|
|
|
116
|
-
# returns the cells in this row as an array
|
|
117
|
-
# This lets us transpose the rows into columns
|
|
118
|
-
# @return [Array]
|
|
119
|
-
def to_ary
|
|
120
|
-
@cells.to_ary
|
|
121
|
-
end
|
|
122
|
-
|
|
123
113
|
# @see height
|
|
124
114
|
def height=(v)
|
|
125
|
-
Axlsx::validate_unsigned_numeric(v)
|
|
126
115
|
unless v.nil?
|
|
127
|
-
|
|
116
|
+
Axlsx::validate_unsigned_numeric(v)
|
|
128
117
|
@custom_height = true
|
|
118
|
+
@ht = v
|
|
129
119
|
end
|
|
130
|
-
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# return cells
|
|
123
|
+
def cells
|
|
124
|
+
self
|
|
131
125
|
end
|
|
132
126
|
|
|
133
127
|
private
|
|
134
128
|
|
|
135
129
|
# assigns the owning worksheet for this row
|
|
136
|
-
def worksheet=(v) DataTypeValidator.validate
|
|
130
|
+
def worksheet=(v) DataTypeValidator.validate :row_worksheet, Worksheet, v; @worksheet=v; end
|
|
137
131
|
|
|
138
132
|
# Converts values, types, and style options into cells and associates them with this row.
|
|
139
133
|
# A new cell is created for each item in the values array.
|
|
@@ -145,26 +139,14 @@ module Axlsx
|
|
|
145
139
|
# @option options [Array, Symbol] types
|
|
146
140
|
# @option options [Array, Integer] style
|
|
147
141
|
def array_to_cells(values, options={})
|
|
148
|
-
|
|
149
|
-
DataTypeValidator.validate 'Row.array_to_cells', Array, values
|
|
142
|
+
DataTypeValidator.validate :array_to_cells, Array, values
|
|
150
143
|
types, style, formula_values = options.delete(:types), options.delete(:style), options.delete(:formula_values)
|
|
151
144
|
values.each_with_index do |value, index|
|
|
145
|
+
options[:style] = style.is_a?(Array) ? style[index] : style if style
|
|
146
|
+
options[:type] = types.is_a?(Array) ? types[index] : types if types
|
|
147
|
+
options[:formula_value] = formula_values[index] if formula_values.is_a?(Array)
|
|
152
148
|
|
|
153
|
-
|
|
154
|
-
cell_style = style.is_a?(Array) ? style[index] : style
|
|
155
|
-
options[:style] = cell_style if cell_style
|
|
156
|
-
|
|
157
|
-
cell_type = types.is_a?(Array)? types[index] : types
|
|
158
|
-
options[:type] = cell_type if cell_type
|
|
159
|
-
|
|
160
|
-
formula_value = formula_values[index] if formula_values.is_a?(Array)
|
|
161
|
-
options[:formula_value] = formula_value if formula_value
|
|
162
|
-
|
|
163
|
-
Cell.new(self, value, options)
|
|
164
|
-
|
|
165
|
-
options.delete(:style)
|
|
166
|
-
options.delete(:type)
|
|
167
|
-
options.delete(:formula_value)
|
|
149
|
+
self[index] = Cell.new(self, value, options)
|
|
168
150
|
end
|
|
169
151
|
end
|
|
170
152
|
end
|
|
@@ -14,7 +14,7 @@ module Axlsx
|
|
|
14
14
|
# @see Break
|
|
15
15
|
def add_break(options)
|
|
16
16
|
# force feed the excel default
|
|
17
|
-
|
|
17
|
+
self << Break.new(options.merge(:max => 16383, :man => true))
|
|
18
18
|
last
|
|
19
19
|
end
|
|
20
20
|
|
|
@@ -25,7 +25,7 @@ module Axlsx
|
|
|
25
25
|
# </rowBreaks>
|
|
26
26
|
def to_xml_string(str='')
|
|
27
27
|
return if empty?
|
|
28
|
-
str << '<rowBreaks count="' <<
|
|
28
|
+
str << ('<rowBreaks count="' << self.size.to_s << '" manualBreakCount="' << self.size.to_s << '">')
|
|
29
29
|
each { |brk| brk.to_xml_string(str) }
|
|
30
30
|
str << '</rowBreaks>'
|
|
31
31
|
end
|
|
@@ -17,7 +17,9 @@ module Axlsx
|
|
|
17
17
|
# @return [String]
|
|
18
18
|
def to_xml_string(str = '')
|
|
19
19
|
str << '<sheetData>'
|
|
20
|
-
worksheet.rows.each_with_index
|
|
20
|
+
worksheet.rows.each_with_index do |row, index|
|
|
21
|
+
row.to_xml_string(index, str)
|
|
22
|
+
end
|
|
21
23
|
str << '</sheetData>'
|
|
22
24
|
end
|
|
23
25
|
|
|
@@ -58,7 +58,7 @@ module Axlsx
|
|
|
58
58
|
# @param [String, Cell] v
|
|
59
59
|
# @return [Title]
|
|
60
60
|
def name=(v)
|
|
61
|
-
DataTypeValidator.validate
|
|
61
|
+
DataTypeValidator.validate :table_name, [String], v
|
|
62
62
|
if v.is_a?(String)
|
|
63
63
|
@name = v
|
|
64
64
|
end
|
|
@@ -75,12 +75,12 @@ module Axlsx
|
|
|
75
75
|
# @return [String]
|
|
76
76
|
def to_xml_string(str = '')
|
|
77
77
|
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
|
78
|
-
str << '<table xmlns="' << XML_NS << '" id="' << (index+1).to_s << '" name="' << @name << '" displayName="' << @name.gsub(/\s/,'_') << '" '
|
|
79
|
-
str << 'ref="' << @ref << '" totalsRowShown="0">'
|
|
80
|
-
str << '<autoFilter ref="' << @ref << '"/>'
|
|
81
|
-
str << '<tableColumns count="' << header_cells.length.to_s << '">'
|
|
78
|
+
str << ('<table xmlns="' << XML_NS << '" id="' << (index+1).to_s << '" name="' << @name << '" displayName="' << @name.gsub(/\s/,'_') << '" ')
|
|
79
|
+
str << ('ref="' << @ref << '" totalsRowShown="0">')
|
|
80
|
+
str << ('<autoFilter ref="' << @ref << '"/>')
|
|
81
|
+
str << ('<tableColumns count="' << header_cells.length.to_s << '">')
|
|
82
82
|
header_cells.each_with_index do |cell,index|
|
|
83
|
-
str << '<tableColumn id ="' << (index+1).to_s << '" name="' << cell.value << '"/>'
|
|
83
|
+
str << ('<tableColumn id ="' << (index+1).to_s << '" name="' << cell.value << '"/>')
|
|
84
84
|
end
|
|
85
85
|
str << '</tableColumns>'
|
|
86
86
|
table_style_info.to_xml_string(str)
|
|
@@ -43,9 +43,7 @@ module Axlsx
|
|
|
43
43
|
# seralizes this object to an xml string
|
|
44
44
|
# @param [String] str the string to contact this objects serialization to.
|
|
45
45
|
def to_xml_string(str = '')
|
|
46
|
-
|
|
47
|
-
serialized_attributes str
|
|
48
|
-
str << '/>'
|
|
46
|
+
serialized_tag('tableStyleInfo', str)
|
|
49
47
|
end
|
|
50
48
|
end
|
|
51
49
|
end
|
|
@@ -23,7 +23,7 @@ module Axlsx
|
|
|
23
23
|
def to_xml_string(str = "")
|
|
24
24
|
return if empty?
|
|
25
25
|
str << "<tableParts count='#{size}'>"
|
|
26
|
-
|
|
26
|
+
each { |table| str << "<tablePart r:id='#{table.rId}'/>" }
|
|
27
27
|
str << '</tableParts>'
|
|
28
28
|
end
|
|
29
29
|
end
|
|
@@ -4,15 +4,11 @@ module Axlsx
|
|
|
4
4
|
# The Worksheet class represents a worksheet in the workbook.
|
|
5
5
|
class Worksheet
|
|
6
6
|
include Axlsx::OptionsParser
|
|
7
|
-
|
|
7
|
+
include Axlsx::SerializedAttributes
|
|
8
8
|
# definition of characters which are less than the maximum width of 0-9 in the default font for use in String#count.
|
|
9
9
|
# This is used for autowidth calculations
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
# removed 'e' and 'y' from this list - as a GUESS
|
|
13
|
-
@thin_chars ||= "^.acfijklrstxzFIJL()-"
|
|
14
|
-
end
|
|
15
|
-
|
|
10
|
+
THIN_CHARS = '^.acfijklrstxzFIJL()-'.freeze
|
|
11
|
+
|
|
16
12
|
# Creates a new worksheet.
|
|
17
13
|
# @note the recommended way to manage worksheets is Workbook#add_worksheet
|
|
18
14
|
# @see Workbook#add_worksheet
|
|
@@ -24,12 +20,15 @@ module Axlsx
|
|
|
24
20
|
def initialize(wb, options={})
|
|
25
21
|
self.workbook = wb
|
|
26
22
|
@sheet_protection = nil
|
|
27
|
-
|
|
28
23
|
initialize_page_options(options)
|
|
29
24
|
parse_options options
|
|
30
25
|
@workbook.worksheets << self
|
|
26
|
+
@sheet_id = index + 1
|
|
27
|
+
yield self if block_given?
|
|
31
28
|
end
|
|
32
29
|
|
|
30
|
+
serializable_attributes :sheet_id, :name, :state
|
|
31
|
+
|
|
33
32
|
# Initalizes page margin, setup and print options
|
|
34
33
|
# @param [Hash] options Options passed in from the initializer
|
|
35
34
|
def initialize_page_options(options)
|
|
@@ -44,7 +43,23 @@ module Axlsx
|
|
|
44
43
|
# The name of the worksheet
|
|
45
44
|
# @return [String]
|
|
46
45
|
def name
|
|
47
|
-
@name ||=
|
|
46
|
+
@name ||= "Sheet" + (index+1).to_s
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Specifies the visible state of this sheet. Allowed states are
|
|
50
|
+
# :visible, :hidden or :very_hidden. The default value is :visible.
|
|
51
|
+
#
|
|
52
|
+
# Worksheets in the :hidden state can be shown using the sheet formatting properties in excel.
|
|
53
|
+
# :very_hidden sheets should be inaccessible to end users.
|
|
54
|
+
# @param [Symbol] sheet_state The visible state for this sheet.
|
|
55
|
+
def state=(sheet_state)
|
|
56
|
+
RestrictionValidator.validate :worksheet_state, [:visible, :hidden, :very_hidden], sheet_state
|
|
57
|
+
@state = sheet_state
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# The visibility of this sheet
|
|
61
|
+
def state
|
|
62
|
+
@state ||= :visible
|
|
48
63
|
end
|
|
49
64
|
|
|
50
65
|
# The sheet calculation properties
|
|
@@ -129,7 +144,7 @@ module Axlsx
|
|
|
129
144
|
# @return [SimpleTypedList]
|
|
130
145
|
# @see Worksheet#add_row
|
|
131
146
|
def rows
|
|
132
|
-
@rows ||=
|
|
147
|
+
@rows ||= SimpleTypedList.new Row
|
|
133
148
|
end
|
|
134
149
|
|
|
135
150
|
# returns the sheet data as columns
|
|
@@ -142,7 +157,7 @@ module Axlsx
|
|
|
142
157
|
@rows.transpose(&block)
|
|
143
158
|
end
|
|
144
159
|
|
|
145
|
-
#
|
|
160
|
+
# A range that excel will apply an auto-filter to "A1:B3"
|
|
146
161
|
# This will turn filtering on for the cells in the range.
|
|
147
162
|
# The first row is considered the header, while subsequent rows are considered to be data.
|
|
148
163
|
# @return String
|
|
@@ -346,7 +361,7 @@ module Axlsx
|
|
|
346
361
|
# @param [String] v
|
|
347
362
|
# @see auto_filter
|
|
348
363
|
def auto_filter=(v)
|
|
349
|
-
DataTypeValidator.validate
|
|
364
|
+
DataTypeValidator.validate :worksheet_auto_filter, String, v
|
|
350
365
|
auto_filter.range = v
|
|
351
366
|
end
|
|
352
367
|
|
|
@@ -427,10 +442,10 @@ module Axlsx
|
|
|
427
442
|
# @option options [Array] widths each member of the widths array will affect how auto_fit behavies.
|
|
428
443
|
# @option options [Float] height the row's height (in points)
|
|
429
444
|
def add_row(values=[], options={})
|
|
430
|
-
Row.new(self, values, options)
|
|
431
|
-
update_column_info
|
|
432
|
-
yield
|
|
433
|
-
|
|
445
|
+
row = Row.new(self, values, options)
|
|
446
|
+
update_column_info row, options.delete(:widths)
|
|
447
|
+
yield row if block_given?
|
|
448
|
+
row
|
|
434
449
|
end
|
|
435
450
|
|
|
436
451
|
alias :<< :add_row
|
|
@@ -522,7 +537,7 @@ module Axlsx
|
|
|
522
537
|
# @example
|
|
523
538
|
# ws.add_page_break("A4")
|
|
524
539
|
def add_page_break(cell)
|
|
525
|
-
DataTypeValidator.validate
|
|
540
|
+
DataTypeValidator.validate :worksheet_page_break, [String, Cell], cell
|
|
526
541
|
column_index, row_index = if cell.is_a?(String)
|
|
527
542
|
Axlsx.name_to_indices(cell)
|
|
528
543
|
else
|
|
@@ -535,7 +550,7 @@ module Axlsx
|
|
|
535
550
|
end
|
|
536
551
|
|
|
537
552
|
# This is a helper method that Lets you specify a fixed width for multiple columns in a worksheet in one go.
|
|
538
|
-
#
|
|
553
|
+
# Note that you must call column_widths AFTER adding data, otherwise the width will not be set successfully.
|
|
539
554
|
# Setting a fixed column width to nil will revert the behaviour back to calculating the width for you on the next call to add_row.
|
|
540
555
|
# @example This would set the first and third column widhts but leave the second column in autofit state.
|
|
541
556
|
# ws.column_widths 7.2, nil, 3
|
|
@@ -559,7 +574,7 @@ module Axlsx
|
|
|
559
574
|
# @see README.md for an example
|
|
560
575
|
def col_style(index, style, options={})
|
|
561
576
|
offset = options.delete(:row_offset) || 0
|
|
562
|
-
cells = @rows[(offset..-1)].map { |row| row
|
|
577
|
+
cells = @rows[(offset..-1)].map { |row| row[index] }.flatten.compact
|
|
563
578
|
cells.each { |cell| cell.style = style }
|
|
564
579
|
end
|
|
565
580
|
|
|
@@ -577,18 +592,26 @@ module Axlsx
|
|
|
577
592
|
cells.each { |cell| cell.style = style }
|
|
578
593
|
end
|
|
579
594
|
|
|
595
|
+
# Returns a sheet node serialization for this sheet in the workbook.
|
|
596
|
+
def to_sheet_node_xml_string(str='')
|
|
597
|
+
add_autofilter_defined_name_to_workbook
|
|
598
|
+
str << '<sheet '
|
|
599
|
+
serialized_attributes str
|
|
600
|
+
str << ('r:id="' << rId << '"></sheet>')
|
|
601
|
+
end
|
|
602
|
+
|
|
580
603
|
# Serializes the worksheet object to an xml string
|
|
581
604
|
# This intentionally does not use nokogiri for performance reasons
|
|
582
605
|
# @return [String]
|
|
583
|
-
def to_xml_string
|
|
606
|
+
def to_xml_string str=''
|
|
607
|
+
add_autofilter_defined_name_to_workbook
|
|
584
608
|
auto_filter.apply if auto_filter.range
|
|
585
|
-
str
|
|
609
|
+
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
|
586
610
|
str << worksheet_node
|
|
587
611
|
serializable_parts.each do |item|
|
|
588
612
|
item.to_xml_string(str) if item
|
|
589
613
|
end
|
|
590
614
|
str << '</worksheet>'
|
|
591
|
-
Axlsx::sanitize(str)
|
|
592
615
|
end
|
|
593
616
|
|
|
594
617
|
# The worksheet relationships. This is managed automatically by the worksheet
|
|
@@ -622,7 +645,7 @@ module Axlsx
|
|
|
622
645
|
def name_to_cell(name)
|
|
623
646
|
col_index, row_index = *Axlsx::name_to_indices(name)
|
|
624
647
|
r = rows[row_index]
|
|
625
|
-
r
|
|
648
|
+
r[col_index] if r
|
|
626
649
|
end
|
|
627
650
|
|
|
628
651
|
# shortcut method to access styles direclty from the worksheet
|
|
@@ -675,7 +698,7 @@ module Axlsx
|
|
|
675
698
|
end
|
|
676
699
|
|
|
677
700
|
def validate_sheet_name(name)
|
|
678
|
-
DataTypeValidator.validate
|
|
701
|
+
DataTypeValidator.validate :worksheet_name, String, name
|
|
679
702
|
raise ArgumentError, (ERR_SHEET_NAME_TOO_LONG % name) if name.size > 31
|
|
680
703
|
raise ArgumentError, (ERR_SHEET_NAME_CHARACTER_FORBIDDEN % name) if '[]*/\?:'.chars.any? { |char| name.include? char }
|
|
681
704
|
name = Axlsx::coder.encode(name)
|
|
@@ -695,8 +718,8 @@ module Axlsx
|
|
|
695
718
|
def range(*cell_def)
|
|
696
719
|
first, last = cell_def
|
|
697
720
|
cells = []
|
|
698
|
-
rows[(first.row.
|
|
699
|
-
r
|
|
721
|
+
rows[(first.row.row_index..last.row.row_index)].each do |r|
|
|
722
|
+
r[(first.index..last.index)].each do |c|
|
|
700
723
|
cells << c
|
|
701
724
|
end
|
|
702
725
|
end
|
|
@@ -734,7 +757,7 @@ module Axlsx
|
|
|
734
757
|
# Helper method for parsingout the root node for worksheet
|
|
735
758
|
# @return [String]
|
|
736
759
|
def worksheet_node
|
|
737
|
-
|
|
760
|
+
"<worksheet xmlns=\"#{XML_NS}\" xmlns:r=\"#{XML_NS_R}\" xml:space=\"#{xml_space}\">"
|
|
738
761
|
end
|
|
739
762
|
|
|
740
763
|
def sheet_data
|
|
@@ -753,11 +776,12 @@ module Axlsx
|
|
|
753
776
|
|
|
754
777
|
def workbook=(v) DataTypeValidator.validate "Worksheet.workbook", Workbook, v; @workbook = v; end
|
|
755
778
|
|
|
756
|
-
def update_column_info(cells, widths=
|
|
779
|
+
def update_column_info(cells, widths=nil)
|
|
757
780
|
cells.each_with_index do |cell, index|
|
|
781
|
+
width = widths ? widths[index] : nil
|
|
758
782
|
col = find_or_create_column_info(index)
|
|
759
|
-
next if
|
|
760
|
-
col.update_width(cell,
|
|
783
|
+
next if width == :ignore
|
|
784
|
+
col.update_width(cell, width, workbook.use_autowidth)
|
|
761
785
|
end
|
|
762
786
|
end
|
|
763
787
|
|
|
@@ -765,5 +789,10 @@ module Axlsx
|
|
|
765
789
|
column_info[index] ||= Col.new(index + 1, index + 1)
|
|
766
790
|
end
|
|
767
791
|
|
|
792
|
+
def add_autofilter_defined_name_to_workbook
|
|
793
|
+
return if !auto_filter.range
|
|
794
|
+
workbook.add_defined_name auto_filter.defined_name, name: '_xlnm._FilterDatabase', local_sheet_id: index, hidden: 1
|
|
795
|
+
end
|
|
796
|
+
|
|
768
797
|
end
|
|
769
798
|
end
|