write_xlsx 0.75.0 → 0.76.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/Changes +4 -0
  3. data/Gemfile +8 -2
  4. data/README.md +4 -2
  5. data/lib/write_xlsx/chart/axis.rb +69 -96
  6. data/lib/write_xlsx/chart/bar.rb +18 -21
  7. data/lib/write_xlsx/chart/caption.rb +1 -1
  8. data/lib/write_xlsx/chart/column.rb +1 -5
  9. data/lib/write_xlsx/chart/line.rb +2 -16
  10. data/lib/write_xlsx/chart/pie.rb +18 -40
  11. data/lib/write_xlsx/chart/radar.rb +2 -5
  12. data/lib/write_xlsx/chart/scatter.rb +24 -32
  13. data/lib/write_xlsx/chart/series.rb +218 -236
  14. data/lib/write_xlsx/chart/stock.rb +15 -27
  15. data/lib/write_xlsx/chart.rb +303 -392
  16. data/lib/write_xlsx/chartsheet.rb +22 -20
  17. data/lib/write_xlsx/colors.rb +9 -15
  18. data/lib/write_xlsx/drawing.rb +26 -28
  19. data/lib/write_xlsx/format.rb +15 -15
  20. data/lib/write_xlsx/package/comments.rb +1 -1
  21. data/lib/write_xlsx/package/conditional_format.rb +8 -8
  22. data/lib/write_xlsx/package/relationships.rb +4 -15
  23. data/lib/write_xlsx/package/styles.rb +9 -16
  24. data/lib/write_xlsx/shape.rb +1 -15
  25. data/lib/write_xlsx/sparkline.rb +1 -1
  26. data/lib/write_xlsx/utility.rb +69 -13
  27. data/lib/write_xlsx/version.rb +1 -1
  28. data/lib/write_xlsx/workbook.rb +19 -7
  29. data/lib/write_xlsx/worksheet/cell_data.rb +1 -1
  30. data/lib/write_xlsx/worksheet/hyperlink.rb +39 -37
  31. data/lib/write_xlsx/worksheet.rb +44 -72
  32. data/lib/write_xlsx/zip_file_utils.rb +99 -0
  33. data/test/chart/test_add_series.rb +5 -5
  34. data/test/chart/test_write_d_lbls.rb +1 -1
  35. data/test/chart/test_write_major_gridlines.rb +1 -1
  36. data/test/chart/test_write_marker.rb +1 -1
  37. data/test/chart/test_write_number_format.rb +1 -1
  38. data/test/helper.rb +7 -4
  39. data/test/regression/klt.csv +4 -0
  40. data/test/regression/test_chart_column07.rb +44 -0
  41. data/test/regression/test_chart_column08.rb +46 -0
  42. data/test/regression/test_chart_date01.rb +57 -0
  43. data/test/regression/test_chart_date02.rb +59 -0
  44. data/test/regression/test_chart_date03.rb +59 -0
  45. data/test/regression/test_chart_date04.rb +61 -0
  46. data/test/regression/test_chart_stock01.rb +1 -6
  47. data/test/regression/test_chart_title02.rb +44 -0
  48. data/test/regression/test_escapes01.rb +1 -1
  49. data/test/regression/test_escapes02.rb +1 -1
  50. data/test/regression/test_escapes03.rb +1 -1
  51. data/test/regression/test_escapes04.rb +1 -1
  52. data/test/regression/test_escapes05.rb +1 -1
  53. data/test/regression/test_escapes06.rb +1 -1
  54. data/test/regression/test_escapes07.rb +1 -1
  55. data/test/regression/test_escapes08.rb +1 -1
  56. data/test/regression/test_set_column09.rb +31 -0
  57. data/test/regression/test_shared_strings_encoding.rb +103 -0
  58. data/test/regression/xlsx_files/chart_column07.xlsx +0 -0
  59. data/test/regression/xlsx_files/chart_column08.xlsx +0 -0
  60. data/test/regression/xlsx_files/chart_date01.xlsx +0 -0
  61. data/test/regression/xlsx_files/chart_date02.xlsx +0 -0
  62. data/test/regression/xlsx_files/chart_date03.xlsx +0 -0
  63. data/test/regression/xlsx_files/chart_date04.xlsx +0 -0
  64. data/test/regression/xlsx_files/chart_title02.xlsx +0 -0
  65. data/test/regression/xlsx_files/set_column09.xlsx +0 -0
  66. data/test/regression/xlsx_files/shared_strings_encoding.xlsx +0 -0
  67. data/test/worksheet/test_write_hyperlink.rb +10 -15
  68. data/write_xlsx.gemspec +0 -3
  69. metadata +48 -39
  70. data/test/worksheet/test_set_column.rb +0 -25
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0997fd3d0c045f87a2365cf8c5bf998f694e31f6
4
- data.tar.gz: 67ccbdd8857b463def4dadc4f74c1a9a62081a5a
3
+ metadata.gz: 15e9357295f571cfc282263876abdaf83e28e652
4
+ data.tar.gz: 264a4bd65b91a39bc4cdabb518291a7df5894376
5
5
  SHA512:
