caxlsx 2.0.2 → 3.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +41 -33
- data/Rakefile +9 -11
- data/examples/auto_filter.rb +10 -1
- data/examples/conditional_formatting/example_conditional_formatting.rb +18 -3
- data/examples/data_validation.rb +57 -40
- data/examples/example.rb +115 -7
- 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 +34 -15
- 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/area_chart.rb +99 -0
- data/lib/axlsx/drawing/area_series.rb +110 -0
- 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_chart.rb +143 -0
- 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 +52 -8
- data/lib/axlsx/drawing/d_lbls.rb +3 -3
- data/lib/axlsx/drawing/drawing.rb +6 -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 +32 -3
- 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 +3 -1
- data/lib/axlsx/drawing/one_cell_anchor.rb +3 -2
- data/lib/axlsx/drawing/pic.rb +25 -19
- 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 +6 -6
- data/lib/axlsx/drawing/scatter_chart.rb +10 -10
- data/lib/axlsx/drawing/scatter_series.rb +40 -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 +3 -1
- data/lib/axlsx/drawing/title.rb +22 -4
- data/lib/axlsx/drawing/two_cell_anchor.rb +6 -1
- data/lib/axlsx/drawing/val_axis.rb +1 -1
- data/lib/axlsx/drawing/view_3D.rb +2 -2
- data/lib/axlsx/drawing/vml_drawing.rb +1 -1
- data/lib/axlsx/package.rb +33 -31
- data/lib/axlsx/rels/relationship.rb +1 -1
- data/lib/axlsx/rels/relationships.rb +7 -4
- 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 +10 -3
- data/lib/axlsx/stylesheet/pattern_fill.rb +1 -1
- data/lib/axlsx/stylesheet/styles.rb +7 -7
- data/lib/axlsx/stylesheet/table_style_element.rb +1 -3
- data/lib/axlsx/util/accessors.rb +6 -6
- data/lib/axlsx/util/constants.rb +107 -99
- data/lib/axlsx/util/mime_type_utils.rb +11 -0
- 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/validators.rb +29 -17
- 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 +36 -11
- data/lib/axlsx/workbook/workbook_view.rb +80 -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 +136 -74
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +63 -43
- data/lib/axlsx/workbook/worksheet/cfvo.rb +1 -3
- data/lib/axlsx/workbook/worksheet/cfvos.rb +4 -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/cols.rb +5 -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 +4 -2
- data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -0
- 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 +44 -28
- 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 +5 -2
- data/lib/axlsx/workbook/worksheet/rich_text.rb +55 -0
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +250 -0
- data/lib/axlsx/workbook/worksheet/row.rb +40 -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_pr.rb +21 -3
- 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 +4 -1
- data/lib/axlsx/workbook/worksheet/worksheet.rb +64 -78
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +10 -10
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +3 -3
- data/test/drawing/tc_area_chart.rb +39 -0
- data/test/drawing/tc_area_series.rb +71 -0
- data/test/drawing/tc_axis.rb +27 -0
- data/test/drawing/tc_bar_chart.rb +71 -0
- data/test/drawing/tc_bubble_chart.rb +44 -0
- data/test/drawing/tc_bubble_series.rb +21 -0
- data/test/drawing/tc_chart.rb +23 -10
- data/test/drawing/tc_data_source.rb +6 -0
- data/test/drawing/tc_drawing.rb +2 -2
- data/test/drawing/tc_line_chart.rb +5 -5
- data/test/drawing/tc_line_series.rb +47 -6
- data/test/drawing/tc_pic.rb +11 -15
- data/test/drawing/tc_scatter_series.rb +36 -1
- data/test/drawing/tc_str_val.rb +9 -0
- data/test/drawing/tc_title.rb +5 -0
- data/test/stylesheet/tc_styles.rb +2 -2
- data/test/tc_axlsx.rb +31 -0
- data/test/tc_helper.rb +2 -0
- data/test/tc_package.rb +19 -1
- data/test/util/tc_mime_type_utils.rb +13 -0
- data/test/util/tc_simple_typed_list.rb +2 -3
- data/test/util/tc_validators.rb +34 -10
- data/test/workbook/tc_defined_name.rb +12 -4
- data/test/workbook/tc_shared_strings_table.rb +16 -1
- data/test/workbook/tc_workbook.rb +38 -3
- 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 +76 -8
- 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_outline_pr.rb +19 -0
- data/test/workbook/worksheet/tc_page_setup.rb +3 -3
- data/test/workbook/worksheet/tc_pivot_table.rb +21 -6
- 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 +7 -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_pr.rb +26 -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_table.rb +2 -3
- data/test/workbook/worksheet/tc_worksheet.rb +99 -45
- metadata +89 -16
|
@@ -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
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module Axlsx
|
|
2
2
|
|
|
3
|
-
# The SheetPr class manages serialization
|
|
3
|
+
# The SheetPr class manages serialization of a worksheet's sheetPr element.
|
|
4
4
|
class SheetPr
|
|
5
5
|
include Axlsx::OptionsParser
|
|
6
6
|
include Axlsx::Accessors
|
|
@@ -8,7 +8,7 @@ module Axlsx
|
|
|
8
8
|
|
|
9
9
|
serializable_attributes :sync_horizontal,
|
|
10
10
|
:sync_vertical,
|
|
11
|
-
:
|
|
11
|
+
:transition_evaluation,
|
|
12
12
|
:transition_entry,
|
|
13
13
|
:published,
|
|
14
14
|
:filter_mode,
|
|
@@ -20,7 +20,7 @@ module Axlsx
|
|
|
20
20
|
# waving magic show to set up the attriubte accessors
|
|
21
21
|
boolean_attr_accessor :sync_horizontal,
|
|
22
22
|
:sync_vertical,
|
|
23
|
-
:
|
|
23
|
+
:transition_evaluation,
|
|
24
24
|
:transition_entry,
|
|
25
25
|
:published,
|
|
26
26
|
:filter_mode,
|
|
@@ -33,6 +33,7 @@ module Axlsx
|
|
|
33
33
|
def initialize(worksheet, options={})
|
|
34
34
|
raise ArgumentError, "you must provide a worksheet" unless worksheet.is_a?(Worksheet)
|
|
35
35
|
@worksheet = worksheet
|
|
36
|
+
@outline_pr = nil
|
|
36
37
|
parse_options options
|
|
37
38
|
end
|
|
38
39
|
|
|
@@ -40,12 +41,18 @@ module Axlsx
|
|
|
40
41
|
# @return [Worksheet]
|
|
41
42
|
attr_reader :worksheet
|
|
42
43
|
|
|
44
|
+
# The tab color of the sheet.
|
|
45
|
+
# @return [Color]
|
|
46
|
+
attr_reader :tab_color
|
|
47
|
+
|
|
43
48
|
# Serialize the object
|
|
44
49
|
# @param [String] str serialized output will be appended to this object if provided.
|
|
45
50
|
# @return [String]
|
|
46
51
|
def to_xml_string(str = '')
|
|
47
52
|
update_properties
|
|
48
53
|
str << "<sheetPr #{serialized_attributes}>"
|
|
54
|
+
tab_color.to_xml_string(str, 'tabColor') if tab_color
|
|
55
|
+
outline_pr.to_xml_string(str) if @outline_pr
|
|
49
56
|
page_setup_pr.to_xml_string(str)
|
|
50
57
|
str << "</sheetPr>"
|
|
51
58
|
end
|
|
@@ -55,6 +62,17 @@ module Axlsx
|
|
|
55
62
|
def page_setup_pr
|
|
56
63
|
@page_setup_pr ||= PageSetUpPr.new
|
|
57
64
|
end
|
|
65
|
+
|
|
66
|
+
# The OutlinePr for this sheet pr object
|
|
67
|
+
# @return [OutlinePr]
|
|
68
|
+
def outline_pr
|
|
69
|
+
@outline_pr ||= OutlinePr.new
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# @see tab_color
|
|
73
|
+
def tab_color=(v)
|
|
74
|
+
@tab_color ||= Color.new(:rgb => v)
|
|
75
|
+
end
|
|
58
76
|
|
|
59
77
|
private
|
|
60
78
|
|
|
@@ -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
|
|
@@ -20,10 +20,13 @@ module Axlsx
|
|
|
20
20
|
map{ |table| Relationship.new(table, TABLE_R, "../#{table.pn}") }
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
+
# renders the tables xml
|
|
24
|
+
# @param [String] str
|
|
25
|
+
# @return [String]
|
|
23
26
|
def to_xml_string(str = "")
|
|
24
27
|
return if empty?
|
|
25
28
|
str << "<tableParts count='#{size}'>"
|
|
26
|
-
|
|
29
|
+
each { |table| str << "<tablePart r:id='#{table.rId}'/>" }
|
|
27
30
|
str << '</tableParts>'
|
|
28
31
|
end
|
|
29
32
|
end
|
|
@@ -4,14 +4,10 @@ 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
|
-
def self.thin_chars
|
|
12
|
-
# removed 'e' and 'y' from this list - as a GUESS
|
|
13
|
-
@thin_chars ||= "^.acfijklrstxzFIJL()-"
|
|
14
|
-
end
|
|
10
|
+
THIN_CHARS = '^.acfijklrstxzFIJL()-'.freeze
|
|
15
11
|
|
|
16
12
|
# Creates a new worksheet.
|
|
17
13
|
# @note the recommended way to manage worksheets is 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, :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
|
|
@@ -76,7 +91,7 @@ module Axlsx
|
|
|
76
91
|
# @see [SheetFormatPr]
|
|
77
92
|
def sheet_format_pr
|
|
78
93
|
@sheet_format_pr ||= SheetFormatPr.new
|
|
79
|
-
|
|
94
|
+
yield @sheet_format_pr if block_given?
|
|
80
95
|
@sheet_format_pr
|
|
81
96
|
end
|
|
82
97
|
|
|
@@ -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
|
|
@@ -137,12 +152,12 @@ module Axlsx
|
|
|
137
152
|
# cell at a specific index. The block will be called with the row and column
|
|
138
153
|
# index in the missing cell was found.
|
|
139
154
|
# @example
|
|
140
|
-
# cols { |row_index, column_index|
|
|
155
|
+
# cols { |row_index, column_index| puts "warn - row #{row_index} does not have a cell at #{column_index}" }
|
|
141
156
|
def cols(&block)
|
|
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
|
|
@@ -249,7 +264,7 @@ module Axlsx
|
|
|
249
264
|
@header_footer
|
|
250
265
|
end
|
|
251
266
|
|
|
252
|
-
#
|
|
267
|
+
# convenience method to access all cells in this worksheet
|
|
253
268
|
# @return [Array] cells
|
|
254
269
|
def cells
|
|
255
270
|
rows.flatten
|
|
@@ -290,50 +305,6 @@ module Axlsx
|
|
|
290
305
|
@sheet_pr ||= SheetPr.new self
|
|
291
306
|
end
|
|
292
307
|
|
|
293
|
-
# Indicates if gridlines should be shown in the sheet.
|
|
294
|
-
# This is true by default.
|
|
295
|
-
# @return [Boolean]
|
|
296
|
-
# @deprecated Use SheetView#show_grid_lines= instead.
|
|
297
|
-
def show_gridlines=(v)
|
|
298
|
-
warn('axlsx::DEPRECIATED: Worksheet#show_gridlines= has been depreciated. This value can be set over SheetView#show_grid_lines=.')
|
|
299
|
-
Axlsx::validate_boolean v
|
|
300
|
-
sheet_view.show_grid_lines = v
|
|
301
|
-
end
|
|
302
|
-
|
|
303
|
-
# @see selected
|
|
304
|
-
# @return [Boolean]
|
|
305
|
-
# @deprecated Use SheetView#tab_selected= instead.
|
|
306
|
-
def selected=(v)
|
|
307
|
-
warn('axlsx::DEPRECIATED: Worksheet#selected= has been depreciated. This value can be set over SheetView#tab_selected=.')
|
|
308
|
-
Axlsx::validate_boolean v
|
|
309
|
-
sheet_view.tab_selected = v
|
|
310
|
-
end
|
|
311
|
-
|
|
312
|
-
# Indicates if the worksheet should show gridlines or not
|
|
313
|
-
# @return Boolean
|
|
314
|
-
# @deprecated Use SheetView#show_grid_lines instead.
|
|
315
|
-
def show_gridlines
|
|
316
|
-
warn('axlsx::DEPRECIATED: Worksheet#show_gridlines has been depreciated. This value can get over SheetView#show_grid_lines.')
|
|
317
|
-
sheet_view.show_grid_lines
|
|
318
|
-
end
|
|
319
|
-
|
|
320
|
-
# Indicates if the worksheet is selected in the workbook
|
|
321
|
-
# It is possible to have more than one worksheet selected, however it might cause issues
|
|
322
|
-
# in some older versions of excel when using copy and paste.
|
|
323
|
-
# @return Boolean
|
|
324
|
-
# @deprecated Use SheetView#tab_selected instead.
|
|
325
|
-
def selected
|
|
326
|
-
warn('axlsx::DEPRECIATED: Worksheet#selected has been depreciated. This value can get over SheetView#tab_selected.')
|
|
327
|
-
sheet_view.tab_selected
|
|
328
|
-
end
|
|
329
|
-
|
|
330
|
-
# (see #fit_to_page)
|
|
331
|
-
# @return [Boolean]
|
|
332
|
-
def fit_to_page=(v)
|
|
333
|
-
warn('axlsx::DEPRECIATED: Worksheet#fit_to_page has been depreciated. This value will automatically be set for you when you use PageSetup#fit_to.')
|
|
334
|
-
fit_to_page?
|
|
335
|
-
end
|
|
336
|
-
|
|
337
308
|
# The name of the worksheet
|
|
338
309
|
# The name of a worksheet must be unique in the workbook, and must not exceed 31 characters
|
|
339
310
|
# @param [String] name
|
|
@@ -346,7 +317,7 @@ module Axlsx
|
|
|
346
317
|
# @param [String] v
|
|
347
318
|
# @see auto_filter
|
|
348
319
|
def auto_filter=(v)
|
|
349
|
-
DataTypeValidator.validate
|
|
320
|
+
DataTypeValidator.validate :worksheet_auto_filter, String, v
|
|
350
321
|
auto_filter.range = v
|
|
351
322
|
end
|
|
352
323
|
|
|
@@ -427,10 +398,10 @@ module Axlsx
|
|
|
427
398
|
# @option options [Array] widths each member of the widths array will affect how auto_fit behavies.
|
|
428
399
|
# @option options [Float] height the row's height (in points)
|
|
429
400
|
def add_row(values=[], options={})
|
|
430
|
-
Row.new(self, values, options)
|
|
431
|
-
update_column_info
|
|
432
|
-
yield
|
|
433
|
-
|
|
401
|
+
row = Row.new(self, values, options)
|
|
402
|
+
update_column_info row, options.delete(:widths)
|
|
403
|
+
yield row if block_given?
|
|
404
|
+
row
|
|
434
405
|
end
|
|
435
406
|
|
|
436
407
|
alias :<< :add_row
|
|
@@ -522,7 +493,7 @@ module Axlsx
|
|
|
522
493
|
# @example
|
|
523
494
|
# ws.add_page_break("A4")
|
|
524
495
|
def add_page_break(cell)
|
|
525
|
-
DataTypeValidator.validate
|
|
496
|
+
DataTypeValidator.validate :worksheet_page_break, [String, Cell], cell
|
|
526
497
|
column_index, row_index = if cell.is_a?(String)
|
|
527
498
|
Axlsx.name_to_indices(cell)
|
|
528
499
|
else
|
|
@@ -535,12 +506,12 @@ module Axlsx
|
|
|
535
506
|
end
|
|
536
507
|
|
|
537
508
|
# This is a helper method that Lets you specify a fixed width for multiple columns in a worksheet in one go.
|
|
538
|
-
#
|
|
509
|
+
# Note that you must call column_widths AFTER adding data, otherwise the width will not be set successfully.
|
|
539
510
|
# 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
511
|
# @example This would set the first and third column widhts but leave the second column in autofit state.
|
|
541
512
|
# ws.column_widths 7.2, nil, 3
|
|
542
513
|
# @note For updating only a single column it is probably easier to just set the width of the ws.column_info[col_index].width directly
|
|
543
|
-
# @param [Integer|Float|
|
|
514
|
+
# @param [Integer|Float|nil] widths
|
|
544
515
|
def column_widths(*widths)
|
|
545
516
|
widths.each_with_index do |value, index|
|
|
546
517
|
next if value == nil
|
|
@@ -559,7 +530,7 @@ module Axlsx
|
|
|
559
530
|
# @see README.md for an example
|
|
560
531
|
def col_style(index, style, options={})
|
|
561
532
|
offset = options.delete(:row_offset) || 0
|
|
562
|
-
cells = @rows[(offset..-1)].map { |row| row
|
|
533
|
+
cells = @rows[(offset..-1)].map { |row| row[index] }.flatten.compact
|
|
563
534
|
cells.each { |cell| cell.style = style }
|
|
564
535
|
end
|
|
565
536
|
|
|
@@ -577,18 +548,27 @@ module Axlsx
|
|
|
577
548
|
cells.each { |cell| cell.style = style }
|
|
578
549
|
end
|
|
579
550
|
|
|
551
|
+
# Returns a sheet node serialization for this sheet in the workbook.
|
|
552
|
+
def to_sheet_node_xml_string(str='')
|
|
553
|
+
add_autofilter_defined_name_to_workbook
|
|
554
|
+
str << '<sheet '
|
|
555
|
+
serialized_attributes str
|
|
556
|
+
str << ('name="' << name << '" ')
|
|
557
|
+
str << ('r:id="' << rId << '"></sheet>')
|
|
558
|
+
end
|
|
559
|
+
|
|
580
560
|
# Serializes the worksheet object to an xml string
|
|
581
561
|
# This intentionally does not use nokogiri for performance reasons
|
|
582
562
|
# @return [String]
|
|
583
|
-
def to_xml_string
|
|
563
|
+
def to_xml_string str=''
|
|
564
|
+
add_autofilter_defined_name_to_workbook
|
|
584
565
|
auto_filter.apply if auto_filter.range
|
|
585
|
-
str
|
|
566
|
+
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
|
586
567
|
str << worksheet_node
|
|
587
568
|
serializable_parts.each do |item|
|
|
588
569
|
item.to_xml_string(str) if item
|
|
589
570
|
end
|
|
590
571
|
str << '</worksheet>'
|
|
591
|
-
Axlsx::sanitize(str)
|
|
592
572
|
end
|
|
593
573
|
|
|
594
574
|
# The worksheet relationships. This is managed automatically by the worksheet
|
|
@@ -606,7 +586,7 @@ module Axlsx
|
|
|
606
586
|
# Returns the cell or cells defined using excel style A1:B3 references.
|
|
607
587
|
# @param [String|Integer] cell_def the string defining the cell or range of cells, or the rownumber
|
|
608
588
|
# @return [Cell, Array]
|
|
609
|
-
def []
|
|
589
|
+
def [](cell_def)
|
|
610
590
|
return rows[cell_def] if cell_def.is_a?(Integer)
|
|
611
591
|
parts = cell_def.split(':').map{ |part| name_to_cell part }
|
|
612
592
|
if parts.size == 1
|
|
@@ -622,7 +602,7 @@ module Axlsx
|
|
|
622
602
|
def name_to_cell(name)
|
|
623
603
|
col_index, row_index = *Axlsx::name_to_indices(name)
|
|
624
604
|
r = rows[row_index]
|
|
625
|
-
r
|
|
605
|
+
r[col_index] if r
|
|
626
606
|
end
|
|
627
607
|
|
|
628
608
|
# shortcut method to access styles direclty from the worksheet
|
|
@@ -675,7 +655,7 @@ module Axlsx
|
|
|
675
655
|
end
|
|
676
656
|
|
|
677
657
|
def validate_sheet_name(name)
|
|
678
|
-
DataTypeValidator.validate
|
|
658
|
+
DataTypeValidator.validate :worksheet_name, String, name
|
|
679
659
|
raise ArgumentError, (ERR_SHEET_NAME_TOO_LONG % name) if name.size > 31
|
|
680
660
|
raise ArgumentError, (ERR_SHEET_NAME_CHARACTER_FORBIDDEN % name) if '[]*/\?:'.chars.any? { |char| name.include? char }
|
|
681
661
|
name = Axlsx::coder.encode(name)
|
|
@@ -695,8 +675,8 @@ module Axlsx
|
|
|
695
675
|
def range(*cell_def)
|
|
696
676
|
first, last = cell_def
|
|
697
677
|
cells = []
|
|
698
|
-
rows[(first.row.
|
|
699
|
-
r
|
|
678
|
+
rows[(first.row.row_index..last.row.row_index)].each do |r|
|
|
679
|
+
r[(first.index..last.index)].each do |c|
|
|
700
680
|
cells << c
|
|
701
681
|
end
|
|
702
682
|
end
|
|
@@ -734,7 +714,7 @@ module Axlsx
|
|
|
734
714
|
# Helper method for parsingout the root node for worksheet
|
|
735
715
|
# @return [String]
|
|
736
716
|
def worksheet_node
|
|
737
|
-
|
|
717
|
+
"<worksheet xmlns=\"#{XML_NS}\" xmlns:r=\"#{XML_NS_R}\" xml:space=\"#{xml_space}\">"
|
|
738
718
|
end
|
|
739
719
|
|
|
740
720
|
def sheet_data
|
|
@@ -753,11 +733,12 @@ module Axlsx
|
|
|
753
733
|
|
|
754
734
|
def workbook=(v) DataTypeValidator.validate "Worksheet.workbook", Workbook, v; @workbook = v; end
|
|
755
735
|
|
|
756
|
-
def update_column_info(cells, widths=
|
|
736
|
+
def update_column_info(cells, widths=nil)
|
|
757
737
|
cells.each_with_index do |cell, index|
|
|
738
|
+
width = widths ? widths[index] : nil
|
|
758
739
|
col = find_or_create_column_info(index)
|
|
759
|
-
next if
|
|
760
|
-
col.update_width(cell,
|
|
740
|
+
next if width == :ignore
|
|
741
|
+
col.update_width(cell, width, workbook.use_autowidth)
|
|
761
742
|
end
|
|
762
743
|
end
|
|
763
744
|
|
|
@@ -765,5 +746,10 @@ module Axlsx
|
|
|
765
746
|
column_info[index] ||= Col.new(index + 1, index + 1)
|
|
766
747
|
end
|
|
767
748
|
|
|
749
|
+
def add_autofilter_defined_name_to_workbook
|
|
750
|
+
return if !auto_filter.range
|
|
751
|
+
workbook.add_defined_name auto_filter.defined_name, name: '_xlnm._FilterDatabase', local_sheet_id: index, hidden: 1
|
|
752
|
+
end
|
|
753
|
+
|
|
768
754
|
end
|
|
769
755
|
end
|