caxlsx 2.0.2
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 +9 -0
- data/.yardopts_guide +19 -0
- data/CHANGELOG.md +239 -0
- data/LICENSE +22 -0
- data/README.md +256 -0
- data/Rakefile +31 -0
- 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 +58 -0
- data/examples/chart_colors.rb +88 -0
- data/examples/colored_links.rb +59 -0
- data/examples/conditional_formatting/example_conditional_formatting.rb +74 -0
- data/examples/conditional_formatting/getting_barred.rb +37 -0
- data/examples/conditional_formatting/hitting_the_high_notes.rb +37 -0
- data/examples/conditional_formatting/scaled_colors.rb +39 -0
- data/examples/conditional_formatting/stop_and_go.rb +37 -0
- data/examples/data_validation.rb +50 -0
- data/examples/example.rb +777 -0
- data/examples/extractive.rb +45 -0
- data/examples/image1.jpeg +0 -0
- data/examples/ios_preview.rb +14 -0
- data/examples/page_setup.rb +11 -0
- data/examples/pivot_table.rb +39 -0
- data/examples/sheet_protection.rb +10 -0
- data/examples/skydrive/real_example.rb +63 -0
- data/examples/styles.rb +66 -0
- data/examples/underline.rb +13 -0
- data/examples/wrap_text.rb +21 -0
- data/lib/axlsx.rb +152 -0
- data/lib/axlsx/content_type/abstract_content_type.rb +32 -0
- data/lib/axlsx/content_type/content_type.rb +26 -0
- data/lib/axlsx/content_type/default.rb +25 -0
- data/lib/axlsx/content_type/override.rb +25 -0
- data/lib/axlsx/doc_props/app.rb +235 -0
- data/lib/axlsx/doc_props/core.rb +39 -0
- data/lib/axlsx/drawing/ax_data_source.rb +26 -0
- data/lib/axlsx/drawing/axes.rb +61 -0
- data/lib/axlsx/drawing/axis.rb +187 -0
- data/lib/axlsx/drawing/bar_3D_chart.rb +151 -0
- data/lib/axlsx/drawing/bar_series.rb +82 -0
- data/lib/axlsx/drawing/cat_axis.rb +85 -0
- data/lib/axlsx/drawing/chart.rb +232 -0
- data/lib/axlsx/drawing/d_lbls.rb +90 -0
- data/lib/axlsx/drawing/drawing.rb +162 -0
- data/lib/axlsx/drawing/graphic_frame.rb +54 -0
- data/lib/axlsx/drawing/hyperlink.rb +102 -0
- data/lib/axlsx/drawing/line_3D_chart.rb +68 -0
- data/lib/axlsx/drawing/line_chart.rb +99 -0
- data/lib/axlsx/drawing/line_series.rb +81 -0
- data/lib/axlsx/drawing/marker.rb +84 -0
- data/lib/axlsx/drawing/num_data.rb +52 -0
- data/lib/axlsx/drawing/num_data_source.rb +62 -0
- data/lib/axlsx/drawing/num_val.rb +32 -0
- data/lib/axlsx/drawing/one_cell_anchor.rb +98 -0
- data/lib/axlsx/drawing/pic.rb +205 -0
- data/lib/axlsx/drawing/picture_locking.rb +44 -0
- data/lib/axlsx/drawing/pie_3D_chart.rb +48 -0
- data/lib/axlsx/drawing/pie_series.rb +74 -0
- data/lib/axlsx/drawing/scaling.rb +60 -0
- data/lib/axlsx/drawing/scatter_chart.rb +74 -0
- data/lib/axlsx/drawing/scatter_series.rb +65 -0
- data/lib/axlsx/drawing/ser_axis.rb +45 -0
- data/lib/axlsx/drawing/series.rb +69 -0
- data/lib/axlsx/drawing/series_title.rb +23 -0
- data/lib/axlsx/drawing/str_data.rb +42 -0
- data/lib/axlsx/drawing/str_val.rb +32 -0
- data/lib/axlsx/drawing/title.rb +78 -0
- data/lib/axlsx/drawing/two_cell_anchor.rb +92 -0
- data/lib/axlsx/drawing/val_axis.rb +37 -0
- data/lib/axlsx/drawing/view_3D.rb +115 -0
- data/lib/axlsx/drawing/vml_drawing.rb +42 -0
- data/lib/axlsx/drawing/vml_shape.rb +66 -0
- data/lib/axlsx/package.rb +352 -0
- data/lib/axlsx/rels/relationship.rb +129 -0
- data/lib/axlsx/rels/relationships.rb +29 -0
- data/lib/axlsx/stylesheet/border.rb +71 -0
- data/lib/axlsx/stylesheet/border_pr.rb +71 -0
- data/lib/axlsx/stylesheet/cell_alignment.rb +134 -0
- data/lib/axlsx/stylesheet/cell_protection.rb +43 -0
- data/lib/axlsx/stylesheet/cell_style.rb +74 -0
- data/lib/axlsx/stylesheet/color.rb +78 -0
- data/lib/axlsx/stylesheet/dxf.rb +79 -0
- data/lib/axlsx/stylesheet/fill.rb +35 -0
- data/lib/axlsx/stylesheet/font.rb +148 -0
- data/lib/axlsx/stylesheet/gradient_fill.rb +103 -0
- data/lib/axlsx/stylesheet/gradient_stop.rb +37 -0
- data/lib/axlsx/stylesheet/num_fmt.rb +79 -0
- data/lib/axlsx/stylesheet/pattern_fill.rb +73 -0
- data/lib/axlsx/stylesheet/styles.rb +420 -0
- data/lib/axlsx/stylesheet/table_style.rb +54 -0
- data/lib/axlsx/stylesheet/table_style_element.rb +79 -0
- data/lib/axlsx/stylesheet/table_styles.rb +46 -0
- data/lib/axlsx/stylesheet/xf.rb +147 -0
- data/lib/axlsx/util/accessors.rb +64 -0
- data/lib/axlsx/util/constants.rb +392 -0
- data/lib/axlsx/util/options_parser.rb +15 -0
- data/lib/axlsx/util/parser.rb +44 -0
- data/lib/axlsx/util/serialized_attributes.rb +79 -0
- data/lib/axlsx/util/simple_typed_list.rb +203 -0
- data/lib/axlsx/util/storage.rb +146 -0
- data/lib/axlsx/util/validators.rb +300 -0
- data/lib/axlsx/version.rb +5 -0
- data/lib/axlsx/workbook/defined_name.rb +129 -0
- data/lib/axlsx/workbook/defined_names.rb +21 -0
- data/lib/axlsx/workbook/shared_strings_table.rb +77 -0
- data/lib/axlsx/workbook/workbook.rb +354 -0
- 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 +416 -0
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +144 -0
- data/lib/axlsx/workbook/worksheet/cfvo.rb +62 -0
- data/lib/axlsx/workbook/worksheet/cfvos.rb +15 -0
- data/lib/axlsx/workbook/worksheet/col.rb +144 -0
- data/lib/axlsx/workbook/worksheet/col_breaks.rb +35 -0
- data/lib/axlsx/workbook/worksheet/color_scale.rb +110 -0
- data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
- data/lib/axlsx/workbook/worksheet/comment.rb +92 -0
- data/lib/axlsx/workbook/worksheet/comments.rb +85 -0
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +82 -0
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +220 -0
- data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
- data/lib/axlsx/workbook/worksheet/data_bar.rb +131 -0
- data/lib/axlsx/workbook/worksheet/data_validation.rb +244 -0
- data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
- data/lib/axlsx/workbook/worksheet/date_time_converter.rb +30 -0
- data/lib/axlsx/workbook/worksheet/dimension.rb +64 -0
- data/lib/axlsx/workbook/worksheet/header_footer.rb +54 -0
- data/lib/axlsx/workbook/worksheet/icon_set.rb +83 -0
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +35 -0
- data/lib/axlsx/workbook/worksheet/page_margins.rb +99 -0
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +44 -0
- data/lib/axlsx/workbook/worksheet/page_setup.rb +242 -0
- data/lib/axlsx/workbook/worksheet/pane.rb +141 -0
- 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 +41 -0
- data/lib/axlsx/workbook/worksheet/protected_range.rb +49 -0
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
- data/lib/axlsx/workbook/worksheet/row.rb +172 -0
- data/lib/axlsx/workbook/worksheet/row_breaks.rb +33 -0
- data/lib/axlsx/workbook/worksheet/selection.rb +103 -0
- data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +29 -0
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
- data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +60 -0
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +69 -0
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +120 -0
- data/lib/axlsx/workbook/worksheet/sheet_view.rb +213 -0
- data/lib/axlsx/workbook/worksheet/table.rb +102 -0
- data/lib/axlsx/workbook/worksheet/table_style_info.rb +51 -0
- data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
- data/lib/axlsx/workbook/worksheet/worksheet.rb +769 -0
- data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +58 -0
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +58 -0
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +74 -0
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -0
- data/lib/schema/dc.xsd +118 -0
- data/lib/schema/dcmitype.xsd +52 -0
- data/lib/schema/dcterms.xsd +331 -0
- data/lib/schema/dml-chart.xsd +1499 -0
- data/lib/schema/dml-chartDrawing.xsd +146 -0
- data/lib/schema/dml-compatibility.xsd +14 -0
- data/lib/schema/dml-diagram.xsd +1091 -0
- data/lib/schema/dml-lockedCanvas.xsd +11 -0
- data/lib/schema/dml-main.xsd +3048 -0
- data/lib/schema/dml-picture.xsd +23 -0
- data/lib/schema/dml-spreadsheetDrawing.xsd +185 -0
- data/lib/schema/dml-wordprocessingDrawing.xsd +185 -0
- data/lib/schema/opc-contentTypes.xsd +42 -0
- data/lib/schema/opc-coreProperties.xsd +54 -0
- data/lib/schema/opc-digSig.xsd +49 -0
- data/lib/schema/opc-relationships.xsd +33 -0
- data/lib/schema/pml.xsd +1676 -0
- data/lib/schema/shared-additionalCharacteristics.xsd +28 -0
- data/lib/schema/shared-bibliography.xsd +144 -0
- data/lib/schema/shared-commonSimpleTypes.xsd +166 -0
- data/lib/schema/shared-customXmlDataProperties.xsd +25 -0
- data/lib/schema/shared-customXmlSchemaProperties.xsd +18 -0
- data/lib/schema/shared-documentPropertiesCustom.xsd +59 -0
- data/lib/schema/shared-documentPropertiesExtended.xsd +56 -0
- data/lib/schema/shared-documentPropertiesVariantTypes.xsd +195 -0
- data/lib/schema/shared-math.xsd +582 -0
- data/lib/schema/shared-relationshipReference.xsd +25 -0
- data/lib/schema/sml.xsd +4434 -0
- data/lib/schema/vml-main.xsd +569 -0
- data/lib/schema/vml-officeDrawing.xsd +509 -0
- data/lib/schema/vml-presentationDrawing.xsd +12 -0
- data/lib/schema/vml-spreadsheetDrawing.xsd +108 -0
- data/lib/schema/vml-wordprocessingDrawing.xsd +96 -0
- data/lib/schema/wml.xsd +3644 -0
- data/lib/schema/xml.xsd +116 -0
- data/test/benchmark.rb +72 -0
- data/test/content_type/tc_content_type.rb +76 -0
- data/test/content_type/tc_default.rb +16 -0
- data/test/content_type/tc_override.rb +14 -0
- data/test/doc_props/tc_app.rb +43 -0
- data/test/doc_props/tc_core.rb +42 -0
- data/test/drawing/tc_axes.rb +8 -0
- data/test/drawing/tc_axis.rb +85 -0
- data/test/drawing/tc_bar_3D_chart.rb +71 -0
- data/test/drawing/tc_bar_series.rb +37 -0
- data/test/drawing/tc_cat_axis.rb +31 -0
- data/test/drawing/tc_cat_axis_data.rb +27 -0
- data/test/drawing/tc_chart.rb +110 -0
- data/test/drawing/tc_d_lbls.rb +57 -0
- data/test/drawing/tc_data_source.rb +17 -0
- data/test/drawing/tc_drawing.rb +80 -0
- data/test/drawing/tc_graphic_frame.rb +27 -0
- data/test/drawing/tc_hyperlink.rb +64 -0
- data/test/drawing/tc_line_3d_chart.rb +47 -0
- data/test/drawing/tc_line_chart.rb +39 -0
- data/test/drawing/tc_line_series.rb +30 -0
- data/test/drawing/tc_marker.rb +44 -0
- data/test/drawing/tc_named_axis_data.rb +27 -0
- data/test/drawing/tc_num_data.rb +31 -0
- data/test/drawing/tc_num_val.rb +29 -0
- data/test/drawing/tc_one_cell_anchor.rb +66 -0
- data/test/drawing/tc_pic.rb +107 -0
- data/test/drawing/tc_picture_locking.rb +72 -0
- data/test/drawing/tc_pie_3D_chart.rb +28 -0
- data/test/drawing/tc_pie_series.rb +32 -0
- data/test/drawing/tc_scaling.rb +36 -0
- data/test/drawing/tc_scatter_chart.rb +48 -0
- data/test/drawing/tc_scatter_series.rb +21 -0
- data/test/drawing/tc_ser_axis.rb +31 -0
- data/test/drawing/tc_series.rb +23 -0
- data/test/drawing/tc_series_title.rb +33 -0
- data/test/drawing/tc_str_data.rb +18 -0
- data/test/drawing/tc_str_val.rb +21 -0
- data/test/drawing/tc_title.rb +49 -0
- data/test/drawing/tc_two_cell_anchor.rb +36 -0
- data/test/drawing/tc_val_axis.rb +24 -0
- data/test/drawing/tc_view_3D.rb +54 -0
- data/test/drawing/tc_vml_drawing.rb +25 -0
- data/test/drawing/tc_vml_shape.rb +106 -0
- data/test/profile.rb +24 -0
- data/test/rels/tc_relationship.rb +44 -0
- data/test/rels/tc_relationships.rb +37 -0
- data/test/stylesheet/tc_border.rb +37 -0
- data/test/stylesheet/tc_border_pr.rb +32 -0
- data/test/stylesheet/tc_cell_alignment.rb +81 -0
- data/test/stylesheet/tc_cell_protection.rb +29 -0
- data/test/stylesheet/tc_cell_style.rb +57 -0
- data/test/stylesheet/tc_color.rb +43 -0
- data/test/stylesheet/tc_dxf.rb +81 -0
- data/test/stylesheet/tc_fill.rb +18 -0
- data/test/stylesheet/tc_font.rb +121 -0
- data/test/stylesheet/tc_gradient_fill.rb +72 -0
- data/test/stylesheet/tc_gradient_stop.rb +31 -0
- data/test/stylesheet/tc_num_fmt.rb +30 -0
- data/test/stylesheet/tc_pattern_fill.rb +43 -0
- data/test/stylesheet/tc_styles.rb +235 -0
- data/test/stylesheet/tc_table_style.rb +44 -0
- data/test/stylesheet/tc_table_style_element.rb +45 -0
- data/test/stylesheet/tc_table_styles.rb +29 -0
- data/test/stylesheet/tc_xf.rb +120 -0
- data/test/tc_axlsx.rb +72 -0
- data/test/tc_helper.rb +10 -0
- data/test/tc_package.rb +227 -0
- data/test/util/tc_serialized_attributes.rb +19 -0
- data/test/util/tc_simple_typed_list.rb +78 -0
- data/test/util/tc_validators.rb +186 -0
- data/test/workbook/tc_defined_name.rb +41 -0
- data/test/workbook/tc_shared_strings_table.rb +44 -0
- data/test/workbook/tc_workbook.rb +125 -0
- 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 +319 -0
- data/test/workbook/worksheet/tc_cfvo.rb +31 -0
- data/test/workbook/worksheet/tc_col.rb +78 -0
- data/test/workbook/worksheet/tc_color_scale.rb +58 -0
- data/test/workbook/worksheet/tc_comment.rb +72 -0
- data/test/workbook/worksheet/tc_comments.rb +57 -0
- data/test/workbook/worksheet/tc_conditional_formatting.rb +224 -0
- data/test/workbook/worksheet/tc_data_bar.rb +46 -0
- data/test/workbook/worksheet/tc_data_validation.rb +265 -0
- data/test/workbook/worksheet/tc_date_time_converter.rb +124 -0
- data/test/workbook/worksheet/tc_header_footer.rb +151 -0
- data/test/workbook/worksheet/tc_icon_set.rb +45 -0
- data/test/workbook/worksheet/tc_page_margins.rb +97 -0
- data/test/workbook/worksheet/tc_page_set_up_pr.rb +15 -0
- data/test/workbook/worksheet/tc_page_setup.rb +143 -0
- data/test/workbook/worksheet/tc_pane.rb +54 -0
- 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_print_options.rb +72 -0
- data/test/workbook/worksheet/tc_protected_range.rb +17 -0
- data/test/workbook/worksheet/tc_row.rb +117 -0
- data/test/workbook/worksheet/tc_selection.rb +55 -0
- 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_protection.rb +117 -0
- data/test/workbook/worksheet/tc_sheet_view.rb +214 -0
- data/test/workbook/worksheet/tc_table.rb +68 -0
- data/test/workbook/worksheet/tc_table_style_info.rb +53 -0
- data/test/workbook/worksheet/tc_worksheet.rb +538 -0
- data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +55 -0
- metadata +546 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Axlsx
|
|
2
|
+
|
|
3
|
+
# The cols class manages the col object used to manage column widths.
|
|
4
|
+
# This is where the magic happens with autowidth
|
|
5
|
+
class Cols < SimpleTypedList
|
|
6
|
+
|
|
7
|
+
def initialize(worksheet)
|
|
8
|
+
raise ArgumentError, "you must provide a worksheet" unless worksheet.is_a?(Worksheet)
|
|
9
|
+
super Col
|
|
10
|
+
@worksheet = worksheet
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def to_xml_string(str = '')
|
|
14
|
+
return if empty?
|
|
15
|
+
str << '<cols>'
|
|
16
|
+
each { |item| item.to_xml_string(str) }
|
|
17
|
+
str << '</cols>'
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
module Axlsx
|
|
2
|
+
|
|
3
|
+
# A comment is the text data for a comment
|
|
4
|
+
class Comment
|
|
5
|
+
|
|
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
|
|
23
|
+
|
|
24
|
+
string_attr_accessor :text, :author
|
|
25
|
+
boolean_attr_accessor :visible
|
|
26
|
+
|
|
27
|
+
# The owning Comments object
|
|
28
|
+
# @return [Comments]
|
|
29
|
+
attr_reader :comments
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# The string based cell position reference (e.g. 'A1') that determines the positioning of this comment
|
|
33
|
+
# @return [String|Cell]
|
|
34
|
+
attr_reader :ref
|
|
35
|
+
|
|
36
|
+
# TODO
|
|
37
|
+
# r (Rich Text Run)
|
|
38
|
+
# rPh (Phonetic Text Run)
|
|
39
|
+
# phoneticPr (Phonetic Properties)
|
|
40
|
+
|
|
41
|
+
# The vml shape that will render this comment
|
|
42
|
+
# @return [VmlShape]
|
|
43
|
+
def vml_shape
|
|
44
|
+
@vml_shape ||= initialize_vml_shape
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# The index of this author in a unique sorted list of all authors in
|
|
48
|
+
# the comment.
|
|
49
|
+
# @return [Integer]
|
|
50
|
+
def author_index
|
|
51
|
+
@comments.authors.index(author)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# @see ref
|
|
55
|
+
def ref=(v)
|
|
56
|
+
Axlsx::DataTypeValidator.validate "Comment.ref", [String, Cell], v
|
|
57
|
+
@ref = v if v.is_a?(String)
|
|
58
|
+
@ref = v.r if v.is_a?(Cell)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# serialize the object
|
|
62
|
+
# @param [String] str
|
|
63
|
+
# @return [String]
|
|
64
|
+
def to_xml_string(str = "")
|
|
65
|
+
author = @comments.authors[author_index]
|
|
66
|
+
str << '<comment ref="' << ref << '" authorId="' << author_index.to_s << '">'
|
|
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
|
|
72
|
+
str << '<r>'
|
|
73
|
+
str << '<rPr><color indexed="81"/></rPr>'
|
|
74
|
+
str << '<t>' << ::CGI.escapeHTML(text) << '</t></r></text>'
|
|
75
|
+
str << '</comment>'
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
private
|
|
79
|
+
|
|
80
|
+
# initialize the vml shape based on this comment's ref/position in the worksheet.
|
|
81
|
+
# by default, all columns are 5 columns wide and 5 rows high
|
|
82
|
+
def initialize_vml_shape
|
|
83
|
+
pos = Axlsx::name_to_indices(ref)
|
|
84
|
+
@vml_shape = VmlShape.new(:row => pos[1], :column => pos[0], :visible => @visible) do |vml|
|
|
85
|
+
vml.left_column = vml.column
|
|
86
|
+
vml.right_column = vml.column + 2
|
|
87
|
+
vml.top_row = vml.row
|
|
88
|
+
vml.bottom_row = vml.row + 4
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
module Axlsx
|
|
3
|
+
|
|
4
|
+
# Comments is a collection of Comment objects for a worksheet
|
|
5
|
+
class Comments < SimpleTypedList
|
|
6
|
+
|
|
7
|
+
# the vml_drawing that holds the shapes for comments
|
|
8
|
+
# @return [VmlDrawing]
|
|
9
|
+
attr_reader :vml_drawing
|
|
10
|
+
|
|
11
|
+
# The worksheet that these comments belong to
|
|
12
|
+
# @return [Worksheet]
|
|
13
|
+
attr_reader :worksheet
|
|
14
|
+
|
|
15
|
+
# The index of this collection in the workbook. Effectively the index of the worksheet.
|
|
16
|
+
# @return [Integer]
|
|
17
|
+
def index
|
|
18
|
+
@worksheet.index
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# The part name for this object
|
|
22
|
+
# @return [String]
|
|
23
|
+
def pn
|
|
24
|
+
"#{COMMENT_PN % (index+1)}"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Creates a new Comments object
|
|
28
|
+
# @param [Worksheet] worksheet The sheet that these comments belong to.
|
|
29
|
+
def initialize(worksheet)
|
|
30
|
+
raise ArgumentError, "you must provide a worksheet" unless worksheet.is_a?(Worksheet)
|
|
31
|
+
super(Comment)
|
|
32
|
+
@worksheet = worksheet
|
|
33
|
+
@vml_drawing = VmlDrawing.new(self)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Adds a new comment to the worksheet that owns these comments.
|
|
37
|
+
# @note the author, text and ref options are required
|
|
38
|
+
# @option options [String] author The name of the author for this comment
|
|
39
|
+
# @option options [String] text The text for this comment
|
|
40
|
+
# @option options [Stirng|Cell] ref The cell that this comment is attached to.
|
|
41
|
+
def add_comment(options={})
|
|
42
|
+
raise ArgumentError, "Comment require an author" unless options[:author]
|
|
43
|
+
raise ArgumentError, "Comment requires text" unless options[:text]
|
|
44
|
+
raise ArgumentError, "Comment requires ref" unless options[:ref]
|
|
45
|
+
@list << Comment.new(self, options)
|
|
46
|
+
yield @list.last if block_given?
|
|
47
|
+
@list.last
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# A sorted list of the unique authors in the contained comments
|
|
51
|
+
# @return [Array]
|
|
52
|
+
def authors
|
|
53
|
+
@list.map { |comment| comment.author.to_s }.uniq.sort
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# The relationships required by this object
|
|
57
|
+
# @return [Array]
|
|
58
|
+
def relationships
|
|
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
|
+
end
|
|
63
|
+
|
|
64
|
+
# serialize the object
|
|
65
|
+
# @param [String] str
|
|
66
|
+
# @return [String]
|
|
67
|
+
def to_xml_string(str="")
|
|
68
|
+
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
|
69
|
+
str << '<comments xmlns="' << XML_NS << '">'
|
|
70
|
+
str << '<authors>'
|
|
71
|
+
authors.each do |author|
|
|
72
|
+
str << '<author>' << author.to_s << '</author>'
|
|
73
|
+
end
|
|
74
|
+
str << '</authors>'
|
|
75
|
+
str << '<commentList>'
|
|
76
|
+
@list.each do |comment|
|
|
77
|
+
comment.to_xml_string str
|
|
78
|
+
end
|
|
79
|
+
str << '</commentList></comments>'
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
module Axlsx
|
|
2
|
+
# Conditional formatting allows styling of ranges based on functions
|
|
3
|
+
#
|
|
4
|
+
# @note The recommended way to manage conditional formatting is via Worksheet#add_conditional_formatting
|
|
5
|
+
# @see Worksheet#add_conditional_formatting
|
|
6
|
+
# @see ConditionalFormattingRule
|
|
7
|
+
class ConditionalFormatting
|
|
8
|
+
|
|
9
|
+
include Axlsx::OptionsParser
|
|
10
|
+
|
|
11
|
+
# Creates a new {ConditionalFormatting} object
|
|
12
|
+
# @option options [Array] rules The rules to apply
|
|
13
|
+
# @option options [String] sqref The range to apply the rules to
|
|
14
|
+
def initialize(options={})
|
|
15
|
+
@rules = []
|
|
16
|
+
parse_options options
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Range over which the formatting is applied, in "A1:B2" format
|
|
20
|
+
# @return [String]
|
|
21
|
+
attr_reader :sqref
|
|
22
|
+
|
|
23
|
+
# Rules to apply the formatting to. Can be either a hash of
|
|
24
|
+
# options to create a {ConditionalFormattingRule}, an array of hashes
|
|
25
|
+
# for multiple ConditionalFormattingRules, or an array of already
|
|
26
|
+
# created ConditionalFormattingRules.
|
|
27
|
+
# @see ConditionalFormattingRule#initialize
|
|
28
|
+
# @return [Array]
|
|
29
|
+
attr_reader :rules
|
|
30
|
+
|
|
31
|
+
# Add Conditional Formatting Rules to this object. Rules can either
|
|
32
|
+
# be already created {ConditionalFormattingRule} elements or
|
|
33
|
+
# hashes of options for automatic creation. If rules is a hash
|
|
34
|
+
# instead of an array, assume only one rule being added.
|
|
35
|
+
#
|
|
36
|
+
# @example This would apply formatting "1" to cells > 20, and formatting "2" to cells < 1
|
|
37
|
+
# conditional_formatting.add_rules [
|
|
38
|
+
# { :type => :cellIs, :operator => :greaterThan, :formula => "20", :dxfId => 1, :priority=> 1 },
|
|
39
|
+
# { :type => :cellIs, :operator => :lessThan, :formula => "10", :dxfId => 2, :priority=> 2 } ]
|
|
40
|
+
#
|
|
41
|
+
# @param [Array|Hash] rules the rules to apply, can be just one in hash form
|
|
42
|
+
# @see ConditionalFormattingRule#initialize
|
|
43
|
+
def add_rules(rules)
|
|
44
|
+
rules = [rules] if rules.is_a? Hash
|
|
45
|
+
rules.each do |rule|
|
|
46
|
+
add_rule rule
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Add a ConditionalFormattingRule. If a hash of options is passed
|
|
51
|
+
# in create a rule on the fly.
|
|
52
|
+
# @param [ConditionalFormattingRule|Hash] rule A rule to use, or the options necessary to create one.
|
|
53
|
+
# @see ConditionalFormattingRule#initialize
|
|
54
|
+
def add_rule(rule)
|
|
55
|
+
if rule.is_a? Axlsx::ConditionalFormattingRule
|
|
56
|
+
@rules << rule
|
|
57
|
+
elsif rule.is_a? Hash
|
|
58
|
+
@rules << ConditionalFormattingRule.new(rule)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# @see rules
|
|
63
|
+
def rules=(v); @rules = v end
|
|
64
|
+
# @see sqref
|
|
65
|
+
def sqref=(v); Axlsx::validate_string(v); @sqref = v end
|
|
66
|
+
|
|
67
|
+
# Serializes the conditional formatting element
|
|
68
|
+
# @example Conditional Formatting XML looks like:
|
|
69
|
+
# <conditionalFormatting sqref="E3:E9">
|
|
70
|
+
# <cfRule type="cellIs" dxfId="0" priority="1" operator="greaterThan">
|
|
71
|
+
# <formula>0.5</formula>
|
|
72
|
+
# </cfRule>
|
|
73
|
+
# </conditionalFormatting>
|
|
74
|
+
# @param [String] str
|
|
75
|
+
# @return [String]
|
|
76
|
+
def to_xml_string(str = '')
|
|
77
|
+
str << '<conditionalFormatting sqref="' << sqref << '">'
|
|
78
|
+
str << rules.collect{ |rule| rule.to_xml_string }.join(' ')
|
|
79
|
+
str << '</conditionalFormatting>'
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
module Axlsx
|
|
3
|
+
# Conditional formatting rules specify formulas whose evaluations
|
|
4
|
+
# format cells
|
|
5
|
+
#
|
|
6
|
+
# @note The recommended way to manage these rules is via Worksheet#add_conditional_formatting
|
|
7
|
+
# @see Worksheet#add_conditional_formatting
|
|
8
|
+
# @see ConditionalFormattingRule#initialize
|
|
9
|
+
class ConditionalFormattingRule
|
|
10
|
+
|
|
11
|
+
include Axlsx::OptionsParser
|
|
12
|
+
include Axlsx::SerializedAttributes
|
|
13
|
+
|
|
14
|
+
# Creates a new Conditional Formatting Rule object
|
|
15
|
+
# @option options [Symbol] type The type of this formatting rule
|
|
16
|
+
# @option options [Boolean] aboveAverage This is an aboveAverage rule
|
|
17
|
+
# @option options [Boolean] bottom This is a bottom N rule.
|
|
18
|
+
# @option options [Integer] dxfId The formatting id to apply to matches
|
|
19
|
+
# @option options [Boolean] equalAverage Is the aboveAverage or belowAverage rule inclusive
|
|
20
|
+
# @option options [Integer] priority The priority of the rule, 1 is highest
|
|
21
|
+
# @option options [Symbol] operator Which operator to apply
|
|
22
|
+
# @option options [String] text The value to apply a text operator against
|
|
23
|
+
# @option options [Boolean] percent If a top/bottom N rule, evaluate as N% rather than N
|
|
24
|
+
# @option options [Integer] rank If a top/bottom N rule, the value of N
|
|
25
|
+
# @option options [Integer] stdDev The number of standard deviations above or below the average to match
|
|
26
|
+
# @option options [Boolean] stopIfTrue Stop evaluating rules after this rule matches
|
|
27
|
+
# @option options [Symbol] timePeriod The time period in a date occuring... rule
|
|
28
|
+
# @option options [String] formula The formula to match against in i.e. an equal rule. Use a [minimum, maximum] array for cellIs between/notBetween conditionals.
|
|
29
|
+
def initialize(options={})
|
|
30
|
+
@color_scale = @data_bar = @icon_set = @formula = nil
|
|
31
|
+
parse_options options
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
serializable_attributes :type, :aboveAverage, :bottom, :dxfId, :equalAverage,
|
|
35
|
+
:priority, :operator, :text, :percent, :rank, :stdDev,
|
|
36
|
+
:stopIfTrue, :timePeriod
|
|
37
|
+
|
|
38
|
+
# Formula
|
|
39
|
+
# The formula or value to match against (e.g. 5 with an operator of :greaterThan to specify cell_value > 5).
|
|
40
|
+
# If the operator is :between or :notBetween, use an array to specify [minimum, maximum]
|
|
41
|
+
# @return [String]
|
|
42
|
+
attr_reader :formula
|
|
43
|
+
|
|
44
|
+
# Type (ST_CfType)
|
|
45
|
+
# options are expression, cellIs, colorScale, dataBar, iconSet,
|
|
46
|
+
# top10, uniqueValues, duplicateValues, containsText,
|
|
47
|
+
# notContainsText, beginsWith, endsWith, containsBlanks,
|
|
48
|
+
# notContainsBlanks, containsErrors, notContainsErrors,
|
|
49
|
+
# timePeriod, aboveAverage
|
|
50
|
+
# @return [Symbol]
|
|
51
|
+
attr_reader :type
|
|
52
|
+
|
|
53
|
+
# Above average rule
|
|
54
|
+
# Indicates whether the rule is an "above average" rule. True
|
|
55
|
+
# indicates 'above average'. This attribute is ignored if type is
|
|
56
|
+
# not equal to aboveAverage.
|
|
57
|
+
# @return [Boolean]
|
|
58
|
+
attr_reader :aboveAverage
|
|
59
|
+
|
|
60
|
+
# Bottom N rule
|
|
61
|
+
# @return [Boolean]
|
|
62
|
+
attr_reader :bottom
|
|
63
|
+
|
|
64
|
+
# Differential Formatting Id
|
|
65
|
+
# @return [Integer]
|
|
66
|
+
attr_reader :dxfId
|
|
67
|
+
|
|
68
|
+
# Equal Average
|
|
69
|
+
# Flag indicating whether the 'aboveAverage' and 'belowAverage'
|
|
70
|
+
# criteria is inclusive of the average itself, or exclusive of
|
|
71
|
+
# that value.
|
|
72
|
+
# @return [Boolean]
|
|
73
|
+
attr_reader :equalAverage
|
|
74
|
+
|
|
75
|
+
# Operator
|
|
76
|
+
# The operator in a "cell value is" conditional formatting
|
|
77
|
+
# rule. This attribute is ignored if type is not equal to cellIs
|
|
78
|
+
#
|
|
79
|
+
# Operator must be one of lessThan, lessThanOrEqual, equal,
|
|
80
|
+
# notEqual, greaterThanOrEqual, greaterThan, between, notBetween,
|
|
81
|
+
# containsText, notContains, beginsWith, endsWith
|
|
82
|
+
# @return [Symbol]
|
|
83
|
+
attr_reader :operator
|
|
84
|
+
|
|
85
|
+
# Priority
|
|
86
|
+
# The priority of this conditional formatting rule. This value is
|
|
87
|
+
# used to determine which format should be evaluated and
|
|
88
|
+
# rendered. Lower numeric values are higher priority than higher
|
|
89
|
+
# numeric values, where '1' is the highest priority.
|
|
90
|
+
# @return [Integer]
|
|
91
|
+
attr_reader :priority
|
|
92
|
+
|
|
93
|
+
# Text
|
|
94
|
+
# used in a "text contains" conditional formatting
|
|
95
|
+
# rule.
|
|
96
|
+
# @return [String]
|
|
97
|
+
attr_reader :text
|
|
98
|
+
|
|
99
|
+
# percent (Top 10 Percent)
|
|
100
|
+
# indicates whether a "top/bottom n" rule is a "top/bottom n
|
|
101
|
+
# percent" rule. This attribute is ignored if type is not equal to
|
|
102
|
+
# top10.
|
|
103
|
+
# @return [Boolean]
|
|
104
|
+
attr_reader :percent
|
|
105
|
+
|
|
106
|
+
# rank (Rank)
|
|
107
|
+
# The value of "n" in a "top/bottom n" conditional formatting
|
|
108
|
+
# rule. This attribute is ignored if type is not equal to top10.
|
|
109
|
+
# @return [Integer]
|
|
110
|
+
attr_reader :rank
|
|
111
|
+
|
|
112
|
+
# stdDev (StdDev)
|
|
113
|
+
# The number of standard deviations to include above or below the
|
|
114
|
+
# average in the conditional formatting rule. This attribute is
|
|
115
|
+
# ignored if type is not equal to aboveAverage. If a value is
|
|
116
|
+
# present for stdDev and the rule type = aboveAverage, then this
|
|
117
|
+
# rule is automatically an "above or below N standard deviations"
|
|
118
|
+
# rule.
|
|
119
|
+
# @return [Integer]
|
|
120
|
+
attr_reader :stdDev
|
|
121
|
+
|
|
122
|
+
# stopIfTrue (Stop If True)
|
|
123
|
+
# If this flag is '1', no rules with lower priority shall be
|
|
124
|
+
# applied over this rule, when this rule evaluates to true.
|
|
125
|
+
# @return [Boolean]
|
|
126
|
+
attr_reader :stopIfTrue
|
|
127
|
+
|
|
128
|
+
# timePeriod (Time Period)
|
|
129
|
+
# The applicable time period in a "date occurring…" conditional
|
|
130
|
+
# formatting rule. This attribute is ignored if type is not equal
|
|
131
|
+
# to timePeriod.
|
|
132
|
+
# Valid types are today, yesterday, tomorrow, last7Days,
|
|
133
|
+
# thisMonth, lastMonth, nextMonth, thisWeek, lastWeek, nextWeek
|
|
134
|
+
attr_reader :timePeriod
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
# colorScale (Color Scale)
|
|
138
|
+
# The color scale to apply to this conditional formatting
|
|
139
|
+
# @return [ColorScale]
|
|
140
|
+
def color_scale
|
|
141
|
+
@color_scale ||= ColorScale.new
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# dataBar (Data Bar)
|
|
145
|
+
# The data bar to apply to this conditional formatting
|
|
146
|
+
# @return [DataBar]
|
|
147
|
+
def data_bar
|
|
148
|
+
@data_bar ||= DataBar.new
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# iconSet (Icon Set)
|
|
152
|
+
# The icon set to apply to this conditional formatting
|
|
153
|
+
# @return [IconSet]
|
|
154
|
+
def icon_set
|
|
155
|
+
@icon_set ||= IconSet.new
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# @see type
|
|
159
|
+
def type=(v); Axlsx::validate_conditional_formatting_type(v); @type = v end
|
|
160
|
+
# @see aboveAverage
|
|
161
|
+
def aboveAverage=(v); Axlsx::validate_boolean(v); @aboveAverage = v end
|
|
162
|
+
# @see bottom
|
|
163
|
+
def bottom=(v); Axlsx::validate_boolean(v); @bottom = v end
|
|
164
|
+
# @see dxfId
|
|
165
|
+
def dxfId=(v); Axlsx::validate_unsigned_numeric(v); @dxfId = v end
|
|
166
|
+
# @see equalAverage
|
|
167
|
+
def equalAverage=(v); Axlsx::validate_boolean(v); @equalAverage = v end
|
|
168
|
+
# @see priority
|
|
169
|
+
def priority=(v); Axlsx::validate_unsigned_numeric(v); @priority = v end
|
|
170
|
+
# @see operator
|
|
171
|
+
def operator=(v); Axlsx::validate_conditional_formatting_operator(v); @operator = v end
|
|
172
|
+
# @see text
|
|
173
|
+
def text=(v); Axlsx::validate_string(v); @text = v end
|
|
174
|
+
# @see percent
|
|
175
|
+
def percent=(v); Axlsx::validate_boolean(v); @percent = v end
|
|
176
|
+
# @see rank
|
|
177
|
+
def rank=(v); Axlsx::validate_unsigned_numeric(v); @rank = v end
|
|
178
|
+
# @see stdDev
|
|
179
|
+
def stdDev=(v); Axlsx::validate_unsigned_numeric(v); @stdDev = v end
|
|
180
|
+
# @see stopIfTrue
|
|
181
|
+
def stopIfTrue=(v); Axlsx::validate_boolean(v); @stopIfTrue = v end
|
|
182
|
+
# @see timePeriod
|
|
183
|
+
def timePeriod=(v); Axlsx::validate_time_period_type(v); @timePeriod = v end
|
|
184
|
+
# @see formula
|
|
185
|
+
def formula=(v); [*v].each {|x| Axlsx::validate_string(x) }; @formula = [*v].map { |form| ::CGI.escapeHTML(form) } end
|
|
186
|
+
|
|
187
|
+
# @see color_scale
|
|
188
|
+
def color_scale=(v)
|
|
189
|
+
Axlsx::DataTypeValidator.validate 'conditional_formatting_rule.color_scale', ColorScale, v
|
|
190
|
+
@color_scale = v
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# @see data_bar
|
|
194
|
+
def data_bar=(v)
|
|
195
|
+
Axlsx::DataTypeValidator.validate 'conditional_formatting_rule.data_bar', DataBar, v
|
|
196
|
+
@data_bar = v
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
# @see icon_set
|
|
200
|
+
def icon_set=(v)
|
|
201
|
+
Axlsx::DataTypeValidator.validate 'conditional_formatting_rule.icon_set', IconSet, v
|
|
202
|
+
@icon_set = v
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
# Serializes the conditional formatting rule
|
|
207
|
+
# @param [String] str
|
|
208
|
+
# @return [String]
|
|
209
|
+
def to_xml_string(str = '')
|
|
210
|
+
str << '<cfRule '
|
|
211
|
+
serialized_attributes str
|
|
212
|
+
str << '>'
|
|
213
|
+
str << '<formula>' << [*self.formula].join('</formula><formula>') << '</formula>' if @formula
|
|
214
|
+
@color_scale.to_xml_string(str) if @color_scale && @type == :colorScale
|
|
215
|
+
@data_bar.to_xml_string(str) if @data_bar && @type == :dataBar
|
|
216
|
+
@icon_set.to_xml_string(str) if @icon_set && @type == :iconSet
|
|
217
|
+
str << '</cfRule>'
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
end
|