6
- metadata.gz: 5f817c43fcea5bd1939dd88204c6b9acbf5609e2b8354f82d9eca8dae9e4e168c4ea94d41d1d14f2ce6e6b01212eff7e9b777e9790ab9794443ea068e9f1688b
7
- data.tar.gz: 6b4242ad09a7059121741ef4a67f0b2b01cf66f9de4c6a8dfb461b07026ccc5a9babc729766837c92a93fb25fc11d4788e3cc02b5595cc374a174c6603956bb5
6
+ metadata.gz: 70bb93acf8c0ecb36ecc45e0c5cb4c1c64c502252878cd3d4bf1c4ab1ad9dd0940dd673cc67c1200d5964597207c678f0996deb4c2466e5bf7f1afb20390903f
7
+ data.tar.gz: 3759ae9b833ca5e0138098b552370f9c7ab1daae3670c52a4b3539298de2d7aa219021eec5d9a9a475e12871bcd342799e17274acfb009d8028baf331fca8466
data/Changes CHANGED
@@ -1,4 +1,8 @@
1
1
  Change history of write_xlsx rubygem.
2
+ 2014-01-31 v0.76.0
3
+ Added date axis handling to charts.
4
+ Added support for non-contiguous chart ranges.
5
+ Fix to remove duplicate set_column() entries.
2
6
 
3
7
  2013-12-09 v0.75.0
4
8
  Added interval unit option for category axes.
