Yo también uso SpreadSheet::Read para leer Excel.
En la mayor parte de las situaciones, las hojas están codificadas en una única codificación (generalmente utf-8, con los últimos Windows), así que no es necesario hacer nada, salvo acordarse de que tenemos que trabajar en utf-8.
En cambio, con software y Excel viejos, pueden venir en distintas codificaciones, incluso celdas con codificaciones distintas.
No queda entonces más remedio que abrir la hoja con SpreadSheet::Read con la opción de que genere los atributos, y mirar en ellos por la codificación de la celda. Y con la función from_to() de
Encode, pasarlo todo a una sola codificación.
Algo así:
Using perl Syntax Highlighting
# Leer la base de datos del archivo Excel $FICHERO_BASE,
# pero no queremos que genere referencias nominales a las celdas,
# y sí, el hash de atributos de cada celda.
my $BASE = ReadData($FICHERO_BASE, cells => 0, attr => 1);
die "ERROR: Base de datos no encontrada" if not $BASE;
#my %HOJAS = %{$BASE->[0]{sheet}}; # Relación hojas -> índices
my $HOJA = $BASE->[ 1 ]->{cell}; # Solo me interesa la primera hoja
my $ATTR = $BASE->[ 1 ]->{attr}; # Atributos de las celdas de la primera hoja
exit if ! $HOJA;
# Recorrer toda la matriz
my $maximo_filas = $BASE->[ 1 ]->{maxrow};
my $maximo_cols = $BASE->[ 1 ]->{maxcol};
for my $fila (1 .. $maximo_filas) {
for my $columna (1 .. $maximo_cols) {
my $contenido_celda = $HOJA->[$columna]->[$fila];
if ($contenido_celda) { # si hay algo en la celda...
if ($ATTR->[$columna]->[$fila]->{enc}) { # ¿tiene atributo de codificación?
# esta línea es obsoleta: cambiaba a codificación 'utf-16' en caso de que hubiera una 'ucs2'
# $ATTR->[$columna]->[$fila]->{enc} = 'utf-16' if $ATTR->[$columna]->[$fila]->{enc} eq 'ucs2';
# pasamos de la codificación en que esté, a 'iso-8859-1'
my $b = from_to($contenido_celda, $ATTR->[$columna]->[$fila]->{enc}, "iso-8859-1");
}
}
else {
...;
}
}
}
Coloreado en 0.005 segundos, usando
GeSHi 1.0.8.4
Con la función from_to(), pasamos lo que sea, de la codificación que sea, a 'iso-8859-1'. El resultado queda en la propia $contenido_celda. En la mayor parte de los casos, la codificación que aparece en las celdas será 'utf-16'... pero depende de la versión de M$Office y/o M$Windows que estés usando...
Si no sabes en qué codificación está, haz un Dumper del hash de atributos, y así verás, en los campos 'enc', en qué están puestas las celdas.
En cuanto a quitar las tildes,
ya hemos hablado de ese asunto...