axlsx 1.2.0 → 2.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 +7 -0
- data/.yardopts +3 -2
- data/.yardopts_guide +19 -0
- data/CHANGELOG.md +64 -1
- data/README.md +105 -87
- data/Rakefile +0 -5
- data/examples/2010_comments.rb +17 -0
- data/examples/anchor_swapping.rb +28 -0
- data/examples/auto_filter.rb +16 -0
- data/examples/basic_charts.rb +4 -0
- data/examples/colored_links.rb +59 -0
- data/examples/conditional_formatting/example_conditional_formatting.rb +4 -2
- data/examples/example.rb +569 -258
- data/examples/ios_preview.rb +14 -0
- data/examples/page_setup.rb +11 -0
- data/examples/pivot_table.rb +39 -0
- data/examples/skydrive/real_example.rb +8 -8
- data/examples/styles.rb +66 -0
- data/examples/underline.rb +13 -0
- data/examples/wrap_text.rb +21 -0
- data/lib/axlsx/content_type/abstract_content_type.rb +32 -0
- data/lib/axlsx/content_type/content_type.rb +1 -1
- data/lib/axlsx/content_type/default.rb +6 -37
- data/lib/axlsx/content_type/override.rb +6 -38
- data/lib/axlsx/doc_props/app.rb +10 -7
- data/lib/axlsx/doc_props/core.rb +6 -1
- data/lib/axlsx/drawing/axes.rb +61 -0
- data/lib/axlsx/drawing/axis.rb +20 -17
- data/lib/axlsx/drawing/bar_3D_chart.rb +31 -22
- data/lib/axlsx/drawing/cat_axis.rb +2 -10
- data/lib/axlsx/drawing/chart.rb +33 -6
- data/lib/axlsx/drawing/d_lbls.rb +21 -31
- data/lib/axlsx/drawing/drawing.rb +11 -17
- data/lib/axlsx/drawing/graphic_frame.rb +3 -3
- data/lib/axlsx/drawing/hyperlink.rb +42 -36
- data/lib/axlsx/drawing/line_3D_chart.rb +28 -70
- data/lib/axlsx/drawing/line_chart.rb +99 -0
- data/lib/axlsx/drawing/line_series.rb +20 -2
- data/lib/axlsx/drawing/marker.rb +38 -18
- data/lib/axlsx/drawing/num_data.rb +6 -6
- data/lib/axlsx/drawing/num_data_source.rb +17 -16
- data/lib/axlsx/drawing/one_cell_anchor.rb +28 -21
- data/lib/axlsx/drawing/pic.rb +43 -45
- data/lib/axlsx/drawing/picture_locking.rb +12 -44
- data/lib/axlsx/drawing/pie_3D_chart.rb +2 -1
- data/lib/axlsx/drawing/scaling.rb +13 -13
- data/lib/axlsx/drawing/scatter_chart.rb +32 -21
- data/lib/axlsx/drawing/ser_axis.rb +15 -16
- data/lib/axlsx/drawing/series.rb +3 -6
- data/lib/axlsx/drawing/str_data.rb +3 -3
- data/lib/axlsx/drawing/str_val.rb +7 -8
- data/lib/axlsx/drawing/two_cell_anchor.rb +7 -27
- data/lib/axlsx/drawing/val_axis.rb +14 -13
- data/lib/axlsx/drawing/view_3D.rb +52 -38
- data/lib/axlsx/drawing/vml_shape.rb +20 -79
- data/lib/axlsx/package.rb +58 -28
- data/lib/axlsx/rels/relationship.rb +75 -9
- data/lib/axlsx/rels/relationships.rb +8 -1
- data/lib/axlsx/stylesheet/border.rb +29 -20
- data/lib/axlsx/stylesheet/border_pr.rb +5 -4
- data/lib/axlsx/stylesheet/cell_alignment.rb +55 -29
- data/lib/axlsx/stylesheet/cell_protection.rb +7 -4
- data/lib/axlsx/stylesheet/cell_style.rb +19 -14
- data/lib/axlsx/stylesheet/color.rb +20 -17
- data/lib/axlsx/stylesheet/dxf.rb +4 -4
- data/lib/axlsx/stylesheet/font.rb +22 -22
- data/lib/axlsx/stylesheet/gradient_fill.rb +45 -21
- data/lib/axlsx/stylesheet/num_fmt.rb +23 -14
- data/lib/axlsx/stylesheet/pattern_fill.rb +12 -21
- data/lib/axlsx/stylesheet/styles.rb +37 -22
- data/lib/axlsx/stylesheet/table_style.rb +17 -16
- data/lib/axlsx/stylesheet/table_style_element.rb +15 -11
- data/lib/axlsx/stylesheet/table_styles.rb +14 -11
- data/lib/axlsx/stylesheet/xf.rb +28 -26
- data/lib/axlsx/util/accessors.rb +64 -0
- data/lib/axlsx/util/constants.rb +127 -6
- data/lib/axlsx/util/options_parser.rb +15 -0
- data/lib/axlsx/util/serialized_attributes.rb +79 -0
- data/lib/axlsx/util/simple_typed_list.rb +50 -15
- data/lib/axlsx/util/validators.rb +51 -16
- data/lib/axlsx/version.rb +2 -2
- data/lib/axlsx/workbook/defined_name.rb +14 -59
- data/lib/axlsx/workbook/shared_strings_table.rb +13 -4
- data/lib/axlsx/workbook/workbook.rb +85 -6
- data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +77 -0
- data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -0
- data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +246 -0
- data/lib/axlsx/workbook/worksheet/break.rb +37 -0
- data/lib/axlsx/workbook/worksheet/cell.rb +109 -107
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +144 -0
- data/lib/axlsx/workbook/worksheet/cfvo.rb +15 -15
- data/lib/axlsx/workbook/worksheet/cfvos.rb +15 -0
- data/lib/axlsx/workbook/worksheet/col.rb +43 -29
- data/lib/axlsx/workbook/worksheet/col_breaks.rb +35 -0
- data/lib/axlsx/workbook/worksheet/color_scale.rb +62 -28
- data/lib/axlsx/workbook/worksheet/comment.rb +28 -37
- data/lib/axlsx/workbook/worksheet/comments.rb +3 -3
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +11 -11
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +31 -27
- data/lib/axlsx/workbook/worksheet/data_bar.rb +75 -41
- data/lib/axlsx/workbook/worksheet/data_validation.rb +61 -62
- data/lib/axlsx/workbook/worksheet/date_time_converter.rb +6 -5
- data/lib/axlsx/workbook/worksheet/dimension.rb +0 -1
- data/lib/axlsx/workbook/worksheet/header_footer.rb +54 -0
- data/lib/axlsx/workbook/worksheet/icon_set.rb +20 -20
- data/lib/axlsx/workbook/worksheet/page_margins.rb +21 -19
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +44 -0
- data/lib/axlsx/workbook/worksheet/page_setup.rb +152 -23
- data/lib/axlsx/workbook/worksheet/pane.rb +48 -51
- data/lib/axlsx/workbook/worksheet/pivot_table.rb +273 -0
- data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +66 -0
- data/lib/axlsx/workbook/worksheet/pivot_tables.rb +24 -0
- data/lib/axlsx/workbook/worksheet/print_options.rb +8 -30
- data/lib/axlsx/workbook/worksheet/protected_range.rb +16 -13
- data/lib/axlsx/workbook/worksheet/row.rb +59 -83
- data/lib/axlsx/workbook/worksheet/row_breaks.rb +33 -0
- data/lib/axlsx/workbook/worksheet/selection.rb +30 -38
- data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +29 -0
- data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +60 -0
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +49 -4
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +51 -155
- data/lib/axlsx/workbook/worksheet/sheet_view.rb +68 -234
- data/lib/axlsx/workbook/worksheet/table.rb +25 -19
- data/lib/axlsx/workbook/worksheet/table_style_info.rb +51 -0
- data/lib/axlsx/workbook/worksheet/tables.rb +1 -1
- data/lib/axlsx/workbook/worksheet/worksheet.rb +174 -35
- data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +6 -5
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +4 -10
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +74 -0
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -0
- data/lib/axlsx.rb +55 -5
- data/lib/schema/sml.xsd +4 -0
- data/test/axlsx.qcachegrind +2226 -0
- data/test/benchmark.rb +2 -3
- data/test/content_type/tc_default.rb +0 -11
- data/test/content_type/tc_override.rb +0 -13
- data/test/doc_props/tc_core.rb +7 -0
- data/test/drawing/tc_axes.rb +8 -0
- data/test/drawing/tc_axis.rb +15 -17
- data/test/drawing/tc_bar_3D_chart.rb +6 -0
- data/test/drawing/tc_cat_axis.rb +9 -9
- data/test/drawing/tc_chart.rb +20 -0
- data/test/drawing/tc_d_lbls.rb +14 -4
- data/test/drawing/tc_drawing.rb +0 -5
- data/test/drawing/tc_graphic_frame.rb +5 -3
- data/test/drawing/tc_hyperlink.rb +0 -4
- data/test/drawing/tc_line_chart.rb +39 -0
- data/test/drawing/tc_line_series.rb +8 -2
- data/test/drawing/tc_pic.rb +14 -3
- data/test/drawing/tc_ser_axis.rb +13 -12
- data/test/drawing/tc_two_cell_anchor.rb +3 -3
- data/test/drawing/tc_val_axis.rb +6 -6
- data/test/drawing/tc_vml_shape.rb +9 -3
- data/test/profile.rb +11 -21
- data/test/rels/tc_relationship.rb +32 -9
- data/test/rels/tc_relationships.rb +12 -1
- data/test/stylesheet/tc_color.rb +6 -0
- data/test/stylesheet/tc_styles.rb +15 -2
- data/test/tc_axlsx.rb +35 -2
- data/test/tc_helper.rb +7 -1
- data/test/tc_package.rb +44 -5
- data/test/util/tc_serialized_attributes.rb +19 -0
- data/test/util/tc_validators.rb +26 -1
- data/test/workbook/tc_defined_name.rb +2 -2
- data/test/workbook/tc_shared_strings_table.rb +6 -0
- data/test/workbook/tc_workbook.rb +38 -1
- data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +38 -0
- data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +76 -0
- data/test/workbook/worksheet/auto_filter/tc_filters.rb +50 -0
- data/test/workbook/worksheet/tc_break.rb +49 -0
- data/test/workbook/worksheet/tc_cell.rb +40 -6
- data/test/workbook/worksheet/tc_col.rb +11 -1
- data/test/workbook/worksheet/tc_color_scale.rb +31 -2
- data/test/workbook/worksheet/tc_comment.rb +21 -6
- data/test/workbook/worksheet/tc_comments.rb +2 -2
- data/test/workbook/worksheet/tc_conditional_formatting.rb +7 -0
- data/test/workbook/worksheet/tc_data_bar.rb +7 -0
- data/test/workbook/worksheet/tc_date_time_converter.rb +3 -11
- data/test/workbook/worksheet/tc_header_footer.rb +151 -0
- data/test/workbook/worksheet/tc_page_set_up_pr.rb +15 -0
- data/test/workbook/worksheet/tc_page_setup.rb +6 -1
- data/test/workbook/worksheet/tc_pane.rb +5 -45
- data/test/workbook/worksheet/tc_pivot_table.rb +120 -0
- data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +54 -0
- data/test/workbook/worksheet/tc_row.rb +4 -4
- data/test/workbook/worksheet/tc_selection.rb +9 -48
- data/test/workbook/worksheet/tc_sheet_calc_pr.rb +18 -0
- data/test/workbook/worksheet/tc_sheet_format_pr.rb +88 -0
- data/test/workbook/worksheet/tc_sheet_pr.rb +27 -0
- data/test/workbook/worksheet/tc_sheet_view.rb +39 -39
- data/test/workbook/worksheet/{table/tc_table.rb → tc_table.rb} +8 -3
- data/test/workbook/worksheet/tc_table_style_info.rb +53 -0
- data/test/workbook/worksheet/tc_worksheet.rb +131 -16
- data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +55 -0
- metadata +97 -64
- data/examples/example.xlsx +0 -0
- data/examples/example_streamed.xlsx +0 -0
- data/examples/extractive.pdf +0 -0
- data/examples/image1.gif +0 -0
- data/examples/image1.jpg +0 -0
- data/examples/image1.png +0 -0
- data/examples/no-use_autowidth.xlsx +0 -0
- data/examples/sample.png +0 -0
- data/examples/scraping_html.rb +0 -91
- data/examples/shared_strings_example.xlsx +0 -0
- data/examples/sheet_view.rb +0 -34
- data/examples/two_cell_anchor_image.rb +0 -11
- data/lib/axlsx/workbook/worksheet/auto_filter.rb +0 -34
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
module Axlsx
|
|
2
|
+
|
|
3
|
+
# The Cell Serializer class contains the logic for serializing cells based on their type.
|
|
4
|
+
class CellSerializer
|
|
5
|
+
class << self
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# Calls the proper serialization method based on type.
|
|
9
|
+
# @param [Integer] row_index The index of the cell's row
|
|
10
|
+
# @param [Integer] column_index The index of the cell's column
|
|
11
|
+
# @param [String] str The string to apend serialization to.
|
|
12
|
+
# @return [String]
|
|
13
|
+
def to_xml_string(row_index, column_index, cell, str='')
|
|
14
|
+
str << '<c r="' << Axlsx::cell_r(column_index, row_index) << '" s="' << cell.style.to_s << '" '
|
|
15
|
+
return str << '/>' if cell.value.nil?
|
|
16
|
+
method = (cell.type.to_s << '_type_serialization').to_sym
|
|
17
|
+
self.send(method, cell, str)
|
|
18
|
+
str << '</c>'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# builds an xml text run based on this cells attributes.
|
|
23
|
+
# @param [String] str The string instance this run will be concated to.
|
|
24
|
+
# @return [String]
|
|
25
|
+
def run_xml_string(cell, str = '')
|
|
26
|
+
if cell.is_text_run?
|
|
27
|
+
data = cell.instance_values.reject{|key, value| value == nil || key == 'value' || key == 'type' }
|
|
28
|
+
keys = data.keys & Cell::INLINE_STYLES
|
|
29
|
+
str << "<r><rPr>"
|
|
30
|
+
keys.each do |key|
|
|
31
|
+
case key
|
|
32
|
+
when 'font_name'
|
|
33
|
+
str << "<rFont val='"<< cell.font_name << "'/>"
|
|
34
|
+
when 'color'
|
|
35
|
+
str << data[key].to_xml_string
|
|
36
|
+
else
|
|
37
|
+
str << "<" << key.to_s << " val='" << data[key].to_s << "'/>"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
str << "</rPr>" << "<t>" << cell.value.to_s << "</t></r>"
|
|
41
|
+
else
|
|
42
|
+
str << "<t>" << cell.value.to_s << "</t>"
|
|
43
|
+
end
|
|
44
|
+
str
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# serializes cells that are type iso_8601
|
|
48
|
+
# @param [Cell] cell The cell that is being serialized
|
|
49
|
+
# @param [String] str The string the serialized content will be appended to.
|
|
50
|
+
# @return [String]
|
|
51
|
+
def iso_8601_type_serialization(cell, str='')
|
|
52
|
+
value_serialization 'd', cell.value, str
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
# serializes cells that are type date
|
|
57
|
+
# @param [Cell] cell The cell that is being serialized
|
|
58
|
+
# @param [String] str The string the serialized content will be appended to.
|
|
59
|
+
# @return [String]
|
|
60
|
+
def date_type_serialization(cell, str='')
|
|
61
|
+
value_serialization false, DateTimeConverter::date_to_serial(cell.value).to_s, str
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Serializes cells that are type time
|
|
65
|
+
# @param [Cell] cell The cell that is being serialized
|
|
66
|
+
# @param [String] str The string the serialized content will be appended to.
|
|
67
|
+
# @return [String]
|
|
68
|
+
def time_type_serialization(cell, str='')
|
|
69
|
+
value_serialization false, DateTimeConverter::time_to_serial(cell.value).to_s, str
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Serializes cells that are type boolean
|
|
73
|
+
# @param [Cell] cell The cell that is being serialized
|
|
74
|
+
# @param [String] str The string the serialized content will be appended to.
|
|
75
|
+
# @return [String]
|
|
76
|
+
def boolean_type_serialization(cell, str='')
|
|
77
|
+
value_serialization 'b', cell.value.to_s, str
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Serializes cells that are type float
|
|
81
|
+
# @param [Cell] cell The cell that is being serialized
|
|
82
|
+
# @param [String] str The string the serialized content will be appended to.
|
|
83
|
+
# @return [String]
|
|
84
|
+
def float_type_serialization(cell, str='')
|
|
85
|
+
numeric_type_serialization cell, str
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Serializes cells that are type integer
|
|
89
|
+
# @param [Cell] cell The cell that is being serialized
|
|
90
|
+
# @param [String] str The string the serialized content will be appended to.
|
|
91
|
+
# @return [String]
|
|
92
|
+
def integer_type_serialization(cell, str = '')
|
|
93
|
+
numeric_type_serialization cell, str
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
# Serializes cells that are type formula
|
|
98
|
+
# @param [Cell] cell The cell that is being serialized
|
|
99
|
+
# @param [String] str The string the serialized content will be appended to.
|
|
100
|
+
# @return [String]
|
|
101
|
+
def formula_serialization(cell, str='')
|
|
102
|
+
str << 't="str">' << '<f>' << cell.value.to_s.sub('=', '') << '</f>'
|
|
103
|
+
str << '<v>' << cell.formula_value.to_s << '</v>' unless cell.formula_value.nil?
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Serializes cells that are type inline_string
|
|
107
|
+
# @param [Cell] cell The cell that is being serialized
|
|
108
|
+
# @param [String] str The string the serialized content will be appended to.
|
|
109
|
+
# @return [String]
|
|
110
|
+
def inline_string_serialization(cell, str = '')
|
|
111
|
+
str << 't="inlineStr">' << '<is>'
|
|
112
|
+
run_xml_string cell, str
|
|
113
|
+
str << '</is>'
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Serializes cells that are type string
|
|
117
|
+
# @param [Cell] cell The cell that is being serialized
|
|
118
|
+
# @param [String] str The string the serialized content will be appended to.
|
|
119
|
+
# @return [String]
|
|
120
|
+
def string_type_serialization(cell, str='')
|
|
121
|
+
if cell.is_formula?
|
|
122
|
+
formula_serialization cell, str
|
|
123
|
+
elsif !cell.ssti.nil?
|
|
124
|
+
value_serialization 's', cell.ssti.to_s, str
|
|
125
|
+
else
|
|
126
|
+
inline_string_serialization cell, str
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
private
|
|
131
|
+
|
|
132
|
+
def numeric_type_serialization(cell, str = '')
|
|
133
|
+
value_serialization 'n', cell.value.to_s, str
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def value_serialization(serialization_type, serialization_value, str = '')
|
|
137
|
+
str << 't="' << serialization_type << '"' if serialization_type
|
|
138
|
+
str << '><v>' << serialization_value << '</v>'
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
@@ -8,35 +8,36 @@ module Axlsx
|
|
|
8
8
|
#
|
|
9
9
|
class Cfvo
|
|
10
10
|
|
|
11
|
+
include Axlsx::OptionsParser
|
|
12
|
+
include Axlsx::SerializedAttributes
|
|
13
|
+
|
|
14
|
+
# Creates a new Cfvo object
|
|
15
|
+
# @option options [Symbol] type The type of conditional formatting value object
|
|
16
|
+
# @option options [Boolean] gte threshold value usage indicator
|
|
17
|
+
# @option options [String] val The value of the conditional formatting object
|
|
18
|
+
def initialize(options={})
|
|
19
|
+
@gte = true
|
|
20
|
+
parse_options options
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
serializable_attributes :type, :gte, :val
|
|
24
|
+
|
|
11
25
|
# Type (ST_CfvoType)
|
|
12
26
|
# The type of this conditional formatting value object. options are num, percent, max, min, formula and percentile
|
|
13
27
|
# @return [Symbol]
|
|
14
28
|
attr_reader :type
|
|
15
29
|
|
|
16
|
-
|
|
17
30
|
# Type (xsd:boolean)
|
|
18
31
|
# For icon sets, determines whether this threshold value uses the greater than or equal to operator. 0 indicates 'greater than' is used instead of 'greater than or equal to'.
|
|
19
32
|
# The default value is true
|
|
20
33
|
# @return [Boolean]
|
|
21
34
|
attr_reader :gte
|
|
22
35
|
|
|
23
|
-
|
|
24
36
|
# Type (ST_Xstring)
|
|
25
37
|
# The value of the conditional formatting object
|
|
26
38
|
# This library will accept any value so long as it supports to_s
|
|
27
39
|
attr_reader :val
|
|
28
40
|
|
|
29
|
-
# Creates a new Cfvo object
|
|
30
|
-
# @option options [Symbol] type The type of conditional formatting value object
|
|
31
|
-
# @option options [Boolean] gte threshold value usage indicator
|
|
32
|
-
# @option options [String] val The value of the conditional formatting object
|
|
33
|
-
def initialize(options={})
|
|
34
|
-
@gte = true
|
|
35
|
-
options.each do |o|
|
|
36
|
-
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
41
|
# @see type
|
|
41
42
|
def type=(v); Axlsx::validate_conditional_formatting_value_object_type(v); @type = v end
|
|
42
43
|
|
|
@@ -54,9 +55,8 @@ module Axlsx
|
|
|
54
55
|
# @return [String]
|
|
55
56
|
def to_xml_string(str = '')
|
|
56
57
|
str << '<cfvo '
|
|
57
|
-
str
|
|
58
|
+
serialized_attributes str
|
|
58
59
|
str << ' />'
|
|
59
60
|
end
|
|
60
|
-
|
|
61
61
|
end
|
|
62
62
|
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Axlsx
|
|
2
|
+
|
|
3
|
+
#A collection of Cfvo objects that initializes with the required
|
|
4
|
+
#first two items
|
|
5
|
+
class Cfvos < SimpleTypedList
|
|
6
|
+
|
|
7
|
+
def initialize
|
|
8
|
+
super(Cfvo)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def to_xml_string(str='')
|
|
12
|
+
@list.each { |cfvo| cfvo.to_xml_string(str) }
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -4,6 +4,27 @@ module Axlsx
|
|
|
4
4
|
# The Col class defines column attributes for columns in sheets.
|
|
5
5
|
class Col
|
|
6
6
|
|
|
7
|
+
include Axlsx::OptionsParser
|
|
8
|
+
include Axlsx::SerializedAttributes
|
|
9
|
+
# Create a new Col objects
|
|
10
|
+
# @param min First column affected by this 'column info' record.
|
|
11
|
+
# @param max Last column affected by this 'column info' record.
|
|
12
|
+
# @option options [Boolean] collapsed see Col#collapsed
|
|
13
|
+
# @option options [Boolean] hidden see Col#hidden
|
|
14
|
+
# @option options [Boolean] outlineLevel see Col#outlineLevel
|
|
15
|
+
# @option options [Boolean] phonetic see Col#phonetic
|
|
16
|
+
# @option options [Integer] style see Col#style
|
|
17
|
+
# @option options [Numeric] width see Col#width
|
|
18
|
+
def initialize(min, max, options={})
|
|
19
|
+
Axlsx.validate_unsigned_int(max)
|
|
20
|
+
Axlsx.validate_unsigned_int(min)
|
|
21
|
+
@min = min
|
|
22
|
+
@max = max
|
|
23
|
+
parse_options options
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
serializable_attributes :collapsed, :hidden, :outline_level, :phonetic, :style, :width, :min, :max, :best_fit, :custom_width
|
|
27
|
+
|
|
7
28
|
# First column affected by this 'column info' record.
|
|
8
29
|
# @return [Integer]
|
|
9
30
|
attr_reader :min
|
|
@@ -17,7 +38,8 @@ module Axlsx
|
|
|
17
38
|
# 'Best fit' means that when numbers are typed into a cell contained in a 'best fit' column, the column width should
|
|
18
39
|
# automatically resize to display the number. [Note: In best fit cases, column width must not be made smaller, only larger. end note]
|
|
19
40
|
# @return [Boolean]
|
|
20
|
-
attr_reader :
|
|
41
|
+
attr_reader :best_fit
|
|
42
|
+
alias :bestFit :best_fit
|
|
21
43
|
|
|
22
44
|
# Flag indicating if the outlining of the affected column(s) is in the collapsed state.
|
|
23
45
|
# @return [Boolean]
|
|
@@ -29,7 +51,8 @@ module Axlsx
|
|
|
29
51
|
|
|
30
52
|
# Outline level of affected column(s). Range is 0 to 7.
|
|
31
53
|
# @return [Integer]
|
|
32
|
-
attr_reader :
|
|
54
|
+
attr_reader :outline_level
|
|
55
|
+
alias :outlineLevel :outline_level
|
|
33
56
|
|
|
34
57
|
# Flag indicating if the phonetic information should be displayed by default for the affected column(s) of the worksheet.
|
|
35
58
|
# @return [Boolean]
|
|
@@ -44,7 +67,8 @@ module Axlsx
|
|
|
44
67
|
attr_reader :width
|
|
45
68
|
|
|
46
69
|
# @return [Boolean]
|
|
47
|
-
attr_reader :
|
|
70
|
+
attr_reader :custom_width
|
|
71
|
+
alias :customWidth :custom_width
|
|
48
72
|
|
|
49
73
|
# @see Col#collapsed
|
|
50
74
|
def collapsed=(v)
|
|
@@ -59,11 +83,12 @@ module Axlsx
|
|
|
59
83
|
end
|
|
60
84
|
|
|
61
85
|
# @see Col#outline
|
|
62
|
-
def
|
|
86
|
+
def outline_level=(v)
|
|
63
87
|
Axlsx.validate_unsigned_numeric(v)
|
|
64
88
|
raise ArgumentError, 'outlineLevel must be between 0 and 7' unless 0 <= v && v <= 7
|
|
65
|
-
@
|
|
89
|
+
@outline_level = v
|
|
66
90
|
end
|
|
91
|
+
alias :outlineLevel= :outline_level=
|
|
67
92
|
|
|
68
93
|
# @see Col#phonetic
|
|
69
94
|
def phonetic=(v)
|
|
@@ -79,30 +104,16 @@ module Axlsx
|
|
|
79
104
|
|
|
80
105
|
# @see Col#width
|
|
81
106
|
def width=(v)
|
|
82
|
-
|
|
83
|
-
|
|
107
|
+
# Removing this validation make a 10% difference in performance
|
|
108
|
+
# as it is called EVERY TIME A CELL IS ADDED - the proper solution
|
|
109
|
+
# is to only set this if a calculated value is greated than the
|
|
110
|
+
# current @width value.
|
|
111
|
+
# TODO!!!
|
|
112
|
+
#Axlsx.validate_unsigned_numeric(v) unless v == nil
|
|
113
|
+
@custom_width = @best_fit = v != nil
|
|
84
114
|
@width = v
|
|
85
115
|
end
|
|
86
116
|
|
|
87
|
-
# Create a new Col objects
|
|
88
|
-
# @param min First column affected by this 'column info' record.
|
|
89
|
-
# @param max Last column affected by this 'column info' record.
|
|
90
|
-
# @option options [Boolean] collapsed see Col#collapsed
|
|
91
|
-
# @option options [Boolean] hidden see Col#hidden
|
|
92
|
-
# @option options [Boolean] outlineLevel see Col#outlineLevel
|
|
93
|
-
# @option options [Boolean] phonetic see Col#phonetic
|
|
94
|
-
# @option options [Integer] style see Col#style
|
|
95
|
-
# @option options [Numeric] width see Col#width
|
|
96
|
-
def initialize(min, max, options={})
|
|
97
|
-
Axlsx.validate_unsigned_int(max)
|
|
98
|
-
Axlsx.validate_unsigned_int(min)
|
|
99
|
-
@min = min
|
|
100
|
-
@max = max
|
|
101
|
-
options.each do |o|
|
|
102
|
-
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
|
|
106
117
|
# updates the width for this col based on the cells autowidth and
|
|
107
118
|
# an optionally specified fixed width
|
|
108
119
|
# @param [Cell] cell The cell to use in updating this col's width
|
|
@@ -114,7 +125,9 @@ module Axlsx
|
|
|
114
125
|
if fixed_width.is_a? Numeric
|
|
115
126
|
self.width = fixed_width
|
|
116
127
|
elsif use_autowidth
|
|
117
|
-
|
|
128
|
+
cell_width = cell.autowidth
|
|
129
|
+
self.width = cell_width unless (width || 0) > (cell_width || 0)
|
|
130
|
+
#self.width = [width || 0, cell.autowidth || 0].max
|
|
118
131
|
end
|
|
119
132
|
end
|
|
120
133
|
|
|
@@ -122,8 +135,9 @@ module Axlsx
|
|
|
122
135
|
# @param [String] str
|
|
123
136
|
# @return [String]
|
|
124
137
|
def to_xml_string(str = '')
|
|
125
|
-
|
|
126
|
-
str
|
|
138
|
+
str << '<col '
|
|
139
|
+
serialized_attributes str
|
|
140
|
+
str << '/>'
|
|
127
141
|
end
|
|
128
142
|
|
|
129
143
|
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Axlsx
|
|
2
|
+
|
|
3
|
+
# A collection of Brake objects.
|
|
4
|
+
# Please do not use this class directly. Instead use
|
|
5
|
+
# Worksheet#add_break
|
|
6
|
+
class ColBreaks < SimpleTypedList
|
|
7
|
+
|
|
8
|
+
# Instantiates a new list restricted to Break types
|
|
9
|
+
def initialize
|
|
10
|
+
super Break
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# A column break specific helper for adding a break.
|
|
14
|
+
# @param [Hash] options A list of options to pass into the Break object
|
|
15
|
+
# The max and man options are fixed, however any other valid option for
|
|
16
|
+
# Break will be passed to the created break object.
|
|
17
|
+
# @see Break
|
|
18
|
+
def add_break(options)
|
|
19
|
+
@list << Break.new(options.merge(:max => 1048575, :man => true))
|
|
20
|
+
last
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Serialize the collection to xml
|
|
24
|
+
# @param [String] str The string to append this lists xml to.
|
|
25
|
+
# <colBreaks count="1" manualBreakCount="1">
|
|
26
|
+
# <brk id="3" max="1048575" man="1"/>
|
|
27
|
+
# </colBreaks>
|
|
28
|
+
def to_xml_string(str='')
|
|
29
|
+
return if empty?
|
|
30
|
+
str << '<colBreaks count="' << @list.size.to_s << '" manualBreakCount="' << @list.size.to_s << '">'
|
|
31
|
+
each { |brk| brk.to_xml_string(str) }
|
|
32
|
+
str << '</colBreaks>'
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -7,34 +7,70 @@ module Axlsx
|
|
|
7
7
|
# @see ConditionalFormattingRule#initialize
|
|
8
8
|
class ColorScale
|
|
9
9
|
|
|
10
|
+
class << self
|
|
11
|
+
|
|
12
|
+
# These are the default conditional formatting value objects
|
|
13
|
+
# that define a two tone color gradient.
|
|
14
|
+
def default_cfvos
|
|
15
|
+
[{:type => :min, :val => 0, :color => 'FFFF7128'},
|
|
16
|
+
{:type => :max, :val => 0, :color => 'FFFFEF9C'}]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# A builder for two tone color gradient
|
|
20
|
+
# @example
|
|
21
|
+
# # this creates a two tone color scale
|
|
22
|
+
# color_scale = Axlsx::ColorScale.two_tone
|
|
23
|
+
# @see examples/example.rb conditional formatting examples.
|
|
24
|
+
def two_tone
|
|
25
|
+
self.new
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# A builder for three tone color gradient
|
|
29
|
+
# @example
|
|
30
|
+
# #this creates a three tone color scale
|
|
31
|
+
# color_scale = Axlsx::ColorScale.three_tone
|
|
32
|
+
# @see examples/example.rb conditional formatting examples.
|
|
33
|
+
def three_tone
|
|
34
|
+
self.new({:type => :min, :val => 0, :color => 'FFF8696B'},
|
|
35
|
+
{:type => :percent, :val => '50', :color => 'FFFFEB84'},
|
|
36
|
+
{:type => :max, :val => 0, :color => 'FF63BE7B'})
|
|
37
|
+
end
|
|
38
|
+
end
|
|
10
39
|
# A simple typed list of cfvos
|
|
11
40
|
# @return [SimpleTypedList]
|
|
12
41
|
# @see Cfvo
|
|
13
|
-
|
|
42
|
+
def value_objects
|
|
43
|
+
@value_objects ||= Cfvos.new
|
|
44
|
+
end
|
|
14
45
|
|
|
15
46
|
# A simple types list of colors
|
|
16
47
|
# @return [SimpleTypedList]
|
|
17
48
|
# @see Color
|
|
18
|
-
|
|
49
|
+
def colors
|
|
50
|
+
@colors ||= SimpleTypedList.new Color
|
|
51
|
+
end
|
|
19
52
|
|
|
20
53
|
# creates a new ColorScale object.
|
|
21
|
-
# This method will yield it self so you can alter the properites of the defauls conditional formating value object (cfvo and colors
|
|
22
|
-
# Two value objects and two colors are created on initialization and cannot be deleted.
|
|
23
54
|
# @see Cfvo
|
|
24
55
|
# @see Color
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
56
|
+
# @example
|
|
57
|
+
# color_scale = Axlsx::ColorScale.new({:type => :num, :val => 0.55, :color => 'fff7696c'})
|
|
58
|
+
def initialize(*cfvos)
|
|
59
|
+
initialize_default_cfvos(cfvos)
|
|
28
60
|
yield self if block_given?
|
|
29
61
|
end
|
|
30
62
|
|
|
31
63
|
# adds a new cfvo / color pair to the color scale and returns a hash containing
|
|
32
64
|
# a reference to the newly created cfvo and color objects so you can alter the default properties.
|
|
33
65
|
# @return [Hash] a hash with :cfvo and :color keys referencing the newly added objects.
|
|
66
|
+
# @param [Hash] options options for the new cfvo and color objects
|
|
67
|
+
# @option [Symbol] type The type of cfvo you to add
|
|
68
|
+
# @option [Any] val The value of the cfvo to add
|
|
69
|
+
# @option [String] The rgb color for the cfvo
|
|
34
70
|
def add(options={})
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
{:cfvo =>
|
|
71
|
+
value_objects << Cfvo.new(:type => options[:type] || :min, :val => options[:val] || 0)
|
|
72
|
+
colors << Color.new(:rgb => options[:color] || "FF000000")
|
|
73
|
+
{:cfvo => value_objects.last, :color => colors.last}
|
|
38
74
|
end
|
|
39
75
|
|
|
40
76
|
|
|
@@ -42,8 +78,8 @@ module Axlsx
|
|
|
42
78
|
# @param [Integer] index The index of the cfvo and color object to delete
|
|
43
79
|
# @note you cannot remove the first two cfvo and color pairs
|
|
44
80
|
def delete_at(index=2)
|
|
45
|
-
|
|
46
|
-
|
|
81
|
+
value_objects.delete_at index
|
|
82
|
+
colors.delete_at index
|
|
47
83
|
end
|
|
48
84
|
|
|
49
85
|
# Serialize this color_scale object data to an xml string
|
|
@@ -51,26 +87,24 @@ module Axlsx
|
|
|
51
87
|
# @return [String]
|
|
52
88
|
def to_xml_string(str = '')
|
|
53
89
|
str << '<colorScale>'
|
|
54
|
-
|
|
55
|
-
|
|
90
|
+
value_objects.to_xml_string(str)
|
|
91
|
+
colors.each { |color| color.to_xml_string(str) }
|
|
56
92
|
str << '</colorScale>'
|
|
57
93
|
end
|
|
58
94
|
|
|
59
95
|
private
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
96
|
+
# There has got to be cleaner way of merging these arrays.
|
|
97
|
+
def initialize_default_cfvos(user_cfvos)
|
|
98
|
+
defaults = self.class.default_cfvos
|
|
99
|
+
user_cfvos.each_with_index do |cfvo, index|
|
|
100
|
+
if index < defaults.size
|
|
101
|
+
cfvo = defaults[index].merge(cfvo)
|
|
102
|
+
end
|
|
103
|
+
add cfvo
|
|
104
|
+
end
|
|
105
|
+
while colors.size < defaults.size
|
|
106
|
+
add defaults[colors.size - 1]
|
|
107
|
+
end
|
|
66
108
|
end
|
|
67
|
-
|
|
68
|
-
# creates the initial color objects
|
|
69
|
-
def initialize_colors
|
|
70
|
-
@colors = SimpleTypedList.new Color
|
|
71
|
-
@colors.concat [Color.new(:rgb => "FFFF0000"), Color.new(:rgb => "FF0000FF")]
|
|
72
|
-
@colors.lock
|
|
73
|
-
end
|
|
74
|
-
|
|
75
109
|
end
|
|
76
110
|
end
|
|
@@ -3,22 +3,34 @@ module Axlsx
|
|
|
3
3
|
# A comment is the text data for a comment
|
|
4
4
|
class Comment
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
include Axlsx::OptionsParser
|
|
7
|
+
include Axlsx::Accessors
|
|
8
|
+
|
|
9
|
+
# Creates a new comment object
|
|
10
|
+
# @param [Comments] comments The comment collection this comment belongs to
|
|
11
|
+
# @param [Hash] options
|
|
12
|
+
# @option [String] author the author of the comment
|
|
13
|
+
# @option [String] text The text for the comment
|
|
14
|
+
# @option [String] ref The refence (e.g. 'A3' where this comment will be anchored.
|
|
15
|
+
# @option [Boolean] visible This controls the visiblity of the associated vml_shape.
|
|
16
|
+
def initialize(comments, options={})
|
|
17
|
+
raise ArgumentError, "A comment needs a parent comments object" unless comments.is_a?(Comments)
|
|
18
|
+
@visible = true
|
|
19
|
+
@comments = comments
|
|
20
|
+
parse_options options
|
|
21
|
+
yield self if block_given?
|
|
22
|
+
end
|
|
9
23
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
# @return [String]
|
|
13
|
-
attr_reader :author
|
|
24
|
+
string_attr_accessor :text, :author
|
|
25
|
+
boolean_attr_accessor :visible
|
|
14
26
|
|
|
15
|
-
|
|
27
|
+
# The owning Comments object
|
|
16
28
|
# @return [Comments]
|
|
17
29
|
attr_reader :comments
|
|
18
30
|
|
|
19
31
|
|
|
20
32
|
# The string based cell position reference (e.g. 'A1') that determines the positioning of this comment
|
|
21
|
-
# @return [String]
|
|
33
|
+
# @return [String|Cell]
|
|
22
34
|
attr_reader :ref
|
|
23
35
|
|
|
24
36
|
# TODO
|
|
@@ -26,22 +38,12 @@ module Axlsx
|
|
|
26
38
|
# rPh (Phonetic Text Run)
|
|
27
39
|
# phoneticPr (Phonetic Properties)
|
|
28
40
|
|
|
29
|
-
def initialize(comments, options={})
|
|
30
|
-
raise ArgumentError, "A comment needs a parent comments object" unless comments.is_a?(Comments)
|
|
31
|
-
@comments = comments
|
|
32
|
-
options.each do |o|
|
|
33
|
-
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
|
34
|
-
end
|
|
35
|
-
yield self if block_given?
|
|
36
|
-
end
|
|
37
|
-
|
|
38
41
|
# The vml shape that will render this comment
|
|
39
42
|
# @return [VmlShape]
|
|
40
43
|
def vml_shape
|
|
41
44
|
@vml_shape ||= initialize_vml_shape
|
|
42
45
|
end
|
|
43
46
|
|
|
44
|
-
#
|
|
45
47
|
# The index of this author in a unique sorted list of all authors in
|
|
46
48
|
# the comment.
|
|
47
49
|
# @return [Integer]
|
|
@@ -56,30 +58,20 @@ module Axlsx
|
|
|
56
58
|
@ref = v.r if v.is_a?(Cell)
|
|
57
59
|
end
|
|
58
60
|
|
|
59
|
-
# @see text
|
|
60
|
-
def text=(v)
|
|
61
|
-
Axlsx::validate_string(v)
|
|
62
|
-
@text = v
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# @see author
|
|
66
|
-
def author=(v)
|
|
67
|
-
@author = v
|
|
68
|
-
end
|
|
69
|
-
|
|
70
61
|
# serialize the object
|
|
71
62
|
# @param [String] str
|
|
72
63
|
# @return [String]
|
|
73
64
|
def to_xml_string(str = "")
|
|
74
65
|
author = @comments.authors[author_index]
|
|
75
66
|
str << '<comment ref="' << ref << '" authorId="' << author_index.to_s << '">'
|
|
76
|
-
str << '<text
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
</t></r>
|
|
67
|
+
str << '<text>'
|
|
68
|
+
unless author.to_s == ""
|
|
69
|
+
str << '<r><rPr><b/><color indexed="81"/></rPr>'
|
|
70
|
+
str << "<t>" << ::CGI.escapeHTML(author.to_s) << ":\n</t></r>"
|
|
71
|
+
end
|
|
80
72
|
str << '<r>'
|
|
81
73
|
str << '<rPr><color indexed="81"/></rPr>'
|
|
82
|
-
str << '<t>' << text << '</t></r></text>'
|
|
74
|
+
str << '<t>' << ::CGI.escapeHTML(text) << '</t></r></text>'
|
|
83
75
|
str << '</comment>'
|
|
84
76
|
end
|
|
85
77
|
|
|
@@ -89,13 +81,12 @@ module Axlsx
|
|
|
89
81
|
# by default, all columns are 5 columns wide and 5 rows high
|
|
90
82
|
def initialize_vml_shape
|
|
91
83
|
pos = Axlsx::name_to_indices(ref)
|
|
92
|
-
@vml_shape = VmlShape.new(:row => pos[1], :column => pos[0]) do |vml|
|
|
84
|
+
@vml_shape = VmlShape.new(:row => pos[1], :column => pos[0], :visible => @visible) do |vml|
|
|
93
85
|
vml.left_column = vml.column
|
|
94
86
|
vml.right_column = vml.column + 2
|
|
95
87
|
vml.top_row = vml.row
|
|
96
88
|
vml.bottom_row = vml.row + 4
|
|
97
89
|
end
|
|
98
90
|
end
|
|
99
|
-
|
|
100
91
|
end
|
|
101
92
|
end
|
|
@@ -56,9 +56,9 @@ module Axlsx
|
|
|
56
56
|
# The relationships required by this object
|
|
57
57
|
# @return [Array]
|
|
58
58
|
def relationships
|
|
59
|
-
[Relationship.new(VML_DRAWING_R, "../#{vml_drawing.pn}"),
|
|
60
|
-
Relationship.new(COMMENT_R, "../#{pn}"),
|
|
61
|
-
Relationship.new(COMMENT_R_NULL, "NULL")]
|
|
59
|
+
[Relationship.new(self, VML_DRAWING_R, "../#{vml_drawing.pn}"),
|
|
60
|
+
Relationship.new(self, COMMENT_R, "../#{pn}"),
|
|
61
|
+
Relationship.new(self, COMMENT_R_NULL, "NULL")]
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
# serialize the object
|