lib/write_xlsx/workbook.rb in write_xlsx-0.73.0 vs lib/write_xlsx/workbook.rb in write_xlsx-0.74.0
- old
+ new
@@ -680,10 +680,13 @@
#
# workbook.define_name("'New Data'!Sales", '=Sheet2!$G$1:$G$10')
#
# See the defined_name.rb program in the examples dir of the distro.
#
+ # Refer to the following to see Excel's syntax rules for defined names:
+ # <http://office.microsoft.com/en-001/excel-help/define-and-use-names-in-formulas-HA010147120.aspx#BMsyntax_rules_for_names>
+ #
def define_name(name, formula)
sheet_index = nil
sheetname = ''
# Local defined names are formatted like "Sheet1!name".
@@ -693,22 +696,30 @@
sheet_index = @worksheets.index_by_name(sheetname)
else
sheet_index = -1 # Use -1 to indicate global names.
end
- # Warn if the sheet index wasn't found.
+ # Raise if the sheet index wasn't found.
if !sheet_index
raise "Unknown sheet name #{sheetname} in defined_name()\n"
end
- # Warn if the sheet name contains invalid chars as defined by Excel help.
- if name !~ %r!^[a-zA-Z_\\][a-zA-Z_.]+!
- raise "Invalid characters in name '#{name}' used in defined_name()\n"
+ # Raise if the name contains invalid chars as defined by Excel help.
+ # Refer to the following to see Excel's syntax rules for defined names:
+ # http://office.microsoft.com/en-001/excel-help/define-and-use-names-in-formulas-HA010147120.aspx#BMsyntax_rules_for_names
+ #
+ if name =~ /\A[-0-9 !"#\$%&'\(\)\*\+,\.:;<=>\?@\[\]\^`\{\}~]/ || name =~ /.+[- !"#\$%&'\(\)\*\+,\\:;<=>\?@\[\]\^`\{\}~]/
+ raise "Invalid characters in name '#{name}' used in defined_name()\n"
end
- # Warn if the sheet name looks like a cell name.
+ # Raise if the name looks like a cell name.
if name =~ %r(^[a-zA-Z][a-zA-Z]?[a-dA-D]?[0-9]+$)
raise "Invalid name '#{name}' looks like a cell name in defined_name()\n"
+ end
+
+ # Raise if the name looks like a R1C1
+ if name =~ /\A[rcRC]\Z/ || name =~ /\A[rcRC]\d+[rcRC]\d+\Z/
+ raise "Invalid name '#{name}' like a RC cell ref in defined_name()\n"
end
@defined_names.push([ name, sheet_index, formula.sub(/^=/, '') ])
end