write_xlsx 0.90.0 → 0.97.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/Changes +37 -0
  3. data/README.md +1 -1
  4. data/examples/a_simple.rb +1 -6
  5. data/examples/conditional_format.rb +73 -46
  6. data/examples/demo.rb +1 -7
  7. data/examples/hyperlink1.rb +4 -11
  8. data/lib/write_xlsx/chart.rb +81 -205
  9. data/lib/write_xlsx/chart/axis.rb +2 -2
  10. data/lib/write_xlsx/chart/caption.rb +3 -1
  11. data/lib/write_xlsx/chart/pie.rb +2 -0
  12. data/lib/write_xlsx/chart/series.rb +11 -7
  13. data/lib/write_xlsx/format.rb +15 -11
  14. data/lib/write_xlsx/package/conditional_format.rb +351 -38
  15. data/lib/write_xlsx/package/content_types.rb +10 -0
  16. data/lib/write_xlsx/package/custom.rb +125 -0
  17. data/lib/write_xlsx/package/packager.rb +26 -0
  18. data/lib/write_xlsx/package/styles.rb +53 -21
  19. data/lib/write_xlsx/package/table.rb +11 -4
  20. data/lib/write_xlsx/utility.rb +234 -34
  21. data/lib/write_xlsx/version.rb +1 -1
  22. data/lib/write_xlsx/workbook.rb +88 -1
  23. data/lib/write_xlsx/worksheet.rb +247 -23
  24. data/test/helper.rb +6 -1
  25. data/test/regression/_test_hyperlink31.rb +26 -0
  26. data/test/regression/images/zero_dpi.jpg +0 -0
  27. data/test/regression/test_chart_bar08.rb +3 -0
  28. data/test/regression/test_chart_bar11.rb +3 -0
  29. data/test/regression/test_chart_bar14.rb +3 -0
  30. data/test/regression/test_chart_chartarea05.rb +16 -17
  31. data/test/regression/test_chart_chartarea06.rb +49 -0
  32. data/test/regression/test_chart_data_labels25.rb +61 -0
  33. data/test/regression/test_chart_format26.rb +48 -0
  34. data/test/regression/test_chart_format27.rb +58 -0
  35. data/test/regression/test_chart_format28.rb +52 -0
  36. data/test/regression/test_chart_format29.rb +59 -0
  37. data/test/regression/test_chart_format30.rb +53 -0
  38. data/test/regression/test_chart_format31.rb +60 -0
  39. data/test/regression/test_chart_table03.rb +56 -0
  40. data/test/regression/test_cond_format14.rb +42 -0
  41. data/test/regression/test_cond_format15.rb +53 -0
  42. data/test/regression/test_cond_format16.rb +53 -0
  43. data/test/regression/test_cond_format17.rb +37 -0
  44. data/test/regression/test_cond_format18.rb +136 -0
  45. data/test/regression/test_date_1904_01.rb +1 -1
  46. data/test/regression/test_escapes04.rb +3 -0
  47. data/test/regression/test_escapes05.rb +3 -0
  48. data/test/regression/test_escapes07.rb +3 -0
  49. data/test/regression/test_escapes08.rb +3 -0
  50. data/test/regression/test_hyperlink01.rb +3 -0
  51. data/test/regression/test_hyperlink02.rb +3 -0
  52. data/test/regression/test_hyperlink03.rb +4 -0
  53. data/test/regression/test_hyperlink04.rb +3 -0
  54. data/test/regression/test_hyperlink05.rb +3 -0
  55. data/test/regression/test_hyperlink06.rb +3 -0
  56. data/test/regression/test_hyperlink07.rb +3 -0
  57. data/test/regression/test_hyperlink08.rb +3 -0
  58. data/test/regression/test_hyperlink09.rb +3 -0
  59. data/test/regression/test_hyperlink10.rb +3 -0
  60. data/test/regression/test_hyperlink11.rb +3 -0
  61. data/test/regression/test_hyperlink12.rb +3 -0
  62. data/test/regression/test_hyperlink13.rb +3 -0
  63. data/test/regression/test_hyperlink14.rb +3 -0
  64. data/test/regression/test_hyperlink15.rb +3 -0
  65. data/test/regression/test_hyperlink16.rb +3 -0
  66. data/test/regression/test_hyperlink17.rb +3 -0
  67. data/test/regression/test_hyperlink18.rb +3 -0
  68. data/test/regression/test_hyperlink20.rb +3 -0
  69. data/test/regression/test_hyperlink21.rb +3 -0
  70. data/test/regression/test_hyperlink22.rb +3 -0
  71. data/test/regression/test_hyperlink23.rb +3 -0
  72. data/test/regression/test_hyperlink24.rb +3 -0
  73. data/test/regression/test_hyperlink25.rb +3 -0
  74. data/test/regression/test_hyperlink26.rb +3 -0
  75. data/test/regression/test_hyperlink27.rb +3 -0
  76. data/test/regression/test_hyperlink28.rb +50 -0
  77. data/test/regression/test_hyperlink29.rb +27 -0
  78. data/test/regression/test_hyperlink30.rb +36 -0
  79. data/test/regression/test_image35.rb +26 -0
  80. data/test/regression/test_properties01.rb +1 -4
  81. data/test/regression/test_properties02.rb +1 -4
  82. data/test/regression/test_properties03.rb +26 -0
  83. data/test/regression/test_properties04.rb +61 -0
  84. data/test/regression/test_properties05.rb +30 -0
  85. data/test/regression/test_table03.rb +3 -0
  86. data/test/regression/test_table04.rb +3 -0
  87. data/test/regression/test_table05.rb +3 -0
  88. data/test/regression/test_table06.rb +3 -0
  89. data/test/regression/test_table20.rb +34 -0
  90. data/test/regression/test_table21.rb +36 -0
  91. data/test/regression/test_table22.rb +32 -0
  92. data/test/regression/xlsx_files/chart_chartarea05.xlsx +0 -0
  93. data/test/regression/xlsx_files/chart_chartarea06.xlsx +0 -0
  94. data/test/regression/xlsx_files/chart_data_labels25.xlsx +0 -0
  95. data/test/regression/xlsx_files/chart_format26.xlsx +0 -0
  96. data/test/regression/xlsx_files/chart_format27.xlsx +0 -0
  97. data/test/regression/xlsx_files/chart_format28.xlsx +0 -0
  98. data/test/regression/xlsx_files/chart_format29.xlsx +0 -0
  99. data/test/regression/xlsx_files/chart_format30.xlsx +0 -0
  100. data/test/regression/xlsx_files/chart_format31.xlsx +0 -0
  101. data/test/regression/xlsx_files/chart_table03.xlsx +0 -0
  102. data/test/regression/xlsx_files/cond_format14.xlsx +0 -0
  103. data/test/regression/xlsx_files/cond_format15.xlsx +0 -0
  104. data/test/regression/xlsx_files/cond_format16.xlsx +0 -0
  105. data/test/regression/xlsx_files/cond_format17.xlsx +0 -0
  106. data/test/regression/xlsx_files/cond_format18.xlsx +0 -0
  107. data/test/regression/xlsx_files/date_1904_01.xlsx +0 -0
  108. data/test/regression/xlsx_files/hyperlink28.xlsx +0 -0
  109. data/test/regression/xlsx_files/hyperlink29.xlsx +0 -0
  110. data/test/regression/xlsx_files/hyperlink30.xlsx +0 -0
  111. data/test/regression/xlsx_files/hyperlink31.xlsx +0 -0
  112. data/test/regression/xlsx_files/image35.xlsx +0 -0
  113. data/test/regression/xlsx_files/properties03.xlsx +0 -0
  114. data/test/regression/xlsx_files/properties04.xlsx +0 -0
  115. data/test/regression/xlsx_files/properties05.xlsx +0 -0
  116. data/test/regression/xlsx_files/table21.xlsx +0 -0
  117. data/test/regression/xlsx_files/table22.xlsx +0 -0
  118. data/test/workbook/test_write_workbook_view.rb +81 -0
  119. data/test/worksheet/test_cond_format_22.rb +266 -0
  120. data/test/worksheet/test_cond_format_23.rb +242 -0
  121. data/test/worksheet/test_cond_format_24.rb +303 -0
  122. data/test/worksheet/test_data_bar_01.rb +53 -0
  123. data/test/worksheet/test_data_bar_02.rb +79 -0
  124. data/test/worksheet/test_data_bar_03.rb +147 -0
  125. data/test/worksheet/test_data_bar_04.rb +145 -0
  126. data/test/worksheet/test_data_bar_05.rb +147 -0
  127. data/test/worksheet/test_data_bar_06.rb +145 -0
  128. data/test/worksheet/test_data_bar_07.rb +146 -0
  129. data/test/worksheet/test_data_bar_08.rb +54 -0
  130. data/test/worksheet/test_data_bar_09.rb +80 -0
  131. data/test/worksheet/test_data_bar_10.rb +165 -0
  132. data/test/worksheet/test_data_bar_11.rb +167 -0
  133. data/test/worksheet/test_data_bar_12.rb +104 -0
  134. data/test/worksheet/test_write_data_validation_02.rb +27 -0
  135. metadata +135 -2
