axlsx 1.1.0 → 1.2.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.
- data/.yardopts +5 -2
- data/CHANGELOG.md +78 -0
- data/LICENSE +1 -1
- data/README.md +132 -331
- data/Rakefile +17 -5
- data/examples/basic_charts.rb +54 -0
- data/examples/chart_colors.rb +88 -0
- data/examples/conditional_formatting/example_conditional_formatting.rb +72 -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 +300 -152
- data/examples/example.xlsx +0 -0
- data/examples/example_streamed.xlsx +0 -0
- data/examples/extractive.pdf +0 -0
- data/examples/extractive.rb +45 -0
- data/examples/no-use_autowidth.xlsx +0 -0
- data/examples/sample.png +0 -0
- data/examples/scraping_html.rb +91 -0
- data/examples/shared_strings_example.xlsx +0 -0
- data/examples/sheet_protection.rb +10 -0
- data/examples/sheet_view.rb +34 -0
- data/examples/skydrive/real_example.rb +63 -0
- data/examples/two_cell_anchor_image.rb +11 -0
- data/lib/axlsx/content_type/content_type.rb +2 -0
- data/lib/axlsx/content_type/default.rb +30 -15
- data/lib/axlsx/content_type/override.rb +29 -14
- data/lib/axlsx/doc_props/app.rb +161 -104
- data/lib/axlsx/doc_props/core.rb +9 -5
- data/lib/axlsx/drawing/ax_data_source.rb +26 -0
- data/lib/axlsx/drawing/axis.rb +106 -35
- data/lib/axlsx/drawing/bar_3D_chart.rb +49 -45
- data/lib/axlsx/drawing/bar_series.rb +25 -7
- data/lib/axlsx/drawing/cat_axis.rb +50 -22
- data/lib/axlsx/drawing/chart.rb +69 -56
- data/lib/axlsx/drawing/d_lbls.rb +100 -0
- data/lib/axlsx/drawing/drawing.rb +28 -12
- data/lib/axlsx/drawing/graphic_frame.rb +2 -1
- data/lib/axlsx/drawing/line_3D_chart.rb +3 -10
- data/lib/axlsx/drawing/line_series.rb +20 -4
- data/lib/axlsx/drawing/num_data.rb +52 -0
- data/lib/axlsx/drawing/num_data_source.rb +61 -0
- data/lib/axlsx/drawing/num_val.rb +32 -0
- data/lib/axlsx/drawing/pic.rb +44 -4
- data/lib/axlsx/drawing/pie_3D_chart.rb +10 -7
- data/lib/axlsx/drawing/pie_series.rb +18 -4
- data/lib/axlsx/drawing/scatter_chart.rb +12 -18
- data/lib/axlsx/drawing/scatter_series.rb +28 -2
- data/lib/axlsx/drawing/ser_axis.rb +1 -1
- data/lib/axlsx/drawing/series.rb +1 -1
- data/lib/axlsx/drawing/str_data.rb +42 -0
- data/lib/axlsx/drawing/str_val.rb +33 -0
- data/lib/axlsx/drawing/title.rb +21 -9
- data/lib/axlsx/drawing/two_cell_anchor.rb +46 -9
- data/lib/axlsx/drawing/view_3D.rb +44 -31
- data/lib/axlsx/drawing/vml_drawing.rb +42 -0
- data/lib/axlsx/drawing/vml_shape.rb +125 -0
- data/lib/axlsx/package.rb +44 -16
- data/lib/axlsx/rels/relationship.rb +3 -3
- data/lib/axlsx/rels/relationships.rb +1 -11
- data/lib/axlsx/stylesheet/color.rb +0 -1
- data/lib/axlsx/stylesheet/dxf.rb +79 -0
- data/lib/axlsx/stylesheet/font.rb +2 -1
- data/lib/axlsx/stylesheet/gradient_fill.rb +1 -1
- data/lib/axlsx/stylesheet/styles.rb +143 -50
- data/lib/axlsx/stylesheet/table_style.rb +3 -3
- data/lib/axlsx/stylesheet/xf.rb +2 -0
- data/lib/axlsx/util/constants.rb +36 -0
- data/lib/axlsx/util/simple_typed_list.rb +15 -21
- data/lib/axlsx/util/validators.rb +122 -5
- data/lib/axlsx/version.rb +2 -7
- data/lib/axlsx/workbook/defined_name.rb +174 -0
- data/lib/axlsx/workbook/defined_names.rb +21 -0
- data/lib/axlsx/workbook/shared_strings_table.rb +12 -13
- data/lib/axlsx/workbook/workbook.rb +71 -13
- data/lib/axlsx/workbook/worksheet/auto_filter.rb +34 -0
- data/lib/axlsx/workbook/worksheet/cell.rb +45 -36
- data/lib/axlsx/workbook/worksheet/cfvo.rb +62 -0
- data/lib/axlsx/workbook/worksheet/col.rb +17 -1
- data/lib/axlsx/workbook/worksheet/color_scale.rb +76 -0
- data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
- data/lib/axlsx/workbook/worksheet/comment.rb +101 -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 +216 -0
- data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
- data/lib/axlsx/workbook/worksheet/data_bar.rb +97 -0
- data/lib/axlsx/workbook/worksheet/data_validation.rb +245 -0
- data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
- data/lib/axlsx/workbook/worksheet/dimension.rb +65 -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_setup.rb +113 -0
- data/lib/axlsx/workbook/worksheet/pane.rb +144 -0
- data/lib/axlsx/workbook/worksheet/print_options.rb +63 -0
- data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -0
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
- data/lib/axlsx/workbook/worksheet/row.rb +69 -12
- data/lib/axlsx/workbook/worksheet/selection.rb +111 -0
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +24 -0
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +224 -0
- data/lib/axlsx/workbook/worksheet/sheet_view.rb +379 -0
- data/lib/axlsx/workbook/worksheet/table.rb +3 -3
- data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
- data/lib/axlsx/workbook/worksheet/worksheet.rb +379 -233
- data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +57 -0
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +64 -0
- data/lib/axlsx.rb +31 -16
- data/test/benchmark.rb +30 -38
- data/test/content_type/tc_content_type.rb +1 -6
- data/test/doc_props/tc_app.rb +31 -1
- data/test/doc_props/tc_core.rb +3 -1
- data/test/drawing/tc_axis.rb +46 -3
- data/test/drawing/tc_bar_3D_chart.rb +12 -12
- data/test/drawing/tc_bar_series.rb +17 -13
- data/test/drawing/tc_cat_axis.rb +3 -3
- data/test/drawing/tc_cat_axis_data.rb +23 -13
- data/test/drawing/tc_chart.rb +29 -11
- data/test/drawing/tc_d_lbls.rb +47 -0
- data/test/drawing/tc_data_source.rb +17 -0
- data/test/drawing/tc_drawing.rb +11 -5
- data/test/drawing/tc_hyperlink.rb +4 -5
- data/test/drawing/tc_line_series.rb +9 -11
- 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_pic.rb +22 -2
- data/test/drawing/tc_pie_3D_chart.rb +4 -8
- data/test/drawing/tc_pie_series.rb +11 -13
- data/test/drawing/tc_scatter_chart.rb +6 -1
- data/test/drawing/tc_scatter_series.rb +6 -5
- data/test/drawing/tc_series.rb +1 -1
- data/test/drawing/tc_str_data.rb +18 -0
- data/test/drawing/tc_str_val.rb +21 -0
- data/test/drawing/tc_title.rb +16 -0
- data/test/drawing/tc_two_cell_anchor.rb +2 -3
- data/test/drawing/tc_view_3D.rb +18 -18
- data/test/drawing/tc_vml_drawing.rb +25 -0
- data/test/drawing/tc_vml_shape.rb +100 -0
- data/test/profile.rb +2 -1
- data/test/rels/tc_relationship.rb +1 -0
- data/test/stylesheet/tc_dxf.rb +81 -0
- data/test/stylesheet/tc_gradient_fill.rb +8 -0
- data/test/stylesheet/tc_pattern_fill.rb +7 -1
- data/test/stylesheet/tc_styles.rb +163 -3
- data/test/stylesheet/tc_table_style.rb +8 -0
- data/test/stylesheet/tc_table_style_element.rb +10 -1
- data/test/tc_helper.rb +1 -0
- data/test/tc_package.rb +93 -17
- data/test/util/tc_simple_typed_list.rb +13 -0
- data/test/util/tc_validators.rb +95 -9
- data/test/workbook/tc_defined_name.rb +41 -0
- data/test/workbook/tc_workbook.rb +5 -3
- data/test/workbook/worksheet/table/tc_table.rb +3 -11
- data/test/workbook/worksheet/tc_cell.rb +52 -18
- data/test/workbook/worksheet/tc_cfvo.rb +31 -0
- data/test/workbook/worksheet/tc_col.rb +9 -0
- data/test/workbook/worksheet/tc_color_scale.rb +29 -0
- data/test/workbook/worksheet/tc_comment.rb +57 -0
- data/test/workbook/worksheet/tc_comments.rb +57 -0
- data/test/workbook/worksheet/tc_conditional_formatting.rb +217 -0
- data/test/workbook/worksheet/tc_data_bar.rb +39 -0
- data/test/workbook/worksheet/tc_data_validation.rb +265 -0
- data/test/workbook/worksheet/tc_date_time_converter.rb +11 -5
- data/test/workbook/worksheet/tc_icon_set.rb +45 -0
- data/test/workbook/worksheet/tc_page_setup.rb +138 -0
- data/test/workbook/worksheet/tc_pane.rb +94 -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 +44 -13
- data/test/workbook/worksheet/tc_selection.rb +94 -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_worksheet.rb +147 -50
- metadata +216 -148
- data/examples/example.csv +0 -1000
- data/examples/example.rb~ +0 -112
- data/lib/axlsx/drawing/cat_axis_data.rb +0 -34
- data/lib/axlsx/drawing/hlink_click.rb~ +0 -0
- data/lib/axlsx/drawing/hyperlink.rb~ +0 -64
- data/lib/axlsx/drawing/named_axis_data.rb +0 -36
- data/lib/axlsx/drawing/picture_locking.rb~ +0 -36
- data/lib/axlsx/drawing/val_axis_data.rb +0 -27
- data/lib/axlsx/stylesheet/#num_fmt.rb# +0 -69
- data/lib/axlsx/util/cbf.rb +0 -333
- data/lib/axlsx/util/cfb.rb~ +0 -201
- data/lib/axlsx/util/ms_off_crypto.rb +0 -189
- data/lib/axlsx/util/ms_off_crypto.rb~ +0 -3
- data/lib/axlsx/util/ms_offcrypto.rb~ +0 -0
- data/lib/axlsx/util/parser.rb~ +0 -6
- data/lib/axlsx/util/storage.rb~ +0 -0
- data/lib/axlsx/workbook/shared_strings_table.rb~ +0 -69
- data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
- data/lib/axlsx/workbook/worksheet/shared_strings_table.rb~ +0 -0
- data/lib/axlsx/workbook/worksheet/table.rb~ +0 -97
- data/lib/schema/dc.xsd~ +0 -118
- data/lib/schema/dcterms.xsd~ +0 -331
- data/lib/schema/opc-coreProperties.xsd~ +0 -50
- data/test/#benchmark.txt# +0 -7
- data/test/#tc_helper.rb# +0 -3
- data/test/benchmark.rb~ +0 -0
- data/test/benchmark.txt +0 -6
- data/test/benchmark.txt~ +0 -6
- data/test/drawing/tc_val_axis_data.rb +0 -17
- data/test/example.csv +0 -1000
- data/test/example.xlsx +0 -0
- data/test/example_streamed.xlsx +0 -0
- data/test/tc_axlsx.rb~ +0 -0
- data/test/tc_helper.rb~ +0 -3
- data/test/workbook/worksheet/table/tc_table.rb~ +0 -72
- data/test/workbook/worksheet/tc_col.rb~ +0 -10
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
module Axlsx
|
|
2
|
+
# Conditional Format Rule icon sets
|
|
3
|
+
# Describes an icon set conditional formatting rule.
|
|
4
|
+
|
|
5
|
+
# @note The recommended way to manage these rules is via Worksheet#add_conditional_formatting
|
|
6
|
+
# @see Worksheet#add_conditional_formatting
|
|
7
|
+
# @see ConditionalFormattingRule#initialize
|
|
8
|
+
class IconSet
|
|
9
|
+
|
|
10
|
+
# instance values that must be serialized as their own elements - e.g. not attributes.
|
|
11
|
+
CHILD_ELEMENTS = [:value_objects]
|
|
12
|
+
|
|
13
|
+
# The icon set to display.
|
|
14
|
+
# Allowed values are: 3Arrows, 3ArrowsGray, 3Flags, 3TrafficLights1, 3TrafficLights2, 3Signs, 3Symbols, 3Symbols2, 4Arrows, 4ArrowsGray, 4RedToBlack, 4Rating, 4TrafficLights, 5Arrows, 5ArrowsGray, 5Rating, 5Quarters
|
|
15
|
+
# The default value is 3TrafficLights1
|
|
16
|
+
# @return [String]
|
|
17
|
+
attr_reader :iconSet
|
|
18
|
+
|
|
19
|
+
# Indicates whether the thresholds indicate percentile values, instead of number values.
|
|
20
|
+
# The default falue is true
|
|
21
|
+
# @return [Boolean]
|
|
22
|
+
attr_reader :percent
|
|
23
|
+
|
|
24
|
+
# If true, reverses the default order of the icons in this icon set.maxLength attribute
|
|
25
|
+
# The default value is false
|
|
26
|
+
# @return [Boolean]
|
|
27
|
+
attr_reader :reverse
|
|
28
|
+
|
|
29
|
+
# Indicates whether to show the values of the cells on which this data bar is applied.
|
|
30
|
+
# The default value is true
|
|
31
|
+
# @return [Boolean]
|
|
32
|
+
attr_reader :showValue
|
|
33
|
+
|
|
34
|
+
# Creates a new icon set object
|
|
35
|
+
# @option options [String] iconSet
|
|
36
|
+
# @option options [Boolean] reverse
|
|
37
|
+
# @option options [Boolean] percent
|
|
38
|
+
# @option options [Boolean] showValue
|
|
39
|
+
def initialize(options = {})
|
|
40
|
+
@percent = @showValue = true
|
|
41
|
+
@reverse = false
|
|
42
|
+
@iconSet = "3TrafficLights1"
|
|
43
|
+
initialize_value_objects
|
|
44
|
+
options.each do |o|
|
|
45
|
+
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
|
46
|
+
end
|
|
47
|
+
yield self if block_given?
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# @see iconSet
|
|
51
|
+
def iconSet=(v); Axlsx::validate_icon_set(v); @iconSet = v end
|
|
52
|
+
|
|
53
|
+
# @see showValue
|
|
54
|
+
def showValue=(v); Axlsx.validate_boolean(v); @showValue = v end
|
|
55
|
+
|
|
56
|
+
# @see percent
|
|
57
|
+
def percent=(v); Axlsx.validate_boolean(v); @percent = v end
|
|
58
|
+
|
|
59
|
+
# @see reverse
|
|
60
|
+
def reverse=(v); Axlsx.validate_boolean(v); @reverse = v end
|
|
61
|
+
|
|
62
|
+
# Serialize this object to an xml string
|
|
63
|
+
# @param [String] str
|
|
64
|
+
# @return [String]
|
|
65
|
+
def to_xml_string(str="")
|
|
66
|
+
str << '<iconSet '
|
|
67
|
+
str << instance_values.map { |key, value| '' << key << '="' << value.to_s << '"' unless CHILD_ELEMENTS.include?(key.to_sym) }.join(' ')
|
|
68
|
+
str << '>'
|
|
69
|
+
@value_objects.each { |cfvo| cfvo.to_xml_string(str) }
|
|
70
|
+
str << '</iconSet>'
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
|
|
75
|
+
# Initalize the simple typed list of value objects
|
|
76
|
+
# I am keeping this private for now as I am not sure what impact changes to the required two cfvo objects will do.
|
|
77
|
+
def initialize_value_objects
|
|
78
|
+
@value_objects = SimpleTypedList.new Cfvo
|
|
79
|
+
@value_objects.concat [Cfvo.new(:type => :percent, :val => 0), Cfvo.new(:type => :percent, :val => 33), Cfvo.new(:type => :percent, :val => 67)]
|
|
80
|
+
@value_objects.lock
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Axlsx
|
|
2
|
+
|
|
3
|
+
# A simple list of merged cells
|
|
4
|
+
class MergedCells < SimpleTypedList
|
|
5
|
+
|
|
6
|
+
# creates a new MergedCells object
|
|
7
|
+
# @param [Worksheet] worksheet
|
|
8
|
+
def initialize(worksheet)
|
|
9
|
+
raise ArgumentError, 'you must provide a worksheet' unless worksheet.is_a?(Worksheet)
|
|
10
|
+
super String
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# adds cells to the merged cells collection
|
|
14
|
+
# @param [Array||String] cells The cells to add to the merged cells
|
|
15
|
+
# collection. This can be an array of actual cells or a string style
|
|
16
|
+
# range like 'A1:C1'
|
|
17
|
+
def add(cells)
|
|
18
|
+
@list << if cells.is_a?(String)
|
|
19
|
+
cells
|
|
20
|
+
elsif cells.is_a?(Array)
|
|
21
|
+
Axlsx::cell_range(cells, false)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# serialize the object
|
|
26
|
+
# @param [String] str
|
|
27
|
+
# @return [String]
|
|
28
|
+
def to_xml_string(str = '')
|
|
29
|
+
return if @list.empty?
|
|
30
|
+
str << "<mergeCells count='#{size}'>"
|
|
31
|
+
each { |merged_cell| str << "<mergeCell ref='#{merged_cell}'></mergeCell>" }
|
|
32
|
+
str << '</mergeCells>'
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
module Axlsx
|
|
2
|
+
# Page setup settings for printing a worksheet. All settings are optional.
|
|
3
|
+
#
|
|
4
|
+
# @note The recommended way to manage print options is via Worksheet#page_setup
|
|
5
|
+
# @see Worksheet#print_options
|
|
6
|
+
# @see Worksheet#initialize
|
|
7
|
+
class PageSetup
|
|
8
|
+
|
|
9
|
+
# TODO: Attributes defined by Open XML spec that are not implemented yet:
|
|
10
|
+
#
|
|
11
|
+
# * blackAndWhite
|
|
12
|
+
# * cellComments
|
|
13
|
+
# * copies
|
|
14
|
+
# * draft
|
|
15
|
+
# * errors
|
|
16
|
+
# * firstPageNumber
|
|
17
|
+
# * horizontalDpi
|
|
18
|
+
# * pageOrder
|
|
19
|
+
# * paperSize
|
|
20
|
+
# * useFirstPageNumber
|
|
21
|
+
# * usePrinterDefaults
|
|
22
|
+
# * verticalDpi
|
|
23
|
+
|
|
24
|
+
# Number of vertical pages to fit on.
|
|
25
|
+
# @note PageSetup#fit_to is the recomended way to manage page fitting as only specifying one of fit_to_width/fit_to_height will result in the counterpart
|
|
26
|
+
# being set to 1.
|
|
27
|
+
# @return [Integer]
|
|
28
|
+
attr_reader :fit_to_height
|
|
29
|
+
|
|
30
|
+
# Number of horizontal pages to fit on.
|
|
31
|
+
# @note PageSetup#fit_to is the recomended way to manage page fitting as only specifying one of width/height will result in the counterpart
|
|
32
|
+
# being set to 1.
|
|
33
|
+
# @return [Integer]
|
|
34
|
+
attr_reader :fit_to_width
|
|
35
|
+
|
|
36
|
+
# Orientation of the page (:default, :landscape, :portrait)
|
|
37
|
+
# @return [Symbol]
|
|
38
|
+
attr_reader :orientation
|
|
39
|
+
|
|
40
|
+
# Height of paper (string containing a number followed by a unit identifier: "297mm", "11in")
|
|
41
|
+
# @return [String]
|
|
42
|
+
attr_reader :paper_height
|
|
43
|
+
|
|
44
|
+
# Width of paper (string containing a number followed by a unit identifier: "210mm", "8.5in")
|
|
45
|
+
# @return [String]
|
|
46
|
+
attr_reader :paper_width
|
|
47
|
+
|
|
48
|
+
# Print scaling (percent value, given as integer ranging from 10 to 400)
|
|
49
|
+
# @return [Integer]
|
|
50
|
+
attr_reader :scale
|
|
51
|
+
|
|
52
|
+
# Creates a new PageSetup object
|
|
53
|
+
# @option options [Integer] fit_to_height Number of vertical pages to fit on
|
|
54
|
+
# @option options [Integer] fit_to_width Number of horizontal pages to fit on
|
|
55
|
+
# @option options [Symbol] orientation Orientation of the page (:default, :landscape, :portrait)
|
|
56
|
+
# @option options [String] paper_height Height of paper (number followed by unit identifier: "297mm", "11in")
|
|
57
|
+
# @option options [String] paper_width Width of paper (number followed by unit identifier: "210mm", "8.5in")
|
|
58
|
+
# @option options [Integer] scale Print scaling (percent value, integer ranging from 10 to 400)
|
|
59
|
+
def initialize(options = {})
|
|
60
|
+
set(options)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Set some or all page settings at once.
|
|
64
|
+
# @param [Hash] options The page settings to set (possible keys are :fit_to_height, :fit_to_width, :orientation, :paper_height, :paper_width, and :scale).
|
|
65
|
+
def set(options)
|
|
66
|
+
options.each do |k, v|
|
|
67
|
+
send("#{k}=", v) if respond_to? "#{k}="
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# @see fit_to_height
|
|
72
|
+
def fit_to_height=(v); Axlsx::validate_unsigned_int(v); @fit_to_height = v; end
|
|
73
|
+
# @see fit_to_width
|
|
74
|
+
def fit_to_width=(v); Axlsx::validate_unsigned_int(v); @fit_to_width = v; end
|
|
75
|
+
# @see orientation
|
|
76
|
+
def orientation=(v); Axlsx::validate_page_orientation(v); @orientation = v; end
|
|
77
|
+
# @see paper_height
|
|
78
|
+
def paper_height=(v); Axlsx::validate_number_with_unit(v); @paper_height = v; end
|
|
79
|
+
# @see paper_width
|
|
80
|
+
def paper_width=(v); Axlsx::validate_number_with_unit(v); @paper_width = v; end
|
|
81
|
+
# @see scale
|
|
82
|
+
def scale=(v); Axlsx::validate_scale_10_400(v); @scale = v; end
|
|
83
|
+
|
|
84
|
+
# convenience method to achieve sanity when setting fit_to_width and fit_to_height
|
|
85
|
+
# as they both default to 1 if only their counterpart is specified.
|
|
86
|
+
# @note This method will overwrite any value you explicitly set via the fit_to_height or fit_to_width methods.
|
|
87
|
+
# @option options [Integer] width The number of pages to fit this worksheet on horizontally. Default 9999
|
|
88
|
+
# @option options [Integer] height The number of pages to fit this worksheet on vertically. Default 9999
|
|
89
|
+
def fit_to(options={})
|
|
90
|
+
self.fit_to_width = options[:width] || 9999
|
|
91
|
+
self.fit_to_height = options[:height] || 9999
|
|
92
|
+
[@fit_to_width, @fit_to_height]
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
# helper method for worksheet to determine if the page setup is configured for fit to page printing
|
|
97
|
+
# We treat any page set up that has a value set for fit_to_width or fit_to_height value as fit_to_page.
|
|
98
|
+
# @return [Boolean]
|
|
99
|
+
def fit_to_page?
|
|
100
|
+
# is there some better what to express this?
|
|
101
|
+
(fit_to_width != nil || fit_to_height != nil)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Serializes the page settings element.
|
|
105
|
+
# @param [String] str
|
|
106
|
+
# @return [String]
|
|
107
|
+
def to_xml_string(str = '')
|
|
108
|
+
str << '<pageSetup '
|
|
109
|
+
str << instance_values.reject{ |k, v| k == 'worksheet' }.map{ |k,v| k.gsub(/_(.)/){ $1.upcase } << %{="#{v}"} }.join(' ')
|
|
110
|
+
str << '/>'
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
module Axlsx
|
|
3
|
+
# Pane options for a worksheet.
|
|
4
|
+
#
|
|
5
|
+
# @note The recommended way to manage the pane options is via SheetView#pane
|
|
6
|
+
# @see SheetView#pane
|
|
7
|
+
class Pane
|
|
8
|
+
|
|
9
|
+
# Active Pane
|
|
10
|
+
# The pane that is active.
|
|
11
|
+
# Options are
|
|
12
|
+
# * bottom_left: Bottom left pane, when both vertical and horizontal
|
|
13
|
+
# splits are applied. This value is also used when only
|
|
14
|
+
# a horizontal split has been applied, dividing the pane
|
|
15
|
+
# into upper and lower regions. In that case, this value
|
|
16
|
+
# specifies the bottom pane.
|
|
17
|
+
# * bottom_right: Bottom right pane, when both vertical and horizontal
|
|
18
|
+
# splits are applied.
|
|
19
|
+
# * top_left: Top left pane, when both vertical and horizontal splits
|
|
20
|
+
# are applied. This value is also used when only a horizontal
|
|
21
|
+
# split has been applied, dividing the pane into upper and lower
|
|
22
|
+
# regions. In that case, this value specifies the top pane.
|
|
23
|
+
# This value is also used when only a vertical split has
|
|
24
|
+
# been applied, dividing the pane into right and left
|
|
25
|
+
# regions. In that case, this value specifies the left pane
|
|
26
|
+
# * top_right: Top right pane, when both vertical and horizontal
|
|
27
|
+
# splits are applied. This value is also used when only
|
|
28
|
+
# a vertical split has been applied, dividing the pane
|
|
29
|
+
# into right and left regions. In that case, this value
|
|
30
|
+
# specifies the right pane.
|
|
31
|
+
# @see type
|
|
32
|
+
# @return [Symbol]
|
|
33
|
+
# default nil
|
|
34
|
+
attr_reader :active_pane
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# Split State
|
|
38
|
+
# Indicates whether the pane has horizontal / vertical
|
|
39
|
+
# splits, and whether those splits are frozen.
|
|
40
|
+
# Options are
|
|
41
|
+
# * frozen: Panes are frozen, but were not split being frozen. In
|
|
42
|
+
# this state, when the panes are unfrozen again, a single
|
|
43
|
+
# pane results, with no split. In this state, the split
|
|
44
|
+
# bars are not adjustable.
|
|
45
|
+
# * frozen_split: Panes are frozen and were split before being frozen. In
|
|
46
|
+
# this state, when the panes are unfrozen again, the split
|
|
47
|
+
# remains, but is adjustable.
|
|
48
|
+
# * split: Panes are split, but not frozen. In this state, the split
|
|
49
|
+
# bars are adjustable by the user.
|
|
50
|
+
# @see type
|
|
51
|
+
# @return [Symbol]
|
|
52
|
+
# default nil
|
|
53
|
+
attr_reader :state
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
# Top Left Visible Cell
|
|
57
|
+
# Location of the top left visible cell in the bottom
|
|
58
|
+
# right pane (when in Left-To-Right mode).
|
|
59
|
+
# @see type
|
|
60
|
+
# @return [String]
|
|
61
|
+
# default nil
|
|
62
|
+
attr_reader :top_left_cell
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# Horizontal Split Position
|
|
66
|
+
# Horizontal position of the split, in 1/20th of a point; 0 (zero)
|
|
67
|
+
# if none. If the pane is frozen, this value indicates the number
|
|
68
|
+
# of columns visible in the top pane.
|
|
69
|
+
# @see type
|
|
70
|
+
# @return [Integer]
|
|
71
|
+
# default 0
|
|
72
|
+
attr_reader :x_split
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
# Vertical Split Position
|
|
76
|
+
# Vertical position of the split, in 1/20th of a point; 0 (zero)
|
|
77
|
+
# if none. If the pane is frozen, this value indicates the number
|
|
78
|
+
# of rows visible in the left pane.
|
|
79
|
+
# @see type
|
|
80
|
+
# @return [Integer]
|
|
81
|
+
# default 0
|
|
82
|
+
attr_reader :y_split
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
# Creates a new {Pane} object
|
|
86
|
+
# @option options [Symbol] active_pane Active Pane
|
|
87
|
+
# @option options [Symbol] state Split State
|
|
88
|
+
# @option options [Cell, String] top_left_cell Top Left Visible Cell
|
|
89
|
+
# @option options [Integer] x_split Horizontal Split Position
|
|
90
|
+
# @option options [Integer] y_split Vertical Split Position
|
|
91
|
+
def initialize(options={})
|
|
92
|
+
#defaults
|
|
93
|
+
@active_pane = @state = @top_left_cell = nil
|
|
94
|
+
@x_split = @y_split = 0
|
|
95
|
+
|
|
96
|
+
# write options to instance variables
|
|
97
|
+
options.each do |o|
|
|
98
|
+
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
# @see active_pane
|
|
104
|
+
def active_pane=(v); Axlsx::validate_pane_type(v); @active_pane = v end
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
# @see state
|
|
108
|
+
def state=(v); Axlsx::validate_split_state_type(v); @state = v end
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
# @see top_left_cell
|
|
112
|
+
def top_left_cell=(v)
|
|
113
|
+
cell = (v.class == Axlsx::Cell ? v.r_abs : v)
|
|
114
|
+
Axlsx::validate_string(cell)
|
|
115
|
+
@top_left_cell = cell
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
# @see x_split
|
|
120
|
+
def x_split=(v); Axlsx::validate_unsigned_int(v); @x_split = v end
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
# @see y_split
|
|
124
|
+
def y_split=(v); Axlsx::validate_unsigned_int(v); @y_split = v end
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
# Serializes the data validation
|
|
128
|
+
# @param [String] str
|
|
129
|
+
# @return [String]
|
|
130
|
+
def to_xml_string(str = '')
|
|
131
|
+
if @state == :frozen && @top_left_cell.nil?
|
|
132
|
+
row = @y_split || 0
|
|
133
|
+
column = @x_split || 0
|
|
134
|
+
|
|
135
|
+
@top_left_cell = "#{('A'..'ZZ').to_a[column]}#{row+1}"
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
str << '<pane '
|
|
139
|
+
str << instance_values.map { |key, value| '' << key.gsub(/_(.)/){ $1.upcase } <<
|
|
140
|
+
%{="#{[:active_pane, :state].include?(key.to_sym) ? value.to_s.gsub(/_(.)/){ $1.upcase } : value}"} unless value.nil? }.join(' ')
|
|
141
|
+
str << '/>'
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
module Axlsx
|
|
2
|
+
# Options for printing a worksheet. All options are boolean and false by default.
|
|
3
|
+
#
|
|
4
|
+
# @note The recommended way to manage print options is via Worksheet#print_options
|
|
5
|
+
# @see Worksheet#print_options
|
|
6
|
+
# @see Worksheet#initialize
|
|
7
|
+
class PrintOptions
|
|
8
|
+
|
|
9
|
+
# Whether grid lines should be printed.
|
|
10
|
+
# @return [Boolean]
|
|
11
|
+
attr_reader :grid_lines
|
|
12
|
+
|
|
13
|
+
# Whether row and column headings should be printed.
|
|
14
|
+
# @return [Boolean]
|
|
15
|
+
attr_reader :headings
|
|
16
|
+
|
|
17
|
+
# Whether the content should be centered horizontally on the page.
|
|
18
|
+
# @return [Boolean]
|
|
19
|
+
attr_reader :horizontal_centered
|
|
20
|
+
|
|
21
|
+
# Whether the content should be centered vertically on the page.
|
|
22
|
+
# @return [Boolean]
|
|
23
|
+
attr_reader :vertical_centered
|
|
24
|
+
|
|
25
|
+
# Creates a new PrintOptions object
|
|
26
|
+
# @option options [Boolean] grid_lines Whether grid lines should be printed
|
|
27
|
+
# @option options [Boolean] headings Whether row and column headings should be printed
|
|
28
|
+
# @option options [Boolean] horizontal_centered Whether the content should be centered horizontally
|
|
29
|
+
# @option options [Boolean] vertical_centered Whether the content should be centered vertically
|
|
30
|
+
def initialize(options = {})
|
|
31
|
+
@grid_lines = @headings = @horizontal_centered = @vertical_centered = false
|
|
32
|
+
set(options)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Set some or all options at once.
|
|
36
|
+
# @param [Hash] options The options to set (possible keys are :grid_lines, :headings, :horizontal_centered, and :vertical_centered).
|
|
37
|
+
def set(options)
|
|
38
|
+
options.each do |k, v|
|
|
39
|
+
send("#{k}=", v) if respond_to? "#{k}="
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @see grid_lines
|
|
44
|
+
def grid_lines=(v); Axlsx::validate_boolean(v); @grid_lines = v; end
|
|
45
|
+
# @see headings
|
|
46
|
+
def headings=(v); Axlsx::validate_boolean(v); @headings = v; end
|
|
47
|
+
# @see horizontal_centered
|
|
48
|
+
def horizontal_centered=(v); Axlsx::validate_boolean(v); @horizontal_centered = v; end
|
|
49
|
+
# @see vertical_centered
|
|
50
|
+
def vertical_centered=(v); Axlsx::validate_boolean(v); @vertical_centered = v; end
|
|
51
|
+
|
|
52
|
+
# Serializes the page options element.
|
|
53
|
+
# @note As all attributes default to "false" according to the xml schema definition, the generated xml includes only those attributes that are set to true.
|
|
54
|
+
# @param [String] str
|
|
55
|
+
# @return [String]
|
|
56
|
+
def to_xml_string(str = '')
|
|
57
|
+
str << '<printOptions '
|
|
58
|
+
#
|
|
59
|
+
str << instance_values.select{ |k,v| v == true }.map{ |k,v| k.gsub(/_(.)/){ $1.upcase } << %{="#{v}"} }.join(' ')
|
|
60
|
+
str << '/>'
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module Axlsx
|
|
2
|
+
# The Protected Range class represents a set of cells in the worksheet
|
|
3
|
+
# @note the recommended way to manage protected ranges with via Worksheet#protect_range
|
|
4
|
+
# @see Worksheet#protect_range
|
|
5
|
+
class ProtectedRange
|
|
6
|
+
|
|
7
|
+
# The reference for the protected range
|
|
8
|
+
# @return [String]
|
|
9
|
+
attr_reader :sqref
|
|
10
|
+
|
|
11
|
+
# The name of the protected range
|
|
12
|
+
# @return [String]
|
|
13
|
+
attr_reader :name
|
|
14
|
+
|
|
15
|
+
# Initializes a new protected range object
|
|
16
|
+
# @option [String] sqref The cell range reference to protect. This can be an absolute or a relateve range however, it only applies to the current sheet.
|
|
17
|
+
# @option [String] name An optional name for the protected name.
|
|
18
|
+
def initialize(options={})
|
|
19
|
+
options.each do |o|
|
|
20
|
+
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
|
21
|
+
end
|
|
22
|
+
yield self if block_given?
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @see sqref
|
|
26
|
+
def sqref=(v)
|
|
27
|
+
Axlsx.validate_string(v)
|
|
28
|
+
@sqref = v
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @see name
|
|
32
|
+
def name=(v)
|
|
33
|
+
Axlsx.validate_string(v)
|
|
34
|
+
@name = v
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# serializes the proteted range
|
|
38
|
+
# @param [String] str if this string object is provided we append
|
|
39
|
+
# our output to that object. Use this - it helps limit the number of
|
|
40
|
+
# objects created during serialization
|
|
41
|
+
def to_xml_string(str="")
|
|
42
|
+
attrs = self.instance_values.reject{ |key, value| value == nil }
|
|
43
|
+
str << '<protectedRange ' << attrs.map { |key, value| '' << key << '="' << value.to_s << '"' }.join(' ') << '/>'
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Axlsx
|
|
2
|
+
|
|
3
|
+
# A self serializing collection of ranges that should be protected in
|
|
4
|
+
# the worksheet
|
|
5
|
+
class ProtectedRanges < SimpleTypedList
|
|
6
|
+
|
|
7
|
+
attr_reader :worksheet
|
|
8
|
+
|
|
9
|
+
def initialize(worksheet)
|
|
10
|
+
raise ArgumentError, 'You must provide a worksheet' unless worksheet.is_a?(Worksheet)
|
|
11
|
+
super ProtectedRange
|
|
12
|
+
@worksheet = worksheet
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Adds a protected range
|
|
16
|
+
# @param [Array|String] cells A string range reference or array of cells that will be protected
|
|
17
|
+
def add_range(cells)
|
|
18
|
+
sqref = if cells.is_a?(String)
|
|
19
|
+
cells
|
|
20
|
+
elsif cells.is_a?(SimpleTypedList) || cells.is_a?(Array)
|
|
21
|
+
Axlsx::cell_range(cells, false)
|
|
22
|
+
end
|
|
23
|
+
@list << ProtectedRange.new(:sqref => sqref, :name => "Range#{size}")
|
|
24
|
+
last
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def to_xml_string(str = '')
|
|
28
|
+
return if empty?
|
|
29
|
+
str << '<protectedRanges>'
|
|
30
|
+
each { |range| range.to_xml_string(str) }
|
|
31
|
+
str << '</protectedRanges>'
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -5,6 +5,16 @@ module Axlsx
|
|
|
5
5
|
# @see Worksheet#add_row
|
|
6
6
|
class Row
|
|
7
7
|
|
|
8
|
+
# No support is provided for the following attributes
|
|
9
|
+
# spans
|
|
10
|
+
# thickTop
|
|
11
|
+
# thickBottom
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# A list of serilizable attributes.
|
|
15
|
+
# @note height(ht) and customHeight are manages separately for now. Have a look at Row#height
|
|
16
|
+
SERIALIZABLE_ATTRIBUTES = [:hidden, :outlineLevel, :collapsed, :s, :customFormat, :ph]
|
|
17
|
+
|
|
8
18
|
# The worksheet this row belongs to
|
|
9
19
|
# @return [Worksheet]
|
|
10
20
|
attr_reader :worksheet
|
|
@@ -13,22 +23,40 @@ module Axlsx
|
|
|
13
23
|
# @return [SimpleTypedList]
|
|
14
24
|
attr_reader :cells
|
|
15
25
|
|
|
16
|
-
#
|
|
26
|
+
# Row height measured in point size. There is no margin padding on row height.
|
|
17
27
|
# @return [Float]
|
|
18
28
|
attr_reader :height
|
|
19
29
|
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
|
|
27
|
-
# spans
|
|
28
|
-
# thickTop
|
|
29
|
-
# thickBottom
|
|
30
|
+
# Flag indicating if the outlining of row.
|
|
31
|
+
# @return [Boolean]
|
|
32
|
+
attr_reader :collapsed
|
|
33
|
+
|
|
34
|
+
# Flag indicating if the the row is hidden.
|
|
35
|
+
# @return [Boolean]
|
|
36
|
+
attr_reader :hidden
|
|
30
37
|
|
|
38
|
+
# Outlining level of the row, when outlining is on
|
|
39
|
+
# @return [Integer]
|
|
40
|
+
attr_reader :outlineLevel
|
|
31
41
|
|
|
42
|
+
# The style applied ot the row. This affects the entire row.
|
|
43
|
+
# @return [Integer]
|
|
44
|
+
attr_reader :s
|
|
45
|
+
|
|
46
|
+
# indicates that a style has been applied directly to the row via Row#s
|
|
47
|
+
# @return [Boolean]
|
|
48
|
+
attr_reader :customFormat
|
|
49
|
+
|
|
50
|
+
# indicates if the row should show phonetic
|
|
51
|
+
# @return [Boolean]
|
|
52
|
+
attr_reader :ph
|
|
53
|
+
|
|
54
|
+
# NOTE removing this from the api as it is actually incorrect.
|
|
55
|
+
# having a method to style a row's cells is fine, but it is not an attribute on the row.
|
|
56
|
+
# The proper attribute is ':s'
|
|
57
|
+
# attr_reader style
|
|
58
|
+
#
|
|
59
|
+
|
|
32
60
|
# Creates a new row. New Cell objects are created based on the values, types and style options.
|
|
33
61
|
# A new cell is created for each item in the values array. style and types options are applied as follows:
|
|
34
62
|
# If the types option is defined and is a symbol it is applied to all the cells created.
|
|
@@ -53,6 +81,30 @@ module Axlsx
|
|
|
53
81
|
array_to_cells(values, options)
|
|
54
82
|
end
|
|
55
83
|
|
|
84
|
+
# @see Row#collapsed
|
|
85
|
+
def collapsed=(v)
|
|
86
|
+
Axlsx.validate_boolean(v)
|
|
87
|
+
@collapsed = v
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# @see Row#hidden
|
|
91
|
+
def hidden=(v)
|
|
92
|
+
Axlsx.validate_boolean(v)
|
|
93
|
+
@hidden = v
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# @see Row#ph
|
|
97
|
+
def ph=(v) Axlsx.validate_boolean(v); @ph = v end
|
|
98
|
+
|
|
99
|
+
# @see Row#s
|
|
100
|
+
def s=(v) Axlsx.validate_unsigned_numeric(v); @s = v; @customFormat = true end
|
|
101
|
+
|
|
102
|
+
# @see Row#outline
|
|
103
|
+
def outlineLevel=(v)
|
|
104
|
+
Axlsx.validate_unsigned_numeric(v)
|
|
105
|
+
@outlineLevel = v
|
|
106
|
+
end
|
|
107
|
+
|
|
56
108
|
# The index of this row in the worksheet
|
|
57
109
|
# @return [Integer]
|
|
58
110
|
def index
|
|
@@ -65,6 +117,9 @@ module Axlsx
|
|
|
65
117
|
# @return [String]
|
|
66
118
|
def to_xml_string(r_index, str = '')
|
|
67
119
|
str << '<row r="' << (r_index + 1 ).to_s << '" '
|
|
120
|
+
instance_values.select { |key, value| SERIALIZABLE_ATTRIBUTES.include? key.to_sym }.each do |key, value|
|
|
121
|
+
str << key << '="' << value.to_s << '" '
|
|
122
|
+
end
|
|
68
123
|
if custom_height?
|
|
69
124
|
str << 'customHeight="1" ht="' << height.to_s << '">'
|
|
70
125
|
else
|
|
@@ -79,7 +134,7 @@ module Axlsx
|
|
|
79
134
|
# @return [Cell]
|
|
80
135
|
def add_cell(value="", options={})
|
|
81
136
|
c = Cell.new(self, value, options)
|
|
82
|
-
worksheet.send(:update_column_info, self.cells,
|
|
137
|
+
worksheet.send(:update_column_info, self.cells, [])
|
|
83
138
|
c
|
|
84
139
|
end
|
|
85
140
|
|
|
@@ -132,6 +187,8 @@ module Axlsx
|
|
|
132
187
|
cell_type = types.is_a?(Array)? types[index] : types
|
|
133
188
|
options[:type] = cell_type if cell_type
|
|
134
189
|
Cell.new(self, value, options)
|
|
190
|
+
options.delete(:style)
|
|
191
|
+
options.delete(:type)
|
|
135
192
|
end
|
|
136
193
|
end
|
|
137
194
|
end
|