summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorZsolt Kozaroczy <[email protected]>2023-05-17 09:52:58 +0200
committerGitHub <[email protected]>2023-05-17 09:52:58 +0200
commitdf919fffb9ccef3eb343f7aaf70206da8f3c8073 (patch)
treec1c264d6e8f16904eaf6d7343faffb1ce24aafc5
parent6eb2fc56d3ab658edc1477d138b1cf0b3021ab29 (diff)
parent72d6411b9365df0bccbe1ac43f793fc7d7ab369f (diff)
downloadcaxlsx-df919fffb9ccef3eb343f7aaf70206da8f3c8073.tar.gz
caxlsx-df919fffb9ccef3eb343f7aaf70206da8f3c8073.zip
Merge branch 'master' into chore/use-delete-prefix-suffix
-rw-r--r--.rubocop_todo.yml48
-rw-r--r--CHANGELOG.md1
-rw-r--r--lib/axlsx.rb76
-rw-r--r--lib/axlsx/drawing/pic.rb2
-rw-r--r--lib/axlsx/util/constants.rb2
-rw-r--r--lib/axlsx/util/validators.rb4
-rw-r--r--lib/axlsx/workbook/workbook.rb4
-rw-r--r--lib/axlsx/workbook/worksheet/cell.rb29
-rw-r--r--lib/axlsx/workbook/worksheet/cell_serializer.rb4
-rw-r--r--lib/axlsx/workbook/worksheet/row.rb2
-rw-r--r--lib/axlsx/workbook/worksheet/worksheet.rb1
-rw-r--r--test/tc_axlsx.rb10
-rw-r--r--test/workbook/worksheet/tc_cell.rb2
13 files changed, 81 insertions, 104 deletions
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 2385ecb2..ed0c7d35 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -20,7 +20,6 @@ Layout/FirstHashElementIndentation:
Layout/HashAlignment:
Exclude:
- 'lib/axlsx/workbook/worksheet/border_creator.rb'
- - 'test/tc_axlsx.rb'
# This cop supports safe autocorrection (--autocorrect).
Lint/AmbiguousOperatorPrecedence:
@@ -58,7 +57,6 @@ Lint/DisjunctiveAssignmentInConstructor:
# Configuration parameters: IgnoreLiteralBranches, IgnoreConstantBranches.
Lint/DuplicateBranch:
Exclude:
- - 'lib/axlsx/workbook/worksheet/cell.rb'
- 'lib/axlsx/workbook/worksheet/merged_cells.rb'
Lint/NonLocalExitFromIterator:
@@ -69,7 +67,6 @@ Lint/NonLocalExitFromIterator:
# Configuration parameters: IgnoreEmptyBlocks, AllowUnusedKeywordArguments.
Lint/UnusedBlockArgument:
Exclude:
- - 'lib/axlsx.rb'
- 'lib/axlsx/drawing/axes.rb'
- 'lib/axlsx/workbook/worksheet/pivot_table.rb'
- 'lib/axlsx/workbook/worksheet/sheet_view.rb'
@@ -106,11 +103,6 @@ Performance/CollectionLiteralInLoop:
- 'lib/axlsx/package.rb'
- 'lib/axlsx/workbook/worksheet/page_margins.rb'
-# This cop supports unsafe autocorrection (--autocorrect-all).
-Performance/Detect:
- Exclude:
- - 'lib/axlsx/workbook/workbook.rb'
-
# This cop supports safe autocorrection (--autocorrect).
Performance/RedundantBlockCall:
Exclude:
@@ -119,9 +111,7 @@ Performance/RedundantBlockCall:
# This cop supports safe autocorrection (--autocorrect).
Performance/RedundantMatch:
Exclude:
- - 'lib/axlsx.rb'
- 'lib/axlsx/stylesheet/color.rb'
- - 'lib/axlsx/workbook/workbook.rb'
# This cop supports safe autocorrection (--autocorrect).
Performance/RedundantSplitRegexpArgument:
@@ -132,13 +122,6 @@ Performance/RedundantSplitRegexpArgument:
Performance/RegexpMatch:
Exclude:
- 'lib/axlsx/stylesheet/color.rb'
- - 'lib/axlsx/workbook/workbook.rb'
- - 'lib/axlsx/workbook/worksheet/cell.rb'
-
-# This cop supports safe autocorrection (--autocorrect).
-Performance/StringIdentifierArgument:
- Exclude:
- - 'lib/axlsx/drawing/pic.rb'
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle.
@@ -266,7 +249,6 @@ Style/GuardClause:
# Configuration parameters: AllowSplatArgument.
Style/HashConversion:
Exclude:
- - 'lib/axlsx.rb'
- 'lib/axlsx/workbook/worksheet/cell_serializer.rb'
- 'lib/axlsx/workbook/worksheet/rich_text_run.rb'
@@ -321,9 +303,7 @@ Style/LineEndConcatenation:
# Configuration parameters: AllowMethodComparison.
Style/MultipleComparison:
Exclude:
- - 'lib/axlsx.rb'
- 'lib/axlsx/stylesheet/font.rb'
- - 'lib/axlsx/workbook/worksheet/cell.rb'
- 'lib/axlsx/workbook/worksheet/rich_text_run.rb'
- 'test/workbook/tc_workbook_view.rb'
@@ -383,7 +363,6 @@ Style/NumericPredicate:
- 'lib/axlsx/stylesheet/font.rb'
- 'lib/axlsx/util/validators.rb'
- 'lib/axlsx/workbook/workbook.rb'
- - 'lib/axlsx/workbook/worksheet/cell.rb'
- 'lib/axlsx/workbook/worksheet/sheet_pr.rb'
- 'lib/axlsx/workbook/worksheet/worksheet.rb'
@@ -425,7 +404,6 @@ Style/ParenthesesAroundCondition:
Exclude:
- 'lib/axlsx/stylesheet/font.rb'
- 'lib/axlsx/util/validators.rb'
- - 'lib/axlsx/workbook/worksheet/cell.rb'
- 'lib/axlsx/workbook/worksheet/rich_text_run.rb'
# This cop supports safe autocorrection (--autocorrect).
@@ -449,7 +427,6 @@ Style/PercentLiteralDelimiters:
# This cop supports safe autocorrection (--autocorrect).
Style/PerlBackrefs:
Exclude:
- - 'lib/axlsx.rb'
- 'test/workbook/worksheet/tc_sheet_protection.rb'
# This cop supports unsafe autocorrection (--autocorrect-all).
@@ -471,7 +448,6 @@ Style/QuotedSymbols:
# SupportedStyles: compact, exploded
Style/RaiseArgs:
Exclude:
- - 'lib/axlsx.rb'
- 'lib/axlsx/package.rb'
- 'lib/axlsx/util/zip_command.rb'
- 'lib/axlsx/workbook/worksheet/border_creator.rb'
@@ -490,7 +466,6 @@ Style/RedundantCondition:
# This cop supports safe autocorrection (--autocorrect).
Style/RedundantFileExtensionInRequire:
Exclude:
- - 'lib/axlsx.rb'
- 'lib/axlsx/content_type/content_type.rb'
- 'lib/axlsx/drawing/drawing.rb'
- 'lib/axlsx/rels/relationships.rb'
@@ -528,7 +503,6 @@ Style/RedundantParentheses:
# This cop supports safe autocorrection (--autocorrect).
Style/RedundantRegexpEscape:
Exclude:
- - 'lib/axlsx.rb'
- 'lib/axlsx/workbook/worksheet/pivot_table.rb'
- 'lib/axlsx/workbook/worksheet/table.rb'
@@ -536,7 +510,6 @@ Style/RedundantRegexpEscape:
# Configuration parameters: AllowMultipleReturnValues.
Style/RedundantReturn:
Exclude:
- - 'lib/axlsx.rb'
- 'lib/axlsx/package.rb'
- 'lib/axlsx/stylesheet/styles.rb'
- 'lib/axlsx/workbook/worksheet/worksheet.rb'
@@ -545,20 +518,6 @@ Style/RedundantReturn:
Style/RedundantSelf:
Enabled: false
-# This cop supports safe autocorrection (--autocorrect).
-# Configuration parameters: EnforcedStyle, AllowInnerSlashes.
-# SupportedStyles: slashes, percent_r, mixed
-Style/RegexpLiteral:
- Exclude:
- - 'lib/axlsx/workbook/worksheet/cell.rb'
-
-# This cop supports safe autocorrection (--autocorrect).
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: implicit, explicit
-Style/RescueStandardError:
- Exclude:
- - 'lib/axlsx.rb'
-
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods, MaxChainLength.
# AllowedMethods: present?, blank?, presence, try, try!
@@ -578,7 +537,6 @@ Style/SingleLineMethods:
# This cop supports unsafe autocorrection (--autocorrect-all).
Style/SlicingWithRange:
Exclude:
- - 'lib/axlsx.rb'
- 'lib/axlsx/drawing/area_chart.rb'
- 'lib/axlsx/drawing/line_chart.rb'
- 'lib/axlsx/workbook/worksheet/pivot_table.rb'
@@ -620,7 +578,6 @@ Style/SymbolProc:
- 'lib/axlsx/drawing/drawing.rb'
- 'lib/axlsx/stylesheet/styles.rb'
- 'lib/axlsx/workbook/workbook.rb'
- - 'lib/axlsx/workbook/worksheet/cell.rb'
- 'lib/axlsx/workbook/worksheet/worksheet.rb'
- 'lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb'
@@ -656,11 +613,6 @@ Style/UnpackFirst:
- 'lib/axlsx/workbook/worksheet/sheet_protection.rb'
# This cop supports safe autocorrection (--autocorrect).
-Style/WhileUntilDo:
- Exclude:
- - 'lib/axlsx.rb'
-
-# This cop supports safe autocorrection (--autocorrect).
Style/WhileUntilModifier:
Exclude:
- 'lib/axlsx/workbook/worksheet/color_scale.rb'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 19f5d742..92d3396f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,7 @@ CHANGELOG
- Drop support for Ruby versions < 2.6
- Added frozen string literals
- Fix `SimpleTypedList#to_a` and `SimpleTypedList#to_ary` returning the internal list instance
+ - Remove ability to set `u=` to true in favor of using :single or one of the other underline options
- **April.23.23**: 3.4.1
- [PR #209](https://github.com/caxlsx/caxlsx/pull/209) - Revert characters other than `=` being considered as formulas.
diff --git a/lib/axlsx.rb b/lib/axlsx.rb
index 4f15ba23..bf16afbd 100644
--- a/lib/axlsx.rb
+++ b/lib/axlsx.rb
@@ -1,29 +1,29 @@
# frozen_string_literal: true
require 'htmlentities'
-require 'axlsx/version.rb'
+require 'axlsx/version'
require 'marcel'
-require 'axlsx/util/simple_typed_list.rb'
-require 'axlsx/util/constants.rb'
-require 'axlsx/util/validators.rb'
-require 'axlsx/util/accessors.rb'
+require 'axlsx/util/simple_typed_list'
+require 'axlsx/util/constants'
+require 'axlsx/util/validators'
+require 'axlsx/util/accessors'
require 'axlsx/util/serialized_attributes'
require 'axlsx/util/options_parser'
require 'axlsx/util/mime_type_utils'
require 'axlsx/util/buffered_zip_output_stream'
require 'axlsx/util/zip_command'
-require 'axlsx/stylesheet/styles.rb'
+require 'axlsx/stylesheet/styles'
-require 'axlsx/doc_props/app.rb'
-require 'axlsx/doc_props/core.rb'
-require 'axlsx/content_type/content_type.rb'
-require 'axlsx/rels/relationships.rb'
+require 'axlsx/doc_props/app'
+require 'axlsx/doc_props/core'
+require 'axlsx/content_type/content_type'
+require 'axlsx/rels/relationships'
-require 'axlsx/drawing/drawing.rb'
-require 'axlsx/workbook/workbook.rb'
-require 'axlsx/package.rb'
+require 'axlsx/drawing/drawing'
+require 'axlsx/workbook/workbook'
+require 'axlsx/package'
# required gems
require 'nokogiri'
require 'zip'
@@ -35,9 +35,9 @@ require 'time'
begin
if Gem.loaded_specs.has_key?("axlsx_styler")
- raise StandardError.new("Please remove `axlsx_styler` from your Gemfile, the associated functionality is now built-in to `caxlsx` directly.")
+ raise StandardError, "Please remove `axlsx_styler` from your Gemfile, the associated functionality is now built-in to `caxlsx` directly."
end
-rescue
+rescue StandardError
# Do nothing
end
@@ -53,7 +53,7 @@ module Axlsx
#
# Defining as a class method on Axlsx to refrain from monkeypatching Object for all users of this gem.
def self.instance_values_for(object)
- Hash[object.instance_variables.map { |name| [name.to_s[1..-1], object.instance_variable_get(name)] }]
+ object.instance_variables.to_h { |name| [name.to_s[1..], object.instance_variable_get(name)] }
end
# determines the cell range for the items provided
@@ -105,37 +105,51 @@ module Axlsx
row_index = (numbers_str.to_i - 1)
- return [col_index, row_index]
+ [col_index, row_index]
end
# converts the column index into alphabetical values.
# @note This follows the standard spreadsheet convention of naming columns A to Z, followed by AA to AZ etc.
# @return [String]
def self.col_ref(index)
- chars = +''
- while index >= 26 do
- index, char = index.divmod(26)
- chars.prepend((char + 65).chr)
- index -= 1
+ # Every row will call this for each column / cell and so we can cache result and avoid lots of small object
+ # allocations.
+ @col_ref ||= {}
+ @col_ref[index] ||= begin
+ i = index
+ chars = +''
+ while i >= 26
+ i, char = i.divmod(26)
+ chars.prepend((char + 65).chr)
+ i -= 1
+ end
+ chars.prepend((i + 65).chr)
+ chars.freeze
end
- chars.prepend((index + 65).chr)
- chars
+ end
+
+ # converts the row index into string values.
+ # @note The spreadsheet rows are 1-based and the passed in index is 0-based, so we add 1.
+ # @return [String]
+ def self.row_ref(index)
+ @row_ref ||= {}
+ @row_ref[index] ||= (index + 1).to_s.freeze
end
# @return [String] The alpha(column)numeric(row) reference for this sell.
# @example Relative Cell Reference
# ws.rows.first.cells.first.r #=> "A1"
def self.cell_r(c_index, r_index)
- col_ref(c_index) << (r_index + 1).to_s
+ col_ref(c_index) + row_ref(r_index)
end
# Creates an array of individual cell references based on an excel reference range.
# @param [String] range A cell range, for example A1:D5
# @return [Array]
def self.range_to_a(range)
- range.match(/^(\w+?\d+)\:(\w+?\d+)$/)
- start_col, start_row = name_to_indices($1)
- end_col, end_row = name_to_indices($2)
+ range =~ /^(\w+?\d+):(\w+?\d+)$/
+ start_col, start_row = name_to_indices(::Regexp.last_match(1))
+ end_col, end_row = name_to_indices(::Regexp.last_match(2))
(start_row..end_row).to_a.map do |row_num|
(start_col..end_col).to_a.map do |col_num|
cell_r(col_num, row_num)
@@ -149,7 +163,7 @@ module Axlsx
def self.camel(s = "", all_caps = true)
s = s.to_s
s = s.capitalize if all_caps
- s.gsub(/_(.)/) { $1.upcase }
+ s.gsub(/_(.)/) { ::Regexp.last_match(1).upcase }
end
# returns the provided string with all invalid control charaters
@@ -170,7 +184,7 @@ module Axlsx
# @param [Object] value The value to process
# @return [Object]
def self.booleanize(value)
- if value == true || value == false
+ if BOOLEAN_VALUES.include?(value)
value ? 1 : 0
else
value
@@ -181,7 +195,7 @@ module Axlsx
# @param [Hash] Hash to merge into
# @param [Hash] Hash to be added
def self.hash_deep_merge(first_hash, second_hash)
- first_hash.merge(second_hash) do |key, this_val, other_val|
+ first_hash.merge(second_hash) do |_key, this_val, other_val|
if this_val.is_a?(Hash) && other_val.is_a?(Hash)
Axlsx.hash_deep_merge(this_val, other_val)
else
diff --git a/lib/axlsx/drawing/pic.rb b/lib/axlsx/drawing/pic.rb
index 77a051c3..fa08bd83 100644
--- a/lib/axlsx/drawing/pic.rb
+++ b/lib/axlsx/drawing/pic.rb
@@ -239,7 +239,7 @@ module Axlsx
def swap_anchor(new_anchor)
new_anchor.drawing.anchors.delete(new_anchor)
@anchor.drawing.anchors[@anchor.drawing.anchors.index(@anchor)] = new_anchor
- new_anchor.instance_variable_set "@object", @anchor.object
+ new_anchor.instance_variable_set :@object, @anchor.object
@anchor = new_anchor
end
end
diff --git a/lib/axlsx/util/constants.rb b/lib/axlsx/util/constants.rb
index 42a7683c..5ef3ece1 100644
--- a/lib/axlsx/util/constants.rb
+++ b/lib/axlsx/util/constants.rb
@@ -423,4 +423,6 @@ module Axlsx
# Trailing character that indicates an array formula.
ARRAY_FORMULA_SUFFIX = '}'
+
+ BOOLEAN_VALUES = [true, false].freeze
end
diff --git a/lib/axlsx/util/validators.rb b/lib/axlsx/util/validators.rb
index 0004f51a..e9cf13b6 100644
--- a/lib/axlsx/util/validators.rb
+++ b/lib/axlsx/util/validators.rb
@@ -106,8 +106,8 @@ module Axlsx
DataTypeValidator.validate :signed_int, Integer, v
end
- VALID_BOOLEAN_CLASSES = [String, Integer, Symbol, TrueClass, FalseClass].freeze
- VALID_BOOLEAN_VALUES = [0, 1, 'true', 'false', :true, :false, true, false, '0', '1'].freeze
+ VALID_BOOLEAN_CLASSES = [TrueClass, FalseClass, Integer, String, Symbol].freeze
+ VALID_BOOLEAN_VALUES = [true, false, 1, 0, '1', '0', 'true', 'false', :true, :false].freeze
BOOLEAN_VALIDATOR = lambda { |arg| VALID_BOOLEAN_VALUES.include?(arg) }
# Requires that the value is a form that can be evaluated as a boolean in an xml document.
diff --git a/lib/axlsx/workbook/workbook.rb b/lib/axlsx/workbook/workbook.rb
index 3e4927aa..1a2f0488 100644
--- a/lib/axlsx/workbook/workbook.rb
+++ b/lib/axlsx/workbook/workbook.rb
@@ -395,8 +395,8 @@ module Axlsx
# retrieve the cells from. e.g. range('Sheet1!A1:B2') will return an array of four cells [A1, A2, B1, B2] while range('Sheet1!A1') will return a single Cell.
# @return [Cell, Array]
def [](cell_def)
- sheet_name = cell_def.split('!')[0] if cell_def.match('!')
- worksheet = self.worksheets.select { |s| s.name == sheet_name }.first
+ sheet_name = cell_def.split('!')[0] if cell_def.include?('!')
+ worksheet = self.worksheets.find { |s| s.name == sheet_name }
raise ArgumentError, 'Unknown Sheet' unless sheet_name && worksheet.is_a?(Worksheet)
worksheet[cell_def.gsub(/.+!/, "")]
diff --git a/lib/axlsx/workbook/worksheet/cell.rb b/lib/axlsx/workbook/worksheet/cell.rb
index f47781f0..4d1bae63 100644
--- a/lib/axlsx/workbook/worksheet/cell.rb
+++ b/lib/axlsx/workbook/worksheet/cell.rb
@@ -42,12 +42,13 @@ module Axlsx
self.type = type unless type == :string
val = options.delete(:style)
- self.style = val unless val.nil? || val == 0
+ self.style = val unless val.nil? || val.zero?
val = options.delete(:formula_value)
self.formula_value = val unless val.nil?
+ val = options.delete(:escape_formulas)
+ self.escape_formulas = val unless val.nil?
parse_options(options)
- self.escape_formulas = row.worksheet.escape_formulas if escape_formulas.nil?
self.value = value
value.cell = self if contains_rich_text?
@@ -135,7 +136,9 @@ module Axlsx
# Allowing user-generated data to be interpreted as formulas is a security risk.
# See https://www.owasp.org/index.php/CSV_Injection for details.
# @return [Boolean]
- attr_reader :escape_formulas
+ def escape_formulas
+ defined?(@escape_formulas) ? @escape_formulas : row.worksheet.escape_formulas
+ end
# Sets whether to treat values starting with an equals sign as formulas or as literal strings.
# @param [Boolean] value The value to set.
@@ -272,15 +275,13 @@ module Axlsx
def extend=(v) set_run_style :validate_boolean, :extend, v; end
# The inline underline property for the cell.
- # It must be one of :none, :single, :double, :singleAccounting, :doubleAccounting, true
+ # It must be one of :none, :single, :double, :singleAccounting, :doubleAccounting
# @return [Boolean]
# @return [String]
- # @note true is for backwards compatability and is reassigned to :single
attr_reader :u
# @see u
def u=(v)
- v = :single if (v == true || v == 1 || v == :true || v == 'true')
set_run_style :validate_cell_u, :u, v
end
@@ -343,7 +344,7 @@ module Axlsx
# @example Absolute Cell Reference
# ws.rows.first.cells.first.r #=> "$A$1"
def r_abs
- "$#{r.match(%r{([A-Z]+)([0-9]+)})[1, 2].join('$')}"
+ "$#{r.match(/([A-Z]+)([0-9]+)/)[1, 2].join('$')}"
end
# @return [Integer] The cellXfs item index applied to this cell.
@@ -368,7 +369,7 @@ module Axlsx
start, stop = if target.is_a?(String)
[self.r, target]
elsif target.is_a?(Cell)
- Axlsx.sort_cells([self, target]).map { |c| c.r }
+ Axlsx.sort_cells([self, target]).map(&:r)
end
self.row.worksheet.merge_cells "#{start}:#{stop}" unless stop.nil?
end
@@ -498,13 +499,11 @@ module Axlsx
:time
elsif v.is_a?(TrueClass) || v.is_a?(FalseClass)
:boolean
- elsif v.to_s =~ Axlsx::NUMERIC_REGEX && v.respond_to?(:to_i)
+ elsif v.respond_to?(:to_i) && v.to_s =~ Axlsx::NUMERIC_REGEX
:integer
- elsif v.to_s =~ Axlsx::SAFE_FLOAT_REGEX && v.respond_to?(:to_f)
- :float
- elsif (matchdata = v.to_s.match(MAYBE_FLOAT_REGEX)) && (Float::MIN_10_EXP..Float::MAX_10_EXP).cover?(matchdata[:exp].to_i) && v.respond_to?(:to_f)
+ elsif v.respond_to?(:to_f) && (v.to_s =~ Axlsx::SAFE_FLOAT_REGEX || ((matchdata = v.to_s.match(MAYBE_FLOAT_REGEX)) && matchdata[:exp].to_i.between?(Float::MIN_10_EXP, Float::MAX_10_EXP)))
:float
- elsif v.to_s =~ Axlsx::ISO_8601_REGEX
+ elsif Axlsx::ISO_8601_REGEX.match?(v.to_s)
:iso_8601
elsif v.is_a? RichText
:richtext
@@ -522,14 +521,14 @@ module Axlsx
case type
when :date
- self.style = STYLE_DATE if self.style == 0
+ self.style = STYLE_DATE if self.style.zero?
if !v.is_a?(Date) && v.respond_to?(:to_date)
v.to_date
else
v
end
when :time
- self.style = STYLE_DATE if self.style == 0
+ self.style = STYLE_DATE if self.style.zero?
if !v.is_a?(Time) && v.respond_to?(:to_time)
v.to_time
else
diff --git a/lib/axlsx/workbook/worksheet/cell_serializer.rb b/lib/axlsx/workbook/worksheet/cell_serializer.rb
index 9d39add3..f45d3c73 100644
--- a/lib/axlsx/workbook/worksheet/cell_serializer.rb
+++ b/lib/axlsx/workbook/worksheet/cell_serializer.rb
@@ -10,7 +10,9 @@ module Axlsx
# @param [String] str The string to apend serialization to.
# @return [String]
def to_xml_string(row_index, column_index, cell, str = +'')
- str << '<c r="' << Axlsx::cell_r(column_index, row_index) << '" s="' << cell.style.to_s << '" '
+ str << '<c r="'
+ str << Axlsx::col_ref(column_index) << Axlsx::row_ref(row_index)
+ str << '" s="' << cell.style.to_s << '" '
return str << '/>' if cell.value.nil?
method = cell.type
diff --git a/lib/axlsx/workbook/worksheet/row.rb b/lib/axlsx/workbook/worksheet/row.rb
index 16116835..dc0320b7 100644
--- a/lib/axlsx/workbook/worksheet/row.rb
+++ b/lib/axlsx/workbook/worksheet/row.rb
@@ -89,7 +89,7 @@ module Axlsx
# @param [String] str The string this rows xml will be appended to.
# @return [String]
def to_xml_string(r_index, str = +'')
- serialized_tag('row', str, :r => r_index + 1) do
+ serialized_tag('row', str, :r => Axlsx.row_ref(r_index)) do
each_with_index { |cell, c_index| cell.to_xml_string(r_index, c_index, str) }
end
end
diff --git a/lib/axlsx/workbook/worksheet/worksheet.rb b/lib/axlsx/workbook/worksheet/worksheet.rb
index 960f33b3..21c53409 100644
--- a/lib/axlsx/workbook/worksheet/worksheet.rb
+++ b/lib/axlsx/workbook/worksheet/worksheet.rb
@@ -429,7 +429,6 @@ module Axlsx
# Allowing user generated data to be interpreted as formulas can be dangerous
# (see https://www.owasp.org/index.php/CSV_Injection for details).
def add_row(values = [], options = {})
- options[:escape_formulas] = escape_formulas if options[:escape_formulas].nil?
row = Row.new(self, values, options)
update_column_info row, options.delete(:widths)
yield row if block_given?
diff --git a/test/tc_axlsx.rb b/test/tc_axlsx.rb
index 95c77d88..3c4b5f93 100644
--- a/test/tc_axlsx.rb
+++ b/test/tc_axlsx.rb
@@ -3,6 +3,7 @@
require 'tc_helper'
class TestAxlsx < Test::Unit::TestCase
+ # rubocop:disable Layout/HashAlignment
def setup_wide
@wide_test_points = {
"A3" => 0,
@@ -15,6 +16,7 @@ class TestAxlsx < Test::Unit::TestCase
"BZU3" => (2 * (26**2)) + (26 * 26) + 20
}
end
+ # rubocop:enable Layout/HashAlignment
def test_cell_range_empty_if_no_cell
assert_equal("", Axlsx.cell_range([]))
@@ -83,8 +85,14 @@ class TestAxlsx < Test::Unit::TestCase
end
end
+ def test_row_ref
+ assert_equal('1', Axlsx.row_ref(0))
+ assert_equal('100', Axlsx.row_ref(99))
+ end
+
def test_cell_r
- # todo
+ assert_equal('A1', Axlsx.cell_r(0, 0))
+ assert_equal('Z26', Axlsx.cell_r(25, 25))
end
def test_range_to_a
diff --git a/test/workbook/worksheet/tc_cell.rb b/test/workbook/worksheet/tc_cell.rb
index a534a8dc..fef23ede 100644
--- a/test/workbook/worksheet/tc_cell.rb
+++ b/test/workbook/worksheet/tc_cell.rb
@@ -567,7 +567,7 @@ class TestCell < Test::Unit::TestCase
def test_to_xml
# TODO: This could use some much more stringent testing related to the xml content generated!
@ws.add_row [Time.now, Date.today, true, 1, 1.0, "text", "=sum(A1:A2)", "2013-01-13T13:31:25.123"]
- @ws.rows.last.cells[5].u = true
+ @ws.rows.last.cells[5].u = :single
schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
doc = Nokogiri::XML(@ws.to_xml_string)