write_xlsx 1.10.2 → 1.11.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 74c1fe583292a7a5318db09651b114e58358646a8706b5b4d35fc01c1850ec6c
4
- data.tar.gz: 424d3f3a1983e4de16de9a943c67718874e7ef7e4a78c440767ecf8c68f0ef88
3
+ metadata.gz: cabafeb058f3742956ec06251cab5ecf67d9b76cd5db3ec659e2e4184d2c1483
4
+ data.tar.gz: 95a68e0390bff44e03dc8577b31162c1d1c2cb80d77f3943947e1114327afb01
5
5
  SHA512:
6
- metadata.gz: 4603c1400dd60ec345b8cf4db50ae1c03e87716192a074d2a767cebc7cfc085439c733ea11167cf900efc3aae3fe555a32639731d36338100bf9fbb170f28fd5
7
- data.tar.gz: 3ccbb69460382ae8074cc62fc896daa1aa608dbbb6ff894bb1fc425643c0ac3b9e91cc55b0c8e2de05a50113b179621db83fcea033b9b201bf56957f833624e3
6
+ metadata.gz: 70a98e3ffc2be69574805f72a63678b2023cc3aef9a1c1a97c5f8a13de80de29c641c573d8c8c9bd7d33da088827a15fb6feb3b4c7591b50ffb26cb321591b49
7
+ data.tar.gz: 1d387aa195a7a35f0b664e4ff155ca71de765ad6ae886df66debc9063d1fea8c4c905ab10a7aef735d69813b79faa1d6e7ded96e70ce23a75df56e5f172b1648
data/.rubocop.yml CHANGED
@@ -8,6 +8,9 @@ AllCops:
8
8
  TargetRubyVersion: 2.6
9
9
  NewCops: enable
10
10
 
11
+ Gemspec/DevelopmentDependencies:
12
+ Enabled: false
13
+
11
14
  Gemspec/RequiredRubyVersion:
12
15
  Enabled: false
13
16
 
@@ -33,6 +36,9 @@ Layout/HeredocIndentation:
33
36
  Layout/LineLength:
34
37
  Max: 7000
35
38
 
39
+ Layout/MultilineMethodCallIndentation:
40
+ Enabled: false
41
+
36
42
  Lint/DuplicateBranch:
37
43
  IgnoreLiteralBranches: true
38
44
  Exclude:
@@ -60,6 +66,9 @@ Metrics/CyclomaticComplexity:
60
66
  Metrics/MethodLength:
61
67
  Max: 400
62
68
 
69
+ Metrics/ModuleLength:
70
+ Max: 1000
71
+
63
72
  Metrics/ParameterLists:
64
73
  Max: 12
65
74
  MaxOptionalParameters: 6
@@ -93,7 +102,7 @@ Style/FormatStringToken:
93
102
  EnforcedStyle: unannotated
94
103
 
95
104
  Style/HashSyntax:
96
- EnforceStyle: ruby19_no_mixed_keys
105
+ EnforcedStyle: ruby19_no_mixed_keys
97
106
  EnforcedShorthandSyntax: either
98
107
 
99
108
  Style/IfUnlessModifier:
data/Changes CHANGED
@@ -1,5 +1,23 @@
1
1
  Change history of write_xlsx rubygem.
2
2
 
3
+ 2023-08-09 v1.11.1
4
+ Fixed issue #110. Redefining costant Struct::ColInfo
5
+
6
+ 2023-05-06 v1.11.0
7
+ Added support for simulated worksheet `autofit()`.
8
+
9
+ Refactored internal column property handling to allow column ranges
10
+ to be overridden (a common UX expectation).
11
+
12
+ Add `quote_prefix` format property.
13
+
14
+ Fix for duplicate number formats. Issue #283(excel-write-xlsx)
15
+
16
+ Add fix for worksheets with tables and background images.
17
+
18
+ Replace/fix the worksheet protection password algorithm
19
+ so that is works correctly for strings over 24 chars.
20
+
3
21
  2023-02-16 v1.10.2
4
22
  Fixed issue #104. Worksheet#write Ruby 3.2 removed Object#=~
