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,15 @@
|
|
|
1
|
+
module Axlsx
|
|
2
|
+
# This module defines a single method for parsing options in class
|
|
3
|
+
# initializers.
|
|
4
|
+
module OptionsParser
|
|
5
|
+
|
|
6
|
+
# Parses an options hash by calling any defined method by the same
|
|
7
|
+
# name of the key postfixed with an '='
|
|
8
|
+
# @param [Hash] options Options to parse.
|
|
9
|
+
def parse_options(options={})
|
|
10
|
+
options.each do |key, value|
|
|
11
|
+
self.send("#{key}=", value) if self.respond_to?("#{key}=") && value != nil
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
module Axlsx
|
|
3
|
+
# The Parser module mixes in a number of methods to help in generating a model from xml
|
|
4
|
+
# This module is not included in the axlsx library at this time. It is for future development only,
|
|
5
|
+
module Parser
|
|
6
|
+
|
|
7
|
+
# The xml to be parsed
|
|
8
|
+
attr_accessor :parser_xml
|
|
9
|
+
|
|
10
|
+
# parse and assign string attribute
|
|
11
|
+
def parse_string attr_name, xpath
|
|
12
|
+
send("#{attr_name.to_s}=", parse_value(xpath))
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# parse convert and assign node text to symbol
|
|
16
|
+
def parse_symbol attr_name, xpath
|
|
17
|
+
v = parse_value xpath
|
|
18
|
+
v = v.to_sym unless v.nil?
|
|
19
|
+
send("#{attr_name.to_s}=", v)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# parse, convert and assign note text to integer
|
|
23
|
+
def parse_integer attr_name, xpath
|
|
24
|
+
v = parse_value xpath
|
|
25
|
+
v = v.to_i if v.respond_to?(:to_i)
|
|
26
|
+
send("#{attr_name.to_s}=", v)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# parse, convert and assign node text to float
|
|
30
|
+
def parse_float attr_name, xpath
|
|
31
|
+
v = parse_value xpath
|
|
32
|
+
v = v.to_f if v.respond_to?(:to_f)
|
|
33
|
+
send("#{attr_name.to_s}=", v)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# return node text based on xpath
|
|
37
|
+
def parse_value xpath
|
|
38
|
+
node = parser_xml.xpath(xpath)
|
|
39
|
+
return nil if node.empty?
|
|
40
|
+
node.text.strip
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module Axlsx
|
|
2
|
+
# This module allows us to define a list of symbols defining which
|
|
3
|
+
# attributes will be serialized for a class.
|
|
4
|
+
module SerializedAttributes
|
|
5
|
+
|
|
6
|
+
# Extend with class methods
|
|
7
|
+
def self.included(base)
|
|
8
|
+
base.send :extend, ClassMethods
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# class methods applied to all includers
|
|
12
|
+
module ClassMethods
|
|
13
|
+
|
|
14
|
+
# This is the method to be used in inheriting classes to specify
|
|
15
|
+
# which of the instance values are serializable
|
|
16
|
+
def serializable_attributes(*symbols)
|
|
17
|
+
@xml_attributes = symbols
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# a reader for those attributes
|
|
21
|
+
def xml_attributes
|
|
22
|
+
@xml_attributes
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# This helper registers the attributes that will be formatted as elements.
|
|
26
|
+
def serializable_element_attributes(*symbols)
|
|
27
|
+
@xml_element_attributes = symbols
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# attr reader for element attributes
|
|
31
|
+
def xml_element_attributes
|
|
32
|
+
@xml_element_attributes
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# serializes the instance values of the defining object based on the
|
|
37
|
+
# list of serializable attributes.
|
|
38
|
+
# @param [String] str The string instance to append this
|
|
39
|
+
# serialization to.
|
|
40
|
+
# @param [Hash] additional_attributes An option key value hash for
|
|
41
|
+
# defining values that are not serializable attributes list.
|
|
42
|
+
def serialized_attributes(str = '', additional_attributes = {})
|
|
43
|
+
attributes = declared_attributes.merge! additional_attributes
|
|
44
|
+
attributes.each do |key, value|
|
|
45
|
+
str << "#{Axlsx.camel(key, false)}=\"#{Axlsx.camel(value, false)}\" "
|
|
46
|
+
end
|
|
47
|
+
str
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# A hash of instance variables that have been declared with
|
|
51
|
+
# seraialized_attributes and are not nil.
|
|
52
|
+
# This requires ruby 1.9.3 or higher
|
|
53
|
+
def declared_attributes
|
|
54
|
+
instance_values.select do |key, value|
|
|
55
|
+
value != nil && self.class.xml_attributes.include?(key.to_sym)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# serialized instance values at text nodes on a camelized element of the
|
|
60
|
+
# attribute name. You may pass in a block for evaluation against non nil
|
|
61
|
+
# values. We use an array for element attributes becuase misordering will
|
|
62
|
+
# break the xml and 1.8.7 does not support ordered hashes.
|
|
63
|
+
# @param [String] str The string instance to which serialized data is appended
|
|
64
|
+
# @param [Array] additional_attributes An array of additional attribute names.
|
|
65
|
+
# @return [String] The serialized output.
|
|
66
|
+
def serialized_element_attributes(str='', additional_attributes=[], &block)
|
|
67
|
+
attrs = self.class.xml_element_attributes + additional_attributes
|
|
68
|
+
values = instance_values
|
|
69
|
+
attrs.each do |attribute_name|
|
|
70
|
+
value = values[attribute_name.to_s]
|
|
71
|
+
next if value.nil?
|
|
72
|
+
value = yield value if block_given?
|
|
73
|
+
element_name = Axlsx.camel(attribute_name, false)
|
|
74
|
+
str << "<#{element_name}>#{value}</#{element_name}>"
|
|
75
|
+
end
|
|
76
|
+
str
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
module Axlsx
|
|
3
|
+
|
|
4
|
+
# A SimpleTypedList is a type restrictive collection that allows some of the methods from Array and supports basic xml serialization.
|
|
5
|
+
# @private
|
|
6
|
+
class SimpleTypedList
|
|
7
|
+
# Creats a new typed list
|
|
8
|
+
# @param [Array, Class] type An array of Class objects or a single Class object
|
|
9
|
+
# @param [String] serialize_as The tag name to use in serialization
|
|
10
|
+
# @raise [ArgumentError] if all members of type are not Class objects
|
|
11
|
+
def initialize type, serialize_as=nil
|
|
12
|
+
if type.is_a? Array
|
|
13
|
+
type.each { |item| raise ArgumentError, "All members of type must be Class objects" unless item.is_a? Class }
|
|
14
|
+
@allowed_types = type
|
|
15
|
+
else
|
|
16
|
+
raise ArgumentError, "Type must be a Class object or array of Class objects" unless type.is_a? Class
|
|
17
|
+
@allowed_types = [type]
|
|
18
|
+
end
|
|
19
|
+
@list = []
|
|
20
|
+
@locked_at = nil
|
|
21
|
+
@serialize_as = serialize_as
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# The class constants of allowed types
|
|
25
|
+
# @return [Array]
|
|
26
|
+
attr_reader :allowed_types
|
|
27
|
+
|
|
28
|
+
# The index below which items cannot be removed
|
|
29
|
+
# @return [Integer]
|
|
30
|
+
attr_reader :locked_at
|
|
31
|
+
|
|
32
|
+
# The tag name to use when serializing this object
|
|
33
|
+
# by default the parent node for all items in the list is the classname of the first allowed type with the first letter in lowercase.
|
|
34
|
+
# @return [String]
|
|
35
|
+
attr_reader :serialize_as
|
|
36
|
+
|
|
37
|
+
# Transposes the list (without blowing up like ruby does)
|
|
38
|
+
# any non populated cell in the matrix will be a nil value
|
|
39
|
+
def transpose
|
|
40
|
+
return @list.clone if @list.size == 0
|
|
41
|
+
row_count = @list.size
|
|
42
|
+
max_column_count = @list.map{|row| row.cells.size}.max
|
|
43
|
+
result = Array.new(max_column_count) { Array.new(row_count) }
|
|
44
|
+
# yes, I know it is silly, but that warning is really annoying
|
|
45
|
+
row_count.times do |row_index|
|
|
46
|
+
max_column_count.times do |column_index|
|
|
47
|
+
datum = if @list[row_index].cells.size >= max_column_count
|
|
48
|
+
@list[row_index].cells[column_index]
|
|
49
|
+
elsif block_given?
|
|
50
|
+
yield(column_index, row_index)
|
|
51
|
+
end
|
|
52
|
+
result[column_index][row_index] = datum
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
result
|
|
56
|
+
end
|
|
57
|
+
# Lock this list at the current size
|
|
58
|
+
# @return [self]
|
|
59
|
+
def lock
|
|
60
|
+
@locked_at = @list.size
|
|
61
|
+
self
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def to_ary
|
|
65
|
+
@list
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
alias :to_a :to_ary
|
|
69
|
+
|
|
70
|
+
# Unlock the list
|
|
71
|
+
# @return [self]
|
|
72
|
+
def unlock
|
|
73
|
+
@locked_at = nil
|
|
74
|
+
self
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# join operator
|
|
78
|
+
# @param [Array] v the array to join
|
|
79
|
+
# @raise [ArgumentError] if any of the values being joined are not
|
|
80
|
+
# one of the allowed types
|
|
81
|
+
# @return [SimpleTypedList]
|
|
82
|
+
def +(v)
|
|
83
|
+
v.each do |item|
|
|
84
|
+
DataTypeValidator.validate "SimpleTypedList.+", @allowed_types, item
|
|
85
|
+
@list << item
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Concat operator
|
|
90
|
+
# @param [Any] v the data to be added
|
|
91
|
+
# @raise [ArgumentError] if the value being added is not one fo the allowed types
|
|
92
|
+
# @return [Integer] returns the index of the item added.
|
|
93
|
+
def <<(v)
|
|
94
|
+
DataTypeValidator.validate "SimpleTypedList.<<", @allowed_types, v
|
|
95
|
+
@list << v
|
|
96
|
+
@list.size - 1
|
|
97
|
+
end
|
|
98
|
+
alias :push :<<
|
|
99
|
+
|
|
100
|
+
# delete the item from the list
|
|
101
|
+
# @param [Any] v The item to be deleted.
|
|
102
|
+
# @raise [ArgumentError] if the item's index is protected by locking
|
|
103
|
+
# @return [Any] The item deleted
|
|
104
|
+
def delete(v)
|
|
105
|
+
return unless @list.include? v
|
|
106
|
+
raise ArgumentError, "Item is protected and cannot be deleted" if protected? @list.index(v)
|
|
107
|
+
@list.delete v
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# delete the item from the list at the index position provided
|
|
111
|
+
# @raise [ArgumentError] if the index is protected by locking
|
|
112
|
+
# @return [Any] The item deleted
|
|
113
|
+
def delete_at(index)
|
|
114
|
+
@list[index]
|
|
115
|
+
raise ArgumentError, "Item is protected and cannot be deleted" if protected? index
|
|
116
|
+
@list.delete_at index
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# positional assignment. Adds the item at the index specified
|
|
120
|
+
# @param [Integer] index
|
|
121
|
+
# @param [Any] v
|
|
122
|
+
# @raise [ArgumentError] if the index is protected by locking
|
|
123
|
+
# @raise [ArgumentError] if the item is not one of the allowed types
|
|
124
|
+
def []=(index, v)
|
|
125
|
+
DataTypeValidator.validate "SimpleTypedList.<<", @allowed_types, v
|
|
126
|
+
raise ArgumentError, "Item is protected and cannot be changed" if protected? index
|
|
127
|
+
@list[index] = v
|
|
128
|
+
v
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# inserts an item at the index specfied
|
|
132
|
+
# @param [Integer] index
|
|
133
|
+
# @param [Any] v
|
|
134
|
+
# @raise [ArgumentError] if the index is protected by locking
|
|
135
|
+
# @raise [ArgumentError] if the index is not one of the allowed types
|
|
136
|
+
def insert(index, v)
|
|
137
|
+
DataTypeValidator.validate "SimpleTypedList.<<", @allowed_types, v
|
|
138
|
+
raise ArgumentError, "Item is protected and cannot be changed" if protected? index
|
|
139
|
+
@list.insert(index, v)
|
|
140
|
+
v
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# determines if the index is protected
|
|
144
|
+
# @param [Integer] index
|
|
145
|
+
def protected? index
|
|
146
|
+
return false unless @locked_at.is_a? Fixnum
|
|
147
|
+
index < @locked_at
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# override the equality method so that this object can be compared to a simple array.
|
|
151
|
+
# if this object's list is equal to the specifiec array, we return true.
|
|
152
|
+
def ==(v)
|
|
153
|
+
v == @list
|
|
154
|
+
end
|
|
155
|
+
# method_mission override to pass allowed methods to the list.
|
|
156
|
+
# @note
|
|
157
|
+
# the following methods are not allowed
|
|
158
|
+
# :replace
|
|
159
|
+
# :insert
|
|
160
|
+
# :collect!
|
|
161
|
+
# :map!
|
|
162
|
+
# :pop
|
|
163
|
+
# :delete_if
|
|
164
|
+
# :reverse!
|
|
165
|
+
# :shift
|
|
166
|
+
# :shuffle!
|
|
167
|
+
# :slice!
|
|
168
|
+
# :sort!
|
|
169
|
+
# :uniq!
|
|
170
|
+
# :unshift
|
|
171
|
+
# :zip
|
|
172
|
+
# :flatten!
|
|
173
|
+
# :fill
|
|
174
|
+
# :drop
|
|
175
|
+
# :drop_while
|
|
176
|
+
# :delete_if
|
|
177
|
+
# :clear
|
|
178
|
+
DESTRUCTIVE = ['replace', 'insert', 'collect!', 'map!', 'pop', 'delete_if',
|
|
179
|
+
'reverse!', 'shift', 'shuffle!', 'slice!', 'sort!', 'uniq!',
|
|
180
|
+
'unshift', 'zip', 'flatten!', 'fill', 'drop', 'drop_while',
|
|
181
|
+
'delete_if', 'clear']
|
|
182
|
+
DELEGATES = Array.instance_methods - self.instance_methods - DESTRUCTIVE
|
|
183
|
+
|
|
184
|
+
DELEGATES.each do |method|
|
|
185
|
+
class_eval %{
|
|
186
|
+
def #{method}(*args, &block)
|
|
187
|
+
@list.send(:#{method}, *args, &block)
|
|
188
|
+
end
|
|
189
|
+
}
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def to_xml_string(str = '')
|
|
193
|
+
classname = @allowed_types[0].name.split('::').last
|
|
194
|
+
el_name = serialize_as.to_s || (classname[0,1].downcase + classname[1..-1])
|
|
195
|
+
str << '<' << el_name << ' count="' << @list.size.to_s << '">'
|
|
196
|
+
@list.each { |item| item.to_xml_string(str) }
|
|
197
|
+
str << '</' << el_name << '>'
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
end
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
module Axlsx
|
|
3
|
+
|
|
4
|
+
# The Storage class represents a storage object or stream in a compound file.
|
|
5
|
+
class Storage
|
|
6
|
+
|
|
7
|
+
# Packing for the Storage when pushing an array of items into a byte stream
|
|
8
|
+
# Name, name length, type, color, left sibling, right sibling, child, classid, state, created, modified, sector, size
|
|
9
|
+
PACKING = "s32 s1 c2 l3 x16 x4 q2 l q"
|
|
10
|
+
|
|
11
|
+
# storage types
|
|
12
|
+
TYPES = {
|
|
13
|
+
:root=>5,
|
|
14
|
+
:stream=>2,
|
|
15
|
+
:storage=>1
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
# Creates a byte string for this storage
|
|
19
|
+
# @return [String]
|
|
20
|
+
def to_s
|
|
21
|
+
data = [@name.concat(Array.new(32-@name.size, 0)),
|
|
22
|
+
@name_size,
|
|
23
|
+
@type,
|
|
24
|
+
@color,
|
|
25
|
+
@left,
|
|
26
|
+
@right,
|
|
27
|
+
@child,
|
|
28
|
+
@created,
|
|
29
|
+
@modified,
|
|
30
|
+
@sector,
|
|
31
|
+
@size].flatten
|
|
32
|
+
data.pack(PACKING)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# storage colors
|
|
36
|
+
COLORS = {
|
|
37
|
+
:red=>0,
|
|
38
|
+
:black=>1
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
# The color of this node in the directory tree. Defaults to black if not specified
|
|
42
|
+
# @return [Integer] color
|
|
43
|
+
attr_reader :color
|
|
44
|
+
|
|
45
|
+
# Sets the color for this storage
|
|
46
|
+
# @param [Integer] v Must be one of the COLORS constant hash values
|
|
47
|
+
def color=(v)
|
|
48
|
+
RestrictionValidator.validate "Storage.color", COLORS.values, v
|
|
49
|
+
@color = v
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# The size of the name for this node.
|
|
53
|
+
# interesting to see that office actually uses 'R' for the root directory and lists the size as 2 bytes - thus is it *NOT* null
|
|
54
|
+
# terminated. I am making this r/w so that I can override the size
|
|
55
|
+
# @return [Integer] color
|
|
56
|
+
attr_reader :name_size
|
|
57
|
+
|
|
58
|
+
# the name of the stream
|
|
59
|
+
attr_reader :name
|
|
60
|
+
|
|
61
|
+
# sets the name of the stream.
|
|
62
|
+
# This will automatically set the name_size attribute
|
|
63
|
+
# @return [String] name
|
|
64
|
+
def name=(v)
|
|
65
|
+
@name = v.bytes.to_a << 0
|
|
66
|
+
@name_size = @name.size * 2
|
|
67
|
+
@name
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# The size of the stream
|
|
71
|
+
attr_reader :size
|
|
72
|
+
|
|
73
|
+
# The stream associated with this storage
|
|
74
|
+
attr_reader :data
|
|
75
|
+
|
|
76
|
+
# Set the data associated with the stream. If the stream type is undefined, we automatically specify the storage as a stream type. # with the exception of storages that are type root, all storages with data should be type stream.
|
|
77
|
+
# @param [String] v The data for this storages stream
|
|
78
|
+
# @return [Array]
|
|
79
|
+
def data=(v)
|
|
80
|
+
Axlsx::validate_string(v)
|
|
81
|
+
self.type = TYPES[:stream] unless @type
|
|
82
|
+
@size = v.size
|
|
83
|
+
@data = v.bytes.to_a
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# The starting sector for the stream. If this storage is not a stream, or the root node this is nil
|
|
87
|
+
# @return [Integer] sector
|
|
88
|
+
attr_accessor :sector
|
|
89
|
+
|
|
90
|
+
# The 0 based index in the directoies chain for this the left sibling of this storage.
|
|
91
|
+
|
|
92
|
+
# @return [Integer] left
|
|
93
|
+
attr_accessor :left
|
|
94
|
+
|
|
95
|
+
# The 0 based index in the directoies chain for this the right sibling of this storage.
|
|
96
|
+
# @return [Integer] right
|
|
97
|
+
attr_accessor :right
|
|
98
|
+
|
|
99
|
+
# The 0 based index in the directoies chain for the child of this storage.
|
|
100
|
+
# @return [Integer] child
|
|
101
|
+
attr_accessor :child
|
|
102
|
+
|
|
103
|
+
# The created attribute for the storage
|
|
104
|
+
# @return [Integer] created
|
|
105
|
+
attr_accessor :created
|
|
106
|
+
|
|
107
|
+
# The modified attribute for the storage
|
|
108
|
+
# @return [Integer] modified
|
|
109
|
+
attr_accessor :modified
|
|
110
|
+
|
|
111
|
+
# The type of storage
|
|
112
|
+
# see TYPES
|
|
113
|
+
# @return [Integer] type
|
|
114
|
+
attr_reader :type
|
|
115
|
+
|
|
116
|
+
# Sets the type for this storage.
|
|
117
|
+
# @param [Integer] v the type to specify must be one of the TYPES constant hash values.
|
|
118
|
+
def type=(v)
|
|
119
|
+
RestrictionValidator.validate "Storage.type", TYPES.values, v
|
|
120
|
+
@type = v
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Creates a new storage object.
|
|
124
|
+
# @param [String] name the name of the storage
|
|
125
|
+
# @option options [Integer] color @default black
|
|
126
|
+
# @option options [Integer] type @default storage
|
|
127
|
+
# @option options [String] data
|
|
128
|
+
# @option options [Integer] left @default -1
|
|
129
|
+
# @option options [Integer] right @default -1
|
|
130
|
+
# @option options [Integer] child @default -1
|
|
131
|
+
# @option options [Integer] created @default 0
|
|
132
|
+
# @option options [Integer] modified @default 0
|
|
133
|
+
# @option options [Integer] sector @default 0
|
|
134
|
+
def initialize(name, options= {})
|
|
135
|
+
@left = @right = @child = -1
|
|
136
|
+
@sector = @size = @created = @modified = 0
|
|
137
|
+
options.each do |o|
|
|
138
|
+
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
|
139
|
+
end
|
|
140
|
+
@color ||= COLORS[:black]
|
|
141
|
+
@type ||= (data.nil? ? TYPES[:storage] : TYPES[:stream])
|
|
142
|
+
self.name = name
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
end
|
|
146
|
+
end
|