@@ -1 +1 @@
1
- WriteXLSX_VERSION = "0.90.0"
1
+ WriteXLSX_VERSION = "0.97.0"
@@ -44,11 +44,14 @@ class Workbook
44
44
  attr_reader :worksheets, :charts, :drawings # :nodoc:
45
45
  attr_reader :named_ranges # :nodoc:
46
46
  attr_reader :doc_properties # :nodoc:
47
+ attr_reader :custom_properties # :nodoc:
47
48
  attr_reader :image_types, :images # :nodoc:
48
49
  attr_reader :shared_strings # :nodoc:
49
50
  attr_reader :vba_project # :nodoc:
50
51
  attr_reader :excel2003_style # :nodoc:
51
52
  attr_reader :strings_to_urls # :nodoc:
53
+ attr_reader :default_url_format # :nodoc:
54
+
52
55
  #
53
56
  # A new Excel workbook is created using the +new+ constructor
54
57
  # which accepts either a filename or an IO object as a parameter.
@@ -114,7 +117,7 @@ def initialize(file, *option_params)
114
117
  @named_ranges = []
115
118
  @custom_colors = []
116
119
  @doc_properties = {}
117
- @local_time = Time.now
120
+ @custom_properties = []
118
121
  @optimization = options[:optimization] || 0
