Herramienta de línea de comandos para ver archivos xls


27

¿Existe una herramienta de línea de comandos para ver / abrir archivos de Excel (.xls)?

Entonces, la respuesta funciona muy bien a menos que las hojas de trabajo no tengan un nombre personalizado.

Cuando intento abrir el archivo, obtengo:

Traceback (most recent call last):
  File "/usr/bin/py_xls2csv", line 17, in <module>
    for sheet_name, values in parse_xls(arg, 'cp1251'): # parse_xls(arg) -- default encoding
  File "/usr/lib/python2.5/site-packages/pyExcelerator/ImportXLS.py", line 334, in parse_xls
    raise Exception, 'No workbook stream in file.'
Exception: No workbook stream in file.

Sin embargo, si abro el archivo y cambio el nombre de la hoja a 'prueba' o algo, funciona bien. ¿Qué necesito ajustar para que pueda manejar los nombres predeterminados? (Hoja1, etc.)

El archivo que estoy tratando de abrir en este momento solo tiene 1 hoja, llamada Sheet1.

Respuestas:


22

Sí, aunque es un poco hacky. Comencemos instalando dos paquetes:

sudo apt-get install python-excelerator w3m

A partir de ahí, usamos un script que viene incluido python-exceleratorpara convertir el documento en un archivo HTML. Luego lo canalizamos a un navegador de línea de comandos ( w3m) y lo mostramos.

py_xls2html spreadsheet.xls 2>/dev/null | sed 's/"//g' | w3m -dump -T 'text/html'

Puede crear una función bash o un alias con eso si no desea seguir escribiéndolo. Debería darte una salida como esta:

Sheet = Sheet1
┏━━━━┯━━━┯━━━━━┯━━━━━━━━━━━━┓
┃this│is │a    │spreadsheet ┃
┠────┼───┼─────┼────────────┨
┃it  │is │very │nice        ┃
┠────┼───┼─────┼────────────┨
┃this│has│three│rows        ┃
┗━━━━┷━━━┷━━━━━┷━━━━━━━━━━━━┛
Sheet = Sheet2 Sheet = Sheet3

Muy bonita. Obviamente, esto no va a soportar ningún tipo de macro, edición o interactividad. Esto es puramente un espectador. También podría trabajar eliminando las comillas que envuelven las cosas. No estoy particularmente molesto por ellos en este momento.

Si no necesita que sea tan tabular, simplemente podría tener algo como esto:

py_xls2csv spreadsheet.xls 2>&1 | less

Puede ir más allá y mostrarlo de una manera un poco más agradable:

py_xls2csv spreadsheet.xls 2>&1 | grep '^"' | sed 's/"//g' | column -s, -t | less -#2 -N -S

Eso te da lo siguiente:

  1 this   is    a       spreadsheet
  2 it     is    very    nice
  3 this   has   three   rows

Para volcarlo en un archivo de texto sin formato: links -dump /tmp/tempspreadsheet.html ..... También: tal como está, imprime caracteres Unicode en \u0950formato ... Tal vez haya alguna forma de procesar la salida para producir el carácter Unicode ... Si alguien conoce un " simple ", me gustaría verlo ...
Peter.O

@fred Lo he cambiado w3mahora (porque se ve mejor) y eso tiene algunas opciones de juego de caracteres (ver w3m --help). También he reducido la longitud, incluida la necesidad de canalizarlo a un archivo.
Oli

¡Increíble! Esto funciona en la mayoría de los casos: vea editar en la publicación principal para la parte 2 de la pregunta (es más fácil formatear cosas allí que en un comentario)
David Oneill

py_xls2csvestá codificado para trabajar con la página de códigos cp1251 .. He encontrado que la sustitución de los 3 casos de cp1251la utf-8resuelve el 'problema" de no mostrar caracteres Unicode ... supongo que depende de lo que está en el spreadsheed. pero utilizando UTF-8 funcionó para mí ... (No me di cuenta de esto hasta después de que publiqué mi respuesta, pero puede ser útil para otras conversiones)
Peter.O

Un comentario tardío ... Acabo de intentar usar esto para tabular un archivo de texto csv (convirtiendo a xls primero) ... y aunque el generado htmlha mantenido múltiples espacios, la salida representada los muestra como un solo espacio (típico de html) ... . ie ... se <td> cows         moo </td>muestra como cows moo... Probablemente haya algún ajuste simple para esto, pero mi conocimiento de html no va mucho más allá de poder deletrear 'html' .. :)
Peter.O

1

Aquí hay un método que mantiene los caracteres Unicode.
es decir. se muestra , en lugar de mostrar el valor del punto de código Unicode\U0906

El script usa OpenOffice.org y PyODConverter.py para convertir un formato de documento OOo a otro formato OOo. Los tipos de conversión se basan en las extensiones de nombre de archivo:

  • pdf html odt doc txt ods xls csv odp ppt swf

#
oextn="html" # output type
ifile="My_OOo_File"   ;echo ifile="$ifile"
ofile="$ifile.$oextn" ;echo ofile="$ofile"
[[ -f "$ofile" ]] && { rm "$ofile"; }
[[ -f "$ofile" ]] && { echo "A pre-existing Output file was NOT removed" ;exit; } 
#
sofport=8100
soffice="$(locate -br "^soffice.bin$")"
soffarg=( '-invisible' '-accept=socket,port='$sofport';urp;' )
soffrex="$soffice ${soffarg[@]}"
#
  soffpid=$(($(pgrep -f -n "$soffice")))
((soffpid!=0)) && { echo "A OpenOffice is already running. PID=$soffpid" ;exit; } 
#
# Start OpenOffice
"$soffice" "${soffarg[@]}" &
soffpid=$(($(pgrep -f -n "$soffrex")))
((soffpid== 0)) && { echo "A OpenOffice has not started yet=$soffpid" ;exit; } 
#
# Start OpenOffice
echo "** Attempting to connect to OpenOffice.org on port $sofport"
x=1; while ((x!=0)) ;do
    /usr/bin/python "$(which DocumentConverter.py)" "$ifile" "$ofile"
    x=$?
done
#
# Start Terminal Browser
w3m   "$ofile" -T 'text/html'
kill -15 $soffpid
#

Probablemente haya otra forma de salir de OOo (pero no lo sé)
Y probablemente haya alguna forma de iniciar una instancia independiente de OOo también, pero tampoco sé cómo hacerlo, por lo que es, requiere que OOo no se esté ejecutando ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.