@@ -308,63 +308,71 @@ begin
308308end 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
312312as
313- l_returnvalue number;
313+ l_column_number number;
314+ l_char_num number;
315+ l_power number;
316+ l_factor decimal;
314317begin
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-
338343end 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
342347as
343- l_offset number;
344- l_returnvalue varchar2(2);
348+ l_dividend decimal;
349+ l_modulo decimal;
350+ l_column_name varchar2(3);
345351begin
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
369377end get_xlsx_column_ref;
370378
@@ -878,7 +886,4 @@ end get_pptx_plaintext;
878886
879887
880888end ooxml_util_pkg;
881- /
882-
883-
884-
889+ /
0 commit comments