119
122
  @x_window = 240
120
123
  @y_window = 15
@@ -141,6 +144,10 @@ def initialize(file, *option_params)
141
144
  else
142
145
  add_format(default_formats.merge(:xf_index => 0))
143
146
  end
147
+
148
+ # Add a default URL format.
149
+ @default_url_format = add_format(:hyperlink => 1)
150
+
144
151
  set_color_palette
145
152
  end
146
153
 
@@ -758,6 +765,25 @@ def define_name(name, formula)
758
765
  @defined_names.push([ name, sheet_index, formula.sub(/^=/, '') ])
759
766
  end
760
767
 
768
+ #
769
+ # Set the workbook size.
770
+ #
771
+ def set_size(width = nil, height = nil)
772
+ if ptrue?(width)
773
+ # Convert to twips at 96 dpi.
774
+ @window_width = width.to_i * 1440 / 96
775
+ else
776
+ @window_width = 16095
777
+ end
778
+
779
+ if ptrue?(height)
780
+ # Convert to twips at 96 dpi.
781
+ @window_height = height.to_i * 1440 / 96
782
+ else
783
+ @window_height = 9660
784
+ end
785
+ end
786
+
761
787
  #
762
788
  # The set_properties method can be used to set the document properties
763
789
  # of the Excel file created by WriteXLSX. These properties are visible
@@ -819,6 +845,53 @@ def set_properties(params)
819
845
  @doc_properties = params.dup
820
846
  end
821
847
 
