caxlsx 3.3.0 → 3.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +24 -5
- data/Rakefile +0 -1
- data/lib/axlsx/content_type/abstract_content_type.rb +2 -5
- data/lib/axlsx/content_type/content_type.rb +0 -4
- data/lib/axlsx/content_type/default.rb +1 -5
- data/lib/axlsx/content_type/override.rb +0 -4
- data/lib/axlsx/doc_props/app.rb +1 -6
- data/lib/axlsx/doc_props/core.rb +1 -6
- data/lib/axlsx/drawing/area_chart.rb +3 -6
- data/lib/axlsx/drawing/area_series.rb +1 -4
- data/lib/axlsx/drawing/ax_data_source.rb +1 -6
- data/lib/axlsx/drawing/axes.rb +5 -6
- data/lib/axlsx/drawing/axis.rb +7 -12
- data/lib/axlsx/drawing/bar_3D_chart.rb +7 -10
- data/lib/axlsx/drawing/bar_chart.rb +6 -9
- data/lib/axlsx/drawing/bar_series.rb +2 -8
- data/lib/axlsx/drawing/bubble_chart.rb +2 -5
- data/lib/axlsx/drawing/bubble_series.rb +3 -6
- data/lib/axlsx/drawing/cat_axis.rb +2 -7
- data/lib/axlsx/drawing/chart.rb +7 -12
- data/lib/axlsx/drawing/d_lbls.rb +23 -22
- data/lib/axlsx/drawing/drawing.rb +4 -8
- data/lib/axlsx/drawing/graphic_frame.rb +0 -3
- data/lib/axlsx/drawing/hyperlink.rb +4 -7
- data/lib/axlsx/drawing/line_3D_chart.rb +10 -14
- data/lib/axlsx/drawing/line_chart.rb +3 -6
- data/lib/axlsx/drawing/line_series.rb +1 -4
- data/lib/axlsx/drawing/marker.rb +5 -9
- data/lib/axlsx/drawing/num_data.rb +4 -9
- data/lib/axlsx/drawing/num_data_source.rb +3 -7
- data/lib/axlsx/drawing/num_val.rb +2 -5
- data/lib/axlsx/drawing/one_cell_anchor.rb +4 -6
- data/lib/axlsx/drawing/pic.rb +46 -13
- data/lib/axlsx/drawing/picture_locking.rb +3 -6
- data/lib/axlsx/drawing/pie_3D_chart.rb +2 -7
- data/lib/axlsx/drawing/pie_series.rb +1 -6
- data/lib/axlsx/drawing/scaling.rb +2 -5
- data/lib/axlsx/drawing/scatter_chart.rb +2 -5
- data/lib/axlsx/drawing/scatter_series.rb +2 -5
- data/lib/axlsx/drawing/ser_axis.rb +2 -6
- data/lib/axlsx/drawing/series.rb +3 -5
- data/lib/axlsx/drawing/series_title.rb +0 -2
- data/lib/axlsx/drawing/str_data.rb +3 -8
- data/lib/axlsx/drawing/str_val.rb +2 -5
- data/lib/axlsx/drawing/title.rb +12 -15
- data/lib/axlsx/drawing/two_cell_anchor.rb +5 -7
- data/lib/axlsx/drawing/val_axis.rb +1 -4
- data/lib/axlsx/drawing/view_3D.rb +24 -24
- data/lib/axlsx/drawing/vml_drawing.rb +2 -5
- data/lib/axlsx/drawing/vml_shape.rb +4 -7
- data/lib/axlsx/package.rb +35 -36
- data/lib/axlsx/rels/relationship.rb +21 -24
- data/lib/axlsx/rels/relationships.rb +3 -6
- data/lib/axlsx/stylesheet/border.rb +1 -4
- data/lib/axlsx/stylesheet/border_pr.rb +3 -5
- data/lib/axlsx/stylesheet/cell_alignment.rb +2 -10
- data/lib/axlsx/stylesheet/cell_protection.rb +1 -4
- data/lib/axlsx/stylesheet/cell_style.rb +3 -7
- data/lib/axlsx/stylesheet/color.rb +6 -5
- data/lib/axlsx/stylesheet/dxf.rb +2 -6
- data/lib/axlsx/stylesheet/fill.rb +0 -4
- data/lib/axlsx/stylesheet/font.rb +7 -6
- data/lib/axlsx/stylesheet/gradient_fill.rb +4 -6
- data/lib/axlsx/stylesheet/gradient_stop.rb +2 -3
- data/lib/axlsx/stylesheet/num_fmt.rb +1 -4
- data/lib/axlsx/stylesheet/pattern_fill.rb +3 -5
- data/lib/axlsx/stylesheet/styles.rb +53 -45
- data/lib/axlsx/stylesheet/table_style.rb +5 -8
- data/lib/axlsx/stylesheet/table_style_element.rb +1 -4
- data/lib/axlsx/stylesheet/table_styles.rb +3 -7
- data/lib/axlsx/stylesheet/xf.rb +3 -6
- data/lib/axlsx/util/accessors.rb +2 -4
- data/lib/axlsx/util/constants.rb +3 -5
- data/lib/axlsx/util/mime_type_utils.rb +13 -0
- data/lib/axlsx/util/options_parser.rb +1 -2
- data/lib/axlsx/util/serialized_attributes.rb +4 -5
- data/lib/axlsx/util/simple_typed_list.rb +18 -17
- data/lib/axlsx/util/storage.rb +32 -36
- data/lib/axlsx/util/validators.rb +7 -4
- data/lib/axlsx/util/zip_command.rb +0 -2
- data/lib/axlsx/version.rb +1 -2
- data/lib/axlsx/workbook/defined_name.rb +6 -5
- data/lib/axlsx/workbook/defined_names.rb +1 -2
- data/lib/axlsx/workbook/shared_strings_table.rb +3 -6
- data/lib/axlsx/workbook/workbook.rb +96 -91
- data/lib/axlsx/workbook/workbook_view.rb +5 -10
- data/lib/axlsx/workbook/workbook_views.rb +1 -3
- data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +9 -8
- data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +6 -6
- data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +13 -14
- data/lib/axlsx/workbook/worksheet/border_creator.rb +29 -26
- data/lib/axlsx/workbook/worksheet/break.rb +2 -5
- data/lib/axlsx/workbook/worksheet/cell.rb +46 -26
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +11 -11
- data/lib/axlsx/workbook/worksheet/cfvo.rb +2 -2
- data/lib/axlsx/workbook/worksheet/cfvos.rb +3 -5
- data/lib/axlsx/workbook/worksheet/col.rb +4 -7
- data/lib/axlsx/workbook/worksheet/col_breaks.rb +4 -5
- data/lib/axlsx/workbook/worksheet/color_scale.rb +10 -12
- data/lib/axlsx/workbook/worksheet/cols.rb +6 -6
- data/lib/axlsx/workbook/worksheet/comment.rb +4 -5
- data/lib/axlsx/workbook/worksheet/comments.rb +6 -10
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +4 -5
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +2 -6
- data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +2 -4
- data/lib/axlsx/workbook/worksheet/data_bar.rb +20 -22
- data/lib/axlsx/workbook/worksheet/data_validation.rb +4 -5
- data/lib/axlsx/workbook/worksheet/data_validations.rb +2 -5
- data/lib/axlsx/workbook/worksheet/date_time_converter.rb +1 -3
- data/lib/axlsx/workbook/worksheet/dimension.rb +5 -4
- data/lib/axlsx/workbook/worksheet/header_footer.rb +0 -1
- data/lib/axlsx/workbook/worksheet/icon_set.rb +2 -3
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +8 -8
- data/lib/axlsx/workbook/worksheet/outline_pr.rb +0 -1
- data/lib/axlsx/workbook/worksheet/page_margins.rb +2 -2
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +1 -3
- data/lib/axlsx/workbook/worksheet/page_setup.rb +117 -120
- data/lib/axlsx/workbook/worksheet/pane.rb +16 -17
- data/lib/axlsx/workbook/worksheet/pivot_table.rb +8 -11
- data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +8 -11
- data/lib/axlsx/workbook/worksheet/pivot_tables.rb +3 -4
- data/lib/axlsx/workbook/worksheet/print_options.rb +0 -1
- data/lib/axlsx/workbook/worksheet/protected_range.rb +4 -5
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +9 -9
- data/lib/axlsx/workbook/worksheet/rich_text.rb +4 -6
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +21 -5
- data/lib/axlsx/workbook/worksheet/row.rb +24 -15
- data/lib/axlsx/workbook/worksheet/row_breaks.rb +3 -4
- data/lib/axlsx/workbook/worksheet/selection.rb +7 -9
- data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +5 -6
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +4 -6
- data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +18 -18
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +4 -4
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +12 -13
- data/lib/axlsx/workbook/worksheet/sheet_view.rb +35 -42
- data/lib/axlsx/workbook/worksheet/table.rb +7 -9
- data/lib/axlsx/workbook/worksheet/table_style_info.rb +2 -3
- data/lib/axlsx/workbook/worksheet/tables.rb +4 -4
- data/lib/axlsx/workbook/worksheet/worksheet.rb +63 -35
- data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +6 -6
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +3 -2
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +5 -6
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +4 -4
- data/lib/axlsx.rb +23 -9
- data/lib/caxlsx.rb +0 -1
- metadata +3 -3
@@ -1,11 +1,9 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
module Axlsx
|
3
2
|
# View options for a worksheet.
|
4
3
|
#
|
5
4
|
# @note The recommended way to manage the sheet view is via Worksheet#sheet_view
|
6
5
|
# @see Worksheet#sheet_view
|
7
6
|
class SheetView
|
8
|
-
|
9
7
|
include Axlsx::OptionsParser
|
10
8
|
include Axlsx::Accessors
|
11
9
|
include Axlsx::SerializedAttributes
|
@@ -30,8 +28,8 @@ module Axlsx
|
|
30
28
|
# @option options [Integer] zoom_scale_normal Zoom Scale Normal View
|
31
29
|
# @option options [Integer] zoom_scale_page_layout_view Zoom Scale Page Layout View
|
32
30
|
# @option options [Integer] zoom_scale_sheet_layout_view Zoom Scale Page Break Preview
|
33
|
-
def initialize(options={})
|
34
|
-
#defaults
|
31
|
+
def initialize(options = {})
|
32
|
+
# defaults
|
35
33
|
@color_id = @top_left_cell = @pane = nil
|
36
34
|
@right_to_left = @show_formulas = @show_outline_symbols = @show_white_space = @tab_selected = @window_protection = false
|
37
35
|
@default_grid_color = @show_grid_lines = @show_row_col_headers = @show_ruler = @show_zeros = true
|
@@ -42,16 +40,15 @@ module Axlsx
|
|
42
40
|
end
|
43
41
|
|
44
42
|
boolean_attr_accessor :default_grid_color, :right_to_left, :show_formulas, :show_grid_lines,
|
45
|
-
|
43
|
+
:show_row_col_headers, :show_ruler, :show_white_space, :show_zeros, :tab_selected, :window_protection, :show_outline_symbols
|
46
44
|
|
47
45
|
serializable_attributes :default_grid_color, :right_to_left, :show_formulas, :show_grid_lines,
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
:show_row_col_headers, :show_ruler, :show_white_space, :show_zeros, :tab_selected, :window_protection, :show_outline_symbols,
|
47
|
+
:zoom_scale_sheet_layout_view, :zoom_scale_page_layout_view, :zoom_scale_normal, :workbook_view_id,
|
48
|
+
:view, :top_left_cell, :color_id, :zoom_scale
|
52
49
|
|
53
50
|
# instance values that must be serialized as their own elements - e.g. not attributes.
|
54
|
-
CHILD_ELEMENTS = [
|
51
|
+
CHILD_ELEMENTS = [:pane, :selections]
|
55
52
|
|
56
53
|
# The pane object for the sheet view
|
57
54
|
# @return [Pane]
|
@@ -66,11 +63,11 @@ module Axlsx
|
|
66
63
|
# @return [Hash]
|
67
64
|
attr_reader :selections
|
68
65
|
|
69
|
-
#
|
66
|
+
#
|
70
67
|
# Color Id
|
71
68
|
# Index to the color value for row/column
|
72
|
-
# text headings and gridlines. This is an
|
73
|
-
# 'index color value' (ICV) rather than
|
69
|
+
# text headings and gridlines. This is an
|
70
|
+
# 'index color value' (ICV) rather than
|
74
71
|
# rgb value.
|
75
72
|
# @see type
|
76
73
|
# @return [Integer]
|
@@ -78,18 +75,17 @@ module Axlsx
|
|
78
75
|
attr_reader :color_id
|
79
76
|
|
80
77
|
# Top Left Visible Cell
|
81
|
-
# Location of the top left visible cell Location
|
78
|
+
# Location of the top left visible cell Location
|
82
79
|
# of the top left visible cell in the bottom right
|
83
80
|
# pane (when in Left-to-Right mode).
|
84
81
|
# @see type
|
85
82
|
# @return [String]
|
86
83
|
# default nil
|
87
84
|
attr_reader :top_left_cell
|
88
|
-
|
89
|
-
|
85
|
+
|
90
86
|
# View Type
|
91
87
|
# Indicates the view type.
|
92
|
-
# Options are
|
88
|
+
# Options are
|
93
89
|
# * normal: Normal view
|
94
90
|
# * page_break_preview: Page break preview
|
95
91
|
# * page_layout: Page Layout View
|
@@ -99,62 +95,59 @@ module Axlsx
|
|
99
95
|
attr_reader :view
|
100
96
|
|
101
97
|
# Workbook View Index
|
102
|
-
# Zero-based index of this workbook view, pointing
|
98
|
+
# Zero-based index of this workbook view, pointing
|
103
99
|
# to a workbookView element in the bookViews collection.
|
104
100
|
# @see type
|
105
|
-
# @return [Integer]
|
101
|
+
# @return [Integer]
|
106
102
|
# default 0
|
107
103
|
attr_reader :workbook_view_id
|
108
104
|
|
109
105
|
# Zoom Scale
|
110
|
-
# Window zoom magnification for current view
|
106
|
+
# Window zoom magnification for current view
|
111
107
|
# representing percent values. This attribute
|
112
|
-
# is restricted to values ranging from 10 to 400.
|
108
|
+
# is restricted to values ranging from 10 to 400.
|
113
109
|
# Horizontal & Vertical scale together.
|
114
|
-
# Current view can be Normal, Page Layout, or
|
110
|
+
# Current view can be Normal, Page Layout, or
|
115
111
|
# Page Break Preview.
|
116
112
|
# @see type
|
117
|
-
# @return [Integer]
|
113
|
+
# @return [Integer]
|
118
114
|
# default 100
|
119
115
|
attr_reader :zoom_scale
|
120
116
|
|
121
|
-
|
122
117
|
# Zoom Scale Normal View
|
123
|
-
# Zoom magnification to use when in normal view,
|
124
|
-
# representing percent values. This attribute is
|
125
|
-
# restricted to values ranging from 10 to 400.
|
118
|
+
# Zoom magnification to use when in normal view,
|
119
|
+
# representing percent values. This attribute is
|
120
|
+
# restricted to values ranging from 10 to 400.
|
126
121
|
# Horizontal & Vertical scale together.
|
127
|
-
# Applies for worksheets only; zero implies the
|
122
|
+
# Applies for worksheets only; zero implies the
|
128
123
|
# automatic setting.
|
129
124
|
# @see type
|
130
|
-
# @return [Integer]
|
125
|
+
# @return [Integer]
|
131
126
|
# default 0
|
132
127
|
attr_reader :zoom_scale_normal
|
133
128
|
|
134
|
-
|
135
129
|
# Zoom Scale Page Layout View
|
136
|
-
# Zoom magnification to use when in page layout
|
137
|
-
# view, representing percent values. This attribute
|
138
|
-
# is restricted to values ranging from 10 to 400.
|
130
|
+
# Zoom magnification to use when in page layout
|
131
|
+
# view, representing percent values. This attribute
|
132
|
+
# is restricted to values ranging from 10 to 400.
|
139
133
|
# Horizontal & Vertical scale together.
|
140
|
-
# Applies for worksheets only; zero implies
|
134
|
+
# Applies for worksheets only; zero implies
|
141
135
|
# the automatic setting.
|
142
136
|
# @see type
|
143
|
-
# @return [Integer]
|
137
|
+
# @return [Integer]
|
144
138
|
# default 0
|
145
139
|
attr_reader :zoom_scale_page_layout_view
|
146
140
|
|
147
|
-
|
148
141
|
# Zoom Scale Page Break Preview
|
149
|
-
# Zoom magnification to use when in page break
|
150
|
-
# preview, representing percent values. This
|
151
|
-
# attribute is restricted to values ranging
|
142
|
+
# Zoom magnification to use when in page break
|
143
|
+
# preview, representing percent values. This
|
144
|
+
# attribute is restricted to values ranging
|
152
145
|
# from 10 to 400. Horizontal & Vertical scale
|
153
146
|
# together.
|
154
|
-
# Applies for worksheet only; zero implies
|
147
|
+
# Applies for worksheet only; zero implies
|
155
148
|
# the automatic setting.
|
156
149
|
# @see type
|
157
|
-
# @return [Integer]
|
150
|
+
# @return [Integer]
|
158
151
|
# default 0
|
159
152
|
attr_reader :zoom_scale_sheet_layout_view
|
160
153
|
|
@@ -172,7 +165,7 @@ module Axlsx
|
|
172
165
|
# @see top_left_cell
|
173
166
|
def top_left_cell=(v)
|
174
167
|
cell = (v.class == Axlsx::Cell ? v.r_abs : v)
|
175
|
-
Axlsx::validate_string(cell)
|
168
|
+
Axlsx::validate_string(cell)
|
176
169
|
@top_left_cell = cell
|
177
170
|
end
|
178
171
|
|
@@ -1,10 +1,8 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
module Axlsx
|
3
2
|
# Table
|
4
3
|
# @note Worksheet#add_table is the recommended way to create tables for your worksheets.
|
5
4
|
# @see README for examples
|
6
5
|
class Table
|
7
|
-
|
8
6
|
include Axlsx::OptionsParser
|
9
7
|
|
10
8
|
# Creates a new Table object
|
@@ -12,13 +10,13 @@ module Axlsx
|
|
12
10
|
# @param [Worksheet] sheet The sheet containing the table data.
|
13
11
|
# @option options [Cell, String] name
|
14
12
|
# @option options [TableStyle] style
|
15
|
-
def initialize(ref, sheet, options={})
|
13
|
+
def initialize(ref, sheet, options = {})
|
16
14
|
@ref = ref
|
17
15
|
@sheet = sheet
|
18
16
|
@style = nil
|
19
17
|
@sheet.workbook.tables << self
|
20
18
|
@table_style_info = TableStyleInfo.new(options[:style_info]) if options[:style_info]
|
21
|
-
@name = "Table#{index+1}"
|
19
|
+
@name = "Table#{index + 1}"
|
22
20
|
parse_options options
|
23
21
|
yield self if block_given?
|
24
22
|
end
|
@@ -44,7 +42,7 @@ module Axlsx
|
|
44
42
|
# The part name for this table
|
45
43
|
# @return [String]
|
46
44
|
def pn
|
47
|
-
"#{TABLE_PN % (index+1)}"
|
45
|
+
"#{TABLE_PN % (index + 1)}"
|
48
46
|
end
|
49
47
|
|
50
48
|
# The relationship id for this table.
|
@@ -64,7 +62,7 @@ module Axlsx
|
|
64
62
|
end
|
65
63
|
end
|
66
64
|
|
67
|
-
# TableStyleInfo for the table.
|
65
|
+
# TableStyleInfo for the table.
|
68
66
|
# initialization can be fed via the :style_info option
|
69
67
|
def table_style_info
|
70
68
|
@table_style_info ||= TableStyleInfo.new
|
@@ -75,12 +73,12 @@ module Axlsx
|
|
75
73
|
# @return [String]
|
76
74
|
def to_xml_string(str = '')
|
77
75
|
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/,'_') << '" ')
|
76
|
+
str << ('<table xmlns="' << XML_NS << '" id="' << (index + 1).to_s << '" name="' << @name << '" displayName="' << @name.gsub(/\s/, '_') << '" ')
|
79
77
|
str << ('ref="' << @ref << '" totalsRowShown="0">')
|
80
78
|
str << ('<autoFilter ref="' << @ref << '"/>')
|
81
79
|
str << ('<tableColumns count="' << header_cells.length.to_s << '">')
|
82
|
-
header_cells.each_with_index do |cell,index|
|
83
|
-
str << ('<tableColumn id ="' << (index+1).to_s << '" name="' << cell.clean_value << '"/>')
|
80
|
+
header_cells.each_with_index do |cell, index|
|
81
|
+
str << ('<tableColumn id ="' << (index + 1).to_s << '" name="' << cell.clean_value << '"/>')
|
84
82
|
end
|
85
83
|
str << '</tableColumns>'
|
86
84
|
table_style_info.to_xml_string(str)
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module Axlsx
|
2
|
-
|
3
2
|
# The table style info class manages style attributes for defined tables in
|
4
3
|
# a worksheet
|
5
4
|
class TableStyleInfo
|
@@ -15,7 +14,7 @@ module Axlsx
|
|
15
14
|
# @option [Boolean] show_column_stripes indicates if column stripes should
|
16
15
|
# be shown
|
17
16
|
# @option [Boolean] show_row_stripes indicates if row stripes should be shown
|
18
|
-
# @option [String] name The name of the style to apply to your table.
|
17
|
+
# @option [String] name The name of the style to apply to your table.
|
19
18
|
# Only predefined styles are currently supported.
|
20
19
|
# @see Annex G. (normative) Predefined SpreadsheetML Style Definitions in part 1 of the specification.
|
21
20
|
def initialize(options = {})
|
@@ -27,7 +26,7 @@ module Axlsx
|
|
27
26
|
# boolean attributes for this object
|
28
27
|
boolean_attr_accessor :show_first_column, :show_last_column, :show_row_stripes, :show_column_stripes
|
29
28
|
serializable_attributes :show_first_column, :show_last_column, :show_row_stripes, :show_column_stripes,
|
30
|
-
|
29
|
+
:name
|
31
30
|
|
32
31
|
# Initialize all the values to false as Excel requires them to
|
33
32
|
# explicitly be disabled or all will show.
|
@@ -1,11 +1,10 @@
|
|
1
1
|
module Axlsx
|
2
|
-
|
3
2
|
# A simple, self serializing class for storing tables
|
4
3
|
class Tables < SimpleTypedList
|
5
|
-
|
6
4
|
# creates a new Tables object
|
7
5
|
def initialize(worksheet)
|
8
6
|
raise ArgumentError, "you must provide a worksheet" unless worksheet.is_a?(Worksheet)
|
7
|
+
|
9
8
|
super Table
|
10
9
|
@worksheet = worksheet
|
11
10
|
end
|
@@ -17,7 +16,8 @@ module Axlsx
|
|
17
16
|
# returns the relationships required by this collection
|
18
17
|
def relationships
|
19
18
|
return [] if empty?
|
20
|
-
|
19
|
+
|
20
|
+
map { |table| Relationship.new(table, TABLE_R, "../#{table.pn}") }
|
21
21
|
end
|
22
22
|
|
23
23
|
# renders the tables xml
|
@@ -25,10 +25,10 @@ module Axlsx
|
|
25
25
|
# @return [String]
|
26
26
|
def to_xml_string(str = "")
|
27
27
|
return if empty?
|
28
|
+
|
28
29
|
str << "<tableParts count='#{size}'>"
|
29
30
|
each { |table| str << "<tablePart r:id='#{table.rId}'/>" }
|
30
31
|
str << '</tableParts>'
|
31
32
|
end
|
32
33
|
end
|
33
|
-
|
34
34
|
end
|
@@ -1,9 +1,6 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
1
|
require_relative "border_creator"
|
4
2
|
|
5
3
|
module Axlsx
|
6
|
-
|
7
4
|
# The Worksheet class represents a worksheet in the workbook.
|
8
5
|
class Worksheet
|
9
6
|
include Axlsx::OptionsParser
|
@@ -16,12 +13,15 @@ module Axlsx
|
|
16
13
|
# @option options [Hash] page_margins A hash containing page margins for this worksheet. @see PageMargins
|
17
14
|
# @option options [Hash] print_options A hash containing print options for this worksheet. @see PrintOptions
|
18
15
|
# @option options [Hash] header_footer A hash containing header/footer options for this worksheet. @see HeaderFooter
|
19
|
-
# @option options [Boolean] show_gridlines
|
20
|
-
|
16
|
+
# @option options [Boolean] show_gridlines Whether gridlines should be shown for this sheet.
|
17
|
+
# @option options [Boolean] escape_formulas Whether formulas should be escaped by default. Can be overridden at a
|
18
|
+
# row/cell level.
|
19
|
+
def initialize(wb, options = {})
|
21
20
|
self.workbook = wb
|
22
21
|
@sheet_protection = nil
|
23
22
|
initialize_page_options(options)
|
24
23
|
parse_options options
|
24
|
+
self.escape_formulas = wb.escape_formulas unless defined? @escape_formulas
|
25
25
|
@workbook.worksheets << self
|
26
26
|
@sheet_id = index + 1
|
27
27
|
yield self if block_given?
|
@@ -43,7 +43,21 @@ module Axlsx
|
|
43
43
|
# The name of the worksheet
|
44
44
|
# @return [String]
|
45
45
|
def name
|
46
|
-
@name ||= "Sheet" + (index+1).to_s
|
46
|
+
@name ||= "Sheet" + (index + 1).to_s
|
47
|
+
end
|
48
|
+
|
49
|
+
# Whether to treat values starting with an equals sign as formulas or as literal strings.
|
50
|
+
# Allowing user-generated data to be interpreted as formulas is a security risk.
|
51
|
+
# See https://www.owasp.org/index.php/CSV_Injection for details.
|
52
|
+
# @return [Boolean]
|
53
|
+
attr_reader :escape_formulas
|
54
|
+
|
55
|
+
# Sets whether to treat values starting with an equals sign as formulas or as literal strings.
|
56
|
+
# @param [Boolean] value The value to set.
|
57
|
+
# @return [Boolean]
|
58
|
+
def escape_formulas=(value)
|
59
|
+
Axlsx.validate_boolean(value)
|
60
|
+
@escape_formulas = value
|
47
61
|
end
|
48
62
|
|
49
63
|
# Specifies the visible state of this sheet. Allowed states are
|
@@ -102,13 +116,13 @@ module Axlsx
|
|
102
116
|
# The tables in this worksheet
|
103
117
|
# @return [Array] of Table
|
104
118
|
def tables
|
105
|
-
@tables ||=
|
119
|
+
@tables ||= Tables.new self
|
106
120
|
end
|
107
121
|
|
108
122
|
# The pivot tables in this worksheet
|
109
123
|
# @return [Array] of Table
|
110
124
|
def pivot_tables
|
111
|
-
@pivot_tables ||=
|
125
|
+
@pivot_tables ||= PivotTables.new self
|
112
126
|
end
|
113
127
|
|
114
128
|
# A collection of column breaks added to this worksheet
|
@@ -172,10 +186,10 @@ module Axlsx
|
|
172
186
|
# @see #page_setup
|
173
187
|
def fit_to_page?
|
174
188
|
return false unless Axlsx.instance_values_for(self).keys.include?('page_setup')
|
189
|
+
|
175
190
|
page_setup.fit_to_page?
|
176
191
|
end
|
177
192
|
|
178
|
-
|
179
193
|
# Column info for the sheet
|
180
194
|
# @return [SimpleTypedList]
|
181
195
|
def column_info
|
@@ -311,7 +325,7 @@ module Axlsx
|
|
311
325
|
# @param [String] name
|
312
326
|
def name=(name)
|
313
327
|
validate_sheet_name name
|
314
|
-
@name=Axlsx::coder.encode(name)
|
328
|
+
@name = Axlsx::coder.encode(name)
|
315
329
|
end
|
316
330
|
|
317
331
|
# The auto filter range for the worksheet
|
@@ -329,13 +343,13 @@ module Axlsx
|
|
329
343
|
# The part name of this worksheet
|
330
344
|
# @return [String]
|
331
345
|
def pn
|
332
|
-
"#{WORKSHEET_PN % (index+1)}"
|
346
|
+
"#{WORKSHEET_PN % (index + 1)}"
|
333
347
|
end
|
334
348
|
|
335
349
|
# The relationship part name of this worksheet
|
336
350
|
# @return [String]
|
337
351
|
def rels_pn
|
338
|
-
"#{WORKSHEET_RELS_PN % (index+1)}"
|
352
|
+
"#{WORKSHEET_RELS_PN % (index + 1)}"
|
339
353
|
end
|
340
354
|
|
341
355
|
# The relationship id of this worksheet.
|
@@ -412,7 +426,8 @@ module Axlsx
|
|
412
426
|
# sign as formula (default) or as simple string.
|
413
427
|
# Allowing user generated data to be interpreted as formulas can be dangerous
|
414
428
|
# (see https://www.owasp.org/index.php/CSV_Injection for details).
|
415
|
-
def add_row(values=[], options={})
|
429
|
+
def add_row(values = [], options = {})
|
430
|
+
options[:escape_formulas] = escape_formulas if options[:escape_formulas].nil?
|
416
431
|
row = Row.new(self, values, options)
|
417
432
|
update_column_info row, options.delete(:widths)
|
418
433
|
yield row if block_given?
|
@@ -432,7 +447,7 @@ module Axlsx
|
|
432
447
|
# @see ConditionalFormattingRule#initialize
|
433
448
|
# @see file:examples/example_conditional_formatting.rb
|
434
449
|
def add_conditional_formatting(cells, rules)
|
435
|
-
cf = ConditionalFormatting.new(
|
450
|
+
cf = ConditionalFormatting.new(:sqref => cells)
|
436
451
|
cf.add_rules rules
|
437
452
|
conditional_formattings << cf
|
438
453
|
conditional_formattings
|
@@ -453,7 +468,7 @@ module Axlsx
|
|
453
468
|
# @param [Hash] options for the hyperlink
|
454
469
|
# @see WorksheetHyperlink for a list of options
|
455
470
|
# @return [WorksheetHyperlink]
|
456
|
-
def add_hyperlink(options={})
|
471
|
+
def add_hyperlink(options = {})
|
457
472
|
hyperlinks.add(options)
|
458
473
|
end
|
459
474
|
|
@@ -470,33 +485,33 @@ module Axlsx
|
|
470
485
|
# @see Bar3DChart
|
471
486
|
# @see Line3DChart
|
472
487
|
# @see README for examples
|
473
|
-
def add_chart(chart_type, options={})
|
488
|
+
def add_chart(chart_type, options = {})
|
474
489
|
chart = worksheet_drawing.add_chart(chart_type, options)
|
475
490
|
yield chart if block_given?
|
476
491
|
chart
|
477
492
|
end
|
478
493
|
|
479
494
|
# needs documentation
|
480
|
-
def add_table(ref, options={})
|
495
|
+
def add_table(ref, options = {})
|
481
496
|
tables << Table.new(ref, self, options)
|
482
497
|
yield tables.last if block_given?
|
483
498
|
tables.last
|
484
499
|
end
|
485
500
|
|
486
|
-
def add_pivot_table(ref, range, options={})
|
501
|
+
def add_pivot_table(ref, range, options = {})
|
487
502
|
pivot_tables << PivotTable.new(ref, range, self, options)
|
488
503
|
yield pivot_tables.last if block_given?
|
489
504
|
pivot_tables.last
|
490
505
|
end
|
491
506
|
|
492
507
|
# Shortcut to worsksheet_comments#add_comment
|
493
|
-
def add_comment(options={})
|
508
|
+
def add_comment(options = {})
|
494
509
|
worksheet_comments.add_comment(options)
|
495
510
|
end
|
496
511
|
|
497
512
|
# Adds a media item to the worksheets drawing
|
498
513
|
# @option [Hash] options options passed to drawing.add_image
|
499
|
-
def add_image(options={})
|
514
|
+
def add_image(options = {})
|
500
515
|
image = worksheet_drawing.add_image(options)
|
501
516
|
yield image if block_given?
|
502
517
|
image
|
@@ -510,10 +525,10 @@ module Axlsx
|
|
510
525
|
def add_page_break(cell)
|
511
526
|
DataTypeValidator.validate :worksheet_page_break, [String, Cell], cell
|
512
527
|
column_index, row_index = if cell.is_a?(String)
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
528
|
+
Axlsx.name_to_indices(cell)
|
529
|
+
else
|
530
|
+
cell.pos
|
531
|
+
end
|
517
532
|
if column_index > 0
|
518
533
|
col_breaks.add_break(:id => column_index)
|
519
534
|
end
|
@@ -530,6 +545,7 @@ module Axlsx
|
|
530
545
|
def column_widths(*widths)
|
531
546
|
widths.each_with_index do |value, index|
|
532
547
|
next if value == nil
|
548
|
+
|
533
549
|
Axlsx::validate_unsigned_numeric(value) unless value == nil
|
534
550
|
find_or_create_column_info(index).width = value
|
535
551
|
end
|
@@ -543,7 +559,7 @@ module Axlsx
|
|
543
559
|
# @note You can also specify the style for specific columns in the call to add_row by using an array for the :styles option
|
544
560
|
# @see Worksheet#add_row
|
545
561
|
# @see README.md for an example
|
546
|
-
def col_style(index, style, options={})
|
562
|
+
def col_style(index, style, options = {})
|
547
563
|
offset = options.delete(:row_offset) || 0
|
548
564
|
cells = @rows[(offset..-1)].map { |row| row[index] }.flatten.compact
|
549
565
|
cells.each { |cell| cell.style = style }
|
@@ -557,7 +573,7 @@ module Axlsx
|
|
557
573
|
# @note You can also specify the style in the add_row call
|
558
574
|
# @see Worksheet#add_row
|
559
575
|
# @see README.md for an example
|
560
|
-
def row_style(index, style, options={})
|
576
|
+
def row_style(index, style, options = {})
|
561
577
|
offset = options.delete(:col_offset) || 0
|
562
578
|
cells = cols[(offset..-1)].map { |column| column[index] }.flatten.compact
|
563
579
|
cells.each { |cell| cell.style = style }
|
@@ -587,19 +603,30 @@ module Axlsx
|
|
587
603
|
# Set the style for cells in a specific column
|
588
604
|
# @param [String|Array] cell references
|
589
605
|
# @param [Hash|Array|Symbol] border options
|
590
|
-
def add_border(cell_refs, options =
|
606
|
+
def add_border(cell_refs, options = nil)
|
607
|
+
if options.is_a?(Hash)
|
608
|
+
border_edges = options[:edges]
|
609
|
+
border_style = options[:style]
|
610
|
+
border_color = options[:color]
|
611
|
+
else
|
612
|
+
border_edges = options
|
613
|
+
end
|
614
|
+
|
591
615
|
if !cell_refs.is_a?(Array)
|
592
616
|
cell_refs = [cell_refs]
|
593
617
|
end
|
594
618
|
|
595
619
|
cell_refs.each do |cell_ref|
|
596
|
-
|
597
|
-
|
620
|
+
item = self[cell_ref]
|
621
|
+
|
622
|
+
cells = item.is_a?(Array) ? item : [item]
|
623
|
+
|
624
|
+
Axlsx::BorderCreator.new(worksheet: self, cells: cells, edges: border_edges, style: border_style, color: border_color).draw
|
598
625
|
end
|
599
626
|
end
|
600
627
|
|
601
628
|
# Returns a sheet node serialization for this sheet in the workbook.
|
602
|
-
def to_sheet_node_xml_string(str='')
|
629
|
+
def to_sheet_node_xml_string(str = '')
|
603
630
|
add_autofilter_defined_name_to_workbook
|
604
631
|
str << '<sheet '
|
605
632
|
serialized_attributes str
|
@@ -610,7 +637,7 @@ module Axlsx
|
|
610
637
|
# Serializes the worksheet object to an xml string
|
611
638
|
# This intentionally does not use nokogiri for performance reasons
|
612
639
|
# @return [String]
|
613
|
-
def to_xml_string str=''
|
640
|
+
def to_xml_string str = ''
|
614
641
|
add_autofilter_defined_name_to_workbook
|
615
642
|
auto_filter.apply if auto_filter.range
|
616
643
|
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
@@ -639,7 +666,7 @@ module Axlsx
|
|
639
666
|
def [](cell_def)
|
640
667
|
return rows[cell_def] if cell_def.is_a?(Integer)
|
641
668
|
|
642
|
-
parts = cell_def.split(':').map{ |part| name_to_cell part }
|
669
|
+
parts = cell_def.split(':').map { |part| name_to_cell part }
|
643
670
|
|
644
671
|
if parts.size == 1
|
645
672
|
parts.first
|
@@ -713,7 +740,7 @@ module Axlsx
|
|
713
740
|
end
|
714
741
|
|
715
742
|
def outline(collection, range, level = 1, collapsed = true)
|
716
|
-
|
743
|
+
range.each do |index|
|
717
744
|
unless (item = collection[index]).nil?
|
718
745
|
item.outline_level = level
|
719
746
|
item.hidden = collapsed
|
@@ -726,9 +753,11 @@ module Axlsx
|
|
726
753
|
DataTypeValidator.validate :worksheet_name, String, name
|
727
754
|
# ignore first character (BOM) after encoding to utf16 because Excel does so, too.
|
728
755
|
raise ArgumentError, (ERR_SHEET_NAME_EMPTY) if name.empty?
|
756
|
+
|
729
757
|
character_length = name.encode("utf-16")[1..-1].encode("utf-16").bytesize / 2
|
730
758
|
raise ArgumentError, (ERR_SHEET_NAME_TOO_LONG % name) if character_length > WORKSHEET_MAX_NAME_LENGTH
|
731
759
|
raise ArgumentError, (ERR_SHEET_NAME_CHARACTER_FORBIDDEN % name) if WORKSHEET_NAME_FORBIDDEN_CHARS.any? { |char| name.include? char }
|
760
|
+
|
732
761
|
name = Axlsx::coder.encode(name)
|
733
762
|
sheet_names = @workbook.worksheets.reject { |s| s == self }.map { |s| s.name }
|
734
763
|
raise ArgumentError, (ERR_DUPLICATE_SHEET_NAME % name) if sheet_names.include?(name)
|
@@ -783,7 +812,6 @@ module Axlsx
|
|
783
812
|
@merged_cells ||= MergedCells.new self
|
784
813
|
end
|
785
814
|
|
786
|
-
|
787
815
|
# Helper method for parsingout the root node for worksheet
|
788
816
|
# @return [String]
|
789
817
|
def worksheet_node
|
@@ -822,8 +850,8 @@ module Axlsx
|
|
822
850
|
|
823
851
|
def add_autofilter_defined_name_to_workbook
|
824
852
|
return if !auto_filter.range
|
853
|
+
|
825
854
|
workbook.add_defined_name auto_filter.defined_name, name: '_xlnm._FilterDatabase', local_sheet_id: index, hidden: 1
|
826
855
|
end
|
827
|
-
|
828
856
|
end
|
829
857
|
end
|
@@ -1,13 +1,12 @@
|
|
1
1
|
module Axlsx
|
2
|
-
|
3
2
|
# A wraper class for comments that defines its on worksheet
|
4
3
|
# serailization
|
5
4
|
class WorksheetComments
|
6
|
-
|
7
5
|
# Creates a new WorksheetComments object
|
8
6
|
# param [Worksheet] worksheet The worksheet comments in thes object belong to
|
9
7
|
def initialize(worksheet)
|
10
8
|
raise ArugumentError, 'You must provide a worksheet' unless worksheet.is_a?(Worksheet)
|
9
|
+
|
11
10
|
@worksheet = worksheet
|
12
11
|
end
|
13
12
|
|
@@ -22,18 +21,18 @@ module Axlsx
|
|
22
21
|
# Adds a comment
|
23
22
|
# @param [Hash] options
|
24
23
|
# @see Comments#add_comment
|
25
|
-
def add_comment(options={})
|
24
|
+
def add_comment(options = {})
|
26
25
|
comments.add_comment(options)
|
27
|
-
end
|
26
|
+
end
|
28
27
|
|
29
28
|
# The relationships defined by this objects comments collection
|
30
29
|
# @return [Relationships]
|
31
30
|
def relationships
|
32
31
|
return [] unless has_comments?
|
32
|
+
|
33
33
|
comments.relationships
|
34
34
|
end
|
35
35
|
|
36
|
-
|
37
36
|
# Helper method to tell us if there are comments in the comments collection
|
38
37
|
# @return [Boolean]
|
39
38
|
def has_comments?
|
@@ -44,7 +43,7 @@ module Axlsx
|
|
44
43
|
# @see Relationship#Id
|
45
44
|
# @return [String]
|
46
45
|
def drawing_rId
|
47
|
-
comments.relationships.find{ |r| r.Type == VML_DRAWING_R }.Id
|
46
|
+
comments.relationships.find { |r| r.Type == VML_DRAWING_R }.Id
|
48
47
|
end
|
49
48
|
|
50
49
|
# Seraalize the object
|
@@ -52,6 +51,7 @@ module Axlsx
|
|
52
51
|
# @return [String]
|
53
52
|
def to_xml_string(str = '')
|
54
53
|
return unless has_comments?
|
54
|
+
|
55
55
|
str << "<legacyDrawing r:id='#{drawing_rId}' />"
|
56
56
|
end
|
57
57
|
end
|
@@ -1,15 +1,14 @@
|
|
1
1
|
module Axlsx
|
2
|
-
|
3
2
|
# This is a utility class for serialing the drawing node in a
|
4
3
|
# worksheet. Drawing objects have their own serialization that exports
|
5
4
|
# a drawing document. This is only for the single node in the
|
6
5
|
# worksheet
|
7
6
|
class WorksheetDrawing
|
8
|
-
|
9
7
|
# Creates a new WorksheetDrawing
|
10
8
|
# @param [Worksheet] worksheet
|
11
9
|
def initialize(worksheet)
|
12
10
|
raise ArgumentError, 'you must provide a worksheet' unless worksheet.is_a?(Worksheet)
|
11
|
+
|
13
12
|
@worksheet = worksheet
|
14
13
|
@drawing = nil
|
15
14
|
end
|
@@ -45,6 +44,7 @@ module Axlsx
|
|
45
44
|
# @return [Relationship]
|
46
45
|
def relationship
|
47
46
|
return unless has_drawing?
|
47
|
+
|
48
48
|
Relationship.new(self, DRAWING_R, "../#{drawing.pn}")
|
49
49
|
end
|
50
50
|
|
@@ -52,6 +52,7 @@ module Axlsx
|
|
52
52
|
# @param [String] str
|
53
53
|
def to_xml_string(str = '')
|
54
54
|
return unless has_drawing?
|
55
|
+
|
55
56
|
str << "<drawing r:id='#{relationship.Id}'/>"
|
56
57
|
end
|
57
58
|
end
|