Skip to content

Commit 33aeca0

Browse files
Modified ooxml_util_pkg functions
Modified the ooxml_util_pkg.get_xlsx_column_ref and the ooxml_util_pkg.get_xlsx_column_number functions to support columns up to the limit (currently XFD or 16384) and in ooxml_util_pkg.get_xlsx_column_ref to fix the bug where the '@' is returned at multiples of 26.
1 parent 11a15da commit 33aeca0

File tree

2 files changed

+58
-54
lines changed

2 files changed

+58
-54
lines changed

ora/ooxml_util_pkg.pkb

Lines changed: 56 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -308,63 +308,71 @@ begin
308308
end get_xlsx_properties;
309309

310310

311-
function get_xlsx_column_number (p_column_ref in varchar2) return number
311+
function get_xlsx_column_number( p_column_ref in varchar2 ) return number
312312
as
313-
l_returnvalue number;
313+
l_column_number number;
314+
l_char_num number;
315+
l_power number;
316+
l_factor decimal;
314317
begin
315318

316-
/*
317-
318-
Purpose: get column number from column reference
319-
320-
Remarks:
321-
322-
Who Date Description
323-
------ ---------- --------------------------------
324-
MBR 11.07.2011 Created
325-
326-
*/
319+
/*
320+
321+
Purpose: get column number from column reference
322+
323+
Remarks:
324+
325+
Who Date Description
326+
------ ---------- --------------------------------
327+
MBR 11.07.2011 Created
328+
JMW 29.11.2016 Modified to support columns up to the limit (currently XFD or 16384)
329+
330+
*/
331+
332+
l_power := length( p_column_ref ) - 1;
333+
334+
for i in 1..length( p_column_ref ) loop
335+
l_char_num := ascii( substr( p_column_ref, i, 1 ));
336+
l_factor := ( l_char_num - 65 ) + 1;
337+
l_column_number := ( l_factor * power( 26, l_power )) + NVL( l_column_number, 0 );
338+
l_power := l_power - 1;
339+
end loop;
340+
341+
return l_column_number;
327342

328-
if length(p_column_ref) > 1 then
329-
l_returnvalue := ascii(substr(p_column_ref,1,1)) - 64;
330-
l_returnvalue := l_returnvalue * 26;
331-
l_returnvalue := l_returnvalue + (ascii(substr(p_column_ref,2,1)) - 64);
332-
else
333-
l_returnvalue := ascii(p_column_ref) - 64;
334-
end if;
335-
336-
return l_returnvalue;
337-
338343
end get_xlsx_column_number;
339344

340345

341-
function get_xlsx_column_ref (p_column_number in varchar2) return varchar2
346+
function get_xlsx_column_ref( p_column_number in number ) return varchar2
342347
as
343-
l_offset number;
344-
l_returnvalue varchar2(2);
348+
l_dividend decimal;
349+
l_modulo decimal;
350+
l_column_name varchar2(3);
345351
begin
346-
347-
/*
348-
349-
Purpose: get column reference from column number
350-
351-
Remarks:
352-
353-
Who Date Description
354-
------ ---------- --------------------------------
355-
MBR 11.07.2011 Created
356-
357-
*/
358352

359-
if p_column_number < 27 then
360-
l_returnvalue := chr(p_column_number + 64);
361-
else
362-
l_offset := trunc(p_column_number/26);
363-
l_returnvalue := chr(l_offset + 64);
364-
l_returnvalue := l_returnvalue || chr(p_column_number - (l_offset * 26) + 64);
365-
end if;
366-
367-
return l_returnvalue;
353+
/*
354+
355+
Purpose: get column reference from column number
356+
357+
Remarks:
358+
359+
Who Date Description
360+
------ ---------- --------------------------------
361+
MBR 11.07.2011 Created
362+
JMW 29.11.2016 Modified to support columns up to the limit (currently XFD or 16384)
363+
and to fix the bug where the '@' is returned at multiples of 26
364+
365+
*/
366+
367+
l_dividend := p_column_number;
368+
369+
while l_dividend > 0 loop
370+
l_modulo := mod( l_dividend - 1, 26 );
371+
l_column_name := to_char( chr( l_modulo + 65 )) || l_column_name;
372+
l_dividend := (( l_dividend - l_modulo ) / 26 );
373+
end loop;
374+
375+
return l_column_name;
368376

369377
end get_xlsx_column_ref;
370378

@@ -878,7 +886,4 @@ end get_pptx_plaintext;
878886

879887

880888
end ooxml_util_pkg;
881-
/
882-
883-
884-
889+
/

ora/ooxml_util_pkg.pks

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ as
107107
function get_xlsx_column_number (p_column_ref in varchar2) return number;
108108

109109
-- get column reference from column number
110-
function get_xlsx_column_ref (p_column_number in varchar2) return varchar2;
110+
function get_xlsx_column_ref (p_column_number in number) return varchar2;
111111

112112
-- get cell value from XLSX file
113113
function get_xlsx_cell_value (p_xlsx in blob,
@@ -148,5 +148,4 @@ as
148148
p_note in number := null) return clob;
149149

150150
end ooxml_util_pkg;
151-
/
152-
151+
/

0 commit comments

Comments
 (0)