848
+ #
849
+ # Set a user defined custom document property.
850
+ #
851
+ def set_custom_property(name, value, type = nil)
852
+ # Valid types.
853
+ valid_type = {
854
+ 'text' => 1,
855
+ 'date' => 1,
856
+ 'number' => 1,
857
+ 'number_int' => 1,
858
+ 'bool' => 1,
859
+ }
860
+
861
+ if !name || (type != 'bool' && !value)
862
+ raise "The name and value parameters must be defined in set_custom_property()"
863
+ end
864
+
865
+ # Determine the type for strings and numbers if it hasn't been specified.
866
+ if !ptrue?(type)
867
+ if value =~ /^\d+$/
868
+ type = 'number_int'
869
+ elsif value =~
870
+ /^([+-]?)(?=[0-9]|\.[0-9])[0-9]*(\.[0-9]*)?([Ee]([+-]?[0-9]+))?$/
871
+ type = 'number'
872
+ else
873
+ type = 'text'
874
+ end
875
+ end
876
+
877
+ # Check for valid validation types.
878
+ if !valid_type[type]
879
+ raise "Unknown custom type '$type' in set_custom_property()"
880
+ end
881
+
882
+ # Check for strings longer than Excel's limit of 255 chars.
883
+ if type == 'text' && value.length > 255
884
+ raise "Length of text custom value '$value' exceeds Excel's limit of 255 in set_custom_property()"
885
+ end
886
+
887
+ if type == 'bool'
888
+ value = value ? 1 : 0
889
+ end
890
+
891
+ @custom_properties << [name, value, type]
892
+ end
893
+
894
+
822
895
  #
823
896
  # The add_vba_project method can be used to add macros or functions to an
824
897
  # WriteXLSX file using a binary VBA project file that has been extracted
@@ -877,6 +950,16 @@ def set_calc_mode(mode, calc_id = nil)
877
950
  @calc_id = calc_id if calc_id
878
951
  end
879
952
 
953
+ #
954
+ # Get the default url format used when a user defined format isn't specified
955
+ # with write_url(). The format is the hyperlink style defined by Excel for the
956
+ # default theme.
957
+ #
958
+ def default_url_format
959
+ @default_url_format
960
+ end
961
+ alias get_default_url_format default_url_format
962
+
880
963
  #
881
964
  # Change the RGB components of the elements in the colour palette.
882
965
  #
@@ -1922,6 +2005,10 @@ def get_image_properties(filename)
1922
2005
 
1923
2006
  @images << [filename, type]
1924
2007
 
2008
+ # Set a default dpi for images with 0 dpi.
2009
+ x_dpi = 96 if x_dpi == 0
2010
+ y_dpi = 96 if y_dpi == 0
2011
+
1925
2012
  [type, width, height, File.basename(filename), x_dpi, y_dpi]
1926
2013
  end
1927
2014
 
@@ -294,7 +294,7 @@ class Worksheet
294
294
  attr_reader :writer, :set_rows, :col_formats # :nodoc:
295
295
  attr_reader :vml_shape_id # :nodoc:
296
296
  attr_reader :comments, :comments_author # :nodoc:
297
- attr_accessor :dxf_priority # :nodoc:
297
+ attr_accessor :data_bars_2010, :dxf_priority # :nodoc:
298
298
  attr_reader :vba_codename # :nodoc:
299
299
  attr_writer :excel_version
300
300
 
@@ -308,6 +308,7 @@ def initialize(workbook, index, name) #:nodoc:
308
308
  @cell_data_table = {}
309
309
  @excel_version = 2007
310
310
  @palette = workbook.palette
311
+ @default_url_format = workbook.default_url_format
311
312
 
312
313
  @page_setup = PageSetup.new
313
314
 
@@ -376,8 +377,9 @@ def initialize(workbook, index, name) #:nodoc:
376
377
 
377
378
  @validations = []
378
379
 
379
- @cond_formats = {}
380
- @dxf_priority = 1
380
+ @cond_formats = {}
381
+ @data_bars_2010 = []
382
+ @dxf_priority = 1
381
383
 
382
384
  if excel2003_style?
383
385
  @original_row_height = 12.75
@@ -422,7 +424,7 @@ def assemble_xml_file #:nodoc:
422
424
  write_legacy_drawing
423
425
  write_legacy_drawing_hf
424
426
  write_table_parts
425
- write_ext_sparklines
427
+ write_ext_list
426
428
  end
427
429
  end
428
430
  end
@@ -2781,6 +2783,9 @@ def write_url(*args)
2781
2783
  raise "URL '#{url}' added but number of URLS is over Excel's limit of 65,530 URLS per worksheet."