5
23
  making it impossible to write Date objects
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+
4
+ #
5
+ # An example of using simulated autofit to automatically adjust the width of
6
+ # worksheet columns based on the data in the cells.
7
+ #
8
+ # Copyright 2000-2023, John McNamara, jmcnamara@cpan.org
9
+ #
10
+ # SPDX-License-Identifier: Artistic-1.0-Perl OR GPL-1.0-or-later
11
+ #
12
+ # convert to Ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
13
+ #
14
+ require 'write_xlsx'
15
+
16
+ workbook = WriteXLSX.new('autofit.xlsx')
17
+ worksheet = workbook.add_worksheet
18
+
19
+ # Write some worksheet data to demonstrate autofitting.
20
+ worksheet.write(0, 0, "Foo")
21
+ worksheet.write(1, 0, "Food")
22
+ worksheet.write(2, 0, "Foody")
23
+ worksheet.write(3, 0, "Froody")
24
+
25
+ worksheet.write(0, 1, 12345)
26
+ worksheet.write(1, 1, 12345678)
27
+ worksheet.write(2, 1, 12345)
28
+
29
+ worksheet.write(0, 2, "Some longer text")
30
+
31
+ worksheet.write(0, 3, 'http://www.google.com')
32
+ worksheet.write(1, 3, 'https://github.com')
33
+
34
+ # Autofit the worksheet
35
+ worksheet.autofit
36
+
37
+ workbook.close
@@ -44,10 +44,8 @@ chart1.add_series(
44
44
  values: ['Sheet1', 1, 6, 2, 2]
45
45
  )
46
46
 
47
- # Add a chart title and some axis labels.
47
+ # Add a chart title.
48
48
  chart1.set_title(name: 'Results of sample analysis')
49
- chart1.set_x_axis(name: 'Test number')
50
- chart1.set_y_axis(name: 'Sample length (mm)')
51
49
 
52
50
  # Set an Excel chart style. Blue colors with white outline and shadow.
53
51
  chart1.set_style(11)
@@ -81,10 +79,8 @@ chart2.add_series(
81
79
  values: ['Sheet1', 1, 6, 2, 2]
82
80
  )
83
81
 
84
- # Add a chart title and some axis labels.
82
+ # Add a chart title.
85
83
  chart2.set_title(name: 'Stacked Chart')
86
- chart2.set_x_axis(name: 'Test number')
87
- chart2.set_y_axis(name: 'Sample length (mm)')
88
84
 
89
85
  # Set an Excel chart style. Blue colors with white outline and shadow.
90
86
  chart2.set_style(12)
@@ -118,10 +114,8 @@ chart3.add_series(
118
114
  values: ['Sheet1', 1, 6, 2, 2]
119
115
  )
120
116
 
121
- # Add a chart title and some axis labels.
117
+ # Add a chart title.
122
118
  chart3.set_title(name: 'Percent Stacked Chart')
123
- chart3.set_x_axis(name: 'Test number')
124
- chart3.set_y_axis(name: 'Sample length (mm)')
125
119
 
126
120
  # Set an Excel chart style. Blue colors with white outline and shadow.
127
121
  chart3.set_style(13)
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
 
3
4
  ###############################################################################
4
5
  #
@@ -1,4 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'write_xlsx/package/xml_writer_simple'
4
5
  require 'write_xlsx/utility'
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
 
3
4
  ###############################################################################
4
5
  #
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Writexlsx
4
5
  class Chart
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
 
3
4
  ###############################################################################
4
5
  #
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
 
3
4
  ###############################################################################
4
5
  #
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Writexlsx
4
5
  class Chart
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
 
3
4
  ###############################################################################
4
5
  #
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
 
3
4
  ###############################################################################
4
5
  #
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
 
3
4
  ###############################################################################
4
5
  #
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
 
3
4
  ###############################################################################
4
5
  #
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Writexlsx
4
5
  class Chart
@@ -182,6 +183,7 @@ module Writexlsx
182
183
  attr_reader :values, :categories, :name, :name_formula, :name_id
183
184
  attr_reader :cat_data_id, :val_data_id, :fill, :pattern, :gradient
184
185
  attr_reader :trendline, :smooth, :labels, :invert_if_negative
186
+ attr_reader :inverted_color
185
187
  attr_reader :x2_axis, :y2_axis, :error_bars, :points
186
188
  attr_accessor :line, :marker
187
189
 
@@ -217,10 +219,12 @@ module Writexlsx
217
219
 
218
220
  @label_positions = chart.label_positions
