Skip to content

Commit 48a1900

Browse files
committed
fix parsing sheetname with unicode chars
1 parent 4a2700c commit 48a1900

File tree

1 file changed

+26
-15
lines changed

1 file changed

+26
-15
lines changed

src/cellref.jl

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ See also: `encode_column_number`.
2626
function decode_column_number(column_name::AbstractString) :: Int
2727
local result::Int = 0
2828

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
3031

3132
iteration = 1
3233
for i in num_characters:-1:1
@@ -115,8 +116,9 @@ julia> XLSX.split_cellname("AB:12")
115116
```
116117
"""
117118
@inline function split_cellname(n::AbstractString)
119+
@assert isascii(n) "$n is not a valid cell name."
118120
for (i, c) in enumerate(n)
119-
if isdigit(c)
121+
if isdigit(c) # this block is safe since n is encoded as ASCII
120122
column_name = SubString(n, 1, i-1)
121123
row = parse(Int, SubString(n, i, length(n)))
122124

@@ -445,41 +447,50 @@ function is_valid_sheet_column_range(n::AbstractString) :: Bool
445447
return true
446448
end
447449

450+
const RGX_SHEET_PREFIX = r"^.+!"
448451
const RGX_CELLNAME_RIGHT_FIXED = r"\$[A-Z]+\$[0-9]+$"
449452
const RGX_SHEET_CELNAME_RIGHT_FIXED = r"\$[A-Z]+\$[0-9]+:\$[A-Z]+\$[0-9]+$"
450453

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+
451461
function SheetCellRef(n::AbstractString)
462+
local cellref::CellRef
463+
452464
if is_valid_fixed_sheet_cellname(n)
453465
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, "\$" => ""))
457467
else
458468
@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)
462470
end
471+
sheetname = parse_sheetname_from_sheetcell_name(n)
472+
return SheetCellRef(sheetname, cellref)
463473
end
464474

465475
function SheetCellRange(n::AbstractString)
476+
local cellrange::CellRange
477+
466478
if is_valid_fixed_sheet_cellrange(n)
467479
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, "\$" => ""))
471481
else
472482
@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)
476484
end
485+
486+
sheetname = parse_sheetname_from_sheetcell_name(n)
487+
return SheetCellRange(sheetname, cellrange)
477488
end
478489

479490
function SheetColumnRange(n::AbstractString)
480491
@assert is_valid_sheet_column_range(n) "$n is not a valid SheetColumnRange."
481492
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)
483494
return SheetColumnRange(sheetname, ColumnRange(column_range))
484495
end
485496

0 commit comments

Comments
 (0)