2782
2784
  end
2783
2785
 
2786
+ # Add the default URL format.
2787
+ xf = @default_url_format unless xf
2788
+
2784
2789
  # Write the hyperlink string.
2785
2790
  write_string(row, col, hyperlink.str, xf)
2786
2791
  end
@@ -6037,6 +6042,26 @@ def set_vba_name(vba_codename = nil)
6037
6042
  end
6038
6043
  end
6039
6044
 
6045
+ def write_ext(url)
6046
+ attributes = [
6047
+ ['xmlns:x14', "#{OFFICE_URL}spreadsheetml/2009/9/main"],
6048
+ ['uri', url]
6049
+ ]
6050
+ @writer.tag_elements('ext', attributes) do
6051
+ yield
6052
+ end
6053
+ end
6054
+
6055
+ def write_sparkline_groups
6056
+ # Write the x14:sparklineGroups element.
6057
+ @writer.tag_elements('x14:sparklineGroups', sparkline_groups_attributes) do
6058
+ # Write the sparkline elements.
6059
+ @sparklines.reverse.each do |sparkline|
6060
+ sparkline.write_sparkline_group(@writer)
6061
+ end
6062
+ end
6063
+ end
6064
+
6040
6065
  private
6041
6066
 
6042
6067
  def hyperlinks_count
@@ -6648,9 +6673,10 @@ def encode_password(password) #:nodoc:
6648
6673
  def write_worksheet_attributes #:nodoc:
6649
6674
  schema = 'http://schemas.openxmlformats.org/'
6650
6675
  attributes = [
6651
- ['xmlns', "#{schema}spreadsheetml/2006/main"],
6652
- ['xmlns:r', "#{schema}officeDocument/2006/relationships"]
6653
- ]
6676
+ ['xmlns', "#{schema}spreadsheetml/2006/main"],
6677
+ ['xmlns:r', "#{schema}officeDocument/2006/relationships"]
6678
+ ]
6679
+
6654
6680
  if @excel_version == 2010
6655
6681
  attributes << ['xmlns:mc', "#{schema}markup-compatibility/2006"]
6656
6682
  attributes << ['xmlns:x14ac', "#{OFFICE_URL}spreadsheetml/2009/9/ac"]
@@ -7506,31 +7532,229 @@ def write_r_id(tag, id)
7506
7532
  end
7507
7533
 
7508
7534
  #
7509
- # Write the <extLst> element and sparkline subelements.
7535
+ # Write the <extLst> element for data bars and sparklines.
7510
7536
  #
7511
- def write_ext_sparklines # :nodoc:
7512
- @writer.tag_elements('extLst') { write_ext } unless @sparklines.empty?
7537
+ def write_ext_list # :nodoc:
7538
+ return if @data_bars_2010.empty? && @sparklines.empty?
7539
+
7540
+ @writer.tag_elements('extLst') do
7541
+ write_ext_list_data_bars if @data_bars_2010.size > 0
7542
+ write_ext_list_sparklines if @sparklines.size > 0
7543
+ end
7513
7544
  end
7514
7545
 
7515
- def write_ext
7516
- @writer.tag_elements('ext', write_ext_attributes) do
7517
- write_sparkline_groups
7546
+ #
7547
+ # Write the Excel 2010 data_bar subelements.
7548
+ #
7549
+ def write_ext_list_data_bars
7550
+ # Write the ext element.
7551
+ write_ext('{78C0D931-6437-407d-A8EE-F0AAD7539E65}') do
7552
+
7553
+ @writer.tag_elements('x14:conditionalFormattings') do
7554
+ # Write each of the Excel 2010 conditional formatting data bar elements.
7555
+ @data_bars_2010.each do |data_bar|
7556
+ # Write the x14:conditionalFormatting element.
7557
+ write_conditional_formatting_2010(data_bar)
7558
+ end
7559
+ end
7518
7560
  end
7519
7561
  end
7562
+ #
7563
+ # Write the <x14:conditionalFormatting> element.
7564
+ #
7565
+ def write_conditional_formatting_2010(data_bar)
7566
+ xmlns_xm = 'http://schemas.microsoft.com/office/excel/2006/main'
7520
7567
 
