De basura nada...
seguro que lo que está viendo son caracteres codificados de forma distinta a lo que tu ordenador tiene configurado como codificación de caracteres de pantalla.
Yo también usaba antes la familia Spreadsheet Excel, pero ahora uso
Spreadsheet::Read, porque me permite acceder a los contenidos de las celdas de forma muy gráfica, y con los contenidos de las mismas, tanto en su valor original, como en el de presentación. Y es justamente eso lo que tienes que averiguar: en qué están codificadas las celdas que contienen esos caracteres.
Por ejemplo, yo hace poco he tenido que hacer un programa que mostrara el contenido de una hoja Excel, subida por el cliente a un servidor, en una tabla HTML dentro de una página web. El problema era que las celdas, si no tenían acentos, venían codificadas en iso-8859-1, mientras que las que sí los tenían, venían codificadas en UCS2-LE (utf16), el nativo de varias versiones de Windows).
Al principio, lo resolví (con el módulo anterior), mirando los atributos de cada celda a pintar:
Using perl Syntax Highlighting
if ($ATTR->[$columna]->[$fila]->{enc}) {
my $b = from_to($contenido_celda, $ATTR->[$columna]->[$fila]->{enc}, "iso-8859-1");
}
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Con la ayuda de la función from_to() del módulo Encode, era fácil pasarlo todo a iso-8859-1.
Más tarde, me dí cuenta que, usando la función row(), el módulo me devolvía los contenidos de toda la fila, y ya convertidos:
Using perl Syntax Highlighting
my @fila = row($HOJA, $fila);
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
así que ya no tenía que preocuparme de hacer conversiones (o, al menos, la conversión se hacía hacia el iso-8859-1 de Perl, y con eso me bastaba para sacar la información hacia el exterior).
En tu caso... recuerda que Data::Dumper es tu amigo... haz volcados de los contenidos de la hoja Excel leída, para ver en qué codificación está, o a ver si te lo dice en el hash de atributos de cada celda.
Por lo que veo, con la función $cell->value() se puede sacar el valor formateado de la celda, mientras que con $cell->unformatted(), el no formateado (lo estoy viendo en la sinopsis del módulo
Spreadsheet::ParseExcel).
En vez de Spreadsheet::ParseExcel::FmtJapan::TextFmt, ¿has probado con Spreadsheet::ParseExcel::FmtDefault::TextFmt? Según veo en su código, esta función devuelve caracteres en unicode, a partir de enteros de 16 bits (codificación utf16):
Using perl Syntax Highlighting
return pack( 'U*', unpack( 'n*', $sTxt ) );
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
El FmtJapan intentará hacer conversión a cp932