219
221
  @label_position_default = chart.label_position_default
220
- @labels = labels_properties(params[:data_labels])
222
+ @labels = labels_properties(params[:data_labels])
223
+ @inverted_color = params[:invert_if_negative_color]
221
224
 
222
- %i[smooth invert_if_negative x2_axis y2_axis]
223
- .each { |key| instance_variable_set("@#{key}", params[key]) }
225
+ %i[
226
+ smooth invert_if_negative x2_axis y2_axis
227
+ ].each { |key| instance_variable_set("@#{key}", params[key]) }
224
228
  end
225
229
 
226
230
  def ==(other)
@@ -228,7 +232,7 @@ module Writexlsx
228
232
  categories values name name_formula name_id
229
233
  cat_data_id val_data_id
230
234
  line fill gradient marker trendline
231
- smooth labels invert_if_neg
235
+ smooth labels inverted_color
232
236
  x2_axis y2_axis error_bars points
233
237
  ]
234
238
  methods.each do |method|
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
+ # frozen_string_literal: true
2
3
 
3
4
  ###############################################################################
4
5
  #
@@ -371,7 +371,7 @@ module Writexlsx
371
371
  # Set on of the 42 built-in Excel chart styles. The default style is 2.
372
372
  #
373
373
  def set_style(style_id = 2)
374
- style_id = 2 if style_id < 0 || style_id > 48
374
+ style_id = 2 if style_id < 1 || style_id > 48
375
375
  @style_id = style_id
376
376
  end
377
377
 
@@ -950,10 +950,36 @@ module Writexlsx
950
950
  write_val(series)
951
951
  # Write the c:smooth element.
952
952
  write_c_smooth(series.smooth) if ptrue?(@smooth_allowed)
953
+ write_ext_lst(series.inverted_color) if series.inverted_color
953
954
  end
954
955
  @series_index += 1
955
956
  end
956
957
 
958
+ def write_ext_lst(color)
959
+ uri = '{6F2FDCE9-48DA-4B69-8628-5D25D57E5C99}'
960
+ xmlns_c_14 =
961
+ 'http://schemas.microsoft.com/office/drawing/2007/8/2/chart'
962
+
963
+ attributes_1 = [
964
+ ['uri', uri],
965
+ ['xmlns:c14', xmlns_c_14]
966
+ ]
967
+
968
+ attributes_2 = [
969
+ ['xmlns:c14', xmlns_c_14]
970
+ ]
971
+
972
+ @writer.tag_elements('c:extLst') do
973
+ @writer.tag_elements('c:ext', attributes_1) do
974
+ @writer.tag_elements('c14:invertSolidFillFmt') do
975
+ @writer.tag_elements('c14:spPr', attributes_2) do
976
+ write_a_solid_fill(color: color)
977
+ end
978
+ end
979
+ end
980
+ end
981
+ end
982
+
957
983
  def write_ser_base(series)
958
984
  # Write the c:idx element.
959
985
  write_idx(@series_index)
@@ -2018,20 +2044,25 @@ module Writexlsx
2018
2044
  attributes << ['w', width]
2019
2045
  end
2020
2046
 
2021
- @writer.tag_elements('a:ln', attributes) do
2022
- # Write the line fill.
2023
- if ptrue?(line[:none])
2024
- # Write the a:noFill element.
2025
- write_a_no_fill
2026
- elsif ptrue?(line[:color])
2027
- # Write the a:solidFill element.
2028
- write_a_solid_fill(line)
2029
- end
2030
- # Write the line/dash type.
2031
- if line[:dash_type]
2032
- # Write the a:prstDash element.
2033
- write_a_prst_dash(line[:dash_type])
2047
+ if ptrue?(line[:none]) || ptrue?(line[:color]) || line[:dash_type]
2048
+ @writer.tag_elements('a:ln', attributes) do
2049
+ # Write the line fill.
2050
+ if ptrue?(line[:none])
2051
+ # Write the a:noFill element.
2052
+ write_a_no_fill
2053
+ elsif ptrue?(line[:color])
2054
+ # Write the a:solidFill element.
2055
+ write_a_solid_fill(line)
2056
+ end
2057
+
2058
+ # Write the line/dash type.
2059
+ if line[:dash_type]
2060
+ # Write the a:prstDash element.
2061
+ write_a_prst_dash(line[:dash_type])
2062
+ end
2034
2063
  end
