axlsx 1.1.1 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +18 -7
- 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/example.rb +6 -2
- data/examples/{real_example.rb → skydrive/real_example.rb} +0 -0
- data/lib/axlsx.rb +1 -1
- data/lib/axlsx/drawing/axis.rb +16 -0
- data/lib/axlsx/stylesheet/dxf.rb +79 -0
- data/lib/axlsx/stylesheet/font.rb +2 -1
- data/lib/axlsx/stylesheet/styles.rb +141 -50
- data/lib/axlsx/stylesheet/xf.rb +2 -0
- data/lib/axlsx/util/constants.rb +8 -0
- data/lib/axlsx/util/validators.rb +44 -0
- data/lib/axlsx/version.rb +1 -1
- data/lib/axlsx/workbook/workbook.rb +6 -0
- data/lib/axlsx/workbook/worksheet/cfvo.rb +62 -0
- data/lib/axlsx/workbook/worksheet/cfvo.rb~ +0 -0
- data/lib/axlsx/workbook/worksheet/color_scale.rb +76 -0
- data/lib/axlsx/workbook/worksheet/color_scale.rb~ +46 -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/data_bar.rb +97 -0
- data/lib/axlsx/workbook/worksheet/data_bar.rb~ +0 -0
- data/lib/axlsx/workbook/worksheet/icon_set.rb +83 -0
- data/lib/axlsx/workbook/worksheet/icon_set.rb~ +95 -0
- data/lib/axlsx/workbook/worksheet/row.rb +2 -0
- data/lib/axlsx/workbook/worksheet/worksheet.rb +25 -3
- data/test/drawing/tc_axis.rb +8 -0
- data/test/stylesheet/tc_dxf.rb +81 -0
- data/test/stylesheet/tc_styles.rb +148 -2
- data/test/workbook/worksheet/tc_cfvo.rb +31 -0
- data/test/workbook/worksheet/tc_cfvo.rb~ +20 -0
- data/test/workbook/worksheet/tc_color_scale.rb +29 -0
- data/test/workbook/worksheet/tc_color_scale.rb~ +0 -0
- data/test/workbook/worksheet/tc_conditional_formatting.rb +173 -0
- data/test/workbook/worksheet/tc_data_bar.rb +39 -0
- data/test/workbook/worksheet/tc_data_bar.rb~ +0 -0
- data/test/workbook/worksheet/tc_icon_set.rb +45 -0
- data/test/workbook/worksheet/tc_icon_set.rb~ +0 -0
- data/test/workbook/worksheet/tc_row.rb +9 -2
- metadata +45 -27
- data/examples/axlsx.xlsx +0 -0
- data/examples/example.xlsx +0 -0
- data/examples/example_streamed.xlsx +0 -0
- data/examples/no-use_autowidth.xlsx +0 -0
- data/examples/shared_strings_example.xlsx +0 -0
- data/lib/axlsx/util/doc/_index.html +0 -84
- data/lib/axlsx/util/doc/class_list.html +0 -47
- data/lib/axlsx/util/doc/css/common.css +0 -1
- data/lib/axlsx/util/doc/css/full_list.css +0 -55
- data/lib/axlsx/util/doc/css/style.css +0 -322
- data/lib/axlsx/util/doc/file_list.html +0 -46
- data/lib/axlsx/util/doc/frames.html +0 -13
- data/lib/axlsx/util/doc/index.html +0 -84
- data/lib/axlsx/util/doc/js/app.js +0 -205
- data/lib/axlsx/util/doc/js/full_list.js +0 -173
- data/lib/axlsx/util/doc/js/jquery.js +0 -16
- data/lib/axlsx/util/doc/method_list.html +0 -46
- data/lib/axlsx/util/doc/top-level-namespace.html +0 -95
@@ -0,0 +1,95 @@
|
|
1
|
+
module Axlsx
|
2
|
+
# Conditional Format Rule data bar object
|
3
|
+
# Describes a data bar 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 DataBar
|
9
|
+
CHILD_ELEMENTS = [:value_objects]
|
10
|
+
|
11
|
+
# minLength attribute
|
12
|
+
# The minimum length of the data bar, as a percentage of the cell width.
|
13
|
+
# The default value is 10
|
14
|
+
# @return [Integer]
|
15
|
+
attr_reader :minLength
|
16
|
+
|
17
|
+
# maxLength attribute
|
18
|
+
# The maximum length of the data bar, as a percentage of the cell width.
|
19
|
+
# The default value is 90
|
20
|
+
# @return [Integer]
|
21
|
+
attr_reader :maxLength
|
22
|
+
|
23
|
+
# maxLength attribute
|
24
|
+
# Indicates whether to show the values of the cells on which this data bar is applied.
|
25
|
+
# The default value is true
|
26
|
+
# @return [Boolean]
|
27
|
+
attr_reader :showValue
|
28
|
+
|
29
|
+
# A simple typed list of cfvos
|
30
|
+
# @return [SimpleTypedList]
|
31
|
+
# @see Cfvo
|
32
|
+
attr_reader :value_objects
|
33
|
+
|
34
|
+
# color
|
35
|
+
# the color object used in the data bar formatting
|
36
|
+
# @return [Color]
|
37
|
+
def color
|
38
|
+
@color ||= Color.new :rgb => "FF0000FF"
|
39
|
+
end
|
40
|
+
|
41
|
+
# Creates a new data bar conditional formatting object
|
42
|
+
# @option options [Integer] minLength
|
43
|
+
# @option options [Integer] maxLength
|
44
|
+
# @option options [Boolean] showValue
|
45
|
+
# @option options [String] color - the rbg value used to color the bars
|
46
|
+
def initialize(options = {})
|
47
|
+
@minLength = 10
|
48
|
+
@maxLength = 90
|
49
|
+
@showValue = true
|
50
|
+
initialize_value_objects
|
51
|
+
options.each do |o|
|
52
|
+
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
53
|
+
end
|
54
|
+
yield self if block_given?
|
55
|
+
end
|
56
|
+
|
57
|
+
# @see minLength
|
58
|
+
def minLength=(v); Axlsx.validate_unsigned_int(v); @minLength = v end
|
59
|
+
# @see maxLength
|
60
|
+
def maxLength=(v); Axlsx.validate_unsigned_int(v); @maxLength = v end
|
61
|
+
|
62
|
+
# @see showValue
|
63
|
+
def showValue=(v); Axlsx.validate_boolean(v); @showValue = v end
|
64
|
+
|
65
|
+
# Sets the color for the data bars.
|
66
|
+
# @param [Color|String] The color object, or rgb string value to apply
|
67
|
+
def color=(v)
|
68
|
+
@color = v if v.is_a? Color
|
69
|
+
self.color.rgb = v if v.is_a? String
|
70
|
+
@color
|
71
|
+
end
|
72
|
+
|
73
|
+
# Serialize this object to an xml string
|
74
|
+
# @param [String] str
|
75
|
+
# @return [String]
|
76
|
+
def to_xml_string(str="")
|
77
|
+
str << '<dataBar '
|
78
|
+
str << instance_values.map { |key, value| '' << key << '="' << value.to_s << '"' unless CHILD_ELEMENTS.include?(key.to_sym) }.join(' ')
|
79
|
+
str << '>'
|
80
|
+
@value_objects.each { |cfvo| cfvo.to_xml_string(str) }
|
81
|
+
self.color.to_xml_string(str)
|
82
|
+
str << '</dataBar>'
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
# Initalize the simple typed list of value objects
|
88
|
+
# I am keeping this private for now as I am not sure what impact changes to the required two cfvo objects will do.
|
89
|
+
def initialize_value_objects
|
90
|
+
@value_objects = SimpleTypedList.new Cfvo
|
91
|
+
@value_objects.concat [Cfvo.new(:type => :min, :val => 0), Cfvo.new(:type => :max, :val => 0)]
|
92
|
+
@value_objects.lock
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -101,6 +101,7 @@ module Axlsx
|
|
101
101
|
@drawing = @page_margins = @auto_filter = nil
|
102
102
|
@merged_cells = []
|
103
103
|
@auto_fit_data = []
|
104
|
+
@conditional_formattings = []
|
104
105
|
|
105
106
|
@selected = false
|
106
107
|
@show_gridlines = true
|
@@ -123,6 +124,22 @@ module Axlsx
|
|
123
124
|
rows.flatten
|
124
125
|
end
|
125
126
|
|
127
|
+
# Add conditional formatting to this worksheet.
|
128
|
+
#
|
129
|
+
# @param [String] cells The range to apply the formatting to
|
130
|
+
# @param [Array|Hash] rules An array of hashes (or just one) to create Conditional formatting rules from.
|
131
|
+
# @example This would format column A whenever it is FALSE.
|
132
|
+
# # for a longer example, see examples/example_conditional_formatting.rb (link below)
|
133
|
+
# worksheet.add_conditional_formatting( "A1:A1048576", { :type => :cellIs, :operator => :equal, :formula => "FALSE", :dxfId => 1, :priority => 1 }
|
134
|
+
#
|
135
|
+
# @see ConditionalFormattingRule#initialize
|
136
|
+
# @see file:examples/example_conditional_formatting.rb
|
137
|
+
def add_conditional_formatting(cells, rules)
|
138
|
+
cf = ConditionalFormatting.new( :sqref => cells )
|
139
|
+
cf.add_rules rules
|
140
|
+
@conditional_formattings << cf
|
141
|
+
end
|
142
|
+
|
126
143
|
# Creates merge information for this worksheet.
|
127
144
|
# Cells can be merged by calling the merge_cells method on a worksheet.
|
128
145
|
# @example This would merge the three cells C1..E1 #
|
@@ -411,6 +428,9 @@ module Axlsx
|
|
411
428
|
unless @tables.empty?
|
412
429
|
str.concat "<tableParts count='%s'>%s</tableParts>" % [@tables.size, @tables.reduce('') { |memo, obj| memo += "<tablePart r:id='%s'/>" % obj.rId }]
|
413
430
|
end
|
431
|
+
@conditional_formattings.each do |cf|
|
432
|
+
str.concat cf.to_xml_string
|
433
|
+
end
|
414
434
|
str + '</worksheet>'
|
415
435
|
end
|
416
436
|
|
@@ -476,10 +496,12 @@ module Axlsx
|
|
476
496
|
end
|
477
497
|
|
478
498
|
|
479
|
-
#
|
499
|
+
# This is still not perfect...
|
500
|
+
# - scaling is not linear as font sizes increst
|
501
|
+
# - different fonts have different mdw and char widths
|
480
502
|
def calculate_width(text, sz)
|
481
|
-
mdw = 1.78 #
|
482
|
-
font_scale = sz/10.0
|
503
|
+
mdw = 1.78 #This is the widest width of 0..9 in arial@10px)
|
504
|
+
font_scale = (sz/10.0).to_f
|
483
505
|
((text.count(Worksheet.thin_chars) * mdw + 5) / mdw * 256) / 256.0 * font_scale
|
484
506
|
end
|
485
507
|
end
|
data/test/drawing/tc_axis.rb
CHANGED
@@ -21,6 +21,14 @@ class TestAxis < Test::Unit::TestCase
|
|
21
21
|
assert_nothing_raised("accepts valid axis position") { @axis.axPos = :r }
|
22
22
|
end
|
23
23
|
|
24
|
+
def test_label_rotation
|
25
|
+
assert_raise(ArgumentError, "requires valid angle") { @axis.label_rotation = :nowhere }
|
26
|
+
assert_raise(ArgumentError, "requires valid angle") { @axis.label_rotation = 91 }
|
27
|
+
assert_raise(ArgumentError, "requires valid angle") { @axis.label_rotation = -91 }
|
28
|
+
assert_nothing_raised("accepts valid angle") { @axis.label_rotation = 45 }
|
29
|
+
assert_equal(@axis.label_rotation, 45 * 60000)
|
30
|
+
end
|
31
|
+
|
24
32
|
def test_tick_label_position
|
25
33
|
assert_raise(ArgumentError, "requires valid tick label position") { @axis.tickLblPos = :nowhere }
|
26
34
|
assert_nothing_raised("accepts valid tick label position") { @axis.tickLblPos = :high }
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'tc_helper.rb'
|
2
|
+
|
3
|
+
class TestDxf < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@item = Axlsx::Dxf.new
|
7
|
+
@styles = Axlsx::Styles.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_initialiation
|
14
|
+
assert_equal(@item.alignment, nil)
|
15
|
+
assert_equal(@item.protection, nil)
|
16
|
+
assert_equal(@item.numFmt, nil)
|
17
|
+
assert_equal(@item.font, nil)
|
18
|
+
assert_equal(@item.fill, nil)
|
19
|
+
assert_equal(@item.border, nil)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_alignment
|
23
|
+
assert_raise(ArgumentError) { @item.alignment = -1.1 }
|
24
|
+
assert_nothing_raised { @item.alignment = Axlsx::CellAlignment.new }
|
25
|
+
assert(@item.alignment.is_a?(Axlsx::CellAlignment))
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_protection
|
29
|
+
assert_raise(ArgumentError) { @item.protection = -1.1 }
|
30
|
+
assert_nothing_raised { @item.protection = Axlsx::CellProtection.new }
|
31
|
+
assert(@item.protection.is_a?(Axlsx::CellProtection))
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_numFmt
|
35
|
+
assert_raise(ArgumentError) { @item.numFmt = 1 }
|
36
|
+
assert_nothing_raised { @item.numFmt = Axlsx::NumFmt.new }
|
37
|
+
assert @item.numFmt.is_a? Axlsx::NumFmt
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_fill
|
41
|
+
assert_raise(ArgumentError) { @item.fill = 1 }
|
42
|
+
assert_nothing_raised { @item.fill = Axlsx::Fill.new(Axlsx::PatternFill.new(:patternType =>:solid, :fgColor=> Axlsx::Color.new(:rgb => "FF000000"))) }
|
43
|
+
assert @item.fill.is_a? Axlsx::Fill
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_font
|
47
|
+
assert_raise(ArgumentError) { @item.font = 1 }
|
48
|
+
assert_nothing_raised { @item.font = Axlsx::Font.new }
|
49
|
+
assert @item.font.is_a? Axlsx::Font
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_border
|
53
|
+
assert_raise(ArgumentError) { @item.border = 1 }
|
54
|
+
assert_nothing_raised { @item.border = Axlsx::Border.new }
|
55
|
+
assert @item.border.is_a? Axlsx::Border
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_to_xml
|
59
|
+
@item.border = Axlsx::Border.new
|
60
|
+
doc = Nokogiri::XML.parse(@item.to_xml_string)
|
61
|
+
assert_equal(1, doc.xpath(".//dxf//border").size)
|
62
|
+
assert_equal(0, doc.xpath(".//dxf//font").size)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_many_options_xml
|
66
|
+
@item.border = Axlsx::Border.new
|
67
|
+
@item.alignment = Axlsx::CellAlignment.new
|
68
|
+
@item.fill = Axlsx::Fill.new(Axlsx::PatternFill.new(:patternType =>:solid, :fgColor=> Axlsx::Color.new(:rgb => "FF000000")))
|
69
|
+
@item.font = Axlsx::Font.new
|
70
|
+
@item.protection = Axlsx::CellProtection.new
|
71
|
+
@item.numFmt = Axlsx::NumFmt.new
|
72
|
+
|
73
|
+
doc = Nokogiri::XML.parse(@item.to_xml_string)
|
74
|
+
assert_equal(1, doc.xpath(".//dxf//fill//patternFill[@patternType='solid']//fgColor[@rgb='FF000000']").size)
|
75
|
+
assert_equal(1, doc.xpath(".//dxf//font").size)
|
76
|
+
assert_equal(1, doc.xpath(".//dxf//protection").size)
|
77
|
+
assert_equal(1, doc.xpath(".//dxf//numFmt[@numFmtId='0'][@formatCode='']").size)
|
78
|
+
assert_equal(1, doc.xpath(".//dxf//alignment").size)
|
79
|
+
assert_equal(1, doc.xpath(".//dxf//border").size)
|
80
|
+
end
|
81
|
+
end
|
@@ -41,6 +41,111 @@ class TestStyles < Test::Unit::TestCase
|
|
41
41
|
assert_equal options[:border][:color], "FF000000", 'color is stil in option'
|
42
42
|
end
|
43
43
|
|
44
|
+
def test_parse_num_fmt
|
45
|
+
f_code = {:format_code => "YYYY/MM"}
|
46
|
+
num_fmt = {:num_fmt => 5}
|
47
|
+
both = { :format_code => "#000", :num_fmt => 0 }
|
48
|
+
assert_equal(@styles.parse_num_fmt_options, nil, 'noop if neither :format_code or :num_fmt exist')
|
49
|
+
max = @styles.numFmts.map{ |nf| nf.numFmtId }.max
|
50
|
+
@styles.parse_num_fmt_options(f_code)
|
51
|
+
assert_equal(@styles.numFmts.last.numFmtId, max + 1, "new numfmts gets next available id")
|
52
|
+
assert(@styles.parse_num_fmt_options(num_fmt).is_a?(Integer), "Should return the provided num_fmt if not dxf")
|
53
|
+
assert(@styles.parse_num_fmt_options(num_fmt.merge({:type => :dxf})).is_a?(Axlsx::NumFmt), "Makes a new NumFmt if dxf")
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_parse_border_options_hash_required_keys
|
57
|
+
assert_raise(ArgumentError, "Require color key") { @styles.parse_border_options(:border => { :style => :thin }) }
|
58
|
+
assert_raise(ArgumentError, "Require style key") { @styles.parse_border_options(:border => { :color => "FF0d0d0d" }) }
|
59
|
+
assert_nothing_raised { @styles.parse_border_options(:border => { :style => :thin, :color => "FF000000"} ) }
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_parse_border_basic_options
|
63
|
+
b_opts = {:border => { :diagonalUp => 1, :edges => [:left, :right], :color => "FFDADADA", :style => :thick } }
|
64
|
+
b = @styles.parse_border_options b_opts
|
65
|
+
assert(b.is_a? Integer)
|
66
|
+
assert_equal(@styles.parse_border_options(b_opts.merge({:type => :dxf})).class,Axlsx::Border)
|
67
|
+
assert(@styles.borders.last.diagonalUp == 1, "border options are passed in to the initializer")
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_parse_border_options_edges
|
71
|
+
b_opts = {:border => { :diagonalUp => 1, :edges => [:left, :right], :color => "FFDADADA", :style => :thick } }
|
72
|
+
@styles.parse_border_options b_opts
|
73
|
+
b = @styles.borders.last
|
74
|
+
left = b.prs.select { |bpr| bpr.name == :left }[0]
|
75
|
+
right = b.prs.select { |bpr| bpr.name == :right }[0]
|
76
|
+
top = b.prs.select { |bpr| bpr.name == :top }[0]
|
77
|
+
bottom = b.prs.select { |bpr| bpr.name == :bottom }[0]
|
78
|
+
assert_equal(top, nil, "unspecified top edge should not be created")
|
79
|
+
assert_equal(bottom, nil, "unspecified bottom edge should not be created")
|
80
|
+
assert(left.is_a?(Axlsx::BorderPr), "specified left edge is set")
|
81
|
+
assert(right.is_a?(Axlsx::BorderPr), "specified right edge is set")
|
82
|
+
assert_equal(left.style,right.style, "edge parts have the same style")
|
83
|
+
assert_equal(left.style, :thick, "the style is THICK")
|
84
|
+
assert_equal(right.color.rgb,left.color.rgb, "edge parts are colors are the same")
|
85
|
+
assert_equal(right.color.rgb,"FFDADADA", "edge color rgb is correct")
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_parse_border_options_noop
|
89
|
+
assert_equal(@styles.parse_border_options({}), nil, "noop if the border key is not in options")
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_parse_border_options_integer_xf
|
93
|
+
assert_equal(@styles.parse_border_options(:border => 1), 1)
|
94
|
+
assert_raise(ArgumentError, "unknown border index") {@styles.parse_border_options(:border => 100) }
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_parse_border_options_integer_dxf
|
98
|
+
b_opts = { :border => { :edges => [:left, :right], :color => "FFFFFFFF", :style=> :thick } }
|
99
|
+
b = @styles.parse_border_options(b_opts)
|
100
|
+
b2 = @styles.parse_border_options(:border => b, :type => :dxf)
|
101
|
+
assert(b2.is_a?(Axlsx::Border), "Cloned existing border object")
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_parse_alignment_options
|
105
|
+
assert_equal(@styles.parse_alignment_options {}, nil, "noop if :alignment is not set")
|
106
|
+
assert(@styles.parse_alignment_options(:alignment => {}).is_a?(Axlsx::CellAlignment))
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_parse_font_options
|
110
|
+
options = {
|
111
|
+
:fg_color => "FF050505",
|
112
|
+
:sz => 20,
|
113
|
+
:b => 1,
|
114
|
+
:i => 1,
|
115
|
+
:u => 1,
|
116
|
+
:strike => 1,
|
117
|
+
:outline => 1,
|
118
|
+
:shadow => 1,
|
119
|
+
:charset => 9,
|
120
|
+
:family => 1,
|
121
|
+
:font_name => "woot font"
|
122
|
+
}
|
123
|
+
assert_equal(@styles.parse_font_options {}, nil, "noop if no font keys are set")
|
124
|
+
assert_equal(@styles.parse_font_options(:b=>1).class, Fixnum, "return index of font if not :dxf type")
|
125
|
+
assert_equal(@styles.parse_font_options(:b=>1, :type => :dxf).class, Axlsx::Font, "return font object if :dxf type")
|
126
|
+
|
127
|
+
f = @styles.parse_font_options(options.merge(:type => :dxf))
|
128
|
+
color = options.delete(:fg_color)
|
129
|
+
options[:name] = options.delete(:font_name)
|
130
|
+
options.each do |key, value|
|
131
|
+
assert_equal(f.send(key), value, "assert that #{key} was parsed")
|
132
|
+
end
|
133
|
+
assert_equal(f.color.rgb, color)
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_parse_fill_options
|
137
|
+
assert_equal(@styles.parse_fill_options {}, nil, "noop if no fill keys are set")
|
138
|
+
assert_equal(@styles.parse_fill_options(:bg_color => "DE").class, Fixnum, "return index of fill if not :dxf type")
|
139
|
+
assert_equal(@styles.parse_fill_options(:bg_color => "DE", :type => :dxf).class, Axlsx::Fill, "return fill object if :dxf type")
|
140
|
+
f = @styles.parse_fill_options(:bg_color => "DE", :type => :dxf)
|
141
|
+
assert(f.fill_type.fgColor.rgb == "FFDEDEDE")
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_parse_protection_options
|
145
|
+
assert_equal(@styles.parse_protection_options {}, nil, "noop if no protection keys are set")
|
146
|
+
assert_equal(@styles.parse_protection_options(:hidden => 1).class, Axlsx::CellProtection, "creates a new cell protection object")
|
147
|
+
end
|
148
|
+
|
44
149
|
def test_add_style
|
45
150
|
fill_count = @styles.fills.size
|
46
151
|
font_count = @styles.fonts.size
|
@@ -68,10 +173,51 @@ class TestStyles < Test::Unit::TestCase
|
|
68
173
|
assert_raise(ArgumentError, "should reject invalid borderId") { @styles.add_style :border => 2 }
|
69
174
|
|
70
175
|
|
71
|
-
assert_equal(xf.applyProtection,
|
176
|
+
assert_equal(xf.applyProtection, true, "protection applied")
|
72
177
|
assert_equal(xf.applyBorder, true, "border applied")
|
73
|
-
assert_equal(xf.applyNumberFormat,
|
178
|
+
assert_equal(xf.applyNumberFormat,true, "number format applied")
|
74
179
|
assert_equal(xf.applyAlignment, true, "alignment applied")
|
75
180
|
end
|
76
181
|
|
182
|
+
def test_basic_add_style_dxf
|
183
|
+
border_count = @styles.borders.size
|
184
|
+
s = @styles.add_style :border => {:style => :thin, :color => "FFFF0000"}, :type => :dxf
|
185
|
+
assert_equal(@styles.borders.size, border_count, "styles borders not affected")
|
186
|
+
assert_equal(@styles.dxfs.last.border.prs.last.color.rgb, "FFFF0000")
|
187
|
+
assert_raise(ArgumentError) { @styles.add_style :border => {:color => "FFFF0000"}, :type => :dxf }
|
188
|
+
assert_equal @styles.borders.last.prs.size, 4
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_add_style_dxf
|
192
|
+
fill_count = @styles.fills.size
|
193
|
+
font_count = @styles.fonts.size
|
194
|
+
dxf_count = @styles.dxfs.size
|
195
|
+
|
196
|
+
style = @styles.add_style :bg_color=>"FF000000", :fg_color=>"FFFFFFFF", :sz=>13, :alignment=>{:horizontal=>:left}, :border=>{:style => :thin, :color => "FFFF0000"}, :hidden=>true, :locked=>true, :type => :dxf
|
197
|
+
assert_equal(@styles.dxfs.size, dxf_count+1)
|
198
|
+
assert_equal(0, style, "returns the zero-based dxfId")
|
199
|
+
|
200
|
+
dxf = @styles.dxfs.last
|
201
|
+
assert_equal(@styles.dxfs.last.fill.fill_type.fgColor.rgb, "FF000000", "fill created with color")
|
202
|
+
|
203
|
+
assert_equal(font_count, (@styles.fonts.size), "font not created under styles")
|
204
|
+
assert_equal(fill_count, (@styles.fills.size), "fill not created under styles")
|
205
|
+
|
206
|
+
assert(dxf.border.is_a?(Axlsx::Border), "border is set")
|
207
|
+
assert_equal(nil, dxf.numFmt, "number format is not set")
|
208
|
+
|
209
|
+
assert(dxf.alignment.is_a?(Axlsx::CellAlignment), "alignment was created")
|
210
|
+
assert_equal(dxf.alignment.horizontal, :left, "horizontal alignment applied")
|
211
|
+
assert_equal(dxf.protection.hidden, true, "hidden protection set")
|
212
|
+
assert_equal(dxf.protection.locked, true, "cell locking set")
|
213
|
+
assert_raise(ArgumentError, "should reject invalid borderId") { @styles.add_style :border => 3 }
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_multiple_dxf
|
217
|
+
# add a second style
|
218
|
+
style = @styles.add_style :bg_color=>"00000000", :fg_color=>"FFFFFFFF", :sz=>13, :alignment=>{:horizontal=>:left}, :border=>{:style => :thin, :color => "FFFF0000"}, :hidden=>true, :locked=>true, :type => :dxf
|
219
|
+
assert_equal(0, style, "returns the first dxfId")
|
220
|
+
style = @styles.add_style :bg_color=>"FF000000", :fg_color=>"FFFFFFFF", :sz=>13, :alignment=>{:horizontal=>:left}, :border=>{:style => :thin, :color => "FFFF0000"}, :hidden=>true, :locked=>true, :type => :dxf
|
221
|
+
assert_equal(1, style, "returns the second dxfId")
|
222
|
+
end
|
77
223
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'tc_helper.rb'
|
2
|
+
|
3
|
+
class TestCfvo < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@cfvo = Axlsx::Cfvo.new(:val => "0", :type => :min)
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_val
|
9
|
+
assert_nothing_raised { @cfvo.val = "abc" }
|
10
|
+
assert_equal(@cfvo.val, "abc")
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_type
|
14
|
+
assert_raise(ArgumentError) { @cfvo.type = :invalid_type }
|
15
|
+
assert_nothing_raised { @cfvo.type = :max }
|
16
|
+
assert_equal(@cfvo.type, :max)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_gte
|
20
|
+
assert_raise(ArgumentError) { @cfvo.gte = :bob }
|
21
|
+
assert_equal(@cfvo.gte, true)
|
22
|
+
assert_nothing_raised { @cfvo.gte = false }
|
23
|
+
assert_equal(@cfvo.gte, false)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_to_xml_string
|
27
|
+
doc = Nokogiri::XML.parse(@cfvo.to_xml_string)
|
28
|
+
assert doc.xpath(".//cfvo[@type='min'][@val=0][@gte=true]")
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|