write_xlsx 0.90.0 → 0.97.0

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.
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