@@ -26,7 +26,8 @@ See also: `encode_column_number`.
26
26
function decode_column_number (column_name:: AbstractString ) :: Int
27
27
local result:: Int = 0
28
28
29
- num_characters = length (column_name)
29
+ @assert isascii (column_name) " $column_name is not a valid column name."
30
+ num_characters = length (column_name) # this is safe, since `column_name` is encoded as ASCII
30
31
31
32
iteration = 1
32
33
for i in num_characters: - 1 : 1
@@ -115,8 +116,9 @@ julia> XLSX.split_cellname("AB:12")
115
116
```
116
117
"""
117
118
@inline function split_cellname (n:: AbstractString )
119
+ @assert isascii (n) " $n is not a valid cell name."
118
120
for (i, c) in enumerate (n)
119
- if isdigit (c)
121
+ if isdigit (c) # this block is safe since n is encoded as ASCII
120
122
column_name = SubString (n, 1 , i- 1 )
121
123
row = parse (Int, SubString (n, i, length (n)))
122
124
@@ -445,41 +447,50 @@ function is_valid_sheet_column_range(n::AbstractString) :: Bool
445
447
return true
446
448
end
447
449
450
+ const RGX_SHEET_PREFIX = r" ^.+!"
448
451
const RGX_CELLNAME_RIGHT_FIXED = r" \$ [A-Z]+\$ [0-9]+$"
449
452
const RGX_SHEET_CELNAME_RIGHT_FIXED = r" \$ [A-Z]+\$ [0-9]+:\$ [A-Z]+\$ [0-9]+$"
450
453
454
+ function parse_sheetname_from_sheetcell_name (n:: AbstractString ) :: SubString
455
+ @assert occursin (RGX_SHEET_PREFIX, n) " $n is not a SheetCell reference."
456
+ sheetname = match (RGX_SHEET_PREFIX, n). match
457
+ sheetname = SubString (sheetname, firstindex (sheetname), prevind (sheetname, lastindex (sheetname)))
458
+ return sheetname
459
+ end
460
+
451
461
function SheetCellRef (n:: AbstractString )
462
+ local cellref:: CellRef
463
+
452
464
if is_valid_fixed_sheet_cellname (n)
453
465
fixed_cellname = match (RGX_CELLNAME_RIGHT_FIXED, n). match
454
- cellname = replace (fixed_cellname, " \$ " => " " )
455
- sheetname = SubString (n, 1 , length (n) - length (fixed_cellname) - 1 )
456
- return SheetCellRef (sheetname, CellRef (cellname))
466
+ cellref = CellRef (replace (fixed_cellname, " \$ " => " " ))
457
467
else
458
468
@assert is_valid_sheet_cellname (n) " $n is not a valid SheetCellRef."
459
- cellname = match (RGX_SHEET_CELLNAME_RIGHT, n). match
460
- sheetname = SubString (n, 1 , length (n) - length (cellname) - 1 )
461
- return SheetCellRef (sheetname, CellRef (cellname))
469
+ cellref = CellRef (match (RGX_SHEET_CELLNAME_RIGHT, n). match)
462
470
end
471
+ sheetname = parse_sheetname_from_sheetcell_name (n)
472
+ return SheetCellRef (sheetname, cellref)
463
473
end
464
474
465
475
function SheetCellRange (n:: AbstractString )
476
+ local cellrange:: CellRange
477
+
466
478
if is_valid_fixed_sheet_cellrange (n)
467
479
fixed_cellrange = match (RGX_SHEET_CELNAME_RIGHT_FIXED, n). match
468
- cellrange = replace (fixed_cellrange, " \$ " => " " )
469
- sheetname = SubString (n, 1 , length (n) - length (fixed_cellrange) - 1 )
470
- return SheetCellRange (sheetname, CellRange (cellrange))
480
+ cellrange = CellRange (replace (fixed_cellrange, " \$ " => " " ))
471
481
else
472
482
@assert is_valid_sheet_cellrange (n) " $n is not a valid SheetCellRange."
473
- cellrange = match (RGX_SHEET_CELLRANGE_RIGHT, n). match
474
- sheetname = SubString (n, 1 , length (n) - length (cellrange) - 1 )
475
- return SheetCellRange (sheetname, CellRange (cellrange))
483
+ cellrange = CellRange (match (RGX_SHEET_CELLRANGE_RIGHT, n). match)
476
484
end
485
+
486
+ sheetname = parse_sheetname_from_sheetcell_name (n)
487
+ return SheetCellRange (sheetname, cellrange)
477
488
end
478
489
479
490
function SheetColumnRange (n:: AbstractString )
480
491
@assert is_valid_sheet_column_range (n) " $n is not a valid SheetColumnRange."
481
492
column_range = match (RGX_SHEET_COLUMN_RANGE_RIGHT, n). match
482
- sheetname = SubString (n, 1 , length (n) - length (column_range) - 1 )
493
+ sheetname = parse_sheetname_from_sheetcell_name (n )
483
494
return SheetColumnRange (sheetname, ColumnRange (column_range))
484
495
end
485
496
0 commit comments