write_xlsx 1.10.1 → 1.10.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 66e9354b51872770af7121d5581615b53c0cb3b7e86c221b0ecee60fe54dae4b
4
- data.tar.gz: 97d6ae9ed6dee9e57e98981e105da155ef405fd5ea40ea17e8057871f02d90d9
3
+ metadata.gz: 74c1fe583292a7a5318db09651b114e58358646a8706b5b4d35fc01c1850ec6c
4
+ data.tar.gz: 424d3f3a1983e4de16de9a943c67718874e7ef7e4a78c440767ecf8c68f0ef88
5
5
  SHA512:
6
- metadata.gz: a86f539563acd7da100be9fb11e1e3da99c1985200e21eaa91ca9db3f69ea130038f0ecead40ea0ba6efcc5b4f433dcd4acf039006faa65adb60ed88d0d5f005
7
- data.tar.gz: f98a3ac1110600e8e2c578127f85a804c1237d44069481f6c0baacc27ff6f21eddbb96f063c544239730ba059a16f7637f39ebfd902f3cc87be4995401bf303b
6
+ metadata.gz: 4603c1400dd60ec345b8cf4db50ae1c03e87716192a074d2a767cebc7cfc085439c733ea11167cf900efc3aae3fe555a32639731d36338100bf9fbb170f28fd5
7
+ data.tar.gz: 3ccbb69460382ae8074cc62fc896daa1aa608dbbb6ff894bb1fc425643c0ac3b9e91cc55b0c8e2de05a50113b179621db83fcea033b9b201bf56957f833624e3
data/.rubocop.yml CHANGED
@@ -38,6 +38,9 @@ Lint/DuplicateBranch:
38
38
  Exclude:
39
39
  - 'lib/write_xlsx/worksheet.rb'
40
40
 
41
+ Lint/UnderscorePrefixedVariableName:
42
+ Enabled: false
43
+
41
44
  Lint/UselessSetterCall:
42
45
  Exclude:
43
46
  - 'lib/write_xlsx/worksheet.rb'
@@ -93,6 +96,9 @@ Style/HashSyntax:
93
96
  EnforceStyle: ruby19_no_mixed_keys
94
97
  EnforcedShorthandSyntax: either
95
98
 
99
+ Style/IfUnlessModifier:
100
+ Enabled: false
101
+
96
102
  Style/NumericLiterals:
97
103
  MinDigits: 10
98
104
 
data/Changes CHANGED
@@ -1,5 +1,11 @@
1
1
  Change history of write_xlsx rubygem.
2
2
 
3
+ 2023-02-16 v1.10.2
4
+ Fixed issue #104. Worksheet#write Ruby 3.2 removed Object#=~
5
+ making it impossible to write Date objects
6
+
7
+ Memory usage optimization.
8
+
3
9
  2023-01-31 v1.10.1
4
10
  Fixed PR #99. Remove range [1..] style to work on Ruby 2.5.
5
11
 
data/README.md CHANGED
@@ -85,7 +85,7 @@ the first worksheet in an Excel XML spreadsheet called ruby.xlsx:
85
85
  Original Perl module was written by John McNamara(jmcnamara@cpan.org).
86
86
 
87
87
  Converted to ruby by Hideo NAKAMURA(nakamrua.hideo@gmail.com)
88
- Copyright (c) 2012-2022 Hideo NAKAMURA.
88
+ Copyright (c) 2012-2023 Hideo NAKAMURA.
89
89
 
90
90
  See LICENSE.txt for further details.
91
91
 
@@ -409,12 +409,23 @@ module Writexlsx
409
409
 
410
410
  def row_col_param_for_conditional_formatting(*args)
411
411
  # Check for a cell reference in A1 notation and substitute row and column
412
- if args[0].to_s =~ (/^\D/) && (args[0] =~ /,/)
413
- # Check for a user defined multiple range like B3:K6,B8:K11.
414
- user_range = args[0].sub(/^=/, '').gsub(/\s*,\s*/, ' ').gsub(/\$/, '')
412
+ user_range = if args[0].to_s =~ (/^\D/) && (args[0] =~ /,/)
413
+ # Check for a user defined multiple range like B3:K6,B8:K11.
414
+ args[0].sub(/^=/, '').gsub(/\s*,\s*/, ' ').gsub(/\$/, '')
415
+ end
416
+
417
+ if (row_col_array = row_col_notation(args.first))
418
+ if row_col_array.size == 2
419
+ row1, col1 = row_col_array
420
+ row2 = args[1]
421
+ elsif row_col_array.size == 4
422
+ row1, col1, row2, col2 = row_col_array
423
+ param = args[1]
424
+ end
425
+ else
426
+ row1, col1, row2, col2, param = args
415
427
  end
416
428
 
417
- row1, col1, row2, col2, param = row_col_notation(args)
418
429
  if row2.respond_to?(:keys)
419
430
  param = row2
420
431
  row2 = row1
@@ -162,41 +162,50 @@ module Writexlsx
162
162
 
163
163
  private
164
164
 
165
- def handle_args(*args)
165
+ def handle_args(row1, col1 = nil, row2 = nil, col2 = nil, param = nil)
166
166
  # Check for a cell reference in A1 notation and substitute row and column
167
- row1, col1, row2, col2, param = row_col_notation(args)
167
+ if (row_col_array = row_col_notation(row1))
168
+ _row1, _col1, _row2, _col2 = row_col_array
169
+ _param = col1
170
+ else
171
+ _row1 = row1
172
+ _col1 = col1
173
+ _row2 = row2
174
+ _col2 = col2
175
+ _param = param
176
+ end
168
177
 
169
178
  # Check for a valid number of args.
170
- raise "Not enough parameters to add_table()" if [row1, col1, row2, col2].include?(nil)
179
+ raise "Not enough parameters to add_table()" if [_row1, _col1, _row2, _col2].include?(nil)
171
180
 
172
181
  # Check that row and col are valid without storing the values.
173
- check_dimensions_and_update_max_min_values(row1, col1, 1, 1)
174
- check_dimensions_and_update_max_min_values(row2, col2, 1, 1)
182
+ check_dimensions_and_update_max_min_values(_row1, _col1, 1, 1)
183
+ check_dimensions_and_update_max_min_values(_row2, _col2, 1, 1)
175
184
 
176
185
  # Swap last row/col for first row/col as necessary.
177
- row1, row2 = row2, row1 if row1 > row2
178
- col1, col2 = col2, col1 if col1 > col2
186
+ _row1, _row2 = _row2, _row1 if _row1 > _row2
187
+ _col1, _col2 = _col2, _col1 if _col1 > _col2
179
188
 
180
189
  # The final hash contains the validation parameters.
181
- param ||= {}
190
+ _param ||= {}
182
191
 
183
192
  # Turn on Excel's defaults.
184
- param[:banded_rows] ||= 1
185
- param[:header_row] ||= 1
186
- param[:autofilter] ||= 1
193
+ _param[:banded_rows] ||= 1
194
+ _param[:header_row] ||= 1
195
+ _param[:autofilter] ||= 1
187
196
 
188
197
  # Check that there are enough rows.
189
- num_rows = row2 - row1
190
- num_rows -= 1 if ptrue?(param[:header_row])
198
+ num_rows = _row2 - _row1
199
+ num_rows -= 1 if ptrue?(_param[:header_row])
191
200
 
192
201
  raise "Must have at least one data row in in add_table()" if num_rows < 0
193
202
 
194
203
  # If the header row if off the default is to turn autofilter off.
195
- param[:autofilter] = 0 if param[:header_row] == 0
204
+ _param[:autofilter] = 0 if _param[:header_row] == 0
196
205
 