7521
- def write_ext_attributes
7522
- [
7523
- ['xmlns:x14', "#{OFFICE_URL}spreadsheetml/2009/9/main"],
7524
- ['uri', '{05C60535-1F16-4fd2-B633-F4F36F0B64E0}']
7568
+ attributes = [ ['xmlns:xm', xmlns_xm] ]
7569
+
7570
+ @writer.tag_elements('x14:conditionalFormatting', attributes) do
7571
+
7572
+ # Write the '<x14:cfRule element.
7573
+ write_x14_cf_rule(data_bar)
7574
+
7575
+ # Write the x14:dataBar element.
7576
+ write_x14_data_bar(data_bar)
7577
+
7578
+ # Write the x14 max and min data bars.
7579
+ write_x14_cfvo(data_bar[:x14_min_type], data_bar[:min_value])
7580
+ write_x14_cfvo(data_bar[:x14_max_type], data_bar[:max_value])
7581
+
7582
+ # Write the x14:borderColor element.
7583
+ if !ptrue?(data_bar[:bar_no_border])
7584
+ write_x14_border_color(data_bar[:bar_border_color])
7585
+ end
7586
+
7587
+ # Write the x14:negativeFillColor element.
7588
+ if !ptrue?(data_bar[:bar_negative_color_same])
7589
+ write_x14_negative_fill_color(data_bar[:bar_negative_color])
7590
+ end
7591
+
7592
+ # Write the x14:negativeBorderColor element.
7593
+ if !ptrue?(data_bar[:bar_no_border]) &&
7594
+ !ptrue?(data_bar[:bar_negative_border_color_same])
7595
+ write_x14_negative_border_color(
7596
+ data_bar[:bar_negative_border_color])
7597
+ end
7598
+
7599
+ # Write the x14:axisColor element.
7600
+ if data_bar[:bar_axis_position] != 'none'
7601
+ write_x14_axis_color(data_bar[:bar_axis_color])
7602
+ end
7603
+
7604
+ # Write closing elements.
7605
+ @writer.end_tag('x14:dataBar')
7606
+ @writer.end_tag('x14:cfRule')
7607
+
7608
+ # Add the conditional format range.
7609
+ @writer.data_element('xm:sqref', data_bar[:range])
7610
+ end
7611
+ end
7612
+
7613
+ #
7614
+ # Write the <cfvo> element.
7615
+ #
7616
+ def write_x14_cfvo(type, value)
7617
+ attributes = [ ['type', type ] ]
7618
+
7619
+ if %w(min max autoMin autoMax).include?(type)
7620
+ @writer.empty_tag('x14:cfvo', attributes)
7621
+ else
7622
+ @writer.tag_elements('x14:cfvo', attributes) do
7623
+ @writer.data_element('xm:f', value)
7624
+ end
7625
+ end
7626
+ end
7627
+
7628
+ #
7629
+ # Write the <'<x14:cfRule> element.
7630
+ #
7631
+ def write_x14_cf_rule(data_bar)
7632
+ type = 'dataBar'
7633
+ id = data_bar[:guid]
7634
+
7635
+ attributes = [
7636
+ ['type', type],
7637
+ ['id', id]
7638
+ ]
7639
+
7640
+ @writer.start_tag('x14:cfRule', attributes)
7641
+
7642
+ end
7643
+
7644
+ #
7645
+ # Write the <x14:dataBar> element.
7646
+ #
7647
+ def write_x14_data_bar(data_bar)
7648
+ min_length = 0
7649
+ max_length = 100
7650
+
7651
+ attributes = [
7652
+ ['minLength', min_length],
7653
+ ['maxLength', max_length]
7525
7654
  ]
7655
+
7656
+ attributes << ['border', 1] if !ptrue?(data_bar[:bar_no_border])
7657
+ attributes << ['gradient', 0] if ptrue?(data_bar[:bar_solid])
7658
+
7659
+ if data_bar[:bar_direction] == 'left'
7660
+ attributes << ['direction', 'leftToRight']
7661
+ end
7662
+ if data_bar[:bar_direction] == 'right'
7663
+ attributes << ['direction', 'rightToLeft']
7664
+ end
7665
+
7666
+ if ptrue?(data_bar[:bar_negative_color_same])
7667
+ attributes << ['negativeBarColorSameAsPositive', 1]
7668
+ end
7669
+
7670
+ if !ptrue?(data_bar[:bar_no_border]) &&
7671
+ !ptrue?(data_bar[:bar_negative_border_color_same])
7672
+ attributes << ['negativeBarBorderColorSameAsPositive', 0]
7673
+ end
7674
+
7675
+ if data_bar[:bar_axis_position] == 'middle'
7676
+ attributes << ['axisPosition', 'middle']
7677
+ end
7678
+
7679
+ if data_bar[:bar_axis_position] == 'none'
7680
+ attributes << ['axisPosition', 'none']
7681
+ end
7682
+
7683
+ @writer.start_tag('x14:dataBar', attributes)
7526
7684
  end
7527
7685
 
7528
- def write_sparkline_groups
7529
- # Write the x14:sparklineGroups element.
7530
- @writer.tag_elements('x14:sparklineGroups', sparkline_groups_attributes) do
7531
- # Write the sparkline elements.
7532
- @sparklines.reverse.each do |sparkline|
7533
- sparkline.write_sparkline_group(@writer)
7686
+ #
7687
+ # Write the <x14:borderColor> element.
7688
+ #
7689
+ def write_x14_border_color(rgb)
7690
+ attributes = [ ['rgb', rgb] ]
7691
+
7692
+ @writer.empty_tag('x14:borderColor', attributes)
7693
+ end
7694
+
7695
+ #
7696
+ # Write the <x14:negativeFillColor> element.
7697
+ #
7698
+ def write_x14_negative_fill_color(rgb)
7699
+ attributes = [ ['rgb', rgb] ]
7700
+
7701
+ @writer.empty_tag('x14:negativeFillColor', attributes)
7702
+ end
7703
+
7704
+ #
7705
+ # Write the <x14:negativeBorderColor> element.
7706
+ #
7707
+ def write_x14_negative_border_color(rgb)
7708
+ attributes = [ ['rgb', rgb] ]
7709
+
7710
+ @writer.empty_tag('x14:negativeBorderColor', attributes)
7711
+ end
7712
+
7713
+ #
7714
+ # Write the <x14:axisColor> element.
7715
+ #
7716
+ def write_x14_axis_color(rgb)
7717
+ attributes = [ ['rgb', rgb] ]
7718
+
7719
+ @writer.empty_tag('x14:axisColor', attributes)
7720
+ end
7721
+
7722
+ #
7723
+ # Write the sparkline subelements.
7724
+ #
7725
+ def write_ext_list_sparklines
7726
+ # Write the ext element.
7727
+ write_ext('{05C60535-1F16-4fd2-B633-F4F36F0B64E0}') do
7728
+
7729
+ # Write the x14:sparklineGroups element.
7730
+ write_sparkline_groups
7731
+
7732
+ # # Write the sparkline elements.
7733
+ # @sparklines.reverse.each do |sparkline|
7734
+ # # Write the x14:sparklineGroup element.
7735
+ # # sparkline.write_sparkline_group(@writer)
7736
+
7737
+ # @writer.end_tag('x14:sparklineGroup')
7738
+ # end
7739
+
7740
+ # @writer.end_tag('x14:sparklineGroups')
7741
+ end
7742
+ end
7743
+
7744
+ #
7745
+ # Write the <x14:sparklines> element and <x14:sparkline> subelements.
7746
+ #
7747
+ def write_sparklines(sparkline)
7748
+ # Write the sparkline elements.
7749
+ @writer.tag_elements('x14:sparklines') do
7750
+ (0..sparkline[:count]-1).each do |i|
7751
+ range = sparkline[:ranges][i]
7752
+ location = sparkline[:locations][i]
7753
+
7754
+ @writer.tag_elements('x14:sparkline') do
7755
+ @writer.data_element('xm:f', range)
7756
+ @writer.data_element('xm:sqref', location)
7757
+ end
7534
7758
  end
7535
7759
  end
7536
7760
  end