write_xlsx 0.81.1 → 0.83.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +8 -0
  3. data/Changes +20 -0
  4. data/README.md +3 -2
  5. data/examples/chart_combined.rb +107 -0
  6. data/examples/chart_data_table.rb +1 -1
  7. data/examples/chart_pareto.rb +82 -0
  8. data/lib/write_xlsx/chart.rb +115 -42
  9. data/lib/write_xlsx/chart/axis.rb +5 -1
  10. data/lib/write_xlsx/chart/bar.rb +13 -0
  11. data/lib/write_xlsx/chart/pie.rb +7 -0
  12. data/lib/write_xlsx/chart/scatter.rb +25 -57
  13. data/lib/write_xlsx/format.rb +40 -0
  14. data/lib/write_xlsx/package/app.rb +39 -1
  15. data/lib/write_xlsx/package/comments.rb +1 -5
  16. data/lib/write_xlsx/package/content_types.rb +48 -13
  17. data/lib/write_xlsx/package/core.rb +14 -12
  18. data/lib/write_xlsx/package/packager.rb +17 -41
  19. data/lib/write_xlsx/package/styles.rb +215 -256
  20. data/lib/write_xlsx/package/table.rb +5 -7
  21. data/lib/write_xlsx/package/xml_writer_simple.rb +2 -0
  22. data/lib/write_xlsx/sheets.rb +2 -2
  23. data/lib/write_xlsx/utility.rb +17 -2
  24. data/lib/write_xlsx/version.rb +1 -1
  25. data/lib/write_xlsx/workbook.rb +44 -2
  26. data/lib/write_xlsx/worksheet.rb +26 -17
  27. data/lib/write_xlsx/worksheet/page_setup.rb +12 -6
  28. data/test/chart/test_write_style.rb +2 -2
  29. data/test/helper.rb +3 -0
  30. data/test/package/app/test_app01.rb +1 -1
  31. data/test/package/app/test_app02.rb +1 -1
  32. data/test/package/app/test_app03.rb +1 -1
  33. data/test/package/content_types/test_content_types.rb +1 -1
  34. data/test/package/content_types/test_write_default.rb +1 -1
  35. data/test/package/content_types/test_write_override.rb +1 -1
  36. data/test/perl_output/chart_combined.xlsx +0 -0
  37. data/test/perl_output/chart_pareto.xlsx +0 -0
  38. data/test/regression/test_button07.rb +5 -2
  39. data/test/regression/test_button13.rb +34 -0
  40. data/test/regression/test_button14.rb +31 -0
  41. data/test/regression/test_chart_column11.rb +45 -0
  42. data/test/regression/test_chart_column12.rb +45 -0
  43. data/test/regression/test_chart_combined01.rb +37 -0
  44. data/test/regression/test_chart_combined02.rb +43 -0
  45. data/test/regression/test_chart_combined03.rb +45 -0
  46. data/test/regression/test_chart_combined04.rb +47 -0
  47. data/test/regression/test_chart_combined05.rb +49 -0
  48. data/test/regression/test_chart_combined06.rb +49 -0
  49. data/test/regression/test_chart_combined07.rb +53 -0
  50. data/test/regression/test_chart_combined08.rb +65 -0
  51. data/test/regression/test_chart_data_labels24.rb +50 -0
  52. data/test/regression/test_chart_date05.rb +57 -0
  53. data/test/regression/test_chart_format20.rb +55 -0
  54. data/test/regression/test_format11.rb +28 -0
  55. data/test/regression/test_format12.rb +41 -0
  56. data/test/regression/test_landscape01.rb +27 -0
  57. data/test/regression/test_quote_name04.rb +40 -0
  58. data/test/regression/test_set_start_page01.rb +4 -7
  59. data/test/regression/test_set_start_page02.rb +33 -0
  60. data/test/regression/test_set_start_page03.rb +33 -0
  61. data/test/regression/test_table17.rb +70 -0
  62. data/test/regression/xlsx_files/chart_column11.xlsx +0 -0
  63. data/test/regression/xlsx_files/chart_column12.xlsx +0 -0
  64. data/test/regression/xlsx_files/chart_combined01.xlsx +0 -0
  65. data/test/regression/xlsx_files/chart_combined02.xlsx +0 -0
  66. data/test/regression/xlsx_files/chart_combined03.xlsx +0 -0
  67. data/test/regression/xlsx_files/chart_combined04.xlsx +0 -0
  68. data/test/regression/xlsx_files/chart_combined05.xlsx +0 -0
  69. data/test/regression/xlsx_files/chart_combined06.xlsx +0 -0
  70. data/test/regression/xlsx_files/chart_combined07.xlsx +0 -0
  71. data/test/regression/xlsx_files/chart_combined08.xlsx +0 -0
  72. data/test/regression/xlsx_files/chart_date05.xlsx +0 -0
  73. data/test/regression/xlsx_files/chart_format20.xlsx +0 -0
  74. data/test/regression/xlsx_files/format11.xlsx +0 -0
  75. data/test/regression/xlsx_files/format12.xlsx +0 -0
  76. data/test/regression/xlsx_files/landscape01.xlsx +0 -0
  77. data/test/regression/xlsx_files/quote_name04.xlsx +0 -0
  78. data/test/regression/xlsx_files/set_start_page01.xlsx +0 -0
  79. data/test/regression/xlsx_files/set_start_page02.xlsx +0 -0
  80. data/test/regression/xlsx_files/set_start_page03.xlsx +0 -0
  81. data/test/regression/xlsx_files/table17.xlsx +0 -0
  82. data/test/test_example_match.rb +172 -0
  83. data/write_xlsx.gemspec +1 -0
  84. metadata +106 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a47873b65edc4837593147baf4b03c8b7a0aca4c
