axlsx 2.0.1 → 3.0.0.pre
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 +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +23 -23
- data/Rakefile +9 -11
- data/examples/auto_filter.rb +10 -1
- data/examples/conditional_formatting/example_conditional_formatting.rb +18 -3
- data/examples/example.rb +102 -4
- data/examples/merge_cells.rb +17 -0
- data/examples/no_grid_with_borders.rb +18 -0
- data/examples/pivot_test.rb +63 -0
- data/examples/split.rb +16 -0
- data/lib/axlsx/content_type/abstract_content_type.rb +1 -1
- data/lib/axlsx/content_type/content_type.rb +1 -1
- data/lib/axlsx/doc_props/app.rb +1 -1
- data/lib/axlsx/doc_props/core.rb +5 -5
- data/lib/axlsx/drawing/area_chart.rb +99 -0
- data/lib/axlsx/drawing/area_series.rb +110 -0
- data/lib/axlsx/drawing/axes.rb +1 -1
- data/lib/axlsx/drawing/axis.rb +12 -9
- data/lib/axlsx/drawing/bar_3D_chart.rb +13 -13
- data/lib/axlsx/drawing/bar_chart.rb +143 -0
- data/lib/axlsx/drawing/bar_series.rb +9 -9
- data/lib/axlsx/drawing/bubble_chart.rb +59 -0
- data/lib/axlsx/drawing/bubble_series.rb +63 -0
- data/lib/axlsx/drawing/cat_axis.rb +5 -5
- data/lib/axlsx/drawing/chart.rb +52 -8
- data/lib/axlsx/drawing/d_lbls.rb +3 -3
- data/lib/axlsx/drawing/drawing.rb +6 -1
- data/lib/axlsx/drawing/graphic_frame.rb +3 -3
- data/lib/axlsx/drawing/hyperlink.rb +1 -3
- data/lib/axlsx/drawing/line_3D_chart.rb +2 -2
- data/lib/axlsx/drawing/line_chart.rb +10 -10
- data/lib/axlsx/drawing/line_series.rb +32 -3
- data/lib/axlsx/drawing/marker.rb +1 -1
- data/lib/axlsx/drawing/num_data.rb +4 -4
- data/lib/axlsx/drawing/num_data_source.rb +6 -6
- data/lib/axlsx/drawing/num_val.rb +3 -1
- data/lib/axlsx/drawing/one_cell_anchor.rb +3 -2
- data/lib/axlsx/drawing/pic.rb +25 -19
- data/lib/axlsx/drawing/picture_locking.rb +1 -3
- data/lib/axlsx/drawing/pie_3D_chart.rb +5 -6
- data/lib/axlsx/drawing/pie_series.rb +6 -6
- data/lib/axlsx/drawing/scaling.rb +6 -6
- data/lib/axlsx/drawing/scatter_chart.rb +10 -10
- data/lib/axlsx/drawing/scatter_series.rb +40 -7
- data/lib/axlsx/drawing/ser_axis.rb +2 -2
- data/lib/axlsx/drawing/series.rb +3 -3
- data/lib/axlsx/drawing/series_title.rb +2 -2
- data/lib/axlsx/drawing/str_data.rb +3 -3
- data/lib/axlsx/drawing/str_val.rb +3 -1
- data/lib/axlsx/drawing/title.rb +22 -4
- data/lib/axlsx/drawing/two_cell_anchor.rb +6 -1
- data/lib/axlsx/drawing/val_axis.rb +1 -1
- data/lib/axlsx/drawing/view_3D.rb +2 -2
- data/lib/axlsx/drawing/vml_drawing.rb +1 -1
- data/lib/axlsx/package.rb +34 -32
- data/lib/axlsx/rels/relationship.rb +1 -1
- data/lib/axlsx/rels/relationships.rb +7 -4
- data/lib/axlsx/stylesheet/border_pr.rb +2 -2
- data/lib/axlsx/stylesheet/cell_alignment.rb +1 -3
- data/lib/axlsx/stylesheet/cell_protection.rb +1 -3
- data/lib/axlsx/stylesheet/cell_style.rb +1 -3
- data/lib/axlsx/stylesheet/color.rb +1 -3
- data/lib/axlsx/stylesheet/font.rb +1 -1
- data/lib/axlsx/stylesheet/gradient_stop.rb +1 -1
- data/lib/axlsx/stylesheet/num_fmt.rb +10 -3
- data/lib/axlsx/stylesheet/pattern_fill.rb +1 -1
- data/lib/axlsx/stylesheet/styles.rb +7 -7
- data/lib/axlsx/stylesheet/table_style_element.rb +1 -3
- data/lib/axlsx/util/accessors.rb +6 -6
- data/lib/axlsx/util/constants.rb +107 -99
- data/lib/axlsx/util/mime_type_utils.rb +11 -0
- data/lib/axlsx/util/options_parser.rb +2 -1
- data/lib/axlsx/util/parser.rb +4 -4
- data/lib/axlsx/util/serialized_attributes.rb +16 -6
- data/lib/axlsx/util/simple_typed_list.rb +28 -52
- data/lib/axlsx/util/storage.rb +4 -4
- data/lib/axlsx/util/validators.rb +29 -17
- data/lib/axlsx/version.rb +1 -1
- data/lib/axlsx/workbook/defined_name.rb +11 -12
- data/lib/axlsx/workbook/defined_names.rb +2 -2
- data/lib/axlsx/workbook/shared_strings_table.rb +5 -5
- data/lib/axlsx/workbook/workbook.rb +36 -11
- data/lib/axlsx/workbook/workbook_view.rb +80 -0
- data/lib/axlsx/workbook/workbook_views.rb +22 -0
- data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +2 -2
- data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +1 -3
- data/lib/axlsx/workbook/worksheet/break.rb +1 -3
- data/lib/axlsx/workbook/worksheet/cell.rb +136 -74
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +63 -43
- data/lib/axlsx/workbook/worksheet/cfvo.rb +1 -3
- data/lib/axlsx/workbook/worksheet/cfvos.rb +4 -1
- data/lib/axlsx/workbook/worksheet/col.rb +7 -10
- data/lib/axlsx/workbook/worksheet/col_breaks.rb +2 -2
- data/lib/axlsx/workbook/worksheet/cols.rb +5 -2
- data/lib/axlsx/workbook/worksheet/comment.rb +5 -6
- data/lib/axlsx/workbook/worksheet/comments.rb +9 -12
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +1 -1
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +1 -1
- data/lib/axlsx/workbook/worksheet/data_bar.rb +4 -6
- data/lib/axlsx/workbook/worksheet/data_validation.rb +6 -4
- data/lib/axlsx/workbook/worksheet/dimension.rb +2 -2
- data/lib/axlsx/workbook/worksheet/header_footer.rb +6 -8
- data/lib/axlsx/workbook/worksheet/icon_set.rb +3 -5
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +4 -2
- data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -0
- data/lib/axlsx/workbook/worksheet/page_margins.rb +1 -3
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +1 -1
- data/lib/axlsx/workbook/worksheet/page_setup.rb +21 -23
- data/lib/axlsx/workbook/worksheet/pane.rb +1 -3
- data/lib/axlsx/workbook/worksheet/pivot_table.rb +44 -28
- data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +4 -4
- data/lib/axlsx/workbook/worksheet/print_options.rb +1 -3
- data/lib/axlsx/workbook/worksheet/protected_range.rb +1 -3
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +5 -2
- data/lib/axlsx/workbook/worksheet/rich_text.rb +55 -0
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +250 -0
- data/lib/axlsx/workbook/worksheet/row.rb +40 -51
- data/lib/axlsx/workbook/worksheet/row_breaks.rb +2 -2
- data/lib/axlsx/workbook/worksheet/selection.rb +1 -3
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +3 -1
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +21 -3
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +1 -3
- data/lib/axlsx/workbook/worksheet/table.rb +6 -6
- data/lib/axlsx/workbook/worksheet/table_style_info.rb +1 -3
- data/lib/axlsx/workbook/worksheet/tables.rb +4 -1
- data/lib/axlsx/workbook/worksheet/worksheet.rb +64 -78
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +10 -10
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +3 -3
- data/lib/axlsx.rb +34 -15
- data/test/drawing/tc_area_chart.rb +39 -0
- data/test/drawing/tc_area_series.rb +71 -0
- data/test/drawing/tc_axis.rb +27 -0
- data/test/drawing/tc_bar_chart.rb +71 -0
- data/test/drawing/tc_bubble_chart.rb +44 -0
- data/test/drawing/tc_bubble_series.rb +21 -0
- data/test/drawing/tc_chart.rb +23 -10
- data/test/drawing/tc_data_source.rb +6 -0
- data/test/drawing/tc_drawing.rb +2 -2
- data/test/drawing/tc_line_chart.rb +5 -5
- data/test/drawing/tc_line_series.rb +47 -6
- data/test/drawing/tc_pic.rb +11 -15
- data/test/drawing/tc_scatter_series.rb +36 -1
- data/test/drawing/tc_str_val.rb +9 -0
- data/test/drawing/tc_title.rb +5 -0
- data/test/stylesheet/tc_styles.rb +2 -2
- data/test/tc_axlsx.rb +31 -0
- data/test/tc_helper.rb +2 -0
- data/test/tc_package.rb +19 -1
- data/test/util/tc_mime_type_utils.rb +13 -0
- data/test/util/tc_simple_typed_list.rb +2 -3
- data/test/util/tc_validators.rb +34 -10
- data/test/workbook/tc_defined_name.rb +12 -4
- data/test/workbook/tc_shared_strings_table.rb +16 -1
- data/test/workbook/tc_workbook.rb +38 -3
- data/test/workbook/tc_workbook_view.rb +50 -0
- data/test/workbook/worksheet/auto_filter/tc_filters.rb +1 -1
- data/test/workbook/worksheet/tc_break.rb +1 -1
- data/test/workbook/worksheet/tc_cell.rb +76 -8
- data/test/workbook/worksheet/tc_col.rb +2 -2
- data/test/workbook/worksheet/tc_conditional_formatting.rb +2 -2
- data/test/workbook/worksheet/tc_data_bar.rb +1 -1
- data/test/workbook/worksheet/tc_data_validation.rb +11 -11
- data/test/workbook/worksheet/tc_header_footer.rb +2 -2
- data/test/workbook/worksheet/tc_icon_set.rb +1 -1
- data/test/workbook/worksheet/tc_outline_pr.rb +19 -0
- data/test/workbook/worksheet/tc_page_setup.rb +3 -3
- data/test/workbook/worksheet/tc_pivot_table.rb +21 -6
- data/test/workbook/worksheet/tc_print_options.rb +1 -1
- data/test/workbook/worksheet/tc_rich_text.rb +44 -0
- data/test/workbook/worksheet/tc_rich_text_run.rb +172 -0
- data/test/workbook/worksheet/tc_row.rb +7 -2
- data/test/workbook/worksheet/tc_sheet_calc_pr.rb +1 -1
- data/test/workbook/worksheet/tc_sheet_format_pr.rb +4 -4
- data/test/workbook/worksheet/tc_sheet_pr.rb +26 -4
- data/test/workbook/worksheet/tc_sheet_protection.rb +5 -5
- data/test/workbook/worksheet/tc_sheet_view.rb +4 -4
- data/test/workbook/worksheet/tc_table.rb +2 -3
- data/test/workbook/worksheet/tc_worksheet.rb +99 -45
- metadata +142 -64
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'tc_helper.rb'
|
2
|
+
|
3
|
+
class TestBarChart < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@p = Axlsx::Package.new
|
7
|
+
ws = @p.workbook.add_worksheet
|
8
|
+
@row = ws.add_row ["one", 1, Time.now]
|
9
|
+
@chart = ws.add_chart Axlsx::BarChart, :title => "fishery"
|
10
|
+
end
|
11
|
+
|
12
|
+
def teardown
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_initialization
|
16
|
+
assert_equal(@chart.grouping, :clustered, "grouping defualt incorrect")
|
17
|
+
assert_equal(@chart.series_type, Axlsx::BarSeries, "series type incorrect")
|
18
|
+
assert_equal(@chart.bar_dir, :bar, " bar direction incorrect")
|
19
|
+
assert(@chart.cat_axis.is_a?(Axlsx::CatAxis), "category axis not created")
|
20
|
+
assert(@chart.val_axis.is_a?(Axlsx::ValAxis), "value access not created")
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_bar_direction
|
24
|
+
assert_raise(ArgumentError, "require valid bar direction") { @chart.bar_dir = :left }
|
25
|
+
assert_nothing_raised("allow valid bar direction") { @chart.bar_dir = :col }
|
26
|
+
assert(@chart.bar_dir == :col)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_grouping
|
30
|
+
assert_raise(ArgumentError, "require valid grouping") { @chart.grouping = :inverted }
|
31
|
+
assert_nothing_raised("allow valid grouping") { @chart.grouping = :standard }
|
32
|
+
assert(@chart.grouping == :standard)
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
def test_gapWidth
|
37
|
+
assert_raise(ArgumentError, "require valid gap width") { @chart.gap_width = 200 }
|
38
|
+
assert_nothing_raised("allow valid gapWidth") { @chart.gap_width = "200%" }
|
39
|
+
assert(@chart.gap_width == "200%")
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_gapDepth
|
43
|
+
assert_raise(ArgumentError, "require valid gap_depth") { @chart.gap_depth = 200 }
|
44
|
+
assert_nothing_raised("allow valid gap_depth") { @chart.gap_depth = "200%" }
|
45
|
+
assert(@chart.gap_depth == "200%")
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_shape
|
49
|
+
assert_raise(ArgumentError, "require valid shape") { @chart.shape = :star }
|
50
|
+
assert_nothing_raised("allow valid shape") { @chart.shape = :cone }
|
51
|
+
assert(@chart.shape == :cone)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_to_xml_string
|
55
|
+
schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
|
56
|
+
doc = Nokogiri::XML(@chart.to_xml_string)
|
57
|
+
errors = []
|
58
|
+
schema.validate(doc).each do |error|
|
59
|
+
errors.push error
|
60
|
+
puts error.message
|
61
|
+
end
|
62
|
+
assert(errors.empty?, "error free validation")
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_to_xml_string_has_axes_in_correct_order
|
66
|
+
str = @chart.to_xml_string
|
67
|
+
cat_axis_position = str.index(@chart.axes[:cat_axis].id.to_s)
|
68
|
+
val_axis_position = str.index(@chart.axes[:val_axis].id.to_s)
|
69
|
+
assert(cat_axis_position < val_axis_position, "cat_axis must occur earlier than val_axis in the XML")
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'tc_helper.rb'
|
2
|
+
|
3
|
+
class TestBubbleChart < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@p = Axlsx::Package.new
|
6
|
+
@chart = nil
|
7
|
+
@p.workbook.add_worksheet do |sheet|
|
8
|
+
sheet.add_row ["First", 1, 5, 7, 9]
|
9
|
+
sheet.add_row ["", 1, 25, 49, 81]
|
10
|
+
sheet.add_row ["", 1, 42, 60, 75]
|
11
|
+
sheet.add_row ["Second", 5, 2, 14, 9]
|
12
|
+
sheet.add_row ["", 5, 10, 15, 20]
|
13
|
+
sheet.add_row ["", 5, 28, 92, 13]
|
14
|
+
sheet.add_chart(Axlsx::BubbleChart, :title => "example: Bubble Chart") do |chart|
|
15
|
+
chart.start_at 0, 4
|
16
|
+
chart.end_at 10, 19
|
17
|
+
chart.add_series :xData => sheet["B1:E1"], :yData => sheet["B2:E2"], :bubbleSize => sheet["B3:E3"], :title => sheet["A1"]
|
18
|
+
chart.add_series :xData => sheet["B4:E4"], :yData => sheet["B5:E5"], :bubbleSize => sheet["B6:E6"], :title => sheet["A3"]
|
19
|
+
@chart = chart
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def teardown
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_initialization
|
28
|
+
assert_equal(@chart.series_type, Axlsx::BubbleSeries, "series type incorrect")
|
29
|
+
assert(@chart.xValAxis.is_a?(Axlsx::ValAxis), "independant value axis not created")
|
30
|
+
assert(@chart.yValAxis.is_a?(Axlsx::ValAxis), "dependant value axis not created")
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_to_xml_string
|
34
|
+
schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
|
35
|
+
doc = Nokogiri::XML(@chart.to_xml_string)
|
36
|
+
errors = []
|
37
|
+
schema.validate(doc).each do |error|
|
38
|
+
errors.push error
|
39
|
+
puts error.message
|
40
|
+
end
|
41
|
+
assert(errors.empty?, "error free validation")
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'tc_helper.rb'
|
2
|
+
|
3
|
+
class TestBubbleSeries < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
p = Axlsx::Package.new
|
7
|
+
@ws = p.workbook.add_worksheet :name=>"hmmm"
|
8
|
+
@chart = @ws.add_chart Axlsx::BubbleChart, :title => "Bubble Chart"
|
9
|
+
@series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :bubbleSize=>[1,5,7], :title=>"GDP", :color => 'FF0000'
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_initialize
|
13
|
+
assert_equal(@series.title.text, "GDP", "series title has been applied")
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_to_xml_string
|
17
|
+
doc = Nokogiri::XML(@chart.to_xml_string)
|
18
|
+
assert_equal(doc.xpath("//a:srgbClr[@val='#{@series.color}']").size,2)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
data/test/drawing/tc_chart.rb
CHANGED
@@ -6,7 +6,7 @@ class TestChart < Test::Unit::TestCase
|
|
6
6
|
@p = Axlsx::Package.new
|
7
7
|
ws = @p.workbook.add_worksheet
|
8
8
|
@row = ws.add_row ["one", 1, Time.now]
|
9
|
-
@chart = ws.add_chart Axlsx::Bar3DChart, :title => "fishery"
|
9
|
+
@chart = ws.add_chart Axlsx::Bar3DChart, :title => "fishery", :bg_color => "000000"
|
10
10
|
end
|
11
11
|
|
12
12
|
def teardown
|
@@ -27,17 +27,30 @@ class TestChart < Test::Unit::TestCase
|
|
27
27
|
assert_equal(@chart.title.cell, @row.cells.first)
|
28
28
|
end
|
29
29
|
|
30
|
+
def test_style
|
31
|
+
assert_raise(ArgumentError) { @chart.style = 49 }
|
32
|
+
assert_nothing_raised { @chart.style = 2 }
|
33
|
+
assert_equal(@chart.style, 2)
|
34
|
+
end
|
35
|
+
|
30
36
|
def test_to_from_marker_access
|
31
37
|
assert(@chart.to.is_a?(Axlsx::Marker))
|
32
38
|
assert(@chart.from.is_a?(Axlsx::Marker))
|
33
39
|
end
|
34
40
|
|
35
|
-
def
|
36
|
-
assert_raise(ArgumentError) { @chart.
|
37
|
-
assert_nothing_raised { @chart.
|
38
|
-
assert_equal(@chart.
|
41
|
+
def test_bg_color
|
42
|
+
assert_raise(ArgumentError) { @chart.bg_color = 2 }
|
43
|
+
assert_nothing_raised { @chart.bg_color = "FFFFFF" }
|
44
|
+
assert_equal(@chart.bg_color, "FFFFFF")
|
45
|
+
|
39
46
|
end
|
40
|
-
|
47
|
+
|
48
|
+
def test_title_size
|
49
|
+
assert_raise(ArgumentError) { @chart.title_size = 2 }
|
50
|
+
assert_nothing_raised { @chart.title_size = "100" }
|
51
|
+
assert_equal(@chart.title.text_size, "100")
|
52
|
+
end
|
53
|
+
|
41
54
|
def test_vary_colors
|
42
55
|
assert_equal(true, @chart.vary_colors)
|
43
56
|
assert_raise(ArgumentError) { @chart.vary_colors = 7 }
|
@@ -63,7 +76,7 @@ class TestChart < Test::Unit::TestCase
|
|
63
76
|
@chart.start_at [5,6]
|
64
77
|
assert_equal(@chart.graphic_frame.anchor.from.col, 5)
|
65
78
|
assert_equal(@chart.graphic_frame.anchor.from.row, 6)
|
66
|
-
|
79
|
+
|
67
80
|
end
|
68
81
|
|
69
82
|
def test_end_at
|
@@ -76,7 +89,7 @@ class TestChart < Test::Unit::TestCase
|
|
76
89
|
@chart.end_at [10,11]
|
77
90
|
assert_equal(@chart.graphic_frame.anchor.to.col, 10)
|
78
91
|
assert_equal(@chart.graphic_frame.anchor.to.row, 11)
|
79
|
-
|
92
|
+
|
80
93
|
end
|
81
94
|
|
82
95
|
def test_add_series
|
@@ -88,13 +101,13 @@ class TestChart < Test::Unit::TestCase
|
|
88
101
|
def test_pn
|
89
102
|
assert_equal(@chart.pn, "charts/chart1.xml")
|
90
103
|
end
|
91
|
-
|
104
|
+
|
92
105
|
def test_d_lbls
|
93
106
|
assert_equal(nil, @chart.instance_values[:d_lbls])
|
94
107
|
@chart.d_lbls.d_lbl_pos = :t
|
95
108
|
assert(@chart.d_lbls.is_a?(Axlsx::DLbls), 'DLbls instantiated on access')
|
96
109
|
end
|
97
|
-
|
110
|
+
|
98
111
|
def test_to_xml_string
|
99
112
|
schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
|
100
113
|
doc = Nokogiri::XML(@chart.to_xml_string)
|
@@ -6,6 +6,12 @@
|
|
6
6
|
@data_source = Axlsx::NumDataSource.new :data => ["1", "2", "3"]
|
7
7
|
end
|
8
8
|
|
9
|
+
def test_tag_name
|
10
|
+
assert_raise(ArgumentError) { @data_source.tag_name = :zVal }
|
11
|
+
assert_nothing_raised { @data_source.tag_name = :yVal }
|
12
|
+
assert_nothing_raised { @data_source.tag_name = :bubbleSize }
|
13
|
+
end
|
14
|
+
|
9
15
|
def test_to_xml_string_strLit
|
10
16
|
str = '<?xml version="1.0" encoding="UTF-8"?>'
|
11
17
|
str << '<c:chartSpace xmlns:c="' << Axlsx::XML_NS_C << '">'
|
data/test/drawing/tc_drawing.rb
CHANGED
@@ -59,9 +59,9 @@ class TestDrawing < Test::Unit::TestCase
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def test_relationships
|
62
|
-
|
62
|
+
@ws.add_chart(Axlsx::Pie3DChart, :title=>"bob", :start_at=>[0,0], :end_at=>[1,1])
|
63
63
|
assert_equal(@ws.drawing.relationships.size, 1, "adding a chart adds a relationship")
|
64
|
-
|
64
|
+
@ws.add_chart(Axlsx::Pie3DChart, :title=>"nancy", :start_at=>[1,5], :end_at=>[5,10])
|
65
65
|
assert_equal(@ws.drawing.relationships.size, 2, "adding a chart adds a relationship")
|
66
66
|
end
|
67
67
|
|
@@ -19,11 +19,11 @@ class TestLineChart < Test::Unit::TestCase
|
|
19
19
|
assert(@chart.val_axis.is_a?(Axlsx::ValAxis), "value access not created")
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
def test_grouping
|
23
|
+
assert_raise(ArgumentError, "require valid grouping") { @chart.grouping = :inverted }
|
24
|
+
assert_nothing_raised("allow valid grouping") { @chart.grouping = :stacked }
|
25
|
+
assert(@chart.grouping == :stacked)
|
26
|
+
end
|
27
27
|
|
28
28
|
def test_to_xml
|
29
29
|
schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
|
@@ -6,25 +6,66 @@ class TestLineSeries < Test::Unit::TestCase
|
|
6
6
|
p = Axlsx::Package.new
|
7
7
|
@ws = p.workbook.add_worksheet :name=>"hmmm"
|
8
8
|
chart = @ws.add_chart Axlsx::Line3DChart, :title => "fishery"
|
9
|
-
@series = chart.add_series
|
9
|
+
@series = chart.add_series(
|
10
|
+
:data => [0,1,2],
|
11
|
+
:labels => ["zero", "one", "two"],
|
12
|
+
:title => "bob",
|
13
|
+
:color => "#FF0000",
|
14
|
+
:show_marker => true,
|
15
|
+
:smooth => true
|
16
|
+
)
|
10
17
|
end
|
11
18
|
|
12
19
|
def test_initialize
|
13
20
|
assert_equal(@series.title.text, "bob", "series title has been applied")
|
14
21
|
assert_equal(@series.labels.class, Axlsx::AxDataSource)
|
15
22
|
assert_equal(@series.data.class, Axlsx::NumDataSource)
|
16
|
-
|
17
23
|
end
|
18
24
|
|
19
25
|
def test_show_marker
|
20
26
|
assert_equal(true, @series.show_marker)
|
21
27
|
@series.show_marker = false
|
22
28
|
assert_equal(false, @series.show_marker)
|
23
|
-
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_smooth
|
32
|
+
assert_equal(true, @series.smooth)
|
33
|
+
@series.smooth = false
|
34
|
+
assert_equal(false, @series.smooth)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_marker_symbol
|
38
|
+
assert_equal(:default, @series.marker_symbol)
|
39
|
+
@series.marker_symbol = :circle
|
40
|
+
assert_equal(:circle, @series.marker_symbol)
|
41
|
+
end
|
42
|
+
|
24
43
|
def test_to_xml_string
|
25
|
-
doc = Nokogiri::XML(@series
|
44
|
+
doc = Nokogiri::XML(wrap_with_namespaces(@series))
|
26
45
|
assert(doc.xpath("//srgbClr[@val='#{@series.color}']"))
|
27
|
-
|
46
|
+
assert_equal(xpath_with_namespaces(doc, "//c:marker").size, 0)
|
47
|
+
assert(doc.xpath("//smooth"))
|
48
|
+
|
49
|
+
@series.marker_symbol = :diamond
|
50
|
+
doc = Nokogiri::XML(wrap_with_namespaces(@series))
|
51
|
+
assert_equal(xpath_with_namespaces(doc, "//c:marker/c:symbol[@val='diamond']").size, 1)
|
52
|
+
|
53
|
+
@series.show_marker = false
|
54
|
+
doc = Nokogiri::XML(wrap_with_namespaces(@series))
|
55
|
+
assert_equal(xpath_with_namespaces(doc, "//c:marker/c:symbol[@val='none']").size, 1)
|
56
|
+
end
|
57
|
+
|
58
|
+
def wrap_with_namespaces(series)
|
59
|
+
'<c:chartSpace xmlns:c="' <<
|
60
|
+
Axlsx::XML_NS_C <<
|
61
|
+
'" xmlns:a="' <<
|
62
|
+
Axlsx::XML_NS_A <<
|
63
|
+
'">' <<
|
64
|
+
series.to_xml_string <<
|
65
|
+
'</c:chartSpace>'
|
66
|
+
end
|
67
|
+
|
68
|
+
def xpath_with_namespaces(doc, xpath)
|
69
|
+
doc.xpath(xpath, "a" => Axlsx::XML_NS_A, "c" => Axlsx::XML_NS_C)
|
28
70
|
end
|
29
|
-
#TODO serialization testing
|
30
71
|
end
|
data/test/drawing/tc_pic.rb
CHANGED
@@ -5,12 +5,11 @@ class TestPic < Test::Unit::TestCase
|
|
5
5
|
def setup
|
6
6
|
@p = Axlsx::Package.new
|
7
7
|
ws = @p.workbook.add_worksheet
|
8
|
-
@test_img = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
|
9
|
-
@
|
10
|
-
@
|
11
|
-
|
12
|
-
|
13
|
-
def teardown
|
8
|
+
@test_img = @test_img_jpg = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
|
9
|
+
@test_img_png = File.dirname(__FILE__) + "/../../examples/image1.png"
|
10
|
+
@test_img_gif = File.dirname(__FILE__) + "/../../examples/image1.gif"
|
11
|
+
@test_img_fake = File.dirname(__FILE__) + "/../../examples/image1_fake.jpg"
|
12
|
+
@image = ws.add_image :image_src => @test_img, :hyperlink => 'https://github.com/randym', :tooltip => "What's up doc?", :opacity => 5
|
14
13
|
end
|
15
14
|
|
16
15
|
def test_initialization
|
@@ -38,6 +37,7 @@ class TestPic < Test::Unit::TestCase
|
|
38
37
|
assert_equal(200, @image.width)
|
39
38
|
|
40
39
|
end
|
40
|
+
|
41
41
|
def test_hyperlink
|
42
42
|
assert_equal(@image.hyperlink.href, "https://github.com/randym")
|
43
43
|
@image.hyperlink = "http://axlsx.blogspot.com"
|
@@ -70,15 +70,12 @@ class TestPic < Test::Unit::TestCase
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def test_image_src
|
73
|
-
assert_raise(ArgumentError) { @image.image_src = 49 }
|
74
|
-
assert_raise(ArgumentError) { @image.image_src = 'Unknown' }
|
75
73
|
assert_raise(ArgumentError) { @image.image_src = __FILE__ }
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
assert_nothing_raised { @image.image_src = @test_img_up }
|
74
|
+
assert_raise(ArgumentError) { @image.image_src = @test_img_fake }
|
75
|
+
assert_nothing_raised { @image.image_src = @test_img_gif }
|
76
|
+
assert_nothing_raised { @image.image_src = @test_img_png }
|
77
|
+
assert_nothing_raised { @image.image_src = @test_img_jpg }
|
78
|
+
assert_equal(@image.image_src, @test_img_jpg)
|
82
79
|
end
|
83
80
|
|
84
81
|
def test_descr
|
@@ -103,5 +100,4 @@ class TestPic < Test::Unit::TestCase
|
|
103
100
|
doc = Nokogiri::XML(@image.anchor.drawing.to_xml_string)
|
104
101
|
assert_equal r_id, doc.xpath("//a:blip").first["r:embed"]
|
105
102
|
end
|
106
|
-
|
107
103
|
end
|
@@ -6,16 +6,51 @@ class TestScatterSeries < Test::Unit::TestCase
|
|
6
6
|
p = Axlsx::Package.new
|
7
7
|
@ws = p.workbook.add_worksheet :name=>"hmmm"
|
8
8
|
@chart = @ws.add_chart Axlsx::ScatterChart, :title => "Scatter Chart"
|
9
|
-
@series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"exponents", :color => 'FF0000'
|
9
|
+
@series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"exponents", :color => 'FF0000', :smooth => true
|
10
10
|
end
|
11
11
|
|
12
12
|
def test_initialize
|
13
13
|
assert_equal(@series.title.text, "exponents", "series title has been applied")
|
14
14
|
end
|
15
15
|
|
16
|
+
def test_smoothed_chart_default_smoothing
|
17
|
+
@chart = @ws.add_chart Axlsx::ScatterChart, :title => "Smooth Chart", :scatter_style => :smoothMarker
|
18
|
+
@series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"smoothed exponents"
|
19
|
+
assert(@series.smooth, "series is smooth by default on smooth charts")
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_unsmoothed_chart_default_smoothing
|
23
|
+
@chart = @ws.add_chart Axlsx::ScatterChart, :title => "Unsmooth Chart", :scatter_style => :line
|
24
|
+
@series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"unsmoothed exponents"
|
25
|
+
assert(!@series.smooth, "series is not smooth by default on non-smooth charts")
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_explicit_smoothing
|
29
|
+
@chart = @ws.add_chart Axlsx::ScatterChart, :title => "Unsmooth Chart, Smooth Series", :scatter_style => :line
|
30
|
+
@series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"smoothed exponents", :smooth => true
|
31
|
+
assert(@series.smooth, "series is smooth when overriding chart default")
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_explicit_unsmoothing
|
35
|
+
@chart = @ws.add_chart Axlsx::ScatterChart, :title => "Smooth Chart, Unsmooth Series", :scatter_style => :smoothMarker
|
36
|
+
@series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"unsmoothed exponents", :smooth => false
|
37
|
+
assert(!@series.smooth, "series is not smooth when overriding chart default")
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_ln_width
|
41
|
+
@chart = @ws.add_chart Axlsx::ScatterChart, :title => "ln width", :scatter_style => :line
|
42
|
+
@series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"ln_width"
|
43
|
+
@series.ln_width = 12700
|
44
|
+
assert_equal(@series.ln_width, 12700, 'line width assigment is allowed')
|
45
|
+
end
|
46
|
+
|
16
47
|
def test_to_xml_string
|
48
|
+
@chart.scatter_style = :line
|
49
|
+
@series.ln_width = 12700
|
17
50
|
doc = Nokogiri::XML(@chart.to_xml_string)
|
51
|
+
assert_equal(12700, @series.ln_width)
|
18
52
|
assert_equal(doc.xpath("//a:srgbClr[@val='#{@series.color}']").size,4)
|
53
|
+
assert_equal(doc.xpath("//a:ln[@w='#{@series.ln_width}']").length, 1)
|
19
54
|
end
|
20
55
|
|
21
56
|
end
|
data/test/drawing/tc_str_val.rb
CHANGED
@@ -4,6 +4,7 @@ class TestStrVal < Test::Unit::TestCase
|
|
4
4
|
|
5
5
|
def setup
|
6
6
|
@str_val = Axlsx::StrVal.new :v => "1"
|
7
|
+
@str_val_with_special_characters = Axlsx::StrVal.new :v => "a & b <c>"
|
7
8
|
end
|
8
9
|
|
9
10
|
def test_initialize
|
@@ -18,4 +19,12 @@ class TestStrVal < Test::Unit::TestCase
|
|
18
19
|
assert_equal(doc.xpath("//c:pt/c:v[text()='1']").size, 1)
|
19
20
|
end
|
20
21
|
|
22
|
+
def test_to_xml_string_special_characters
|
23
|
+
str = '<?xml version="1.0" encoding="UTF-8"?>'
|
24
|
+
str << '<c:chartSpace xmlns:c="' << Axlsx::XML_NS_C << '">'
|
25
|
+
str << @str_val_with_special_characters.to_xml_string(0)
|
26
|
+
doc = Nokogiri::XML(str)
|
27
|
+
assert_equal(doc.xpath("//c:pt/c:v[text()='a & b <c>']").size, 1)
|
28
|
+
end
|
29
|
+
|
21
30
|
end
|
data/test/drawing/tc_title.rb
CHANGED
@@ -19,6 +19,11 @@ class TestTitle < Test::Unit::TestCase
|
|
19
19
|
assert(@title.cell == nil)
|
20
20
|
end
|
21
21
|
|
22
|
+
def test_initialize_title_size
|
23
|
+
title = Axlsx::Title.new 'bob', 90
|
24
|
+
assert_equal "90", title.text_size
|
25
|
+
end
|
26
|
+
|
22
27
|
def test_text
|
23
28
|
assert_raise(ArgumentError, "text must be a string") { @title.text = 123 }
|
24
29
|
@title.cell = @row.cells.first
|
@@ -133,7 +133,7 @@ class TestStyles < Test::Unit::TestCase
|
|
133
133
|
:font_name => "woot font"
|
134
134
|
}
|
135
135
|
assert_equal(@styles.parse_font_options {}, nil, "noop if no font keys are set")
|
136
|
-
|
136
|
+
assert(@styles.parse_font_options(:b=>1).is_a?(Integer), "return index of font if not :dxf type")
|
137
137
|
assert_equal(@styles.parse_font_options(:b=>1, :type => :dxf).class, Axlsx::Font, "return font object if :dxf type")
|
138
138
|
|
139
139
|
f = @styles.parse_font_options(options.merge(:type => :dxf))
|
@@ -147,7 +147,7 @@ class TestStyles < Test::Unit::TestCase
|
|
147
147
|
|
148
148
|
def test_parse_fill_options
|
149
149
|
assert_equal(@styles.parse_fill_options {}, nil, "noop if no fill keys are set")
|
150
|
-
|
150
|
+
assert(@styles.parse_fill_options(:bg_color => "DE").is_a?(Integer), "return index of fill if not :dxf type")
|
151
151
|
assert_equal(@styles.parse_fill_options(:bg_color => "DE", :type => :dxf).class, Axlsx::Fill, "return fill object if :dxf type")
|
152
152
|
f = @styles.parse_fill_options(:bg_color => "DE", :type => :dxf)
|
153
153
|
assert(f.fill_type.bgColor.rgb == "FFDEDEDE")
|
data/test/tc_axlsx.rb
CHANGED
@@ -45,6 +45,16 @@ class TestAxlsx < Test::Unit::TestCase
|
|
45
45
|
assert_equal(Axlsx.cell_range([c2, c1], true), "'Sheet <''>" 1'!$A$1:$B$1")
|
46
46
|
end
|
47
47
|
|
48
|
+
def test_cell_range_row
|
49
|
+
p = Axlsx::Package.new
|
50
|
+
ws = p.workbook.add_worksheet
|
51
|
+
row = ws.add_row
|
52
|
+
row.add_cell
|
53
|
+
row.add_cell
|
54
|
+
row.add_cell
|
55
|
+
assert_equal("A1:C1", Axlsx.cell_range(row, false))
|
56
|
+
end
|
57
|
+
|
48
58
|
def test_name_to_indices
|
49
59
|
setup_wide
|
50
60
|
@wide_test_points.each do |key, value|
|
@@ -69,4 +79,25 @@ class TestAxlsx < Test::Unit::TestCase
|
|
69
79
|
assert_equal([['Z5', 'AA5', 'AB5'], ['Z6', 'AA6', 'AB6']], Axlsx::range_to_a('Z5:AB6'))
|
70
80
|
end
|
71
81
|
|
82
|
+
def test_sanitize_frozen_control_strippped
|
83
|
+
needs_sanitize = "legit\x08".freeze # Backspace control char
|
84
|
+
|
85
|
+
assert_equal(Axlsx.sanitize(needs_sanitize), 'legit', 'should strip control chars')
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_sanitize_unfrozen_control_strippped
|
89
|
+
needs_sanitize = "legit\x08" # Backspace control char
|
90
|
+
sanitized_str = Axlsx.sanitize(needs_sanitize)
|
91
|
+
|
92
|
+
assert_equal(sanitized_str, 'legit', 'should strip control chars')
|
93
|
+
assert_equal(sanitized_str.object_id, sanitized_str.object_id, 'should preserve object')
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_sanitize_unfrozen_no_sanitize
|
97
|
+
legit_str = 'legit'
|
98
|
+
sanitized_str = Axlsx.sanitize(legit_str)
|
99
|
+
|
100
|
+
assert_equal(sanitized_str, legit_str, 'should preserve value')
|
101
|
+
assert_equal(sanitized_str.object_id, legit_str.object_id, 'should preserve object')
|
102
|
+
end
|
72
103
|
end
|
data/test/tc_helper.rb
CHANGED
data/test/tc_package.rb
CHANGED
@@ -7,10 +7,17 @@ class TestPackage < Test::Unit::TestCase
|
|
7
7
|
ws = @package.workbook.add_worksheet
|
8
8
|
ws.add_row ['Can', 'we', 'build it?']
|
9
9
|
ws.add_row ['Yes!', 'We', 'can!']
|
10
|
+
@rt = Axlsx::RichText.new
|
11
|
+
@rt.add_run "run 1", :b => true, :i => false
|
12
|
+
ws.add_row [@rt]
|
13
|
+
|
14
|
+
ws.rows.last.add_cell('b', :type => :text)
|
15
|
+
|
10
16
|
ws.outline_level_rows 0, 1
|
11
17
|
ws.outline_level_columns 0, 1
|
12
18
|
ws.add_hyperlink :ref => ws.rows.first.cells.last, :location => 'https://github.com/randym'
|
13
19
|
ws.workbook.add_defined_name("#{ws.name}!A1:C2", :name => '_xlnm.Print_Titles', :hidden => true)
|
20
|
+
ws.workbook.add_view active_tab: 1, first_sheet: 0
|
14
21
|
ws.protect_range('A1:C1')
|
15
22
|
ws.protect_range(ws.rows.last.cells)
|
16
23
|
ws.add_comment :author => 'alice', :text => 'Hi Bob', :ref => 'A12'
|
@@ -52,6 +59,11 @@ class TestPackage < Test::Unit::TestCase
|
|
52
59
|
chart.d_lbls.show_val = true
|
53
60
|
end
|
54
61
|
|
62
|
+
ws.add_chart(Axlsx::BubbleChart, :title => 'bubble chart') do |chart|
|
63
|
+
chart.add_series :xData => [1,2,3,4], :yData => [1,3,2,4]
|
64
|
+
chart.d_lbls.show_val = true
|
65
|
+
end
|
66
|
+
|
55
67
|
@fname = 'axlsx_test_serialization.xlsx'
|
56
68
|
img = File.expand_path('../../examples/image1.jpeg', __FILE__)
|
57
69
|
ws.add_image(:image_src => img, :noSelect => true, :noMove => true, :hyperlink=>"http://axlsx.blogspot.com") do |image|
|
@@ -148,6 +160,11 @@ class TestPackage < Test::Unit::TestCase
|
|
148
160
|
assert package_1.to_stream.string == package_2.to_stream.string, "zip files are not identical"
|
149
161
|
end
|
150
162
|
|
163
|
+
def test_serialization_creates_files_with_excel_mime_type
|
164
|
+
assert_equal(MimeMagic.by_magic(@package.to_stream).type,
|
165
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
|
166
|
+
end
|
167
|
+
|
151
168
|
def test_validation
|
152
169
|
assert_equal(@package.validate.size, 0, @package.validate)
|
153
170
|
Axlsx::Workbook.send(:class_variable_set, :@@date1904, 9900)
|
@@ -176,12 +193,13 @@ class TestPackage < Test::Unit::TestCase
|
|
176
193
|
|
177
194
|
|
178
195
|
#no mystery parts
|
179
|
-
assert_equal(
|
196
|
+
assert_equal(25, p.size)
|
180
197
|
|
181
198
|
end
|
182
199
|
|
183
200
|
def test_shared_strings_requires_part
|
184
201
|
@package.use_shared_strings = true
|
202
|
+
@package.to_stream #ensure all cell_serializer paths are hit
|
185
203
|
p = @package.send(:parts)
|
186
204
|
assert_equal(p.select{ |part| part[:entry] =~/xl\/sharedStrings.xml/}.size, 1, "shared strings table missing")
|
187
205
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'tc_helper.rb'
|
2
|
+
class TestMimeTypeUtils < Test::Unit::TestCase
|
3
|
+
def setup
|
4
|
+
@test_img = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
|
5
|
+
end
|
6
|
+
|
7
|
+
def teardown
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_mime_type_utils
|
11
|
+
assert_equal(Axlsx::MimeTypeUtils::get_mime_type(@test_img), 'image/jpeg')
|
12
|
+
end
|
13
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'tc_helper.rb'
|
2
2
|
class TestSimpleTypedList < Test::Unit::TestCase
|
3
3
|
def setup
|
4
|
-
@list = Axlsx::SimpleTypedList.new
|
4
|
+
@list = Axlsx::SimpleTypedList.new Integer
|
5
5
|
end
|
6
6
|
|
7
7
|
def teardown
|
@@ -72,7 +72,6 @@ class TestSimpleTypedList < Test::Unit::TestCase
|
|
72
72
|
def test_equality
|
73
73
|
@list.push 1
|
74
74
|
@list.push 2
|
75
|
-
assert_equal(@list, [1,2])
|
76
|
-
|
75
|
+
assert_equal(@list.to_ary, [1,2])
|
77
76
|
end
|
78
77
|
end
|