2064
+ else
2065
+ @writer.empty_tag('a:ln', attributes)
2035
2066
  end
2036
2067
  end
2037
2068
 
@@ -4,25 +4,26 @@
4
4
  module Writexlsx
5
5
  class Colors
6
6
  COLORS = {
7
- aqua: 0x0F,
8
- cyan: 0x0F,
9
- black: 0x08,
10
- blue: 0x0C,
11
- brown: 0x10,
12
- magenta: 0x0E,
13
- fuchsia: 0x0E,
14
- gray: 0x17,
15
- grey: 0x17,
16
- green: 0x11,
17
- lime: 0x0B,
18
- navy: 0x12,
19
- orange: 0x35,
20
- pink: 0x21,
21
- purple: 0x14,
22
- red: 0x0A,
23
- silver: 0x16,
24
- white: 0x09,
25
- yellow: 0x0D
7
+ aqua: 0x0F,
8
+ cyan: 0x0F,
9
+ black: 0x08,
10
+ blue: 0x0C,
11
+ brown: 0x10,
12
+ magenta: 0x0E,
13
+ fuchsia: 0x0E,
14
+ gray: 0x17,
15
+ grey: 0x17,
16
+ green: 0x11,
17
+ lime: 0x0B,
18
+ navy: 0x12,
19
+ orange: 0x35,
20
+ pink: 0x21,
21
+ purple: 0x14,
22
+ red: 0x0A,
23
+ silver: 0x16,
24
+ white: 0x09,
25
+ yellow: 0x0D,
26
+ automatic: 0x40
26
27
  } # :nodoc:
27
28
 
28
29
  ###############################################################################
@@ -12,7 +12,7 @@ module Writexlsx
12
12
  attr_reader :diag_type, :diag_color, :font_only, :color_indexed # :nodoc:
13
13
  attr_reader :left, :left_color, :right, :right_color, :top, :top_color, :bottom, :bottom_color # :nodoc:
14
14
  attr_reader :font_scheme # :nodoc:
15
- attr_accessor :num_format_index, :border_index, :font_index # :nodoc:
15
+ attr_accessor :quote_prefix, :num_format_index, :border_index, :font_index # :nodoc:
16
16
  attr_accessor :fill_index, :font_condense, :font_extend, :diag_border # :nodoc:
17
17
  attr_accessor :bg_color, :fg_color, :pattern # :nodoc:
18
18
 
@@ -84,6 +84,7 @@ module Writexlsx
84
84
  @just_distrib = 0
85
85
  @color_indexed = 0
86
86
  @font_only = 0
87
+ @quote_prefix = 0
87
88
 
88
89
  set_format_properties(params) unless params.empty?
89
90
  end
@@ -213,7 +214,7 @@ module Writexlsx
213
214
  # Returns a unique hash key for the Format object.
214
215
  #
215
216
  def get_format_key
216
- [get_font_key, get_border_key, get_fill_key, get_alignment_key, @num_format, @locked, @hidden].join(':')
217
+ [get_font_key, get_border_key, get_fill_key, get_alignment_key, @num_format, @locked, @hidden, @quote_prefix].join(':')
217
218
  end
218
219
 
219
220
  #
@@ -583,14 +584,16 @@ module Writexlsx
583
584
  if theme == -1
584
585
  # Ignore for excel2003_style
585
586
  elsif ptrue?(theme)
586
- write_color(writer, 'theme', theme)
587
+ write_color('theme', theme, writer)
587
588
  elsif ptrue?(@color_indexed)
588
- write_color(writer, 'indexed', @color_indexed)
589
+ write_color('indexed', @color_indexed, writer)
589
590
  elsif ptrue?(@color)
590
591
  color = worksheet.palette_color(@color)
591
- write_color(writer, 'rgb', color)
592
+ if color != 'Automatic'
593
+ write_color('rgb', color, writer)
594
+ end
592
595
  elsif !ptrue?(dxf_format)
593
- write_color(writer, 'theme', 1)
596
+ write_color('theme', 1, writer)
594
597
  end
595
598
 
596
599
  unless ptrue?(dxf_format)
@@ -606,12 +609,12 @@ module Writexlsx
606
609
  writer.empty_tag('sz', [['val', size]])
607
610
 
608
611
  if ptrue?(theme)