4
- data.tar.gz: 3b18363eaa6f1f1ac48a15c28dd39285202369bf
3
+ metadata.gz: 055ac6da5fa4ffabd709a61116271eb670a1a946
4
+ data.tar.gz: da5f1f06369023fec4603457d29cd60b1638e317
5
5
  SHA512:
6
- metadata.gz: 30ff5c82ce5ede263bee14816a0b52463f60a5336641176dc6bca5669d244996790abbac68491ff1a028b11fa1466a87d86de3ef355e82307832b93cc5cddb5f
7
- data.tar.gz: 48d97134f94f572573f1981da0c900a4ce1ac8dea0cf7cba35ccacdd8b27b30e06f61a3b86dae90f54b16999b0014bfa50505a36579ffa7a754099fa3f22e660
6
+ metadata.gz: 8b09a5444cce89ac0b182f9a82d37ade0e41e5a081cd0c885dcb288e8b6c67a6424ce44dc69e9c6e4e302d4271fb29b9997365ad379629103af99f55fee115ad
7
+ data.tar.gz: cfd9852383a7cf97b141ab4ec6a1d5eac376cb05c3e6ecbb64a48e3c799bf513c043273e4a26c8890abb36331278e5705ec5abe34806102ceb615ff58a148bf5
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.0
4
+ - 2.1.5
5
+ - 2.1.2
6
+ - 2.1.1
7
+ - 2.0.0
8
+ - 1.9.3
data/Changes CHANGED
@@ -1,4 +1,24 @@
1
1
  Change history of write_xlsx rubygem.
2
+ 2015-04-12 v0.83.0
3
+ Added option to combine two different chart types. For example to
4
+ create a Pareto chart.
5
+
6
+ 2015-04-12 v0.82.0
7
+ Added extra documentation on how to handle VBA macros and added
8
+ automatic and manual setting of workbook and worksheet VBA codenames.
9
+
10
+ Fix for set_start_page() for values > 1.
11
+
12
+ Fix to copy user defined chart properties, such as trendlines,
13
+ so that they aren't overwritten.
14
+
15
+ Added column funtion_value option to add_table to allow
16
+ function value to be set.
17
+
18
+ Allow explicit text categories in charts.
19
+
20
+ Fix for column/bar gap/overlap on y2 axis.
21
+
2
22
  2014-12-28 v0.81.1
3
23
  use test-unit gem instead of test/unit.
4
24
 
