write_xlsx 1.11.0 → 1.11.2
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/Changes +12 -0
- data/examples/shape_all.rb +1 -1
- data/lib/write_xlsx/chart/area.rb +1 -0
- data/lib/write_xlsx/chart/axis.rb +1 -0
- data/lib/write_xlsx/chart/bar.rb +1 -0
- data/lib/write_xlsx/chart/caption.rb +1 -0
- data/lib/write_xlsx/chart/column.rb +1 -0
- data/lib/write_xlsx/chart/doughnut.rb +1 -0
- data/lib/write_xlsx/chart/legend.rb +1 -0
- data/lib/write_xlsx/chart/line.rb +1 -0
- data/lib/write_xlsx/chart/pie.rb +15 -2
- data/lib/write_xlsx/chart/radar.rb +1 -0
- data/lib/write_xlsx/chart/scatter.rb +1 -0
- data/lib/write_xlsx/chart/series.rb +56 -4
- data/lib/write_xlsx/chart/stock.rb +1 -0
- data/lib/write_xlsx/chart.rb +107 -23
- data/lib/write_xlsx/chartsheet.rb +10 -1
- data/lib/write_xlsx/col_name.rb +7 -3
- data/lib/write_xlsx/colors.rb +20 -19
- data/lib/write_xlsx/format.rb +10 -8
- data/lib/write_xlsx/package/app.rb +9 -5
- data/lib/write_xlsx/package/comments.rb +2 -1
- data/lib/write_xlsx/package/conditional_format.rb +6 -6
- data/lib/write_xlsx/package/packager.rb +2 -3
- data/lib/write_xlsx/package/styles.rb +11 -13
- data/lib/write_xlsx/package/table.rb +74 -20
- data/lib/write_xlsx/package/xml_writer_simple.rb +32 -44
- data/lib/write_xlsx/sheets.rb +6 -2
- data/lib/write_xlsx/sparkline.rb +2 -2
- data/lib/write_xlsx/utility.rb +14 -12
- data/lib/write_xlsx/version.rb +1 -1
- data/lib/write_xlsx/workbook.rb +2 -3
- data/lib/write_xlsx/worksheet/cell_data.rb +17 -18
- data/lib/write_xlsx/worksheet/hyperlink.rb +2 -2
- data/lib/write_xlsx/worksheet.rb +90 -39
- data/write_xlsx.gemspec +2 -0
- metadata +31 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 9dae4b31e210af6cea2f7df87d92e29d48e8b36d7408cfc0c542b4aa0fe4ea22
         | 
| 4 | 
            +
              data.tar.gz: 3c1be9afcd157d1c7a4aabf6f0688b049a80699133e6a3d31d17874bce453b5a
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 7975e43767efe81a4d32819a62ce805d88c51c879e7456f9ea653be43521501bf79612d61ea95ab065efcf5bf7c43fa7f4c2e657a0ab09e211310200237faceb
         | 
| 7 | 
            +
              data.tar.gz: 03f711b7f01ba88e9e84676ce442737bf8c7cd14db67cd04bdd50aa30eddaad850133d476e11b7a0c0ed25f485740810d6724e0449f7343cc10345bc67ba9c5c
         | 
    
        data/.rubocop.yml
    CHANGED
    
    
    
        data/Changes
    CHANGED
    
    | @@ -1,5 +1,17 @@ | |
| 1 1 | 
             
            Change history of write_xlsx rubygem.
         | 
| 2 2 |  | 
| 3 | 
            +
            2023-12-26 v1.11.2
         | 
| 4 | 
            +
                Fix issue where header images in chartsheets weren't displayed.
         | 
| 5 | 
            +
                Add support for custom table total functions.
         | 
| 6 | 
            +
                Add chart option to display N/A as empty cells.
         | 
| 7 | 
            +
                Add support for leader lines to all chart types.
         | 
| 8 | 
            +
                Fix issue where column formulas were overwritten by table data
         | 
| 9 | 
            +
                add Worksheet#very_hidden method.
         | 
| 10 | 
            +
                Add add trendline equation formatting for chart.
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            2023-08-09 v1.11.1
         | 
| 13 | 
            +
                Fixed issue #110. Redefining costant Struct::ColInfo
         | 
| 14 | 
            +
             | 
| 3 15 | 
             
            2023-05-06 v1.11.0
         | 
| 4 16 | 
             
                Added support for simulated worksheet `autofit()`.
         | 
| 5 17 |  | 
    
        data/examples/shape_all.rb
    CHANGED
    
    | @@ -218,7 +218,7 @@ shapes_list.each_line do |line| | |