609
- write_color(writer, 'theme', theme)
612
+ write_color('theme', theme, writer)
610
613
  elsif ptrue?(@color)
611
614
  color = worksheet.palette_color(@color)
612
- write_color(writer, 'rgb', color)
615
+ write_color('rgb', color, writer)
613
616
  else
614
- write_color(writer, 'theme', 1)
617
+ write_color('theme', 1, writer)
615
618
  end
616
619
 
617
620
  writer.empty_tag('rFont', [['val', @font]])
@@ -642,6 +645,7 @@ module Writexlsx
642
645
  ['borderId', border_index],
643
646
  ['xfId', xf_id]
644
647
  ]
648
+ attributes << ['quotePrefix', 1] if ptrue?(quote_prefix)
645
649
  attributes << ['applyNumberFormat', 1] if num_format_index > 0
646
650
  # Add applyFont attribute if XF format uses a font element.
647
651
  attributes << ['applyFont', 1] if font_index > 0 && !ptrue?(@hyperlink)
@@ -57,7 +57,8 @@ module Writexlsx
57
57
  # Minor modification to allow comparison testing. Change RGB colors
58
58
  # from long format, ffcc00 to short format fc0 used by VML.
59
59
  def rgb_color(rgb)
60
- result = sprintf("%02x%02x%02x", *rgb)
60
+ r, g, b = rgb
61
+ result = sprintf("%02x%02x%02x", r, g, b)
61
62
  result = "#{::Regexp.last_match(1)}#{::Regexp.last_match(2)}#{::Regexp.last_match(3)}" if result =~ /^([0-9a-f])\1([0-9a-f])\2([0-9a-f])\3$/
62
63
  result
63
64
  end
@@ -818,9 +818,9 @@ module Writexlsx
818
818
  write_cfvo(min_type, min_value)
819
819
  write_cfvo(mid_type, mid_value) if mid_type
820
820
  write_cfvo(max_type, max_value)
821
- write_color(@writer, 'rgb', min_color)
822
- write_color(@writer, 'rgb', mid_color) if mid_color
823
- write_color(@writer, 'rgb', max_color)
821
+ write_color('rgb', min_color)
822
+ write_color('rgb', mid_color) if mid_color
823
+ write_color('rgb', max_color)
824
824
  end
825
825
  end
826
826
  end
@@ -844,7 +844,7 @@ module Writexlsx
844
844
  write_cfvo(min_type, min_value)
845
845
  write_cfvo(max_type, max_value)
846
846
 
847
- write_color(@writer, 'rgb', bar_color)
847
+ write_color('rgb', bar_color)
848
848
  end
849
849
  end
850
850
 
@@ -11,11 +11,14 @@ module Writexlsx
11
11
 
12
12
  PRESERVE_SPACE_ATTRIBUTES = ['xml:space', 'preserve'].freeze
13
13
 
14
+ attr_reader :strings
15
+
14
16
  def initialize
15
17
  @writer = Package::XMLWriterSimple.new
16
18
  @strings = [] # string table
17
19
  @strings_index = {} # string table index
18
20
  @count = 0 # count
21
+ @str_unique = 0
19
22
  end
20
23
 
21
24
  def index(string, params = {})
@@ -25,10 +28,9 @@ module Writexlsx
25
28
 
26
29
  def add(string)
27
30
  unless @strings_index[string]
28
- # Only first time the string will be append to list
29
- # next time we only check and not #dup it
30
31
  str = string.frozen? ? string : string.freeze
31
32
  @strings << str
33
+ @str_unique += 1
32
34
  @strings_index[str] = @strings.size - 1
33
35
  end
34
36
  @count += 1
@@ -128,7 +130,7 @@ module Writexlsx
128
130
  end
129
131
 
130
132
  def unique_count
131
- @strings.size
133
+ @str_unique
132
134
  end
133
135
  end
134
136
  end
@@ -14,7 +14,7 @@ module Writexlsx
14
14
  @xf_formats = nil
15
15
  @palette = []
16
16
  @font_count = 0
17
- @num_format_count = 0
17
+ @num_formats = []
18
18
  @border_count = 0
19
19
  @fill_count = 0
20
20
  @custom_colors = []
@@ -38,18 +38,18 @@ module Writexlsx
38
38
  # Pass in the Format objects and other properties used to set the styles.
