caxlsx 2.0.2 → 3.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +125 -30
- data/README.md +65 -151
- data/Rakefile +9 -11
- data/examples/{image1.jpeg → assets/image1.jpeg} +0 -0
- data/examples/generate.rb +15 -0
- data/lib/axlsx.rb +35 -17
- 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 +12 -14
- 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 +4 -4
- 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 +4 -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 +23 -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 +58 -47
- data/lib/axlsx/rels/relationship.rb +27 -26
- 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 +11 -3
- 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 +108 -99
- data/lib/axlsx/util/mime_type_utils.rb +11 -0
- data/lib/axlsx/util/options_parser.rb +2 -1
- 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 +31 -19
- data/lib/axlsx/util/zip_command.rb +73 -0
- 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 -20
- 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 +164 -75
- 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 +14 -13
- 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 +8 -6
- 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 +42 -52
- 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 +76 -81
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +10 -10
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +3 -3
- data/lib/caxlsx.rb +2 -0
- 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 +4 -4
- data/test/drawing/tc_hyperlink.rb +1 -1
- data/test/drawing/tc_line_chart.rb +5 -5
- data/test/drawing/tc_line_series.rb +47 -6
- data/test/drawing/tc_one_cell_anchor.rb +1 -1
- data/test/drawing/tc_pic.rb +11 -15
- data/test/drawing/tc_pie_series.rb +2 -1
- data/test/drawing/tc_scatter_series.rb +36 -1
- data/test/drawing/tc_series_title.rb +21 -0
- data/test/drawing/tc_str_val.rb +9 -0
- data/test/drawing/tc_title.rb +21 -0
- data/test/fixtures/image1.gif +0 -0
- data/test/fixtures/image1.jpeg +0 -0
- data/test/fixtures/image1.jpg +0 -0
- data/test/fixtures/image1.png +0 -0
- data/test/fixtures/image1_fake.jpg +0 -0
- data/test/rels/tc_relationship.rb +8 -0
- data/test/stylesheet/tc_font.rb +14 -2
- data/test/stylesheet/tc_styles.rb +29 -3
- data/test/tc_axlsx.rb +37 -0
- data/test/tc_helper.rb +2 -0
- data/test/tc_package.rb +50 -13
- 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 +35 -11
- 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 +143 -9
- data/test/workbook/worksheet/tc_col.rb +18 -3
- 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 +173 -0
- data/test/workbook/worksheet/tc_row.rb +24 -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 +123 -60
- metadata +180 -128
- data/examples/2010_comments.rb +0 -17
- data/examples/anchor_swapping.rb +0 -28
- data/examples/auto_filter.rb +0 -16
- data/examples/basic_charts.rb +0 -58
- data/examples/chart_colors.rb +0 -88
- data/examples/colored_links.rb +0 -59
- data/examples/conditional_formatting/example_conditional_formatting.rb +0 -74
- data/examples/conditional_formatting/getting_barred.rb +0 -37
- data/examples/conditional_formatting/hitting_the_high_notes.rb +0 -37
- data/examples/conditional_formatting/scaled_colors.rb +0 -39
- data/examples/conditional_formatting/stop_and_go.rb +0 -37
- data/examples/data_validation.rb +0 -50
- data/examples/example.rb +0 -777
- data/examples/extractive.rb +0 -45
- data/examples/ios_preview.rb +0 -14
- data/examples/page_setup.rb +0 -11
- data/examples/pivot_table.rb +0 -39
- data/examples/sheet_protection.rb +0 -10
- data/examples/skydrive/real_example.rb +0 -63
- data/examples/styles.rb +0 -66
- data/examples/underline.rb +0 -13
- data/examples/wrap_text.rb +0 -21
- data/lib/axlsx/util/parser.rb +0 -44
@@ -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,7 @@ module Axlsx
|
|
4
4
|
# The Worksheet class represents a worksheet in the workbook.
|
5
5
|
class Worksheet
|
6
6
|
include Axlsx::OptionsParser
|
7
|
-
|
8
|
-
# definition of characters which are less than the maximum width of 0-9 in the default font for use in String#count.
|
9
|
-
# This is used for autowidth calculations
|
10
|
-
# @return [String]
|
11
|
-
def self.thin_chars
|
12
|
-
# removed 'e' and 'y' from this list - as a GUESS
|
13
|
-
@thin_chars ||= "^.acfijklrstxzFIJL()-"
|
14
|
-
end
|
7
|
+
include Axlsx::SerializedAttributes
|
15
8
|
|
16
9
|
# Creates a new worksheet.
|
17
10
|
# @note the recommended way to manage worksheets is Workbook#add_worksheet
|
@@ -24,12 +17,15 @@ module Axlsx
|
|
24
17
|
def initialize(wb, options={})
|
25
18
|
self.workbook = wb
|
26
19
|
@sheet_protection = nil
|
27
|
-
|
28
20
|
initialize_page_options(options)
|
29
21
|
parse_options options
|
30
22
|
@workbook.worksheets << self
|
23
|
+
@sheet_id = index + 1
|
24
|
+
yield self if block_given?
|
31
25
|
end
|
32
26
|
|
27
|
+
serializable_attributes :sheet_id, :state
|
28
|
+
|
33
29
|
# Initalizes page margin, setup and print options
|
34
30
|
# @param [Hash] options Options passed in from the initializer
|
35
31
|
def initialize_page_options(options)
|
@@ -44,7 +40,23 @@ module Axlsx
|
|
44
40
|
# The name of the worksheet
|
45
41
|
# @return [String]
|
46
42
|
def name
|
47
|
-
@name ||=
|
43
|
+
@name ||= "Sheet" + (index+1).to_s
|
44
|
+
end
|
45
|
+
|
46
|
+
# Specifies the visible state of this sheet. Allowed states are
|
47
|
+
# :visible, :hidden or :very_hidden. The default value is :visible.
|
48
|
+
#
|
49
|
+
# Worksheets in the :hidden state can be shown using the sheet formatting properties in excel.
|
50
|
+
# :very_hidden sheets should be inaccessible to end users.
|
51
|
+
# @param [Symbol] sheet_state The visible state for this sheet.
|
52
|
+
def state=(sheet_state)
|
53
|
+
RestrictionValidator.validate :worksheet_state, [:visible, :hidden, :very_hidden], sheet_state
|
54
|
+
@state = sheet_state
|
55
|
+
end
|
56
|
+
|
57
|
+
# The visibility of this sheet
|
58
|
+
def state
|
59
|
+
@state ||= :visible
|
48
60
|
end
|
49
61
|
|
50
62
|
# The sheet calculation properties
|
@@ -76,7 +88,7 @@ module Axlsx
|
|
76
88
|
# @see [SheetFormatPr]
|
77
89
|
def sheet_format_pr
|
78
90
|
@sheet_format_pr ||= SheetFormatPr.new
|
79
|
-
|
91
|
+
yield @sheet_format_pr if block_given?
|
80
92
|
@sheet_format_pr
|
81
93
|
end
|
82
94
|
|
@@ -129,7 +141,7 @@ module Axlsx
|
|
129
141
|
# @return [SimpleTypedList]
|
130
142
|
# @see Worksheet#add_row
|
131
143
|
def rows
|
132
|
-
@rows ||=
|
144
|
+
@rows ||= SimpleTypedList.new Row
|
133
145
|
end
|
134
146
|
|
135
147
|
# returns the sheet data as columns
|
@@ -137,12 +149,12 @@ module Axlsx
|
|
137
149
|
# cell at a specific index. The block will be called with the row and column
|
138
150
|
# index in the missing cell was found.
|
139
151
|
# @example
|
140
|
-
# cols { |row_index, column_index|
|
152
|
+
# cols { |row_index, column_index| puts "warn - row #{row_index} does not have a cell at #{column_index}" }
|
141
153
|
def cols(&block)
|
142
154
|
@rows.transpose(&block)
|
143
155
|
end
|
144
156
|
|
145
|
-
#
|
157
|
+
# A range that excel will apply an auto-filter to "A1:B3"
|
146
158
|
# This will turn filtering on for the cells in the range.
|
147
159
|
# The first row is considered the header, while subsequent rows are considered to be data.
|
148
160
|
# @return String
|
@@ -249,7 +261,7 @@ module Axlsx
|
|
249
261
|
@header_footer
|
250
262
|
end
|
251
263
|
|
252
|
-
#
|
264
|
+
# convenience method to access all cells in this worksheet
|
253
265
|
# @return [Array] cells
|
254
266
|
def cells
|
255
267
|
rows.flatten
|
@@ -290,50 +302,6 @@ module Axlsx
|
|
290
302
|
@sheet_pr ||= SheetPr.new self
|
291
303
|
end
|
292
304
|
|
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
305
|
# The name of the worksheet
|
338
306
|
# The name of a worksheet must be unique in the workbook, and must not exceed 31 characters
|
339
307
|
# @param [String] name
|
@@ -346,7 +314,7 @@ module Axlsx
|
|
346
314
|
# @param [String] v
|
347
315
|
# @see auto_filter
|
348
316
|
def auto_filter=(v)
|
349
|
-
DataTypeValidator.validate
|
317
|
+
DataTypeValidator.validate :worksheet_auto_filter, String, v
|
350
318
|
auto_filter.range = v
|
351
319
|
end
|
352
320
|
|
@@ -419,6 +387,12 @@ module Axlsx
|
|
419
387
|
# @example - use << alias
|
420
388
|
# ws << [3, 4, 5], :types => [nil, :float]
|
421
389
|
#
|
390
|
+
# @example - specify whether a row should escape formulas or not
|
391
|
+
# ws.add_row ['=IF(2+2=4,4,5)', 2, 3], :escape_formulas=>true
|
392
|
+
#
|
393
|
+
# @example - specify whether a certain cells in a row should escape formulas or not
|
394
|
+
# ws.add_row ['=IF(2+2=4,4,5)', '=IF(13+13=4,4,5)'], :escape_formulas=>[true, false]
|
395
|
+
#
|
422
396
|
# @see Worksheet#column_widths
|
423
397
|
# @return [Row]
|
424
398
|
# @option options [Array] values
|
@@ -426,11 +400,15 @@ module Axlsx
|
|
426
400
|
# @option options [Array, Integer] style
|
427
401
|
# @option options [Array] widths each member of the widths array will affect how auto_fit behavies.
|
428
402
|
# @option options [Float] height the row's height (in points)
|
403
|
+
# @option options [Array, Boolean] escape_formulas - Whether to treat a value starting with an equal
|
404
|
+
# sign as formula (default) or as simple string.
|
405
|
+
# Allowing user generated data to be interpreted as formulas can be dangerous
|
406
|
+
# (see https://www.owasp.org/index.php/CSV_Injection for details).
|
429
407
|
def add_row(values=[], options={})
|
430
|
-
Row.new(self, values, options)
|
431
|
-
update_column_info
|
432
|
-
yield
|
433
|
-
|
408
|
+
row = Row.new(self, values, options)
|
409
|
+
update_column_info row, options.delete(:widths)
|
410
|
+
yield row if block_given?
|
411
|
+
row
|
434
412
|
end
|
435
413
|
|
436
414
|
alias :<< :add_row
|
@@ -522,7 +500,7 @@ module Axlsx
|
|
522
500
|
# @example
|
523
501
|
# ws.add_page_break("A4")
|
524
502
|
def add_page_break(cell)
|
525
|
-
DataTypeValidator.validate
|
503
|
+
DataTypeValidator.validate :worksheet_page_break, [String, Cell], cell
|
526
504
|
column_index, row_index = if cell.is_a?(String)
|
527
505
|
Axlsx.name_to_indices(cell)
|
528
506
|
else
|
@@ -535,12 +513,12 @@ module Axlsx
|
|
535
513
|
end
|
536
514
|
|
537
515
|
# This is a helper method that Lets you specify a fixed width for multiple columns in a worksheet in one go.
|
538
|
-
#
|
516
|
+
# Note that you must call column_widths AFTER adding data, otherwise the width will not be set successfully.
|
539
517
|
# 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
518
|
# @example This would set the first and third column widhts but leave the second column in autofit state.
|
541
519
|
# ws.column_widths 7.2, nil, 3
|
542
520
|
# @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|
|
521
|
+
# @param [Integer|Float|nil] widths
|
544
522
|
def column_widths(*widths)
|
545
523
|
widths.each_with_index do |value, index|
|
546
524
|
next if value == nil
|
@@ -559,7 +537,7 @@ module Axlsx
|
|
559
537
|
# @see README.md for an example
|
560
538
|
def col_style(index, style, options={})
|
561
539
|
offset = options.delete(:row_offset) || 0
|
562
|
-
cells = @rows[(offset..-1)].map { |row| row
|
540
|
+
cells = @rows[(offset..-1)].map { |row| row[index] }.flatten.compact
|
563
541
|
cells.each { |cell| cell.style = style }
|
564
542
|
end
|
565
543
|
|
@@ -577,18 +555,27 @@ module Axlsx
|
|
577
555
|
cells.each { |cell| cell.style = style }
|
578
556
|
end
|
579
557
|
|
558
|
+
# Returns a sheet node serialization for this sheet in the workbook.
|
559
|
+
def to_sheet_node_xml_string(str='')
|
560
|
+
add_autofilter_defined_name_to_workbook
|
561
|
+
str << '<sheet '
|
562
|
+
serialized_attributes str
|
563
|
+
str << ('name="' << name << '" ')
|
564
|
+
str << ('r:id="' << rId << '"></sheet>')
|
565
|
+
end
|
566
|
+
|
580
567
|
# Serializes the worksheet object to an xml string
|
581
568
|
# This intentionally does not use nokogiri for performance reasons
|
582
569
|
# @return [String]
|
583
|
-
def to_xml_string
|
570
|
+
def to_xml_string str=''
|
571
|
+
add_autofilter_defined_name_to_workbook
|
584
572
|
auto_filter.apply if auto_filter.range
|
585
|
-
str
|
573
|
+
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
586
574
|
str << worksheet_node
|
587
575
|
serializable_parts.each do |item|
|
588
576
|
item.to_xml_string(str) if item
|
589
577
|
end
|
590
578
|
str << '</worksheet>'
|
591
|
-
Axlsx::sanitize(str)
|
592
579
|
end
|
593
580
|
|
594
581
|
# The worksheet relationships. This is managed automatically by the worksheet
|
@@ -606,7 +593,7 @@ module Axlsx
|
|
606
593
|
# Returns the cell or cells defined using excel style A1:B3 references.
|
607
594
|
# @param [String|Integer] cell_def the string defining the cell or range of cells, or the rownumber
|
608
595
|
# @return [Cell, Array]
|
609
|
-
def []
|
596
|
+
def [](cell_def)
|
610
597
|
return rows[cell_def] if cell_def.is_a?(Integer)
|
611
598
|
parts = cell_def.split(':').map{ |part| name_to_cell part }
|
612
599
|
if parts.size == 1
|
@@ -622,7 +609,7 @@ module Axlsx
|
|
622
609
|
def name_to_cell(name)
|
623
610
|
col_index, row_index = *Axlsx::name_to_indices(name)
|
624
611
|
r = rows[row_index]
|
625
|
-
r
|
612
|
+
r[col_index] if r
|
626
613
|
end
|
627
614
|
|
628
615
|
# shortcut method to access styles direclty from the worksheet
|
@@ -675,8 +662,10 @@ module Axlsx
|
|
675
662
|
end
|
676
663
|
|
677
664
|
def validate_sheet_name(name)
|
678
|
-
DataTypeValidator.validate
|
679
|
-
|
665
|
+
DataTypeValidator.validate :worksheet_name, String, name
|
666
|
+
# ignore first character (BOM) after encoding to utf16 because Excel does so, too.
|
667
|
+
character_length = name.encode("utf-16")[1..-1].encode("utf-16").bytesize / 2
|
668
|
+
raise ArgumentError, (ERR_SHEET_NAME_TOO_LONG % name) if character_length > 31
|
680
669
|
raise ArgumentError, (ERR_SHEET_NAME_CHARACTER_FORBIDDEN % name) if '[]*/\?:'.chars.any? { |char| name.include? char }
|
681
670
|
name = Axlsx::coder.encode(name)
|
682
671
|
sheet_names = @workbook.worksheets.reject { |s| s == self }.map { |s| s.name }
|
@@ -695,8 +684,8 @@ module Axlsx
|
|
695
684
|
def range(*cell_def)
|
696
685
|
first, last = cell_def
|
697
686
|
cells = []
|
698
|
-
rows[(first.row.
|
699
|
-
r
|
687
|
+
rows[(first.row.row_index..last.row.row_index)].each do |r|
|
688
|
+
r[(first.index..last.index)].each do |c|
|
700
689
|
cells << c
|
701
690
|
end
|
702
691
|
end
|
@@ -734,7 +723,7 @@ module Axlsx
|
|
734
723
|
# Helper method for parsingout the root node for worksheet
|
735
724
|
# @return [String]
|
736
725
|
def worksheet_node
|
737
|
-
|
726
|
+
"<worksheet xmlns=\"#{XML_NS}\" xmlns:r=\"#{XML_NS_R}\" xml:space=\"#{xml_space}\">"
|
738
727
|
end
|
739
728
|
|
740
729
|
def sheet_data
|
@@ -753,11 +742,12 @@ module Axlsx
|
|
753
742
|
|
754
743
|
def workbook=(v) DataTypeValidator.validate "Worksheet.workbook", Workbook, v; @workbook = v; end
|
755
744
|
|
756
|
-
def update_column_info(cells, widths=
|
745
|
+
def update_column_info(cells, widths=nil)
|
757
746
|
cells.each_with_index do |cell, index|
|
747
|
+
width = widths ? widths[index] : nil
|
758
748
|
col = find_or_create_column_info(index)
|
759
|
-
next if
|
760
|
-
col.update_width(cell,
|
749
|
+
next if width == :ignore
|
750
|
+
col.update_width(cell, width, workbook.use_autowidth)
|
761
751
|
end
|
762
752
|
end
|
763
753
|
|
@@ -765,5 +755,10 @@ module Axlsx
|
|
765
755
|
column_info[index] ||= Col.new(index + 1, index + 1)
|
766
756
|
end
|
767
757
|
|
758
|
+
def add_autofilter_defined_name_to_workbook
|
759
|
+
return if !auto_filter.range
|
760
|
+
workbook.add_defined_name auto_filter.defined_name, name: '_xlnm._FilterDatabase', local_sheet_id: index, hidden: 1
|
761
|
+
end
|
762
|
+
|
768
763
|
end
|
769
764
|
end
|