Ferramenta de linha de comando para visualizar arquivos xls

27

Existe uma ferramenta de linha de comando para exibir / abrir arquivos excel (.xls)?

Portanto, a resposta funciona muito bem, a menos que as planilhas não tenham um nome personalizado.

Quando tento abrir o arquivo, recebo:

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.

No entanto, se eu abrir o arquivo e renomear a planilha para 'teste' ou algo funcionar corretamente. O que preciso ajustar para que ele possa lidar com os nomes padrão? (Folha1, etc)

O arquivo que estou tentando abrir no momento tem apenas 1 planilha, denominada Plan1.

David Oneill
fonte

Respostas:

22

Sim, é um pouco hacky embora. Vamos começar instalando dois pacotes:

sudo apt-get install python-excelerator w3m

A partir daí, usamos um script fornecido com o pacote python-exceleratorpara converter o documento em um arquivo HTML. Em seguida, canalizamos isso para um navegador de linha de comando ( w3m) e o exibimos.

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

Você pode criar uma função bash ou um alias com isso se não quiser continuar digitando-a. Deve fornecer uma saída como esta:

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

Muito pretteh. Obviamente, isso não suporta nenhum tipo de macro, edição ou interatividade. Isto é puramente um visualizador. Você também pode trabalhar para remover as aspas que envolvem as coisas. Não estou particularmente incomodado com eles neste momento.

Se você não precisa ser tão tabular, pode simplesmente ter algo assim:

py_xls2csv spreadsheet.xls 2>&1 | less

Você pode ir além e exibi-lo de uma maneira um pouco melhor:

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

Isso fornece o seguinte:

  1 this   is    a       spreadsheet
  2 it     is    very    nice
  3 this   has   three   rows
Oli
fonte
Para despejá-lo no arquivo de texto sem formatação: links -dump /tmp/tempspreadsheet.html ..... Também: como está, imprime caracteres Unicode no \u0950formato ... Talvez haja uma maneira de processar a saída para produzir o caractere Unicode ... Se alguém souber um " simples assim", eu gostaria de vê-lo ...
Peter.O
@fred Eu mudei para w3magora (porque parece melhor) e isso tem algumas opções de charset (consulte w3m --help). Também reduzi o comprimento, incluindo diminuir a necessidade de canalizá-lo para um arquivo.
Oli
Impressionante! Isso funciona na maioria dos casos: ver edição para pós principal para a parte 2 da questão (é mais fácil de coisas formato lá do que em um comentário)
David Oneill
py_xls2csvé codificado para funcionar com a página de códigos cp1251 .. Descobri que substituir as 3 instâncias de cp1251com utf-8resolve o 'problema' de não exibir caracteres unicode ... Suponho que depende do que está na pasta de trabalho. mas usando utf-8 trabalhou para mim ... (I didi não perceber que até depois que eu postei minha resposta, mas pode ser útil para outras conversões)
Peter.O
Um comentário tardio ... Eu apenas tentei usar isso para tabular um arquivo de texto csv (convertendo para xls primeiro) .. e embora o gerado htmltenha mantido vários espaços, a saída renderizada os exibe como um espaço único (típico de html) .. ... ou seja, é <td> cows         moo </td>exibido como cows moo... Provavelmente, há alguns ajustes simples para isso, mas meu conhecimento de html não vai muito além de ser capaz de soletrar 'html' .. :)
Peter.O
1

Aqui está um método que mantém os caracteres Unicode.
ie ele exibe , em vez de exibir o valor do Unicode Codepoint\U0906

O script usa o OpenOffice.org e o PyODConverter.py para converter um formato de documento OOo em outro formato OOo. Os tipos de conversão são baseados nas extensões de nome de arquivo:

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

Provavelmente, existe outra maneira de sair do OOo (mas eu não o conheço).
E provavelmente existe alguma maneira de iniciar uma instância independente do OOo também, mas também não sei como fazer isso. requer que o OOo não esteja sendo executado ...

Peter.O
fonte