197
- check_parameter(param, valid_table_parameter, 'add_table')
206
+ check_parameter(_param, valid_table_parameter, 'add_table')
198
207
 
199
- [row1, row2, col1, col2, param]
208
+ [_row1, _row2, _col1, _col2, _param]
200
209
  end
201
210
 
202
211
  # List of valid input parameters.
@@ -53,7 +53,12 @@ module Writexlsx
53
53
 
54
54
  def xl_col_to_name(col, col_absolute)
55
55
  col_str = ColName.instance.col_str(col)
56
- "#{absolute_char(col_absolute)}#{col_str}"
56
+ if col_absolute
57
+ "#{absolute_char(col_absolute)}#{col_str}"
58
+ else
59
+ # Do not allocate new string
60
+ col_str
61
+ end
57
62
  end
58
63
 
59
64
  def xl_range(row_1, row_2, col_1, col_2,
@@ -252,12 +257,8 @@ module Writexlsx
252
257
  end
253
258
 
254
259
  # Check for a cell reference in A1 notation and substitute row and column
255
- def row_col_notation(args) # :nodoc:
256
- if args[0].to_s =~ /^\D/
257
- substitute_cellref(*args)
258
- else
259
- args
260
- end
260
+ def row_col_notation(row_or_a1) # :nodoc:
261
+ substitute_cellref(row_or_a1) if row_or_a1.to_s =~ /^\D/
261
262
  end
262
263
 
263
264
  #
@@ -267,7 +268,7 @@ module Writexlsx
267
268
  # Ex: ("A4", "Hello") is converted to (3, 0, "Hello").
268
269
  #
269
270
  def substitute_cellref(cell, *args) # :nodoc:
270
- return [*args] if cell.respond_to?(:coerce) # Numeric
271
+ # return [*args] if cell.respond_to?(:coerce) # Numeric
271
272
 
272
273
  normalized_cell = cell.upcase
273
274
 
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- WriteXLSX_VERSION = "1.10.1"
3
+ WriteXLSX_VERSION = "1.10.2"
@@ -13,7 +13,19 @@ module Writexlsx
13
13
 
14
14
  def initialize(*args)
15
15
  # Check for a cell reference in A1 notation and substitute row and column.
16
- row1, col1, row2, col2, options = row_col_notation(args)
16
+ if (row_col_array = row_col_notation(args.first))
17
+ case row_col_array.size
18
+ when 2
19
+ row1, col1 = row_col_array
20
+ row2, col2, options = args[1..-1]
21
+ when 4
22
+ row1, col1, row2, col2 = row_col_array
23
+ options = args[1]
24
+ end
25
+ else
26
+ row1, col1, row2, col2, options = args
27
+ end
28
+
17
29
  if row2.respond_to?(:keys)
18
30
  options_to_instance_variable(row2.dup)
19
31
  row2 = row1
@@ -15,6 +15,7 @@ require 'write_xlsx/worksheet/data_validation'
15
15
  require 'write_xlsx/worksheet/hyperlink'
16
16
  require 'write_xlsx/worksheet/page_setup'
17
17
  require 'tempfile'
18
+ require 'date'
18
19
 
19
20
  module Writexlsx
20
21
  class Worksheet
@@ -395,7 +396,12 @@ module Writexlsx
395
396
  def set_selection(*args)
396
397
  return if args.empty?
397
398
 
398
- row_first, col_first, row_last, col_last = row_col_notation(args)
399
+ if (row_col_array = row_col_notation(args.first))
400
+ row_first, col_first, row_last, col_last = row_col_array
401
+ else
402
+ row_first, col_first, row_last, col_last = args
403
+ end
404
+
399
405
  active_cell = xl_rowcol_to_cell(row_first, col_first)
400
406
 
401
407
  if row_last # Range selection.
@@ -420,10 +426,15 @@ module Writexlsx
420
426
  #
421
427
  # Set the first visible cell at the top left of the worksheet.
422
428
  #
423
- def set_top_left_cell(*args)
424
- row, col = row_col_notation(args)
429
+ def set_top_left_cell(row, col = nil)
430
+ if (row_col_array = row_col_notation(row))
431
+ _row, _col = row_col_array
432
+ else
433
+ _row = row
434
+ _col = col
435
+ end
425
436
 
426
- @top_left_cell = xl_rowcol_to_cell(row, col)
437
+ @top_left_cell = xl_rowcol_to_cell(_row, _col)
427
438
  end
428
439
 
429
440
  #
@@ -439,7 +450,12 @@ module Writexlsx
439
450
  return if args.empty?
440
451
 
441
452
  # Check for a cell reference in A1 notation and substitute row and column.
442
- row, col, top_row, left_col, type = row_col_notation(args)
453
+ if (row_col_array = row_col_notation(args.first))
454
+ row, col, top_row, left_col = row_col_array
455
+ type = args[1]
456
+ else
457
+ row, col, top_row, left_col, type = args
458
+ end
443
459
 
444
460
  col ||= 0
445
461
  top_row ||= row
@@ -772,7 +788,12 @@ module Writexlsx
772
788
  def print_area(*args)
773
789
  return @page_setup.print_area.dup if args.empty?
774
790
 
775
- row1, col1, row2, col2 = row_col_notation(args)
791
+ if (row_col_array = row_col_notation(args.first))
792
+ row1, col1, row2, col2 = row_col_array
793
+ else
794
+ row1, col1, row2, col2 = args
795
+ end
796
+
776
797
  return if [row1, col1, row2, col2].include?(nil)
777
798
 
778
799
  # Ignore max print area since this is the same as no print area for Excel.
@@ -889,50 +910,62 @@ module Writexlsx
889
910
  # data the {#write()}[#method-i-write] method acts as a general alias for several more
890
911
  # specific methods:
891
912
  #
892
- def write(*args)
913
+ def write(row, col, token = nil, format = nil, value1 = nil, value2 = nil)
893
914
  # Check for a cell reference in A1 notation and substitute row and column
894
- row_col_args = row_col_notation(args)
895
- token = row_col_args[2] || ''
896
- token = token.to_s if token.instance_of?(Time)
915
+ if (row_col_array = row_col_notation(row))
916
+ _row, _col = row_col_array
917
+ _token = col
918
+ _format = token
919
+ _value1 = format
920
+ _value2 = value1
921
+ else
922
+ _row = row
923
+ _col = col
924
+ _token = token
925
+ _format = format
926
+ _value1 = value1
927
+ _value2 = value2
928
+ end
929
+ _token ||= ''
930
+ _token = _token.to_s if token.instance_of?(Time) || token.instance_of?(Date)
897
931
 
898
- fmt = row_col_args[3]
899
- if fmt.respond_to?(:force_text_format?) && fmt.force_text_format?
900
- write_string(*args) # Force text format
932
+ if _format.respond_to?(:force_text_format?) && _format.force_text_format?
933
+ write_string(_row, _col, _token, _format) # Force text format
901
934
  # Match an array ref.
902
- elsif token.respond_to?(:to_ary)
903
- write_row(*args)
904
- elsif token.respond_to?(:coerce) # Numeric
905
- write_number(*args)
935
+ elsif _token.respond_to?(:to_ary)
936
+ write_row(_row, _col, _token, _format, _value1, _value2)
937
+ elsif _token.respond_to?(:coerce) # Numeric
938
+ write_number(_row, _col, _token, _format)
906
939
  # Match integer with leading zero(s)
907
- elsif @leading_zeros && token =~ /^0\d*$/
908
- write_string(*args)
909
- elsif token =~ /\A([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?\Z/
910
- write_number(*args)
940
+ elsif @leading_zeros && _token =~ /^0\d*$/
941
+ write_string(_row, _col, _token, _format)
942
+ elsif _token =~ /\A([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?\Z/
943
+ write_number(_row, _col, _token, _format)
911
944
  # Match formula
912
- elsif token =~ /^=/
913
- write_formula(*args)
945
+ elsif _token =~ /^=/
946
+ write_formula(_row, _col, _token, _format, _value1)
914
947
  # Match array formula
915
- elsif token =~ /^\{=.*\}$/
916
- write_formula(*args)
948
+ elsif _token =~ /^\{=.*\}$/
949
+ write_formula(_row, _col, _token, _format, _value1)
917
950
  # Match blank
918
- elsif token == ''
919
- row_col_args.delete_at(2) # remove the empty string from the parameter list
920
- write_blank(*row_col_args)
951
+ elsif _token == ''
952
+ # row_col_args.delete_at(2) # remove the empty string from the parameter list
953
+ write_blank(_row, _col, _format)
921
954
  elsif @workbook.strings_to_urls
922
955
  # Match http, https or ftp URL
923
- if token =~ %r{\A[fh]tt?ps?://}
924
- write_url(*args)
956
+ if _token =~ %r{\A[fh]tt?ps?://}
957
+ write_url(_row, _col, _token, _format, _value1, _value2)
925
958
  # Match mailto:
926
- elsif token =~ /\Amailto:/
927
- write_url(*args)
959
+ elsif _token =~ /\Amailto:/
960
+ write_url(_row, _col, _token, _format, _value1, _value2)
928
961
  # Match internal or external sheet link
929
- elsif token =~ /\A(?:in|ex)ternal:/
930
- write_url(*args)
962
+ elsif _token =~ /\A(?:in|ex)ternal:/
963
+ write_url(_row, _col, _token, _format, _value1, _value2)
931
964
  else
932
- write_string(*args)
965
+ write_string(_row, _col, _token, _format)
933
966
  end
934
967
  else
935
- write_string(*args)
968
+ write_string(_row, _col, _token, _format)
936
969
  end
937
970
  end
938
971
 
@@ -944,19 +977,28 @@ module Writexlsx
944
977
  # the elements of the array are in turn array. This allows the writing
945
978
  # of 1D or 2D arrays of data in one go.
946
979
  #
947
- def write_row(*args)
980
+ def write_row(row, col, tokens = nil, *options)
948
981
  # Check for a cell reference in A1 notation and substitute row and column
949
- row, col, tokens, *options = row_col_notation(args)
950
- raise "Not an array ref in call to write_row()$!" unless tokens.respond_to?(:to_ary)
982
+ if (row_col_array = row_col_notation(row))
983
+ _row, _col = row_col_array
984
+ _tokens = col
985
+ _options = [tokens] + options
986
+ else
987
+ _row = row
988
+ _col = col
989
+ _tokens = tokens
990
+ _options = options
991
+ end
992
+ raise "Not an array ref in call to write_row()$!" unless _tokens.respond_to?(:to_ary)
951
993
 
952
- tokens.each do |token|
994
+ _tokens.each do |_token|
953
995
  # Check for nested arrays
954
- if token.respond_to?(:to_ary)
955
- write_col(row, col, token, *options)
996
+ if _token.respond_to?(:to_ary)
997
+ write_col(_row, _col, _token, *_options)
956
998
  else
957
- write(row, col, token, *options)
999
+ write(_row, _col, _token, *_options)
958
1000
  end
959
- col += 1
1001
+ _col += 1
960
1002
  end
961
1003
  end
962
1004
 
@@ -968,13 +1010,22 @@ module Writexlsx
968
1010
  # the elements of the array are in turn array. This allows the writing
969
1011
  # of 1D or 2D arrays of data in one go.
970
1012
  #
971
- def write_col(*args)
972
- row, col, tokens, *options = row_col_notation(args)
1013
+ def write_col(row, col, tokens = nil, *options)
1014
+ if (row_col_array = row_col_notation(row))
1015
+ _row, _col = row_col_array
1016
+ _tokens = col
1017
+ _options = [tokens] + options if options
1018
+ else
1019
+ _row = row
1020
+ _col = col
1021
+ _tokens = tokens
1022
+ _options = options
1023
+ end
973
1024
 
974
- tokens.each do |token|
1025
+ _tokens.each do |_token|
975
1026
  # write() will deal with any nested arrays
976
- write(row, col, token, *options)
977
- row += 1
1027
+ write(_row, _col, _token, *_options)
1028
+ _row += 1
978
1029
  end
979
1030
  end
980
1031
 
@@ -984,19 +1035,28 @@ module Writexlsx
984
1035
  #
985
1036
  # Write a comment to the specified row and column (zero indexed).
986
1037
  #
987
- def write_comment(*args)
1038
+ def write_comment(row, col, string = nil, options = nil)
988
1039
  # Check for a cell reference in A1 notation and substitute row and column
989
- row, col, string, options = row_col_notation(args)
990
- raise WriteXLSXInsufficientArgumentError if [row, col, string].include?(nil)
1040
+ if (row_col_array = row_col_notation(row))
1041
+ _row, _col = row_col_array
1042
+ _string = col
1043
+ _options = string
1044
+ else
1045
+ _row = row
1046
+ _col = col
1047
+ _string = string
1048
+ _options = options
1049
+ end
1050
+ raise WriteXLSXInsufficientArgumentError if [_row, _col, _string].include?(nil)
991
1051
 
992
1052
  # Check that row and col are valid and store max and min values
993
- check_dimensions(row, col)
994
- store_row_col_max_min_values(row, col)
1053
+ check_dimensions(_row, _col)
1054
+ store_row_col_max_min_values(_row, _col)
995
1055
 
996
1056
  @has_vml = true
997
1057
 
998
1058
  # Process the properties of the cell comment.
999
- @comments.add(@workbook, self, row, col, string, options)
1059
+ @comments.add(@workbook, self, _row, _col, _string, _options)
1000
1060
  end
1001
1061
 
1002
1062
  #
@@ -1005,16 +1065,25 @@ module Writexlsx
1005
1065
  #
1006
1066
  # Write an integer or a float to the cell specified by row and column:
1007
1067
  #
1008
- def write_number(*args)
1068
+ def write_number(row, col, number, format = nil)
1009
1069
  # Check for a cell reference in A1 notation and substitute row and column
1010
- row, col, num, xf = row_col_notation(args)
1011
- raise WriteXLSXInsufficientArgumentError if row.nil? || col.nil? || num.nil?
1070
+ if (row_col_array = row_col_notation(row))
1071
+ _row, _col = row_col_array
1072
+ _number = col
1073
+ _format = number
1074
+ else
1075
+ _row = row
1076
+ _col = col
1077
+ _number = number
1078
+ _format = format
1079
+ end
1080
+ raise WriteXLSXInsufficientArgumentError if _row.nil? || _col.nil? || _number.nil?
1012
1081
 
1013
1082
  # Check that row and col are valid and store max and min values
1014
- check_dimensions(row, col)
1015
- store_row_col_max_min_values(row, col)
1083
+ check_dimensions(_row, _col)
1084
+ store_row_col_max_min_values(_row, _col)
1016
1085
 
1017
- store_data_to_table(NumberCellData.new(num, xf), row, col)
1086
+ store_data_to_table(NumberCellData.new(_number, _format), _row, _col)
1018
1087
  end
1019
1088
 
1020
1089
  #
@@ -1024,19 +1093,28 @@ module Writexlsx
1024
1093
  # Write a string to the specified row and column (zero indexed).
1025
1094
  # +format+ is optional.
1026
1095
  #
1027
- def write_string(*args)
1096
+ def write_string(row, col, string = nil, format = nil)
1028
1097
  # Check for a cell reference in A1 notation and substitute row and column
1029
- row, col, str, xf = row_col_notation(args)
1030
- str &&= str.to_s
1031
- raise WriteXLSXInsufficientArgumentError if row.nil? || col.nil? || str.nil?
1098
+ if (row_col_array = row_col_notation(row))
1099
+ _row, _col = row_col_array
1100
+ _string = col
1101
+ _format = string
1102
+ else
1103
+ _row = row
1104
+ _col = col
1105
+ _string = string
1106
+ _format = format
1107
+ end
1108
+ _string &&= _string.to_s
1109
+ raise WriteXLSXInsufficientArgumentError if _row.nil? || _col.nil? || _string.nil?
1032
1110
 
1033
1111
  # Check that row and col are valid and store max and min values
1034
- check_dimensions(row, col)
1035
- store_row_col_max_min_values(row, col)
1112
+ check_dimensions(_row, _col)
1113
+ store_row_col_max_min_values(_row, _col)
1036
1114
 
1037
- index = shared_string_index(str.length > STR_MAX ? str[0, STR_MAX] : str)
1115
+ index = shared_string_index(_string.length > STR_MAX ? _string[0, STR_MAX] : _string)
1038
1116
 
1039
- store_data_to_table(StringCellData.new(index, xf), row, col)
1117
+ store_data_to_table(StringCellData.new(index, _format), _row, _col)
1040
1118
  end
1041
1119
 
1042
1120
  #
@@ -1047,24 +1125,31 @@ module Writexlsx
1047
1125
  # The method receives string fragments prefixed by format objects. The final
1048
1126
  # format object is used as the cell format.
1049
1127
  #
1050
- def write_rich_string(*args)
1128
+ def write_rich_string(row, col, *rich_strings)
1051
1129
  # Check for a cell reference in A1 notation and substitute row and column
1052
- row, col, *rich_strings = row_col_notation(args)
1053
- raise WriteXLSXInsufficientArgumentError if [row, col, rich_strings[0]].include?(nil)
1130
+ if (row_col_array = row_col_notation(row))
1131
+ _row, _col = row_col_array
1132
+ _rich_strings = [col] + rich_strings
1133
+ else
1134
+ _row = row
1135
+ _col = col
1136
+ _rich_strings = rich_strings
1137
+ end
1138
+ raise WriteXLSXInsufficientArgumentError if [_row, _col, _rich_strings[0]].include?(nil)
1054
1139
 
1055
- xf = cell_format_of_rich_string(rich_strings)
1140
+ _xf = cell_format_of_rich_string(_rich_strings)
1056
1141
 
1057
1142
  # Check that row and col are valid and store max and min values
1058
- check_dimensions(row, col)
1059
- store_row_col_max_min_values(row, col)
1143
+ check_dimensions(_row, _col)
1144
+ store_row_col_max_min_values(_row, _col)
1060
1145
 
1061
- fragments, _length = rich_strings_fragments(rich_strings)
1146
+ _fragments, _length = rich_strings_fragments(_rich_strings)
1062
1147
  # can't allow 2 formats in a row
1063
- return -4 unless fragments
1148
+ return -4 unless _fragments
1064
1149
 
1065
- index = shared_string_index(xml_str_of_rich_string(fragments))
1150
+ index = shared_string_index(xml_str_of_rich_string(_fragments))
1066
1151
 
1067
- store_data_to_table(StringCellData.new(index, xf), row, col)
1152
+ store_data_to_table(StringCellData.new(index, _xf), _row, _col)
1068
1153
  end
1069
1154
 
1070
1155
  #
@@ -1075,19 +1160,26 @@ module Writexlsx
1075
1160
  # A blank cell is used to specify formatting without adding a string
1076
1161
  # or a number.
1077
1162
  #
1078
- def write_blank(*args)
1163
+ def write_blank(row, col, format = nil)
1079
1164
  # Check for a cell reference in A1 notation and substitute row and column
1080
- row, col, xf = row_col_notation(args)
1081
- raise WriteXLSXInsufficientArgumentError if [row, col].include?(nil)
1165
+ if (row_col_array = row_col_notation(row))
1166
+ _row, _col = row_col_array
1167
+ _format = col
1168
+ else
1169
+ _row = row
1170
+ _col = col
1171
+ _format = format
1172
+ end
1173
+ raise WriteXLSXInsufficientArgumentError if [_row, _col].include?(nil)
1082
1174
 
1083
1175
  # Don't write a blank cell unless it has a format
1084
- return unless xf
1176
+ return unless _format
1085
1177
 
1086
1178
  # Check that row and col are valid and store max and min values
1087
- check_dimensions(row, col)
1088
- store_row_col_max_min_values(row, col)
1179
+ check_dimensions(_row, _col)
1180
+ store_row_col_max_min_values(_row, _col)
1089
1181
 
1090
- store_data_to_table(BlankCellData.new(xf), row, col)
1182
+ store_data_to_table(BlankCellData.new(_format), _row, _col)
1091
1183
  end
1092
1184
 
1093
1185
  def expand_formula(formula, function, addition = '')
@@ -1261,28 +1353,39 @@ module Writexlsx
1261
1353
  #
1262
1354
  # Write a formula or function to the cell specified by +row+ and +column+:
1263
1355
  #
1264
- def write_formula(*args)
1356
+ def write_formula(row, col, formula = nil, format = nil, value = nil)
1265
1357
  # Check for a cell reference in A1 notation and substitute row and column
1266
- row, col, formula, format, value = row_col_notation(args)
1267
- raise WriteXLSXInsufficientArgumentError if [row, col, formula].include?(nil)
1358
+ if (row_col_array = row_col_notation(row))
1359
+ _row, _col = row_col_array
1360
+ _formula = col
1361
+ _format = formula
1362
+ _value = format
1363
+ else
1364
+ _row = row
1365
+ _col = col
1366
+ _formula = formula
1367
+ _format = format
1368
+ _value = value
1369
+ end
1370
+ raise WriteXLSXInsufficientArgumentError if [_row, _col, _formula].include?(nil)
1268
1371
 
1269
1372
  # Check for dynamic array functions.
1270
1373
  regex = /\bLET\(|\bSORT\(|\bLAMBDA\(|\bSINGLE\(|\bSORTBY\(|\bUNIQUE\(|\bXMATCH\(|\bFILTER\(|\bXLOOKUP\(|\bSEQUENCE\(|\bRANDARRAY\(|\bANCHORARRAY\(/
1271
- if formula =~ regex
1374
+ if _formula =~ regex
1272
1375
  return write_dynamic_array_formula(
1273
- row, col, row, col, formula, format, value
1376
+ _row, _col, _row, _col, _formula, _format, _value
1274
1377
  )
1275
1378
  end
1276
1379
 
1277
1380
  # Hand off array formulas.
1278
- if formula =~ /^\{=.*\}$/
1279
- write_array_formula(row, col, row, col, formula, format, value)
1381
+ if _formula =~ /^\{=.*\}$/
1382
+ write_array_formula(_row, _col, _row, _col, _formula, _format, _value)
1280
1383
  else
1281
- check_dimensions(row, col)
1282
- store_row_col_max_min_values(row, col)
1283
- formula = formula.sub(/^=/, '')
1384
+ check_dimensions(_row, _col)
1385
+ store_row_col_max_min_values(_row, _col)
1386
+ _formula = _formula.sub(/^=/, '')
1284
1387
 
1285
- store_data_to_table(FormulaCellData.new(formula, format, value), row, col)
1388
+ store_data_to_table(FormulaCellData.new(_formula, _format, _value), _row, _col)
1286
1389
  end
1287
1390
  end
1288
1391
 
@@ -1300,7 +1403,12 @@ module Writexlsx
1300
1403
  params = args
1301
1404
  end
1302
1405
 
1303
- row1, col1, row2, col2, formula, xf, value = row_col_notation(params)
1406
+ if (row_col_array = row_col_notation(params.first))
1407
+ row1, col1, row2, col2 = row_col_array
1408
+ formula, xf, value = params[1..-1]
1409
+ else
1410
+ row1, col1, row2, col2, formula, xf, value = params
1411
+ end
1304
1412
  raise WriteXLSXInsufficientArgumentError if [row1, col1, row2, col2, formula].include?(nil)
1305
1413
 
1306
1414
  # Swap last row/col with first row/col as necessary
@@ -1349,8 +1457,8 @@ module Writexlsx
1349
1457
  #
1350
1458
  # Write an array formula to the specified row and column (zero indexed).
1351
1459
  #
1352
- def write_array_formula(*args)
1353
- write_array_formula_base('a', *args)
1460
+ def write_array_formula(row1, col1, row2 = nil, col2 = nil, formula = nil, format = nil, value = nil)
1461
+ write_array_formula_base('a', row1, col1, row2, col2, formula, format, value)
1354
1462
  end
1355
1463
 
1356
1464
  #
@@ -1358,8 +1466,8 @@ module Writexlsx
1358
1466
  #
1359
1467
  # Write a dynamic formula to the specified row and column (zero indexed).
1360
1468
  #
1361
- def write_dynamic_array_formula(*args)
1362
- write_array_formula_base('d', *args)
1469
+ def write_dynamic_array_formula(row1, col1, row2 = nil, col2 = nil, formula = nil, format = nil, value = nil)
1470
+ write_array_formula_base('d', row1, col1, row2, col2, formula, format, value)
1363
1471
  @has_dynamic_arrays = true
1364
1472
  end
1365
1473
 
@@ -1368,18 +1476,27 @@ module Writexlsx
1368
1476
  #
1369
1477
  # Write a boolean value to the specified row and column (zero indexed).
1370
1478
  #
1371
- def write_boolean(*args)
1372
- row, col, val, xf = row_col_notation(args)
1373
- raise WriteXLSXInsufficientArgumentError if row.nil? || col.nil?
1479
+ def write_boolean(row, col, val = nil, format = nil)
1480
+ if (row_col_array = row_col_notation(row))
1481
+ _row, _col = row_col_array
1482
+ _val = col
1483
+ _format = val
1484
+ else
1485
+ _row = row
1486
+ _col = col
1487
+ _val = val
1488
+ _format = format
1489
+ end
1490
+ raise WriteXLSXInsufficientArgumentError if _row.nil? || _col.nil?
1374
1491
 
1375
- val = val ? 1 : 0 # Boolean value.
1492
+ _val = _val ? 1 : 0 # Boolean value.
1376
1493
  # xf : cell format.
1377
1494
 
1378
1495
  # Check that row and col are valid and store max and min values
1379
- check_dimensions(row, col)
1380
- store_row_col_max_min_values(row, col)
1496
+ check_dimensions(_row, _col)
1497
+ store_row_col_max_min_values(_row, _col)
1381
1498
 
1382
- store_data_to_table(BooleanCellData.new(val, xf), row, col)
1499
+ store_data_to_table(BooleanCellData.new(_val, _format), _row, _col)
1383
1500
  end
1384
1501
 
1385
1502
  #
@@ -1388,28 +1505,35 @@ module Writexlsx
1388
1505
  #
1389
1506
  # Update formatting of the cell to the specified row and column (zero indexed).
1390
1507
  #
1391
- def update_format_with_params(*args)
1392
- row, col, params = row_col_notation(args)
1393
- raise WriteXLSXInsufficientArgumentError if row.nil? || col.nil? || params.nil?
1508
+ def update_format_with_params(row, col, params = nil)
1509
+ if (row_col_array = row_col_notation(row))
1510
+ _row, _col = row_col_array
1511
+ _params = args[1]
1512
+ else
1513
+ _row = row
1514
+ _col = col
1515
+ _params = params
1516
+ end
1517
+ raise WriteXLSXInsufficientArgumentError if _row.nil? || _col.nil? || _params.nil?
1394
1518
 
1395
1519
  # Check that row and col are valid and store max and min values
1396
- check_dimensions(row, col)
1397
- store_row_col_max_min_values(row, col)
1520
+ check_dimensions(_row, _col)
1521
+ store_row_col_max_min_values(_row, _col)
1398
1522
 
1399
1523
  format = nil
1400
1524
  cell_data = nil
1401
- if @cell_data_table[row].nil? || @cell_data_table[row][col].nil?
1402
- format = @workbook.add_format(params)
1403
- write_blank(row, col, format)
1525
+ if @cell_data_table[_row].nil? || @cell_data_table[_row][_col].nil?
1526
+ format = @workbook.add_format(_params)
1527
+ write_blank(_row, _col, format)
1404
1528
  else
1405
- if @cell_data_table[row][col].xf.nil?
1406
- format = @workbook.add_format(params)
1407
- cell_data = @cell_data_table[row][col]
1529
+ if @cell_data_table[_row][_col].xf.nil?
1530
+ format = @workbook.add_format(_params)
1531
+ cell_data = @cell_data_table[_row][_col]
1408
1532
  else
1409
1533
  format = @workbook.add_format
1410
- cell_data = @cell_data_table[row][col]
1534
+ cell_data = @cell_data_table[_row][_col]
1411
1535
  format.copy(cell_data.xf)
1412
- format.set_format_properties(params)
1536
+ format.set_format_properties(_params)
1413
1537
  end
1414
1538
  # keep original value of cell
1415
1539
  value = if cell_data.is_a? FormulaCellData
@@ -1421,7 +1545,7 @@ module Writexlsx
1421
1545
  else
1422
1546
  cell_data.data
1423
1547
  end
1424
- write(row, col, value, format)
1548
+ write(_row, _col, value, format)
1425
1549
  end
1426
1550
  end
1427
1551
 
@@ -1431,22 +1555,31 @@ module Writexlsx
1431
1555
  #
1432
1556
  # Update formatting of cells in range to the specified row and column (zero indexed).
1433
1557
  #
1434
- def update_range_format_with_params(*args)
1435
- row_first, col_first, row_last, col_last, params = row_col_notation(args)
1558
+ def update_range_format_with_params(row_first, col_first, row_last = nil, col_last = nil, params = nil)
1559
+ if (row_col_array = row_col_notation(row_first))
1560
+ _row_first, _col_first, _row_last, _col_last = row_col_array
1561
+ params = args[1..-1]
1562
+ else
1563
+ _row_first = row_first
1564
+ _col_first = col_first
1565
+ _row_last = row_last
1566
+ _col_last = col_last
1567
+ _params = params
1568
+ end
1436
1569
 
1437
- raise WriteXLSXInsufficientArgumentError if [row_first, col_first, row_last, col_last, params].include?(nil)
1570
+ raise WriteXLSXInsufficientArgumentError if [_row_first, _col_first, _row_last, _col_last, _params].include?(nil)
1438
1571
 
1439
1572
  # Swap last row/col with first row/col as necessary
1440
- row_first, row_last = row_last, row_first if row_first > row_last
1441
- col_first, col_last = col_last, col_first if col_first > col_last
1573
+ _row_first, _row_last = _row_last, _row_first if _row_first > _row_last
1574
+ _col_first, _col_last = _col_last, _col_first if _col_first > _col_last
1442
1575
 
1443
1576
  # Check that column number is valid and store the max value
1444
- check_dimensions(row_last, col_last)
1445
- store_row_col_max_min_values(row_last, col_last)
1577
+ check_dimensions(_row_last, _col_last)
1578
+ store_row_col_max_min_values(_row_last, _col_last)
1446
1579
 
1447
- (row_first..row_last).each do |row|
1448
- (col_first..col_last).each do |col|
1449
- update_format_with_params(row, col, params)
1580
+ (_row_first.._row_last).each do |row|
1581
+ (_col_first.._col_last).each do |col|
1582
+ update_format_with_params(row, col, _params)
1450
1583
  end
1451
1584
  end
1452
1585
  end
@@ -1483,26 +1616,39 @@ module Writexlsx
1483
1616
  # The label is written using the {#write()}[#method-i-write] method. Therefore it is
1484
1617
  # possible to write strings, numbers or formulas as labels.
1485
1618
  #
1486
- def write_url(*args)
1619
+ def write_url(row, col, url = nil, format = nil, str = nil, tip = nil)
1487
1620
  # Check for a cell reference in A1 notation and substitute row and column
1488
- row, col, url, xf, str, tip = row_col_notation(args)
1489
- xf, str = str, xf if str.respond_to?(:xf_index) || !xf.respond_to?(:xf_index)
1490
- raise WriteXLSXInsufficientArgumentError if [row, col, url].include?(nil)
1621
+ if (row_col_array = row_col_notation(row))
1622
+ _row, _col = row_col_array
1623
+ _url = col
1624
+ _format = url
1625
+ _str = format
1626
+ _tip = str
1627
+ else
1628
+ _row = row
1629
+ _col = col
1630
+ _url = url
1631
+ _format = format
1632
+ _str = str
1633
+ _tip = tip
1634
+ end
1635
+ _format, _str = _str, _format if _str.respond_to?(:xf_index) || !_format.respond_to?(:xf_index)
1636
+ raise WriteXLSXInsufficientArgumentError if [_row, _col, _url].include?(nil)
1491
1637
 
1492
1638
  # Check that row and col are valid and store max and min values
1493
- check_dimensions(row, col)
1494
- store_row_col_max_min_values(row, col)
1639
+ check_dimensions(_row, _col)
1640
+ store_row_col_max_min_values(_row, _col)
1495
1641
 
1496
- hyperlink = Hyperlink.factory(url, str, tip)
1497
- store_hyperlink(row, col, hyperlink)
1642
+ hyperlink = Hyperlink.factory(_url, _str, _tip)
1643
+ store_hyperlink(_row, _col, hyperlink)
1498
1644
 
1499
1645
  raise "URL '#{url}' added but URL exceeds Excel's limit of 65,530 URLs per worksheet." if hyperlinks_count > 65_530
1500
1646
 
1501
1647
  # Add the default URL format.
1502
- xf ||= @default_url_format
1648
+ _format ||= @default_url_format
1503
1649
 
1504
1650
  # Write the hyperlink string.
1505
- write_string(row, col, hyperlink.str, xf)
1651
+ write_string(_row, _col, hyperlink.str, _format)
1506
1652
  end
1507
1653
 
1508
1654
  #
@@ -1512,22 +1658,31 @@ module Writexlsx
1512
1658
  # Write a datetime string in ISO8601 "yyyy-mm-ddThh:mm:ss.ss" format as a
1513
1659
  # number representing an Excel date. format is optional.
1514
1660
  #
1515
- def write_date_time(*args)
1661
+ def write_date_time(row, col, str, format = nil)
1516
1662
  # Check for a cell reference in A1 notation and substitute row and column
1517
- row, col, str, xf = row_col_notation(args)
1518
- raise WriteXLSXInsufficientArgumentError if [row, col, str].include?(nil)
1663
+ if (row_col_array = row_col_notation(row))
1664
+ _row, _col = row_col_array
1665
+ _str = col
1666
+ _format = str
1667
+ else
1668
+ _row = row
1669
+ _col = col
1670
+ _str = str
1671
+ _format = format
1672
+ end
1673
+ raise WriteXLSXInsufficientArgumentError if [_row, _col, _str].include?(nil)
1519
1674
 
1520
1675
  # Check that row and col are valid and store max and min values
1521
- check_dimensions(row, col)
1522
- store_row_col_max_min_values(row, col)
1676
+ check_dimensions(_row, _col)
1677
+ store_row_col_max_min_values(_row, _col)
1523
1678
 
1524
- date_time = convert_date_time(str)
1679
+ date_time = convert_date_time(_str)
1525
1680
 
1526
1681
  if date_time
1527
- store_data_to_table(NumberCellData.new(date_time, xf), row, col)
1682
+ store_data_to_table(NumberCellData.new(date_time, _format), _row, _col)
1528
1683
  else
1529
1684
  # If the date isn't valid then write it as a string.
1530
- write_string(*args)
1685
+ write_string(_row, _col, _str, _format)
1531
1686
  end
1532
1687
  end
1533
1688
 
@@ -1539,13 +1694,22 @@ module Writexlsx
1539
1694
  # The Chart must be created by the add_chart() Workbook method and
1540
1695
  # it must have the embedded option set.
1541
1696
  #
1542
- def insert_chart(*args)
1697
+ def insert_chart(row, col, chart = nil, *options)
1543
1698
  # Check for a cell reference in A1 notation and substitute row and column.
1544
- row, col, chart, *options = row_col_notation(args)
1545
- raise WriteXLSXInsufficientArgumentError if [row, col, chart].include?(nil)
1699
+ if (row_col_array = row_col_notation(row))
1700
+ _row, _col = row_col_array
1701
+ _chart = col
1702
+ _options = [chart] + options
1703
+ else
1704
+ _row = row
1705
+ _col = col
1706
+ _chart = chart
1707
+ _options = options
1708
+ end
1709
+ raise WriteXLSXInsufficientArgumentError if [_row, _col, _chart].include?(nil)
1546
1710
 
1547
- if options.first.instance_of?(Hash)
1548
- params = options.first
1711
+ if _options.first.instance_of?(Hash)
1712
+ params = _options.first
1549
1713
  x_offset = params[:x_offset]
1550
1714
  y_offset = params[:y_offset]
1551
1715
  x_scale = params[:x_scale]
@@ -1554,7 +1718,7 @@ module Writexlsx
1554
1718
  description = params[:description]
1555
1719
  decorative = params[:decorative]
1556
1720
  else
1557
- x_offset, y_offset, x_scale, y_scale, anchor = options
1721
+ x_offset, y_offset, x_scale, y_scale, anchor = _options
1558
1722
  end
1559
1723
  x_offset ||= 0
1560
1724
  y_offset ||= 0
@@ -1562,24 +1726,24 @@ module Writexlsx
1562
1726
  y_scale ||= 1
1563
1727
  anchor ||= 1
1564
1728
 
1565
- raise "Not a Chart object in insert_chart()" unless chart.is_a?(Chart) || chart.is_a?(Chartsheet)
1566
- raise "Not a embedded style Chart object in insert_chart()" if chart.respond_to?(:embedded) && chart.embedded == 0
1729
+ raise "Not a Chart object in insert_chart()" unless _chart.is_a?(Chart) || _chart.is_a?(Chartsheet)
1730
+ raise "Not a embedded style Chart object in insert_chart()" if _chart.respond_to?(:embedded) && _chart.embedded == 0
1567
1731
 
1568
- if chart.already_inserted? || (chart.combined && chart.combined.already_inserted?)
1732
+ if _chart.already_inserted? || (_chart.combined && _chart.combined.already_inserted?)
1569
1733
  raise "Chart cannot be inserted in a worksheet more than once"
1570
1734
  else
1571
- chart.already_inserted = true
1572
- chart.combined.already_inserted = true if chart.combined
1735
+ _chart.already_inserted = true
1736
+ _chart.combined.already_inserted = true if _chart.combined
1573
1737
  end
1574
1738
 
1575
1739
  # Use the values set with chart.set_size, if any.
1576
- x_scale = chart.x_scale if chart.x_scale != 1
1577
- y_scale = chart.y_scale if chart.y_scale != 1
1578
- x_offset = chart.x_offset if ptrue?(chart.x_offset)
1579
- y_offset = chart.y_offset if ptrue?(chart.y_offset)
1740
+ x_scale = _chart.x_scale if _chart.x_scale != 1
1741
+ y_scale = _chart.y_scale if _chart.y_scale != 1
1742
+ x_offset = _chart.x_offset if ptrue?(_chart.x_offset)
1743
+ y_offset = _chart.y_offset if ptrue?(_chart.y_offset)
1580
1744
 
1581
1745
  @charts << [
1582
- row, col, chart, x_offset, y_offset,
1746
+ _row, _col, _chart, x_offset, y_offset,
1583
1747
  x_scale, y_scale, anchor, description, decorative
1584
1748
  ]
1585
1749
  end
@@ -1588,14 +1752,23 @@ module Writexlsx
1588
1752
  # :call-seq:
1589
1753
  # insert_image(row, column, filename, options)
1590
1754
  #
1591
- def insert_image(*args)
1755
+ def insert_image(row, col, image = nil, *options)
1592
1756
  # Check for a cell reference in A1 notation and substitute row and column.
1593
- row, col, image, *options = row_col_notation(args)
1594
- raise WriteXLSXInsufficientArgumentError if [row, col, image].include?(nil)
1757
+ if (row_col_array = row_col_notation(row))
1758
+ _row, _col = row_col_array
1759
+ _image = col
1760
+ _options = [image] + options
1761
+ else
1762
+ _row = row
1763
+ _col = col
1764
+ _image = image
1765
+ _options = options
1766
+ end
1767
+ raise WriteXLSXInsufficientArgumentError if [_row, _col, _image].include?(nil)
1595
1768
 
1596
- if options.first.instance_of?(Hash)
1769
+ if _options.first.instance_of?(Hash)
1597
1770
  # Newer hash bashed options
1598
- params = options.first
1771
+ params = _options.first
1599
1772
  x_offset = params[:x_offset]
1600
1773
  y_offset = params[:y_offset]
1601
1774
  x_scale = params[:x_scale]
@@ -1606,7 +1779,7 @@ module Writexlsx
1606
1779
  description = params[:description]
1607
1780
  decorative = params[:decorative]
1608
1781
  else
1609
- x_offset, y_offset, x_scale, y_scale, anchor = options
1782
+ x_offset, y_offset, x_scale, y_scale, anchor = _options
1610
1783
  end
1611
1784
  x_offset ||= 0
1612
1785
  y_offset ||= 0
@@ -1615,7 +1788,7 @@ module Writexlsx
1615
1788
  anchor ||= 2
1616
1789
 
1617
1790
  @images << [
1618
- row, col, image, x_offset, y_offset,
1791
+ _row, _col, _image, x_offset, y_offset,
1619
1792
  x_scale, y_scale, url, tip, anchor, description, decorative
1620
1793
  ]
1621
1794
  end
@@ -1627,32 +1800,43 @@ module Writexlsx
1627
1800
  # Deprecated. This is a writeexcel gem's method that is no longer
1628
1801
  # required by WriteXLSX.
1629
1802
  #
1630
- def repeat_formula(*args)
1803
+ def repeat_formula(row, col, formula, format, *pairs)
1631
1804
  # Check for a cell reference in A1 notation and substitute row and column.
1632
- row, col, formula, format, *pairs = row_col_notation(args)
1633
- raise WriteXLSXInsufficientArgumentError if [row, col].include?(nil)
1805
+ if (row_col_array = row_col_notation(row))
1806
+ _row, _col = row_col_array
1807
+ _formula = col
1808
+ _format = formula
1809
+ _pairs = [format] + pairs
1810
+ else
1811
+ _row = row
1812
+ _col = col
1813
+ _formula = formula
1814
+ _format = format
1815
+ _pairs = pairs
1816
+ end
1817
+ raise WriteXLSXInsufficientArgumentError if [_row, _col].include?(nil)
1634
1818
 
1635
- raise "Odd number of elements in pattern/replacement list" unless pairs.size.even?
1636
- raise "Not a valid formula" unless formula.respond_to?(:to_ary)
1819
+ raise "Odd number of elements in pattern/replacement list" unless _pairs.size.even?
1820
+ raise "Not a valid formula" unless _formula.respond_to?(:to_ary)
1637
1821
 
1638
- tokens = formula.join("\t").split("\t")
1822
+ tokens = _formula.join("\t").split("\t")
1639
1823
  raise "No tokens in formula" if tokens.empty?
1640
1824
 
1641
- value = nil
1642
- if pairs[-2] == 'result'
1643
- value = pairs.pop
1644
- pairs.pop
1825
+ _value = nil
1826
+ if _pairs[-2] == 'result'
1827
+ _value = _pairs.pop
1828
+ _pairs.pop
1645
1829
  end
1646
- until pairs.empty?
1647
- pattern = pairs.shift
1648
- replace = pairs.shift
1830
+ until _pairs.empty?
1831
+ pattern = _pairs.shift
1832
+ replace = _pairs.shift
1649
1833
 
1650
1834
  tokens.each do |token|
1651
1835
  break if token.sub!(pattern, replace)
1652
1836
  end
1653
1837
  end
1654
- formula = tokens.join('')
1655
- write_formula(row, col, formula, format, value)
1838
+ _formula = tokens.join('')
1839
+ write_formula(_row, _col, _formula, _format, _value)
1656
1840
  end
1657
1841
 
1658
1842
  #
@@ -1741,7 +1925,13 @@ module Writexlsx
1741
1925
  # others should be blank. All cells should contain the same format.
1742
1926
  #
1743
1927
  def merge_range(*args)
1744
- row_first, col_first, row_last, col_last, string, format, *extra_args = row_col_notation(args)
1928
+ if (row_col_array = row_col_notation(args.first))
1929
+ row_first, col_first, row_last, col_last = row_col_array
1930
+ string, format, *extra_args = args[1..-1]
1931
+ else
1932
+ row_first, col_first, row_last, col_last,
1933
+ string, format, *extra_args = args
1934
+ end
1745
1935
 
1746
1936
  raise "Incorrect number of arguments" if [row_first, col_first, row_last, col_last, format].include?(nil)
1747
1937
  raise "Fifth parameter must be a format object" unless format.respond_to?(:xf_index)
@@ -1774,10 +1964,21 @@ module Writexlsx
1774
1964
  def merge_range_type(type, *args)
1775
1965
  case type
1776
1966
  when 'array_formula', 'blank', 'rich_string'
1777
- row_first, col_first, row_last, col_last, *others = row_col_notation(args)
1967
+ if (row_col_array = row_col_notation(args.first))
1968
+ row_first, col_first, row_last, col_last = row_col_array
1969
+ *others = args[1..-1]
1970
+ else
1971
+ row_first, col_first, row_last, col_last, *others = args
1972
+ end
1778
1973
  format = others.pop
1779
1974
  else
1780
- row_first, col_first, row_last, col_last, token, format, *others = row_col_notation(args)
1975
+ if (row_col_array = row_col_notation(args.first))
1976
+ row_first, col_first, row_last, col_last = row_col_array
1977
+ token, format, *others = args[1..-1]
1978
+ else
1979
+ row_first, col_first, row_last, col_last,
1980
+ token, format, *others = args
1981
+ end
1781
1982
  end
1782
1983
 
1783
1984
  raise "Format object missing or in an incorrect position" unless format.respond_to?(:xf_index)
@@ -1870,8 +2071,16 @@ module Writexlsx
1870
2071
  # The insert_button() method can be used to insert an Excel form button
1871
2072
  # into a worksheet.
1872
2073
  #
1873
- def insert_button(*args)
1874
- @buttons_array << button_params(*row_col_notation(args))
2074
+ def insert_button(row, col, properties = nil)
2075
+ if (row_col_array = row_col_notation(row))
2076
+ _row, _col = row_col_array
2077
+ _properties = col
2078
+ else
2079
+ _row = row
2080
+ _col = col
2081
+ _properties = properties
2082
+ end
2083
+ @buttons_array << button_params(_row, _col, _properties)
1875
2084
  @has_vml = 1
1876
2085
  end
1877
2086
 
@@ -1937,17 +2146,24 @@ module Writexlsx
1937
2146
  #
1938
2147
  # Set the autofilter area in the worksheet.
1939
2148
  #
1940
- def autofilter(*args)
1941
- row1, col1, row2, col2 = row_col_notation(args)
1942
- return if [row1, col1, row2, col2].include?(nil)
2149
+ def autofilter(row1, col1 = nil, row2 = nil, col2 = nil)
2150
+ if (row_col_array = row_col_notation(row1))
2151
+ _row1, _col1, _row2, _col2 = row_col_array
2152
+ else
2153
+ _row1 = row1
2154
+ _col1 = col1
2155
+ _row2 = row2
2156
+ _col2 = col2
2157
+ end
2158
+ return if [_row1, _col1, _row2, _col2].include?(nil)
1943
2159
 
1944
2160
  # Reverse max and min values if necessary.
1945
- row1, row2 = row2, row1 if row2 < row1
1946
- col1, col2 = col2, col1 if col2 < col1
2161
+ _row1, _row2 = _row2, _row1 if _row2 < _row1
2162
+ _col1, _col2 = _col2, _col1 if _col2 < _col1
1947
2163
 
1948
- @autofilter_area = convert_name_area(row1, col1, row2, col2)
1949
- @autofilter_ref = xl_range(row1, row2, col1, col2)
1950
- @filter_range = [col1, col2]
2164
+ @autofilter_area = convert_name_area(_row1, _col1, _row2, _col2)
2165
+ @autofilter_ref = xl_range(_row1, _row2, _col1, _col2)
2166
+ @filter_range = [_col1, _col2]
1951
2167
  end
1952
2168
 
1953
2169
  #
@@ -2228,10 +2444,12 @@ module Writexlsx
2228
2444
  # Write the cell value <v> element.
2229
2445
  #
2230
2446
  def write_cell_value(value = '') # :nodoc:
2231
- return write_cell_formula('=NA()') if !value.nil? && value.is_a?(Float) && value.nan?
2447
+ return write_cell_formula('=NA()') if value.is_a?(Float) && value.nan?
2232
2448
 
2233
2449
  value ||= ''
2234
- value = value.to_i if value == value.to_i
2450
+
2451
+ int_value = value.to_i
2452
+ value = int_value if value == int_value
2235
2453
  @writer.data_element('v', value)
2236
2454
  end
2237
2455
 
@@ -2902,19 +3120,38 @@ EOS
2902
3120
  #
2903
3121
  # Insert a shape into the worksheet.
2904
3122
  #
2905
- def insert_shape(*args)
3123
+ def insert_shape(
3124
+ row_start, column_start, shape = nil, x_offset = nil, y_offset = nil,
3125
+ x_scale = nil, y_scale = nil, anchor = nil
3126
+ )
2906
3127
  # Check for a cell reference in A1 notation and substitute row and column.
2907
- row_start, column_start, shape, x_offset, y_offset, x_scale, y_scale, anchor =
2908
- row_col_notation(args)
2909
- raise "Insufficient arguments in insert_shape()" if [row_start, column_start, shape].include?(nil)
3128
+ if (row_col_array = row_col_notation(row_start))
3129
+ _row_start, _column_start = row_col_array
3130
+ _shape = column_start
3131
+ _x_offset = shape
3132
+ _y_offset = x_offset
3133
+ _x_scale = y_offset
3134
+ _y_scale = x_scale
3135
+ _anchor = y_scale
3136
+ else
3137
+ _row_start = row_start
3138
+ _column_start = column_start
3139
+ _shape = shape
3140
+ _x_offset = x_offset
3141
+ _y_offset = y_offset
3142
+ _x_scale = x_scale
3143
+ _y_scale = y_scale
3144
+ _anchor = anchor
3145
+ end
3146
+ raise "Insufficient arguments in insert_shape()" if [_row_start, _column_start, _shape].include?(nil)
2910
3147
 
2911
- shape.set_position(
2912
- row_start, column_start, x_offset, y_offset,
2913
- x_scale, y_scale, anchor
3148
+ _shape.set_position(
3149
+ _row_start, _column_start, _x_offset, _y_offset,
3150
+ _x_scale, _y_scale, _anchor
2914
3151
  )
2915
3152
  # Assign a shape ID.
2916
3153
  while true
2917
- id = shape.id || 0
3154
+ id = _shape.id || 0
2918
3155
  used = @shape_hash[id]
2919
3156
 
2920
3157
  # Test if shape ID is already used. Otherwise assign a new one.
@@ -2922,20 +3159,20 @@ EOS
2922
3159
  break
2923
3160
  else
2924
3161
  @last_shape_id += 1
2925
- shape.id = @last_shape_id
3162
+ _shape.id = @last_shape_id
2926
3163
  end
2927
3164
  end
2928
3165
 
2929
3166
  # Allow lookup of entry into shape array by shape ID.
2930
- @shape_hash[shape.id] = shape.element = @shapes.size
3167
+ @shape_hash[_shape.id] = _shape.element = @shapes.size
2931
3168
 
2932
- insert = if ptrue?(shape.stencil)
3169
+ insert = if ptrue?(_shape.stencil)
2933
3170
  # Insert a copy of the shape, not a reference so that the shape is
2934
3171
  # used as a stencil. Previously stamped copies don't get modified
2935
3172
  # if the stencil is modified.
2936
- shape.dup
3173
+ _shape.dup
2937
3174
  else
2938
- shape
3175
+ _shape
2939
3176
  end
2940
3177
 
2941
3178
  # For connectors change x/y coords based on location of connected shapes.
@@ -3333,8 +3570,11 @@ EOS
3333
3570
  end
3334
3571
 
3335
3572
  def write_cell_column_dimension(row_num) # :nodoc:
3573
+ row = @cell_data_table[row_num]
3336
3574
  (@dim_colmin..@dim_colmax).each do |col_num|
3337
- @cell_data_table[row_num][col_num].write_cell(self, row_num, col_num) if @cell_data_table[row_num][col_num]
3575
+ if (cell = row[col_num])
3576
+ cell.write_cell(self, row_num, col_num)
3577
+ end
3338
3578
  end
3339
3579
  end
3340
3580
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: write_xlsx
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.1
4
+ version: 1.10.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hideo NAKAMURA
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-30 00:00:00.000000000 Z
11
+ date: 2023-02-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip
@@ -275,7 +275,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
275
275
  - !ruby/object:Gem::Version
276
276
  version: '0'
277
277
  requirements: []
278
- rubygems_version: 3.4.1
278
+ rubygems_version: 3.4.5
279
279
  signing_key:
280
280
  specification_version: 4
281
281
  summary: write_xlsx is a gem to create a new file in the Excel 2007+ XLSX format.