data/Gemfile CHANGED
@@ -1,4 +1,10 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in write_xlsx.gemspec
4
- gemspec
3
+ if RUBY_VERSION >= "1.9"
4
+ gem 'rubyzip'
5
+ group :development do
6
+ gem 'simplecov'
7
+ end
8
+ else
9
+ gem 'rubyzip', '0.9.9'
10
+ end
data/README.md CHANGED
@@ -1,8 +1,10 @@
1
1
  # write_xlsx
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/write_xlsx.png)](http://badge.fury.io/rb/write_xlsx)
4
+
3
5
  gem to create a new file in the Excel 2007+ XLSX format, and you can use the
4
6
  same interface as writeexcel gem. write_xlsx is converted from Perl's module
5
- [Excel::Writer::XLSX-0.75](https://github.com/jmcnamara/excel-writer-xlsx) .
7
+ [Excel::Writer::XLSX-0.76](https://github.com/jmcnamara/excel-writer-xlsx) .
6
8
 
7
9
  ## Description
8
10
 
@@ -82,7 +84,7 @@ the first worksheet in an Excel XML spreadsheet called ruby.xlsx:
82
84
  Original Perl module was written by John McNamara(jmcnamara@cpan.org).
83
85
 
84
86
  Converted to ruby by Hideo NAKAMURA(cxn03651@msj.biglobe.ne.jp)
85
- Copyright (c) 2012-2013 Hideo NAKAMURA.
87
+ Copyright (c) 2012-2014 Hideo NAKAMURA.
86
88
 
87
89
  See LICENSE.txt for further details.
88
90
 
@@ -8,12 +8,12 @@ module Writexlsx
8
8
  class Axis < Caption
9
9
  include Writexlsx::Utility
10
10
 
11
- attr_accessor :defaults, :reverse
12
- attr_accessor :min, :max
13
- attr_accessor :minor_unit, :major_unit, :minor_unit_type, :major_unit_type
14
- attr_accessor :log_base, :crossing, :position, :position_axis, :label_position, :visible
15
- attr_accessor :num_format, :num_format_linked, :num_font, :layout, :interval_unit
16
- attr_accessor :major_gridlines, :minor_gridlines, :major_tick_mark
11
+ attr_accessor :defaults
12
+ attr_accessor :min, :max, :num_format, :position, :major_tick_mark
13
+ attr_reader :minor_unit, :major_unit, :minor_unit_type, :major_unit_type
14
+ attr_reader :log_base, :crossing, :position_axis, :label_position, :visible
15
+ attr_reader :num_format_linked, :num_font, :layout, :interval_unit
16
+ attr_reader :major_gridlines, :minor_gridlines, :reverse
17
17
 
18
18
  #
19
19
  # Convert user defined axis values into axis instance.
@@ -22,36 +22,79 @@ module Writexlsx
22
22
  super
23
23
  args = (defaults || {}).merge(params)
24
24
 
25
- @reverse = args[:reverse]
26
- @min = args[:min]
27
- @max = args[:max]
28
- @minor_unit = args[:minor_unit]
29
- @major_unit = args[:major_unit]
30
- @minor_unit_type = args[:minor_unit_type]
31
- @major_unit_type = args[:major_unit_type]
32
- @log_base = args[:log_base]
33
- @crossing = args[:crossing]
34
- @position_axis = args[:position_axis]
35
- @label_position = args[:label_position]
36
- @num_format = args[:num_format]
37
- @num_format_linked = args[:num_format_linked]
38
- @interval_unit = args[:interval_unit]
25
+ [
26
+ :reverse, :min, :max, :minor_unit, :major_unit, :minor_unit_type,
27
+ :major_unit_type, :log_base, :crossing, :position_axis, :label_position,
28
+ :num_format, :num_format_linked, :interval_unit, :major_tick_mark
29
+ ].each { |val| instance_variable_set("@#{val}", args[val]) }
39
30
  @visible = args[:visible] || 1
40
31
 
32
+ set_major_minor_gridlines(args)
33
+ set_position(args)
34
+ set_position_axis
35
+ set_font_properties(args)
36
+ set_axis_name_layout(args)
37
+ end
38
+
39
+ #
40
+ # Write the <c:numberFormat> element. Note: It is assumed that if a user
41
+ # defined number format is supplied (i.e., non-default) then the sourceLinked
42
+ # attribute is 0. The user can override this if required.
43
+ #
44
+
45
+ def write_number_format(writer) # :nodoc:
46
+ writer.empty_tag('c:numFmt', num_fmt_attributes)
47
+ end
48
+
49
+ #
50
+ # Write the <c:numFmt> element. Special case handler for category axes which
51
+ # don't always have a number format.
52
+ #
53
+ def write_cat_number_format(writer, cat_has_num_fmt)
54
+ return unless user_defined_num_fmt_set? || cat_has_num_fmt
55
+
56
+ writer.empty_tag('c:numFmt', num_fmt_attributes)
57
+ end
58
+
59
+ private
60
+
61
+ def user_defined_num_fmt_set?
62
+ @defaults && @num_format != @defaults[:num_format]
63
+ end
64
+
65
+ def source_linked
66
+ value = 1
67
+ value = 0 if user_defined_num_fmt_set?
68
+ value = 1 if @num_format_linked
69
+
70
+ value
71
+ end
72
+
73
+ def num_fmt_attributes
74
+ [
75
+ ['formatCode', @num_format],
76
+ ['sourceLinked', source_linked]
77
+ ]
78
+ end
79
+
80
+ def set_major_minor_gridlines(args)
41
81
  # Map major/minor_gridlines properties.
42
82
  [:major_gridlines, :minor_gridlines].each do |lines|
43
83
  if args[lines] && ptrue?(args[lines][:visible])
44
- instance_variable_set("@#{lines}", gridline_properties(args[lines]))
84
+ instance_variable_set("@#{lines}", Gridline.new(args[lines]))
45
85
  else
46
86
  instance_variable_set("@#{lines}", nil)
47
87
  end
48
88
  end
49
- @major_tick_mark = args[:major_tick_mark]
89
+ end
50
90
 
91
+ def set_position(args)
51
92
  # Only use the first letter of bottom, top, left or right.
52
93
  @position = args[:position]
53
94
  @position = @position.downcase[0, 1] if @position
95
+ end
54
96
 
97
+ def set_position_axis
55
98
  # Set the position for a category axis on or between the tick marks.
56
99
  if @position_axis
57
100
  if @position_axis == 'on_tick'
@@ -63,85 +106,15 @@ module Writexlsx
63
106
  @position_axis = nil
64
107
  end
65
108
  end
109
+ end
66
110
 
67
- # Set the font properties if present.
111
+ def set_font_properties(args)
68
112
  @num_font = @chart.convert_font_args(args[:num_font])
69
113
  @name_font = @chart.convert_font_args(args[:name_font])
70
-
71
- # Set the axis name layout.
72
- @layout = @chart.layout_properties(args[:name_layout], 1)
73
114
  end
74
115
 
75
- #
76
- # Write the <c:numberFormat> element. Note: It is assumed that if a user
77
- # defined number format is supplied (i.e., non-default) then the sourceLinked
78
- # attribute is 0. The user can override this if required.
79
- #
80
-
81
- def write_number_format(writer) # :nodoc:
82
- source_linked = 1
83
-
84
- # Check if a user defined number format has been set.
85
- if @defaults && @num_format != @defaults[:num_format]
86
- source_linked = 0
87
- end
88
-
89
- # User override of sourceLinked.
90
- if ptrue?(@num_format_linked)
91
- source_linked = 1
92
- end
93
-
94
- attributes = [
95
- ['formatCode', @num_format],
96
- ['sourceLinked', source_linked]
97
- ]
98
-
99
- writer.empty_tag('c:numFmt', attributes)
100
- end
101
-
102
- #
103
- # Write the <c:numFmt> element. Special case handler for category axes which
104
- # don't always have a number format.
105
- #
106
- def write_cat_number_format(writer, cat_has_num_fmt)
107
- source_linked = 1
108
- default_format = true
109
-
110
- # Check if a user defined number format has been set.
111
- if @defaults && @num_format != @defaults[:num_format]
112
- source_linked = 0
113
- default_format = false
114
- end
115
-
116
- # User override of linkedSource.
117
- if @num_format_linked
118
- source_linked = 1
119
- end
120
-
121
- # Skip if cat doesn't have a num format (unless it is non-default).
122
- if !cat_has_num_fmt && default_format
123
- return ''
124
- end
125
-
126
- attributes = [
127
- ['formatCode', @num_format],
128
- ['sourceLinked', source_linked]
129
- ]
130
-
131
- writer.empty_tag('c:numFmt', attributes)
132
- end
133
-
134
- #
135
- # Convert user defined gridline properties to the structure required internally.
136
- #
137
- def gridline_properties(args)
138
- # Set the visible property for the gridline.
139
- gridline = { :_visible => args[:visible] }
140
-
141
- # Set the line properties for the gridline.
142
- gridline[:_line] = @chart.line_properties(args[:line])
143
-
144
- gridline
116
+ def set_axis_name_layout(args)
117
+ @layout = @chart.layout_properties(args[:name_layout], 1)
145
118
  end
146
119
  end
147
120
  end
@@ -27,23 +27,8 @@ module Writexlsx
27
27
  @horiz_val_axis = 0
28
28
  @horiz_cat_axis = 1
29
29
  @show_crosses = false
30
-
31
30
  # Override and reset the default axis values.
32
- if @x_axis.defaults
33
- @x_axis.defaults[:major_gridlines] = { :visible => 1 }
34
- else
35
- @x_axis.defaults = { :major_gridlines => { :visible => 1 } }
36
- end
37
- if @y_axis.defaults
38
- @y_axis.defaults[:major_gridlines] = { :visible => 0 }
39
- else
40
- @y_axis.defaults = { :major_gridlines => { :visible => 0 } }
41
- end
42
-
43
- if @subtype == 'percent_stacked'
44
- @x_axis.defaults[:num_format] = '0%'
45
- end
46
-
31
+ axis_defaults_set
47
32
  set_x_axis
48
33
  set_y_axis
49
34
  end
@@ -68,11 +53,7 @@ module Writexlsx
68
53
  # Write the <c:barDir> element.
69
54
  #
70
55
  def write_bar_dir
71
- val = 'bar'
72
-
73
- attributes = [ ['val', val] ]
74
-
75
- @writer.empty_tag('c:barDir', attributes)
56
+ @writer.empty_tag('c:barDir', [ ['val', 'bar'] ])
76
57
  end
77
58
 
78
59
  #
@@ -82,6 +63,22 @@ module Writexlsx
82
63
  def write_err_dir(direction)
83
64
  # do nothing
84
65
  end
66
+
67
+ private
68
+
69
+ def axis_defaults_set
70
+ if @x_axis.defaults
71
+ @x_axis.defaults[:major_gridlines] = { :visible => 1 }
72
+ else
73
+ @x_axis.defaults = { :major_gridlines => { :visible => 1 } }
74
+ end
75
+ if @y_axis.defaults
76
+ @y_axis.defaults[:major_gridlines] = { :visible => 0 }
77
+ else
78
+ @y_axis.defaults = { :major_gridlines => { :visible => 0 } }
79
+ end
80
+ @x_axis.defaults[:num_format] = '0%' if @subtype == 'percent_stacked'
81
+ end
85
82
  end
86
83
  end
87
84
  end
@@ -12,7 +12,7 @@ module Writexlsx
12
12
 
13
13
  def merge_with_hash(params) # :nodoc:
14
14
  @name, @formula = @chart.process_names(params[:name], params[:name_formula])
15
- @data_id = @chart.get_data_id(@formula, params[:data])
15
+ @data_id = @chart.data_id(@formula, params[:data])
16
16
  @name_font = @chart.convert_font_args(params[:name_font])
17
17
  @layout = @chart.layout_properties(params[:layout], 1)
18
18
 
@@ -53,11 +53,7 @@ module Writexlsx
53
53
  # Write the <c:barDir> element.
54
54
  #
55
55
  def write_bar_dir
56
- val = 'col'
57
-
58
- attributes = [ ['val', val] ]
59
-
60
- @writer.empty_tag('c:barDir', attributes)
56
+ @writer.empty_tag('c:barDir', [ ['val', 'col'] ])
61
57
  end
62
58
 
63
59
  #
@@ -18,10 +18,11 @@ module Writexlsx
18
18
  class Chart
19
19
  class Line < self
20
20
  include Writexlsx::Utility
21
+ include Writexlsx::WriteDPtPoint
21
22
 
22
23
  def initialize(subtype)
23
24
  super(subtype)
24
- @default_marker = {:type => 'none'}
25
+ @default_marker = Marker.new(:type => 'none')
25
26
  @smooth_allowed = 1
26
27
  end
27
28
 
@@ -62,21 +63,6 @@ module Writexlsx
62
63
  write_axis_ids(params)
63
64
  end
64
65
  end
65
-
66
- #
67
- # Write an individual <c:dPt> element. Override the parent method to add
68
- # markers.
69
- #
70
- def write_d_pt_point(index, point)
71
- @writer.tag_elements('c:dPt') do
72
- # Write the c:idx element.
73
- write_idx(index)
74
- @writer.tag_elements('c:marker') do
75
- # Write the c:spPr element.
76
- write_sp_pr(point)
77
- end
78
- end
79
- end
80
66
  end
81
67
  end
82
68
  end
@@ -28,13 +28,12 @@ module Writexlsx
28
28
 
29
29
  def initialize(subtype)
30
30
  super(subtype)
31
- @vary_data_color = 1
32
31
  end
33
32
 
34
33
  #
35
34
  # Override the virtual superclass method with a chart specific method.
36
35
  #
37
- def write_chart_type(params = {})
36
+ def write_chart_type
38
37
  # Write the c:areaChart element.
39
38
  write_pie_chart
40
39
  end
@@ -63,7 +62,7 @@ module Writexlsx
63
62
  def write_plot_area
64
63
  @writer.tag_elements('c:plotArea') do
65
64
  # Write the c:layout element.
66
- write_layout(@plotarea[:_layout], 'plot')
65
+ write_layout(@plotarea.layout, 'plot')
67
66
  # Write the subclass chart type element.
68
67
  write_chart_type
69
68
  end
@@ -76,41 +75,32 @@ module Writexlsx
76
75
  #
77
76
  def write_legend
78
77
  position = @legend_position
79
- font = @legend_font
80
- overlay = 0
78
+ allowed = %w(right left top bottom)
81
79
  delete_series = @legend_delete_series || []
82
80
 
83
- if position =~ /^overlay_/
84
- position.sub!(/^overlay_/, '')
85
- overlay = 1
81
+ if @legend_position =~ /^overlay_/
82
+ position = @legend_position.sub(/^overlay_/, '')
83
+ overlay = true
84
+ else
85
+ position = @legend_position
86
+ overlay = false
86
87
  end
87
88
 
88
- allowed = {
89
- 'right' => 'r',
90
- 'left' => 'l',
91
- 'top' => 't',
92
- 'bottom' => 'b'
93
- }
94
-
95
89
  return if position == 'none'
96
- return unless allowed.has_key?(position)
97
-
98
- position = allowed[position]
90
+ return unless allowed.include?(position)
99
91
 
100
92
  @writer.tag_elements('c:legend') do
101
93
  # Write the c:legendPos element.
102
- write_legend_pos(position)
94
+ write_legend_pos(position[0])
103
95
  # Remove series labels from the legend.
104
- delete_series.each do |index|
105
- # Write the c:legendEntry element.
106
- write_legend_entry(index)
107
- end
96
+ # Write the c:legendEntry element.
97
+ delete_series.each { |index| write_legend_entry(index) }
108
98
  # Write the c:layout element.
109
99
  write_layout(@legend_layout, 'legend')
110
100
  # Write the c:overlay element.
111
- write_overlay if overlay != 0
101
+ write_overlay if overlay
112
102
  # Write the c:txPr element. Over-ridden.
113
- write_tx_pr_legend(0, font)
103
+ write_tx_pr_legend(0, @legend_font)
114
104
  end
115
105
  end
116
106
 
@@ -149,11 +139,7 @@ module Writexlsx
149
139
  # Write the <a:pPr> element for legends.
150
140
  #
151
141
  def write_a_p_pr_legend(font)
152
- rtl = 0
153
-
154
- attributes = [ ['rtl', rtl] ]
155
-
156
- @writer.tag_elements('a:pPr', attributes) do
142
+ @writer.tag_elements('a:pPr', [ ['rtl', 0] ]) do
157
143
  # Write the a:defRPr element.
158
144
  write_a_def_rpr(font)
159
145
  end
@@ -163,22 +149,14 @@ module Writexlsx
163
149
  # Write the <c:varyColors> element.
164
150
  #
165
151
  def write_vary_colors
166
- val = 1
167
-
168
- attributes = [ ['val', val] ]
169
-
170
- @writer.empty_tag('c:varyColors', attributes)
152
+ @writer.empty_tag('c:varyColors', [ ['val', 1] ])
171
153
  end
172
154
 
173
155
  #
174
156
  # Write the <c:firstSliceAng> element.
175
157
  #
176
158
  def write_first_slice_ang
177
- val = 0
178
-
179
- attributes = [ ['val', val] ]
180
-
181
- @writer.empty_tag('c:firstSliceAng', attributes)
159
+ @writer.empty_tag('c:firstSliceAng', [ ['val', 0] ])
182
160
  end
183
161
  end
184
162
  end
@@ -32,7 +32,7 @@ module Writexlsx
32
32
  super(subtype)
33
33
  @subtype = subtype || 'marker'
34
34
  if @subtype == 'marker'
35
- @default_marker = { :type => 'none' }
35
+ @default_marker = Marker.new(:type => 'none')
36
36
  end
37
37
 
38
38
  # Override and reset the default axis values.
@@ -80,10 +80,7 @@ module Writexlsx
80
80
  #
81
81
  def write_radar_style
82
82
  val = 'marker'
83
-
84
- if @subtype == 'filled'
85
- val = 'filled'
86
- end
83
+ val = 'filled' if @subtype == 'filled'
87
84
 
88
85
  attributes = [ ['val', val] ]
89
86
 
@@ -34,6 +34,7 @@ module Writexlsx
34
34
  #
35
35
  class Scatter < self
36
36
  include Writexlsx::Utility
37
+ include Writexlsx::WriteDPtPoint
37
38
 
38
39
  def initialize(subtype)
39
40
  super(subtype)
@@ -64,15 +65,8 @@ module Writexlsx
64
65
  return if series.empty?
65
66
 
66
67
  style = 'lineMarker'
67
- subtype = @subtype
68
-
69
68
  # Set the user defined chart subtype
70
- case subtype
71
- when 'marker_only', 'straight_with_markers', 'straight'
72
- style = 'lineMarker'
73
- when 'smooth_with_markers', 'smooth'
74
- style = 'smoothMarker'
75
- end
69
+ style = 'smoothMarker' if ['smooth_with_markers', 'smooth'].include?(@subtype)
76
70
 
77
71
  # Add default formatting to the series data.
78
72
  modify_series_formatting
@@ -82,10 +76,8 @@ module Writexlsx
82
76
  write_scatter_style(style)
83
77
  # Write the series elements.
84
78
  series.each {|s| write_series(s)}
85
-
86
79
  # Write the c:marker element.
87
80
  write_marker_value
88
-
89
81
  # Write the c:axId elements
90
82
  write_axis_ids(params)
91
83
  end
@@ -141,7 +133,7 @@ module Writexlsx
141
133
  def write_plot_area
142
134
  @writer.tag_elements('c:plotArea') do
143
135
  # Write the c:layout element.
144
- write_layout(@plotarea[:_layout], 'plot')
136
+ write_layout(@plotarea.layout, 'plot')
145
137
 
146
138
  # Write the subclass chart type elements for primary and secondary axes
147
139
  write_chart_type(:primary_axes => 1)
@@ -227,9 +219,7 @@ module Writexlsx
227
219
  # Write the <c:scatterStyle> element.
228
220
  #
229
221
  def write_scatter_style(val)
230
- attributes = [ ['val', val] ]
231
-
232
- @writer.empty_tag('c:scatterStyle', attributes)
222
+ @writer.empty_tag('c:scatterStyle', [ ['val', val] ])
233
223
  end
234
224
 
235
225
  #
@@ -237,44 +227,46 @@ module Writexlsx
237
227
  # specified by the user.
238
228
  #
239
229
  def modify_series_formatting
240
- subtype = @subtype
241
-
242
230
  # The default scatter style "markers only" requires a line type
243
- if subtype == 'marker_only'
231
+ if @subtype == 'marker_only'
244
232
  # Go through each series and define default values.
245
233
  @series.each do |series|
246
234
  # Set a line type unless there is already a user defined type.
247
- if series.line[:_defined] == 0
248
- series.line = { :width => 2.25, :none => 1, :_defined => 1 }
235
+ unless series.line_defined?
236
+ series.line = line_properties(:width => 2.25, :none => 1, :_defined => 1)
249
237
  end
250
238
  end
251
239
  end
252
240
 
253
241
  # Turn markers off for subtypes that don't have them
254
- unless subtype =~ /marker/
242
+ unless @subtype =~ /marker/
255
243
  # Go through each series and define default values.
256
244
  @series.each do |series|
257
245
  # Set a marker type unless there is already a user defined type.
258
246
  unless ptrue?(series.marker)
259
- series.marker = { :type => 'none', :_defined => 1 }
247
+ series.marker = Marker.new(:type => 'none', :_defined => 1)
260
248
  end
261
249
  end
262
250
  end
263
251
  end
264
252
 
265
253
  #
266
- # Write an individual <c:dPt> element. Override the parent method to add
267
- # markers.
254
+ # Write the <c:valAx> element.
255
+ # This is for the second valAx in scatter plots.
268
256
  #
269
- def write_d_pt_point(index, point)
270
- @writer.tag_elements('c:dPt') do
271
- # Write the c:idx element.
272
- write_idx(index)
273
- @writer.tag_elements('c:marker') do
274
- # Write the c:spPr element.
275
- write_sp_pr(point)
276
- end
277
- end
257
+ # Usually the X axis.
258
+ #
259
+ def write_cat_val_axis(params) # :nodoc:
260
+ axis_ids = params[:axis_ids]
261
+ return unless axis_ids && !axis_ids.empty?
262
+
263
+ x_axis = params[:y_axis]
264
+ y_axis = params[:x_axis]
265
+ axis_ids_0 = axis_ids[1]
266
+ axis_ids_1 = axis_ids[0]
267
+ position = y_axis.position || params[:position] || @val_axis_position
268
+
269
+ write_val_axis_base(x_axis, y_axis, axis_ids_0, axis_ids_1, position)
278
270
  end
279
271
  end
280
272
  end