39
39
  #
40
40
  def set_style_properties(
41
- xf_formats, palette, font_count, num_format_count, border_count,
41
+ xf_formats, palette, font_count, num_formats, border_count,
42
42
  fill_count, custom_colors, dxf_formats, has_comments
43
43
  )
44
- @xf_formats = xf_formats
45
- @palette = palette
46
- @font_count = font_count
47
- @num_format_count = num_format_count
48
- @border_count = border_count
49
- @fill_count = fill_count
50
- @custom_colors = custom_colors
51
- @dxf_formats = dxf_formats
52
- @has_comments = has_comments
44
+ @xf_formats = xf_formats
45
+ @palette = palette
46
+ @font_count = font_count
47
+ @num_formats = num_formats
48
+ @border_count = border_count
49
+ @fill_count = fill_count
50
+ @custom_colors = custom_colors
51
+ @dxf_formats = dxf_formats
52
+ @has_comments = has_comments
53
53
  end
54
54
 
55
55
  #
@@ -59,6 +59,8 @@ module Writexlsx
59
59
  def palette_color(index)
60
60
  if index.to_s =~ /^#([0-9A-F]{6})$/i
61
61
  "FF#{::Regexp.last_match(1).upcase}"
62
+ elsif index == 0x40
63
+ "Automatic"
62
64
  else
63
65
  "FF#{super(index)}"
64
66
  end
@@ -77,7 +79,7 @@ module Writexlsx
77
79
  # Write the <numFmts> element.
78
80
  #
79
81
  def write_num_fmts
80
- count = @num_format_count
82
+ count = @num_formats.size
81
83
 
82
84
  return if count == 0
83
85
 
@@ -85,11 +87,10 @@ module Writexlsx
85
87
 
86
88
  @writer.tag_elements('numFmts', attributes) do
87
89
  # Write the numFmts elements.
88
- @xf_formats.each do |format|
89
- # Ignore built-in number formats, i.e., < 164.
90
- next unless format.num_format_index >= 164
91
-
92
- write_num_fmt(format.num_format_index, format.num_format)
90
+ index = 164
91
+ @num_formats.each do |num_format|
92
+ write_num_fmt(index, num_format)
93
+ index += 1
93
94
  end
94
95
  end
95
96
  end
@@ -187,15 +188,6 @@ module Writexlsx
187
188
  end
188
189
  end
189
190
 
190
- #
191
- # Write the <color> element.
192
- #
193
- def write_color(name, value)
194
- attributes = [[name, value]]
195
-
196
- @writer.empty_tag('color', attributes)
197
- end
198
-
199
191
  #
200
192
  # Write the <fills> element.
201
193
  #
@@ -285,10 +277,14 @@ module Writexlsx
285
277
  def write_pattern_fill(format, dxf_format)
286
278
  bg_color, fg_color = bg_and_fg_color(format, dxf_format)
287
279
 
288
- @writer.empty_tag('fgColor', [['rgb', palette_color(fg_color)]]) if fg_color && fg_color != 0
280
+ if fg_color && fg_color != 0 && fg_color != 0x40 # 'Automatic'
281
+ @writer.empty_tag('fgColor', [['rgb', palette_color(fg_color)]])
282
+ end
289
283
 
290
284
  if bg_color && bg_color != 0
291
- @writer.empty_tag('bgColor', [['rgb', palette_color(bg_color)]])
285
+ if bg_color != 0x40 # 'Automatic'
286
+ @writer.empty_tag('bgColor', [['rgb', palette_color(bg_color)]])
287
+ end
292
288
  elsif !dxf_format && format.pattern <= 1
293
289
  @writer.empty_tag('bgColor', [['indexed', 64]])
294
290
  end
@@ -391,10 +387,11 @@ module Writexlsx
391
387
  attributes = [[:style, BORDER_STYLES[style]]]
392
388
 
393
389
  @writer.tag_elements(type, attributes) do
394
- if color == 0
390
+ if [0, 0x40].include?(color) # 'Automatic'
395
391
  @writer.empty_tag('color', [['auto', 1]])
396
- else
392
+ elsif color != 0 && color != 0x40 # 'Automatic'
397
393
  color = palette_color(color)
394
+
398
395
  @writer.empty_tag('color', [['rgb', color]])
399
396
  end
400
397
  end