| 218 218 | 
             
              line = line.chomp
         | 
| 219 219 | 
             
              next unless line =~ /^\w/    # Skip blank lines and comments.
         | 
| 220 220 |  | 
| 221 | 
            -
              sheet, name = line.split( | 
| 221 | 
            +
              sheet, name = line.split("\t")
         | 
| 222 222 | 
             
              if last_sheet != sheet
         | 
| 223 223 | 
             
                worksheet = workbook.add_worksheet(sheet)
         | 
| 224 224 | 
             
                row       = 2
         | 
    
        data/lib/write_xlsx/chart/bar.rb
    CHANGED
    
    
    
        data/lib/write_xlsx/chart/pie.rb
    CHANGED
    
    | @@ -1,4 +1,5 @@ | |
| 1 1 | 
             
            # -*- coding: utf-8 -*-
         | 
| 2 | 
            +
            # frozen_string_literal: true
         | 
| 2 3 |  | 
| 3 4 | 
             
            ###############################################################################
         | 
| 4 5 | 
             
            #
         | 
| @@ -122,8 +123,7 @@ module Writexlsx | |
| 122 123 | 
             
                  # Write the <c:legend> element.
         | 
| 123 124 | 
             
                  #
         | 
| 124 125 | 
             
                  def write_legend
         | 
| 125 | 
            -
                     | 
| 126 | 
            -
                    allowed  = %w[right left top bottom]
         | 
| 126 | 
            +
                    allowed = %w[right left top bottom]
         | 
| 127 127 | 
             
                    delete_series = @legend.delete_series || []
         | 
| 128 128 |  | 
| 129 129 | 
             
                    if @legend.position =~ /^overlay_/
         | 
| @@ -206,6 +206,19 @@ module Writexlsx | |
| 206 206 | 
             
                  def write_first_slice_ang
         | 
| 207 207 | 
             
                    @writer.empty_tag('c:firstSliceAng', [['val', @rotation]])
         | 
| 208 208 | 
             
                  end
         | 
| 209 | 
            +
             | 
| 210 | 
            +
                  #
         | 
| 211 | 
            +
                  # Write the <c:showLeaderLines> element. This is for Pie/Doughnut charts.
         | 
| 212 | 
            +
                  # Other chart types only supported leader lines after Excel 2015 via an
         | 
| 213 | 
            +
                  # extension element.
         | 
| 214 | 
            +
                  #
         | 
| 215 | 
            +
                  def write_show_leader_lines
         | 
| 216 | 
            +
                    val  = 1
         | 
| 217 | 
            +
             | 
| 218 | 
            +
                    attributes = [['val', val]]
         | 
| 219 | 
            +
             | 
| 220 | 
            +
                    @writer.empty_tag('c:showLeaderLines', attributes)
         | 
| 221 | 
            +
                  end
         | 
| 209 222 | 
             
                end
         | 
| 210 223 | 
             
              end
         | 
| 211 224 | 
             
            end
         | 
| @@ -1,4 +1,5 @@ | |
| 1 1 | 
             
            # -*- coding: utf-8 -*-
         | 
| 2 | 
            +
            # frozen_string_literal: true
         | 
| 2 3 |  | 
| 3 4 | 
             
            module Writexlsx
         | 
| 4 5 | 
             
              class Chart
         | 
| @@ -58,10 +59,13 @@ module Writexlsx | |
| 58 59 | 
             
                class Trendline < Chartline
         | 
| 59 60 | 
             
                  attr_reader :name, :forward, :backward, :order, :period
         | 
| 60 61 | 
             
                  attr_reader :intercept, :display_equation, :display_r_squared
         | 
| 62 | 
            +
                  attr_reader :label
         | 
| 61 63 |  | 
| 62 64 | 
             
                  def initialize(params)
         | 
| 63 65 | 
             
                    super(params)
         | 
| 64 66 |  | 
| 67 | 
            +
                    @label = trendline_label_properties(params[:label])
         | 
| 68 | 
            +
             | 
| 65 69 | 
             
                    @name              = params[:name]
         | 
| 66 70 | 
             
                    @forward           = params[:forward]
         | 
| 67 71 | 
             
                    @backward          = params[:backward]
         | 
| @@ -75,6 +79,51 @@ module Writexlsx | |
| 75 79 |  | 
| 76 80 | 
             
                  private
         | 
| 77 81 |  | 
| 82 | 
            +
                  #
         | 
| 83 | 
            +
                  # Convert user defined trendline label properties to the structure required
         | 
| 84 | 
            +
                  # internally.
         | 
| 85 | 
            +
                  #
         | 
| 86 | 
            +
                  def trendline_label_properties(_label)
         | 
| 87 | 
            +
                    return unless _label || _label.is_a?(Hash)
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                    # Copy the user supplied properties.
         | 
| 90 | 
            +
                    label = {}
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                    # Set the font properties for the label.
         | 
| 93 | 
            +
                    label[:font] = convert_font_args(_label[:font]) if ptrue?(_label[:font])
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                    # Set the line properties for the label.
         | 
| 96 | 
            +
                    line = line_properties(_label[:line])
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                    # Allow 'border' as a synonym for 'line'.
         | 
| 99 | 
            +
                    line = line_properties(_label[:border]) if ptrue?(_label[:border])
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                    # Set the fill properties for the label.
         | 
| 102 | 
            +
                    fill = fill_properties(_label[:fill])
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                    # Set the pattern properties for the label.
         | 
| 105 | 
            +
                    pattern = pattern_properties(_label[:pattern])
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                    # Set the gradient fill properties for the label.
         | 
| 108 | 
            +
                    gradient = gradient_properties(_label[:gradient])
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                    # Pattern fill overrides solid fill.
         | 
| 111 | 
            +
                    fill = nil if ptrue?(pattern)
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                    # Gradient fill overrides solid and pattern fills.
         | 
| 114 | 
            +
                    if ptrue?(gradient)
         | 
| 115 | 
            +
                      pattern = nil
         | 
| 116 | 
            +
                      fill    = nil
         | 
| 117 | 
            +
                    end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                    label[:line]     = line
         | 
| 120 | 
            +
                    label[:fill]     = fill
         | 
| 121 | 
            +
                    label[:pattern]  = pattern
         | 
| 122 | 
            +
                    label[:gradient] = gradient
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                    label
         | 
| 125 | 
            +
                  end
         | 
| 126 | 
            +
             | 
| 78 127 | 
             
                  def types
         | 
| 79 128 | 
             
                    {
         | 
| 80 129 | 
             
                      exponential:    'exp',
         | 
| @@ -182,6 +231,7 @@ module Writexlsx | |
| 182 231 | 
             
                  attr_reader :values, :categories, :name, :name_formula, :name_id
         | 
| 183 232 | 
             
                  attr_reader :cat_data_id, :val_data_id, :fill, :pattern, :gradient
         | 
| 184 233 | 
             
                  attr_reader :trendline, :smooth, :labels, :invert_if_negative
         | 
| 234 | 
            +
                  attr_reader :inverted_color
         | 
| 185 235 | 
             
                  attr_reader :x2_axis, :y2_axis, :error_bars, :points
         | 
| 186 236 | 
             
                  attr_accessor :line, :marker
         | 
| 187 237 |  | 
| @@ -217,10 +267,12 @@ module Writexlsx | |
| 217 267 |  | 
| 218 268 | 
             
                    @label_positions = chart.label_positions
         | 
| 219 269 | 
             
                    @label_position_default = chart.label_position_default
         | 
| 220 | 
            -
                    @labels | 
| 270 | 
            +
                    @labels = labels_properties(params[:data_labels])
         | 
| 271 | 
            +
                    @inverted_color = params[:invert_if_negative_color]
         | 
| 221 272 |  | 
| 222 | 
            -
                    %i[ | 
| 223 | 
            -
                       | 
| 273 | 
            +
                    %i[
         | 
| 274 | 
            +
                      smooth invert_if_negative x2_axis y2_axis
         | 
| 275 | 
            +
                    ].each { |key| instance_variable_set("@#{key}", params[key]) }
         | 
| 224 276 | 
             
                  end
         | 
| 225 277 |  | 
| 226 278 | 
             
                  def ==(other)
         | 
| @@ -228,7 +280,7 @@ module Writexlsx | |
| 228 280 | 
             
                      categories values name name_formula name_id
         | 
| 229 281 | 
             
                      cat_data_id val_data_id
         | 
| 230 282 | 
             
                      line fill gradient marker trendline
         | 
| 231 | 
            -
                      smooth labels  | 
| 283 | 
            +
                      smooth labels inverted_color
         | 
| 232 284 | 
             
                      x2_axis y2_axis error_bars points
         | 
| 233 285 | 
             
                    ]
         | 
| 234 286 | 
             
                    methods.each do |method|
         | 
    
        data/lib/write_xlsx/chart.rb
    CHANGED
    
    | @@ -568,6 +568,13 @@ module Writexlsx | |
| 568 568 | 
             
                  @is_secondary
         | 
| 569 569 | 
             
                end
         | 
| 570 570 |  | 
| 571 | 
            +
                #
         | 
| 572 | 
            +
                # Set the option for displaying #N/A as an empty cell in a chart.
         | 
| 573 | 
            +
                #
         | 
| 574 | 
            +
                def show_na_as_empty_cell
         | 
| 575 | 
            +
                  @show_na_as_empty = true
         | 
| 576 | 
            +
                end
         | 
| 577 | 
            +
             | 
| 571 578 | 
             
                private
         | 
| 572 579 |  | 
| 573 580 | 
             
                def axis_setup
         | 
| @@ -598,6 +605,7 @@ module Writexlsx | |
| 598 605 | 
             
                  @cross_between     = 'between'
         | 
| 599 606 | 
             
                  @date_category     = false
         | 
| 600 607 | 
             
                  @show_blanks       = 'gap'
         | 
| 608 | 
            +
                  @show_na_as_empty  = false
         | 
| 601 609 | 
             
                  @show_hidden_data  = false
         | 
| 602 610 | 
             
                  @show_crosses      = true
         | 
| 603 611 | 
             
                end
         | 
| @@ -782,6 +790,9 @@ module Writexlsx | |
| 782 790 |  | 
| 783 791 | 
             
                    # Write the c:dispBlanksAs element.
         | 
| 784 792 | 
             
                    write_disp_blanks_as
         | 
| 793 | 
            +
             | 
| 794 | 
            +
                    # Write the c:extLst element.
         | 
| 795 | 
            +
                    write_ext_lst_display_na if @show_na_as_empty
         | 
| 785 796 | 
             
                  end
         | 
| 786 797 | 
             
                end
         | 
| 787 798 |  | 
| @@ -950,10 +961,62 @@ module Writexlsx | |
| 950 961 | 
             
                    write_val(series)
         | 
| 951 962 | 
             
                    # Write the c:smooth element.
         | 
| 952 963 | 
             
                    write_c_smooth(series.smooth) if ptrue?(@smooth_allowed)
         | 
| 964 | 
            +
                    # Write the c:extLst element.
         | 
| 965 | 
            +
                    write_ext_lst_inverted_fill(series.inverted_color) if series.inverted_color
         | 
| 953 966 | 
             
                  end
         | 
| 954 967 | 
             
                  @series_index += 1
         | 
| 955 968 | 
             
                end
         | 
| 956 969 |  | 
| 970 | 
            +
                def write_ext_lst_inverted_fill(color)
         | 
| 971 | 
            +
                  uri = '{6F2FDCE9-48DA-4B69-8628-5D25D57E5C99}'
         | 
| 972 | 
            +
                  xmlns_c_14 =
         | 
| 973 | 
            +
                    'http://schemas.microsoft.com/office/drawing/2007/8/2/chart'
         | 
| 974 | 
            +
             | 
| 975 | 
            +
                  attributes_1 = [
         | 
| 976 | 
            +
                    ['uri', uri],
         | 
| 977 | 
            +
                    ['xmlns:c14', xmlns_c_14]
         | 
| 978 | 
            +
                  ]
         | 
| 979 | 
            +
             | 
| 980 | 
            +
                  attributes_2 = [
         | 
| 981 | 
            +
                    ['xmlns:c14', xmlns_c_14]
         | 
| 982 | 
            +
                  ]
         | 
| 983 | 
            +
             | 
| 984 | 
            +
                  @writer.tag_elements('c:extLst') do
         | 
| 985 | 
            +
                    @writer.tag_elements('c:ext', attributes_1) do
         | 
| 986 | 
            +
                      @writer.tag_elements('c14:invertSolidFillFmt') do
         | 
| 987 | 
            +
                        @writer.tag_elements('c14:spPr', attributes_2) do
         | 
| 988 | 
            +
                          write_a_solid_fill(color: color)
         | 
| 989 | 
            +
                        end
         | 
| 990 | 
            +
                      end
         | 
| 991 | 
            +
                    end
         | 
| 992 | 
            +
                  end
         | 
| 993 | 
            +
                end
         | 
| 994 | 
            +
             | 
| 995 | 
            +
                #
         | 
| 996 | 
            +
                # Write the <c:extLst> element for the display N/A as empty cell option.
         | 
| 997 | 
            +
                #
         | 
| 998 | 
            +
                def write_ext_lst_display_na
         | 
| 999 | 
            +
                  uri        = '{56B9EC1D-385E-4148-901F-78D8002777C0}'
         | 
| 1000 | 
            +
                  xmlns_c_16 = 'http://schemas.microsoft.com/office/drawing/2017/03/chart'
         | 
| 1001 | 
            +
             | 
| 1002 | 
            +
                  attributes1 = [
         | 
| 1003 | 
            +
                    ['uri', uri],
         | 
| 1004 | 
            +
                    ['xmlns:c16r3', xmlns_c_16]
         | 
| 1005 | 
            +
                  ]
         | 
| 1006 | 
            +
             | 
| 1007 | 
            +
                  attributes2 = [
         | 
| 1008 | 
            +
                    ['val', 1]
         | 
| 1009 | 
            +
                  ]
         | 
| 1010 | 
            +
             | 
| 1011 | 
            +
                  @writer.tag_elements('c:extLst') do
         | 
| 1012 | 
            +
                    @writer.tag_elements('c:ext', attributes1) do
         | 
| 1013 | 
            +
                      @writer.tag_elements('c16r3:dataDisplayOptions16') do
         | 
| 1014 | 
            +
                        @writer.empty_tag('c16r3:dispNaAsBlank', attributes2)
         | 
| 1015 | 
            +
                      end
         | 
| 1016 | 
            +
                    end
         | 
| 1017 | 
            +
                  end
         | 
| 1018 | 
            +
                end
         | 
| 1019 | 
            +
             | 
| 957 1020 | 
             
                def write_ser_base(series)
         | 
| 958 1021 | 
             
                  # Write the c:idx element.
         | 
| 959 1022 | 
             
                  write_idx(@series_index)
         | 
| @@ -2018,20 +2081,25 @@ module Writexlsx | |
| 2018 2081 | 
             
                    attributes << ['w', width]
         | 
| 2019 2082 | 
             
                  end
         | 
| 2020 2083 |  | 
| 2021 | 
            -
                   | 
| 2022 | 
            -
                     | 
| 2023 | 
            -
             | 
| 2024 | 
            -
                       | 
| 2025 | 
            -
             | 
| 2026 | 
            -
             | 
| 2027 | 
            -
                       | 
| 2028 | 
            -
             | 
| 2029 | 
            -
             | 
| 2030 | 
            -
             | 
| 2031 | 
            -
             | 
| 2032 | 
            -
                      # Write the  | 
| 2033 | 
            -
                       | 
| 2084 | 
            +
                  if ptrue?(line[:none]) || ptrue?(line[:color]) || line[:dash_type]
         | 
| 2085 | 
            +
                    @writer.tag_elements('a:ln', attributes) do
         | 
| 2086 | 
            +
                      # Write the line fill.
         | 
| 2087 | 
            +
                      if ptrue?(line[:none])
         | 
| 2088 | 
            +
                        # Write the a:noFill element.
         | 
| 2089 | 
            +
                        write_a_no_fill
         | 
| 2090 | 
            +
                      elsif ptrue?(line[:color])
         | 
| 2091 | 
            +
                        # Write the a:solidFill element.
         | 
| 2092 | 
            +
                        write_a_solid_fill(line)
         | 
| 2093 | 
            +
                      end
         | 
| 2094 | 
            +
             | 
| 2095 | 
            +
                      # Write the line/dash type.
         | 
| 2096 | 
            +
                      if line[:dash_type]
         | 
| 2097 | 
            +
                        # Write the a:prstDash element.
         | 
| 2098 | 
            +
                        write_a_prst_dash(line[:dash_type])
         | 
| 2099 | 
            +
                      end
         | 
| 2034 2100 | 
             
                    end
         | 
| 2101 | 
            +
                  else
         | 
| 2102 | 
            +
                    @writer.empty_tag('a:ln', attributes)
         | 
| 2035 2103 | 
             
                  end
         | 
| 2036 2104 | 
             
                end
         | 
| 2037 2105 |  | 
| @@ -2091,7 +2159,7 @@ module Writexlsx | |
| 2091 2159 | 
             
                      # Write the c:dispEq element.
         | 
| 2092 2160 | 
             
                      write_disp_eq
         | 
| 2093 2161 | 
             
                      # Write the c:trendlineLbl element.
         | 
| 2094 | 
            -
                      write_trendline_lbl
         | 
| 2162 | 
            +
                      write_trendline_lbl(trendline)
         | 
| 2095 2163 | 
             
                    end
         | 
| 2096 2164 | 
             
                  end
         | 
| 2097 2165 | 
             
                end
         | 
| @@ -2168,12 +2236,18 @@ module Writexlsx | |
| 2168 2236 | 
             
                #
         | 
| 2169 2237 | 
             
                # Write the <c:trendlineLbl> element.
         | 
| 2170 2238 | 
             
                #
         | 
| 2171 | 
            -
                def write_trendline_lbl
         | 
| 2239 | 
            +
                def write_trendline_lbl(trendline)
         | 
| 2172 2240 | 
             
                  @writer.tag_elements('c:trendlineLbl') do
         | 
| 2173 2241 | 
             
                    # Write the c:layout element.
         | 
| 2174 2242 | 
             
                    write_layout
         | 
| 2175 2243 | 
             
                    # Write the c:numFmt element.
         | 
| 2176 2244 | 
             
                    write_trendline_num_fmt
         | 
| 2245 | 
            +
                    # Write the c:spPr element for the label formatting.
         | 
| 2246 | 
            +
                    write_sp_pr(trendline.label)
         | 
| 2247 | 
            +
                    # Write the data label font elements.
         | 
| 2248 | 
            +
                    if trendline.label && ptrue?(trendline.label[:font])
         | 
| 2249 | 
            +
                      write_axis_font(trendline.label[:font])
         | 
| 2250 | 
            +
                    end
         | 
| 2177 2251 | 
             
                  end
         | 
| 2178 2252 | 
             
                end
         | 
| 2179 2253 |  | 
| @@ -2513,11 +2587,25 @@ module Writexlsx | |
| 2513 2587 | 
             
                  @writer.data_element('c:separator', data)
         | 
| 2514 2588 | 
             
                end
         | 
| 2515 2589 |  | 
| 2516 | 
            -
                #
         | 
| 2517 | 
            -
                #  | 
| 2518 | 
            -
                #
         | 
| 2590 | 
            +
                # Write the <c:showLeaderLines> element. This is different for Pie/Doughnut
         | 
| 2591 | 
            +
                # charts. Other chart types only supported leader lines after Excel 2015 via
         | 
| 2592 | 
            +
                # an extension element.
         | 
| 2519 2593 | 
             
                def write_show_leader_lines
         | 
| 2520 | 
            -
                   | 
| 2594 | 
            +
                  uri        = '{CE6537A1-D6FC-4f65-9D91-7224C49458BB}'
         | 
| 2595 | 
            +
                  xmlns_c_15 = 'http://schemas.microsoft.com/office/drawing/2012/chart'
         | 
| 2596 | 
            +
             | 
| 2597 | 
            +
                  attributes1 = [
         | 
| 2598 | 
            +
                    ['uri', uri],
         | 
| 2599 | 
            +
                    ['xmlns:c15', xmlns_c_15]
         | 
| 2600 | 
            +
                  ]
         | 
| 2601 | 
            +
             | 
| 2602 | 
            +
                  attributes2 = [['val',  1]]
         | 
| 2603 | 
            +
             | 
| 2604 | 
            +
                  @writer.tag_elements('c:extLst') do
         | 
| 2605 | 
            +
                    @writer.tag_elements('c:ext', attributes1) do
         | 
| 2606 | 
            +
                      @writer.empty_tag('c15:showLeaderLines', attributes2)
         | 
| 2607 | 
            +
                    end
         | 
| 2608 | 
            +
                  end
         | 
| 2521 2609 | 
             
                end
         | 
| 2522 2610 |  | 
| 2523 2611 | 
             
                #
         | 
| @@ -2831,8 +2919,6 @@ module Writexlsx | |
| 2831 2919 | 
             
                # Write the <a:fillToRect> element.
         | 
| 2832 2920 | 
             
                #
         | 
| 2833 2921 | 
             
                def write_a_fill_to_rect(type)
         | 
| 2834 | 
            -
                  attributes = []
         | 
| 2835 | 
            -
             | 
| 2836 2922 | 
             
                  attributes = if type == 'shape'
         | 
| 2837 2923 | 
             
                                 [
         | 
| 2838 2924 | 
             
                                   ['l', 50000],
         | 
| @@ -2854,8 +2940,6 @@ module Writexlsx | |
| 2854 2940 | 
             
                # Write the <a:tileRect> element.
         | 
| 2855 2941 | 
             
                #
         | 
| 2856 2942 | 
             
                def write_a_tile_rect(type)
         | 
| 2857 | 
            -
                  attributes = []
         | 
| 2858 | 
            -
             | 
| 2859 2943 | 
             
                  attributes = if type == 'shape'
         | 
| 2860 2944 | 
             
                                 []
         | 
| 2861 2945 | 
             
                               else
         | 
| @@ -54,6 +54,8 @@ module Writexlsx | |
| 54 54 | 
             
                      write_header_footer
         | 
| 55 55 | 
             
                      # Write the drawing element.
         | 
| 56 56 | 
             
                      write_drawings
         | 
| 57 | 
            +
                      # Write the legaacyDrawingHF element.
         | 
| 58 | 
            +
                      write_legacy_drawing_hf
         | 
| 57 59 | 
             
                      # Close the worksheet tag.
         | 
| 58 60 | 
             
                    end
         | 
| 59 61 | 
             
                  end
         | 
| @@ -145,6 +147,10 @@ module Writexlsx | |
| 145 147 | 
             
                  @chart.show_blanks_as(*args)
         | 
| 146 148 | 
             
                end
         | 
| 147 149 |  | 
| 150 | 
            +
                def show_na_as_empty_cell
         | 
| 151 | 
            +
                  @chart.show_na_as_empty_cell(*args)
         | 
| 152 | 
            +
                end
         | 
| 153 | 
            +
             | 
| 148 154 | 
             
                def show_hidden_data(*args)
         | 
| 149 155 | 
             
                  @chart.show_hidden_data(*args)
         | 
| 150 156 | 
             
                end
         | 
| @@ -185,7 +191,10 @@ module Writexlsx | |
| 185 191 | 
             
                end
         | 
| 186 192 |  | 
| 187 193 | 
             
                def external_links
         | 
| 188 | 
            -
                  [ | 
| 194 | 
            +
                  [
         | 
| 195 | 
            +
                    @external_drawing_links,
         | 
| 196 | 
            +
                    @external_vml_links
         | 
| 197 | 
            +
                  ]
         | 
| 189 198 | 
             
                end
         | 
| 190 199 |  | 
| 191 200 | 
             
                private
         | 
    
        data/lib/write_xlsx/col_name.rb
    CHANGED
    
    | @@ -7,12 +7,16 @@ class ColName | |
| 7 7 | 
             
              include Singleton
         | 
| 8 8 |  | 
| 9 9 | 
             
              def initialize
         | 
| 10 | 
            -
                @col_str_table =  | 
| 10 | 
            +
                @col_str_table = []
         | 
| 11 | 
            +
                @row_str_table = []
         | 
| 11 12 | 
             
              end
         | 
| 12 13 |  | 
| 13 14 | 
             
              def col_str(col)
         | 
| 14 | 
            -
                @col_str_table[col]  | 
| 15 | 
            -
             | 
| 15 | 
            +
                @col_str_table[col] ||= col_str_build(col)
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              def row_str(row)
         | 
| 19 | 
            +
                @row_str_table[row] ||= row.to_s
         | 
| 16 20 | 
             
              end
         | 
| 17 21 |  | 
| 18 22 | 
             
              private
         | 
    
        data/lib/write_xlsx/colors.rb
    CHANGED
    
    | @@ -4,25 +4,26 @@ | |
| 4 4 | 
             
            module Writexlsx
         | 
| 5 5 | 
             
              class Colors
         | 
| 6 6 | 
             
                COLORS = {
         | 
| 7 | 
            -
                  aqua: | 
| 8 | 
            -
                  cyan: | 
| 9 | 
            -
                  black: | 
| 10 | 
            -
                  blue: | 
| 11 | 
            -
                  brown: | 
| 12 | 
            -
                  magenta: | 
| 13 | 
            -
                  fuchsia: | 
| 14 | 
            -
                  gray: | 
| 15 | 
            -
                  grey: | 
| 16 | 
            -
                  green: | 
| 17 | 
            -
                  lime: | 
| 18 | 
            -
                  navy: | 
| 19 | 
            -
                  orange: | 
| 20 | 
            -
                  pink: | 
| 21 | 
            -
                  purple: | 
| 22 | 
            -
                  red: | 
| 23 | 
            -
                  silver: | 
| 24 | 
            -
                  white: | 
| 25 | 
            -
                  yellow: | 
| 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 | 
             
                ###############################################################################
         | 
    
        data/lib/write_xlsx/format.rb
    CHANGED
    
    | @@ -324,7 +324,7 @@ module Writexlsx | |
| 324 324 | 
             
                    return colors[color_code.downcase.to_sym] if colors[color_code.downcase.to_sym]
         | 
| 325 325 |  | 
| 326 326 | 
             
                    # or the default color if string is unrecognised,
         | 
| 327 | 
            -
                     | 
| 327 | 
            +
                    0x00 if color_code =~ /\D/
         | 
| 328 328 | 
             
                  else
         | 
| 329 329 | 
             
                    # or an index < 8 mapped into the correct range,
         | 
| 330 330 | 
             
                    return color_code + 8 if color_code < 8
         | 
| @@ -584,14 +584,16 @@ module Writexlsx | |
| 584 584 | 
             
                    if theme == -1
         | 
| 585 585 | 
             
                    # Ignore for excel2003_style
         | 
| 586 586 | 
             
                    elsif ptrue?(theme)
         | 
| 587 | 
            -
                      write_color( | 
| 587 | 
            +
                      write_color('theme', theme, writer)
         | 
| 588 588 | 
             
                    elsif ptrue?(@color_indexed)
         | 
| 589 | 
            -
                      write_color( | 
| 589 | 
            +
                      write_color('indexed', @color_indexed, writer)
         | 
| 590 590 | 
             
                    elsif ptrue?(@color)
         | 
| 591 591 | 
             
                      color = worksheet.palette_color(@color)
         | 
| 592 | 
            -
                       | 
| 592 | 
            +
                      if color != 'Automatic'
         | 
| 593 | 
            +
                        write_color('rgb', color, writer)
         | 
| 594 | 
            +
                      end
         | 
| 593 595 | 
             
                    elsif !ptrue?(dxf_format)
         | 
| 594 | 
            -
                      write_color( | 
| 596 | 
            +
                      write_color('theme', 1, writer)
         | 
| 595 597 | 
             
                    end
         | 
| 596 598 |  | 
| 597 599 | 
             
                    unless ptrue?(dxf_format)
         | 
| @@ -607,12 +609,12 @@ module Writexlsx | |
| 607 609 | 
             
                    writer.empty_tag('sz', [['val', size]])
         | 
| 608 610 |  | 
| 609 611 | 
             
                    if ptrue?(theme)
         | 
| 610 | 
            -
                      write_color( | 
| 612 | 
            +
                      write_color('theme', theme, writer)
         | 
| 611 613 | 
             
                    elsif ptrue?(@color)
         | 
| 612 614 | 
             
                      color = worksheet.palette_color(@color)
         | 
| 613 | 
            -
                      write_color( | 
| 615 | 
            +
                      write_color('rgb', color, writer)
         | 
| 614 616 | 
             
                    else
         | 
| 615 | 
            -
                      write_color( | 
| 617 | 
            +
                      write_color('theme', 1, writer)
         | 
| 616 618 | 
             
                    end
         | 
| 617 619 |  | 
| 618 620 | 
             
                    writer.empty_tag('rFont', [['val', @font]])
         | 
| @@ -46,7 +46,9 @@ module Writexlsx | |
| 46 46 | 
             
                    add_heading_pair(
         | 
| 47 47 | 
             
                      [
         | 
| 48 48 | 
             
                        'Worksheets',
         | 
| 49 | 
            -
                        @workbook.worksheets.reject  | 
| 49 | 
            +
                        @workbook.worksheets.reject do |s|
         | 
| 50 | 
            +
                          s.is_chartsheet? || s.very_hidden?
         | 
| 51 | 
            +
                        end.count
         | 
| 50 52 | 
             
                      ]
         | 
| 51 53 | 
             
                    )
         | 
| 52 54 | 
             
                  end
         | 
| @@ -57,14 +59,16 @@ module Writexlsx | |
| 57 59 |  | 
| 58 60 | 
             
                  def add_worksheet_part_names
         | 
| 59 61 | 
             
                    @workbook.worksheets
         | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 62 | 
            +
                      .reject { |sheet| sheet.is_chartsheet? || sheet.very_hidden? }
         | 
| 63 | 
            +
                      .each  do |sheet|
         | 
| 64 | 
            +
                      add_part_name(sheet.name)
         | 
| 65 | 
            +
                    end
         | 
| 62 66 | 
             
                  end
         | 
| 63 67 |  | 
| 64 68 | 
             
                  def add_chartsheet_part_names
         | 
| 65 69 | 
             
                    @workbook.worksheets
         | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 70 | 
            +
                      .select { |sheet| sheet.is_chartsheet? }
         | 
| 71 | 
            +
                      .each   { |sheet| add_part_name(sheet.name) }
         | 
| 68 72 | 
             
                  end
         | 
| 69 73 |  | 
| 70 74 | 
             
                  def add_part_name(part_name)
         | 
| @@ -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 | 
            -
                     | 
| 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
         |