Strumento da riga di comando per la visualizzazione di file xls


27

Esiste uno strumento da riga di comando per visualizzare / aprire file excel (.xls)?

Quindi la risposta funziona alla grande a meno che i fogli di lavoro non abbiano un nome personalizzato.

Quando provo ad aprire il file, ottengo:

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.

Tuttavia, se apro il file e rinomino il foglio in "test" o qualcosa funziona correttamente. Cosa devo modificare per poter gestire i nomi predefiniti? (Foglio1, ecc.)

Il file che sto provando ad aprire al momento ha solo 1 foglio, chiamato Foglio1.

Risposte:


22

Sì, però è un po 'confuso. Iniziamo installando due pacchetti:

sudo apt-get install python-excelerator w3m

Da lì, utilizziamo uno script fornito in bundle con python-exceleratorper convertire il documento in un file HTML. Quindi lo inseriamo in un browser della riga di comando ( w3m) e lo visualizziamo.

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

Puoi creare una funzione bash o un alias con quella se non vuoi continuare a digitarla. Dovrebbe darti un output in questo modo:

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

Molto carino. Ovviamente questo non supporterà alcun tipo di macro, modifica o interattività. Questo è puramente uno spettatore. Puoi anche lavorare per eliminare le virgolette che avvolgono le cose. Non sono particolarmente infastidito da loro a questo punto.

Se non ti serve per essere il più tabulare potresti semplicemente avere qualcosa del genere:

py_xls2csv spreadsheet.xls 2>&1 | less

Puoi andare oltre e visualizzarlo in un modo leggermente più bello:

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

Questo ti dà quanto segue:

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

Per scaricarlo in un semplice file di testo: links -dump /tmp/tempspreadsheet.html ..... Inoltre: così com'è, stampa i caratteri Unicode in \u0950formato ... Forse c'è un modo per elaborare l'output per produrre il carattere Unicode ... Se qualcuno conosce un " semplice "modo, mi piacerebbe vederlo ...
Peter.O

@fred L'ho cambiato w3mora (perché sembra più bello) e che ha alcune opzioni di set di caratteri (vedi w3m --help). Ho anche ridotto la lunghezza, inclusa la necessità di convogliarlo in un file.
Oli

Eccezionale! Funziona nella maggior parte dei casi: vedi modifica al post principale per la parte 2 della domanda (È più facile formattare le cose lì che in un commento)
David Oneill

py_xls2csvè hard-coded per funzionare con la codepage cp1251 .. Ho scoperto che la sostituzione delle 3 istanze di cp1251with utf-8risolve il "problema" di non visualizzare i caratteri unicode ... Suppongo che dipenda da cosa c'è nel foglio di calcolo ma usando utf-8 ha funzionato per me ... (non me ne sono reso conto fino a quando non ho pubblicato la mia risposta, ma potrebbe essere utile per altre conversioni)
Peter.O

Un commento tardivo ... Ho appena provato a usarlo per tabulare un file di testo CSV (convertendolo prima in xls) .. e sebbene il generato htmlabbia mantenuto più spazi, l'output renderizzato li mostra come un unico spazio (tipico di HTML) .. Ad esempio .. <td> cows         moo </td>viene visualizzato come cows moo... C'è probabilmente qualche semplice modifica per questo, ma la mia conoscenza html non va ben oltre la possibilità di scrivere 'html' .. :)
Peter.O

1

Ecco un metodo che mantiene i caratteri Unicode.
vale a dire. viene visualizzato , anziché visualizzare il valore del punto di codice Unicode\U0906

Lo script utilizza OpenOffice.org e PyODConverter.py per convertire un formato di documento OOo in un altro formato OOo. I tipi di conversione si basano sulle estensioni del nome file:

  • 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
#

Esiste probabilmente un altro modo per uscire da OOo (ma non lo so)
E probabilmente c'è un modo per avviare anche un'istanza indipendente di OOo, ma non so neanche come farlo, così com'è, richiede che OOo non sia in esecuzione ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.