data/README.md CHANGED
@@ -1,10 +1,11 @@
1
1
  # write_xlsx
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/write_xlsx.png)](http://badge.fury.io/rb/write_xlsx)
4
+ [![Build Status](https://travis-ci.org/cxn03651/write_xlsx.svg?branch=master)](https://travis-ci.org/cxn03651/write_xlsx)
4
5
 
5
6
  gem to create a new file in the Excel 2007+ XLSX format, and you can use the
6
7
  same interface as writeexcel gem. write_xlsx is converted from Perl's module
7
- [Excel::Writer::XLSX-0.81](https://github.com/jmcnamara/excel-writer-xlsx) .
8
+ [Excel::Writer::XLSX-0.83](https://github.com/jmcnamara/excel-writer-xlsx) .
8
9
 
9
10
  ## Description
10
11
 
@@ -84,7 +85,7 @@ the first worksheet in an Excel XML spreadsheet called ruby.xlsx:
84
85
  Original Perl module was written by John McNamara(jmcnamara@cpan.org).
85
86
 
86
87
  Converted to ruby by Hideo NAKAMURA(cxn03651@msj.biglobe.ne.jp)
87
- Copyright (c) 2012-2014 Hideo NAKAMURA.
88
+ Copyright (c) 2012-2015 Hideo NAKAMURA.
88
89
 
89
90
  See LICENSE.txt for further details.
90
91
 
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+
4
+ #######################################################################
5
+ #
6
+ # An example of a Combined chart in WriteXLSX.
7
+ #
8
+ # reverse ('(c)'), March 2015, John McNamara, jmcnamara@cpan.org
9
+ # convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
10
+ #
11
+
12
+ require 'write_xlsx'
13
+
14
+ workbook = WriteXLSX.new('chart_combined.xlsx')
15
+ worksheet = workbook.add_worksheet
16
+ bold = workbook.add_format(:bold => 1)
17
+
18
+ # Add the worksheet data that the charts will refer to.
19
+ headings = ['Number', 'Batch 1', 'Batch 2']
20
+ data = [
21
+ [ 2, 3, 4, 5, 6, 7],
22
+ [10, 40, 50, 20, 10, 50],
23
+ [30, 60, 70, 50, 40, 30]
24
+ ]
25
+
26
+ worksheet.write('A1', headings, bold)
27
+ worksheet.write('A2', data)
28
+
29
+ #
30
+ # In the first example we will create a combined column and line chart.
31
+ # They will share the same X and Y axes.
32
+ #
33
+
34
+ # Create a new column chart. This will use this as the primary chart.
35
+ column_chart1 = workbook.add_chart(:type => 'column', :embedded => 1)
36
+
37
+ # Configure the data series for the primary chart.
38
+ column_chart1.add_series(
39
+ :name => '=Sheet1!$B$1',
40
+ :categories => '=Sheet1!$A$2:$A$7',
41
+ :values => '=Sheet1!$B$2:$B$7'
42
+ )
43
+
44
+ # Create a new column chart. This will use this as the secondary chart.
45
+ line_chart1 = workbook.add_chart(:type => 'line', :embedded => 1)
46
+
47
+ # Configure the data series for the secondary chart.
48
+ line_chart1.add_series(
49
+ :name => '=Sheet1!$C$1',
50
+ :categories => '=Sheet1!$A$2:$A$7',
51
+ :values => '=Sheet1!$C$2:$C$7'
52
+ )
53
+
54
+ # Combine the charts.
55
+ column_chart1.combine(line_chart1)
56
+
57
+ # Add a chart title and some axis labels. Note, this is done via the
58
+ # primary chart.
59
+ column_chart1.set_title(:name => 'Combined chart - same Y axis')
60
+ column_chart1.set_x_axis(:name => 'Test number')
61
+ column_chart1.set_y_axis(:name => 'Sample length (mm)')
62
+
63
+
64
+ # Insert the chart into the worksheet
65
+ worksheet.insert_chart('E2', column_chart1)
66
+
67
+ #
68
+ # In the second example we will create a similar combined column and line
69
+ # chart except that the secondary chart will have a secondary Y axis.
70
+ #
71
+
72
+ # Create a new column chart. This will use this as the primary chart.
73
+ column_chart2 = workbook.add_chart(:type => 'column', :embedded => 1)
74
+
75
+ # Configure the data series for the primary chart.
76
+ column_chart2.add_series(
77
+ :name => '=Sheet1!$B$1',
78
+ :categories => '=Sheet1!$A$2:$A$7',
79
+ :values => '=Sheet1!$B$2:$B$7'
80
+ )
81
+
82
+ # Create a new column chart. This will use this as the secondary chart.
83
+ line_chart2 = workbook.add_chart(:type => 'line', :embedded => 1)
84
+
85
+ # Configure the data series for the secondary chart. We also set a
86
+ # secondary Y axis via (y2_axis). This is the only difference between
87
+ # this and the first example, apart from the axis label below.
88
+ line_chart2.add_series(
89
+ :name => '=Sheet1!$C$1',
90
+ :categories => '=Sheet1!$A$2:$A$7',
91
+ :values => '=Sheet1!$C$2:$C$7',
92
+ :y2_axis => 1
93
+ )
94
+
95
+ # Combine the charts.
96
+ column_chart2.combine(line_chart2)
97
+
98
+ # Add a chart title and some axis labels.
99
+ column_chart2.set_title(:name => 'Combine chart - secondary Y axis')
100
+ column_chart2.set_x_axis(:name => 'Test number')
101
+ column_chart2.set_y_axis(:name => 'Sample length (mm)')
102
+ column_chart2.set_y2_axis(:name => 'Target length (mm)')
103
+
104
+ # Insert the chart into the worksheet
105
+ worksheet.insert_chart('E18', column_chart2)
106
+
107
+ workbook.close
@@ -3,7 +3,7 @@
3
3
 
4
4
  #######################################################################
5
5
  #
6
- # A demo of an Column chart with a data table on the X-axis using
6
+ # A demo of a Column chart with a data table on the X-axis using
7
7
  # WriteXLSX.
8
8
  #
9
9
  # reverse ('(c)'), December 2012, John McNamara, jmcnamara@cpan.org
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+
4
+ #######################################################################
5
+ #
6
+ # A demo of a Pareto chart in Excel::Writer::XLSX.
7
+ #
8
+ # reverse ('(c)'), March 2015, John McNamara, jmcnamara@cpan.org
9
+ # convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
10
+ #
11
+
12
+ require 'write_xlsx'
13
+
14
+ workbook = WriteXLSX.new('chart_pareto.xlsx')
15
+ worksheet = workbook.add_worksheet
16
+
17
+ # Formats used in the workbook.
18
+ bold = workbook.add_format(:bold => 1)
19
+ percent_format = workbook.add_format(:num_format => '0.0%')
20
+
21
+ # Widen the columns for visibility.
22
+ worksheet.set_column('A:A', 15)
23
+ worksheet.set_column('B:C', 10)
24
+
25
+ # Add the worksheet data that the charts will refer to.
26
+ headings = ['Reason', 'Number', 'Percentage']
27
+
28
+ reasons = [
29
+ 'Traffic', 'Child care', 'Public Transport', 'Weather',
30
+ 'Overslept', 'Emergency'
31
+ ]
32
+
33
+ numbers = [ 60, 40, 20, 15, 10, 5]
34
+ percents = [0.44, 0.667, 0.8, 0.9, 0.967, 1]
35
+
36
+ worksheet.write_row('A1', headings, bold)
37
+ worksheet.write_col('A2', reasons)
38
+ worksheet.write_col('B2', numbers)
39
+ worksheet.write_col('C2', percents, percent_format)
40
+
41
+ # Create a new column chart. This will be the primary chart.
42
+ column_chart = workbook.add_chart(:type => 'column', :embedded => 1)
43
+
44
+ # Add a series
45
+ column_chart.add_series(
46
+ :categories => 'Sheet1!$A$2:$A$7',
47
+ :values => 'Sheet1!$B$2:$B$7'
48
+ )
49
+
50
+ # Add a chart title.
51
+ column_chart.set_title(:name => 'Reasons for lateness')
52
+
53
+ # Turn off the chart legend.
54
+ column_chart.set_legend(:position => 'none')
55
+
56
+ # Set the title and scale of the Y axes. Note, the secondary axis is set from
57
+ # the primary chart.
58
+ column_chart.set_y_axis(
59
+ :name => 'Respondents (number)',
60
+ :min => 0,
61
+ :max => 120
62
+ )
63
+ column_chart.set_y2_axis(:max => 1)
64
+
65
+ # Create a new line chart. This will be the secondary chart.
66
+ line_chart = workbook.add_chart(:type => 'line', :embedded => 1)
67
+
68
+ # Add a series, on the secondary axis.
69
+ line_chart.add_series(
70
+ :categories => '=Sheet1!$A$2:$A$7',
71
+ :values => '=Sheet1!$C$2:$C$7',
72
+ :marker => {:type => 'automatic'},
73
+ :y2_axis => 1
74
+ )
75
+
76
+ # Combine the charts.
77
+ column_chart.combine(line_chart)
78
+
79
+ # Insert the chart into the worksheet.
80
+ worksheet.insert_chart('F2', column_chart)
81
+
82
+ workbook.close
@@ -141,7 +141,11 @@ class Chart
141
141
  attr_reader :embedded, :formula_ids, :formula_data # :nodoc:
142
142
  attr_reader :x_scale, :y_scale, :x_offset, :y_offset # :nodoc:
143
143
  attr_reader :width, :height # :nodoc:
144
- attr_reader :label_positions, :label_position_default
144
+ attr_reader :label_positions, :label_position_default, :combined # :nodoc:
145
+ attr_writer :date_category, :already_inserted
146
+ attr_writer :series_index
147
+ attr_writer :writer
148
+ attr_reader :x2_axis, :y2_axis, :axis2_ids
145
149
 
146
150
  #
147
151
  # Factory method for returning chart objects based on their class type.
@@ -185,7 +189,7 @@ def initialize(subtype) # :nodoc:
185
189
  @sheet_type = 0x0200
186
190
  @series = []
187
191
  @embedded = 0
188
- @id = ''
192
+ @id = -1
189
193
  @series_index = 0
190
194
  @style_id = 2
191
195
  @formula_ids = {}
@@ -197,6 +201,8 @@ def initialize(subtype) # :nodoc:
197
201
  @name = ''
198
202
  @table = nil
199
203
  set_default_properties
204
+ @combined = nil
205
+ @is_secondary = false
200
206
  end
201
207
 
202
208
  def set_xml_writer(filename) # :nodoc:
@@ -245,6 +251,11 @@ def add_series(params)
245
251
  x2_axis = params[:x2_axis]
246
252
  y2_axis = params[:y2_axis]
247
253
 
254
+ # Store secondary status for combined charts.
255
+ if ptrue?(x2_axis) || ptrue?(y2_axis)
256
+ @is_secondary = true
257
+ end
258
+
248
259
  # Set the gap and overlap for Bar/Column charts.
249
260
  if params[:gap]
250
261
  if ptrue?(y2_axis)
@@ -342,7 +353,7 @@ def set_chartarea(params)
342
353
  # Set on of the 42 built-in Excel chart styles. The default style is 2.
343
354
  #
344
355
  def set_style(style_id = 2)
345
- style_id = 2 if style_id < 0 || style_id > 42
356
+ style_id = 2 if style_id < 0 || style_id > 48
346
357
  @style_id = style_id
347
358
  end
348
359
 
@@ -423,6 +434,13 @@ def set_high_low_lines(params = {})
423
434
  @hi_low_lines = Chartline.new(params)
424
435
  end
425
436
 
437
+ #
438
+ # Add another chart to create a combined chart.
439
+ #
440
+ def combine(chart)
441
+ @combined = chart
442
+ end
443
+
426
444
  #
427
445
  # Setup the default configuration data for an embedded chart.
428
446
  #
@@ -518,7 +536,12 @@ def params_to_font(params)
518
536
  #
519
537
  def process_names(name = nil, name_formula = nil) # :nodoc:
520
538
  # Name looks like a formula, use it to set name_formula.
521
- if name && name =~ /^=[^!]+!\$/
539
+ if name.respond_to?(:to_ary)
540
+ cell = xl_rowcol_to_cell(name[1], name[2], 1, 1)
541
+ name_formula = "#{quote_sheetname(name[0])}!#{cell}"
542
+ name = ''
543
+ elsif
544
+ name && name =~ /^=[^!]+!\$/
522
545
  name_formula = name
523
546
  name = ''
524
547
  end
@@ -556,6 +579,14 @@ def data_id(full_formula, data) # :nodoc:
556
579
  id
557
580
  end
558
581
 
582
+ def already_inserted?
583
+ @already_inserted
584
+ end
585
+
586
+ def is_secondary?
587
+ @is_secondary
588
+ end
589
+
559
590
  private
560
591
 
561
592
  def axis_setup
@@ -663,11 +694,11 @@ def add_axis_ids(params) # :nodoc:
663
694
  end
664
695
 
665
696
  def ids
666
- chart_id = 1 + @id
697
+ chart_id = 5001 + @id
667
698
  axis_count = 1 + @axis2_ids.size + @axis_ids.size
668
699
 
669
- id1 = sprintf('5%03d%04d', chart_id, axis_count)
670
- id2 = sprintf('5%03d%04d', chart_id, axis_count + 1)
700
+ id1 = sprintf('%04d%04d', chart_id, axis_count)
701
+ id2 = sprintf('%04d%04d', chart_id, axis_count + 1)
671
702
 
672
703
  [id1, id2]
673
704
  end
@@ -832,6 +863,7 @@ def write_disp_blanks_as
832
863
  # Write the <c:plotArea> element.
833
864
  #
834
865
  def write_plot_area # :nodoc:
866
+ second_chart = @combined
835
867
  @writer.tag_elements('c:plotArea') do
836
868
  # Write the c:layout element.
837
869
  write_layout(@plotarea.layout, 'plot')
@@ -839,6 +871,27 @@ def write_plot_area # :nodoc:
839
871
  write_chart_type(:primary_axes => 1)
840
872
  write_chart_type(:primary_axes => 0)
841
873
 
874
+ # Configure a combined chart if present.
875
+ if second_chart
876
+
877
+ # Secondary axis has unique id otherwise use same as primary.
878
+ if second_chart.is_secondary?
879
+ second_chart.id = 1000 + @id
880
+ else
881
+ second_chart.id = @id
882
+ end
883
+
884
+ # Share the same writer for writing.
885
+ second_chart.writer = @writer
886
+
887
+ # Share series index with primary chart.
888
+ second_chart.series_index = @series_index
889
+
890
+ # Write the subclass chart type elements for combined chart.
891
+ second_chart.write_chart_type(:primary_axes => 1)
892
+ second_chart.write_chart_type(:primary_axes => 0)
893
+ end
894
+
842
895
  # Write the category and value elements for the primary axes.
843
896
  params = {
844
897
  :x_axis => @x_axis,
@@ -852,7 +905,7 @@ def write_plot_area # :nodoc:
852
905
  write_cat_axis(params)
853
906
  end
854
907
 
855
- write_val_axis(params)
908
+ write_val_axis(@x_axis, @y_axis, @axis_ids)
856
909
 
857
910
  # Write the category and value elements for the secondary axes.
858
911
  params = {
@@ -861,7 +914,23 @@ def write_plot_area # :nodoc:
861
914
  :axis_ids => @axis2_ids
862
915
  }
863
916
 
864
- write_val_axis(params)
917
+ write_val_axis(@x2_axis, @y2_axis, @axis2_ids)
918
+
919
+ # Write the secondary axis for the secondary chart.
920
+ if second_chart && second_chart.is_secondary?
921
+
922
+ params = {
923
+ :x_axis => second_chart.x2_axis,
924
+ :y_axis => second_chart.y2_axis,
925
+ :axis_ids => second_chart.axis2_ids
926
+ }
927
+
928
+ second_chart.write_val_axis(
929
+ second_chart.x2_axis,
930
+ second_chart.y2_axis,
931
+ second_chart.axis2_ids
932
+ )
933
+ end
865
934
 
866
935
  if @date_category
867
936
  write_date_axis(params)
@@ -937,30 +1006,10 @@ def write_series(series) # :nodoc:
937
1006
  # Write the <c:ser> element.
938
1007
  #
939
1008
  def write_ser(series) # :nodoc:
940
- index = @series_index
941
- @series_index += 1
942
-
943
1009
  @writer.tag_elements('c:ser') do
944
- # Write the c:idx element.
945
- write_idx(index)
946
- # Write the c:order element.
947
- write_order(index)
948
- # Write the series name.
949
- write_series_name(series)
950
- # Write the c:spPr element.
951
- write_sp_pr(series)
952
- # Write the c:marker element.
953
- write_marker(series.marker)
954
- # Write the c:invertIfNegative element.
955
- write_c_invert_if_negative(series.invert_if_negative)
956
- # Write the c:dPt element.
957
- write_d_pt(series.points)
958
- # Write the c:dLbls element.
959
- write_d_lbls(series.labels)
960
- # Write the c:trendline element.
961
- write_trendline(series.trendline)
962
- # Write the c:errBars element.
963
- write_error_bars(series.error_bars)
1010
+ write_ser_base(series) do
1011
+ write_c_invert_if_negative(series.invert_if_negative)
1012
+ end
964
1013
  # Write the c:cat element.
965
1014
  write_cat(series)
966
1015
  # Write the c:val element.
@@ -968,6 +1017,31 @@ def write_ser(series) # :nodoc:
968
1017
  # Write the c:smooth element.
969
1018
  write_c_smooth(series.smooth) if ptrue?(@smooth_allowed)
970
1019
  end
1020
+ @series_index += 1
1021
+ end
1022
+
1023
+ def write_ser_base(series)
1024
+ # Write the c:idx element.
1025
+ write_idx(@series_index)
1026
+ # Write the c:order element.
1027
+ write_order(@series_index)
1028
+ # Write the series name.
1029
+ write_series_name(series)
1030
+ # Write the c:spPr element.
1031
+ write_sp_pr(series)
1032
+ # Write the c:marker element.
1033
+ write_marker(series.marker)
1034
+
1035
+ yield if block_given?
1036
+
1037
+ # Write the c:dPt element.
1038
+ write_d_pt(series.points)
1039
+ # Write the c:dLbls element.
1040
+ write_d_lbls(series.labels)
1041
+ # Write the c:trendline element.
1042
+ write_trendline(series.trendline)
1043
+ # Write the c:errBars element.
1044
+ write_error_bars(series.error_bars)
971
1045
  end
972
1046
 
973
1047
  #
@@ -1177,7 +1251,7 @@ def write_cat_axis(params) # :nodoc:
1177
1251
  write_crossing(y_axis.crossing)
1178
1252
  end
1179
1253
  # Write the c:auto element.
1180
- write_auto(1)
1254
+ write_auto(1) unless x_axis.text_axis
1181
1255
  # Write the c:labelAlign element.
1182
1256
  write_label_align('ctr')
1183
1257
  # Write the c:labelOffset element.
@@ -1190,18 +1264,17 @@ def write_cat_axis(params) # :nodoc:
1190
1264
  #
1191
1265
  # Write the <c:valAx> element. Usually the Y axis.
1192
1266
  #
1193
- def write_val_axis(params)
1194
- axis_ids = params[:axis_ids]
1267
+ def write_val_axis(x_axis, y_axis, axis_ids, position = nil)
1195
1268
  return unless axis_ids && !axis_ids.empty?
1196
1269
 
1197
- x_axis = params[:x_axis]
1198
- y_axis = params[:y_axis]
1199
- axis_ids_0 = axis_ids[0]
1200
- axis_ids_1 = axis_ids[1]
1201
- position = y_axis.position || params[:position] || @val_axis_position
1202
-
1203
- write_val_axis_base(x_axis, y_axis, axis_ids_0, axis_ids_1, position)
1270
+ write_val_axis_base(
1271
+ x_axis, y_axis,
1272
+ axis_ids[0],
1273
+ axis_ids[1],
1274
+ y_axis.position || position || @val_axis_position
1275
+ )
1204
1276
  end
1277
+ public :write_val_axis
1205
1278
 
1206
1279
  def write_val_axis_base(x_axis, y_axis, axis_ids_0, axis_ids_1, position) # :nodoc:
1207
1280
  @writer.tag_elements('c:valAx') do