Narzędzie wiersza polecenia do przeglądania plików XLS

27

Czy istnieje narzędzie wiersza polecenia do przeglądania / otwierania plików Excel (.xls)?

Tak więc odpowiedź działa świetnie, chyba że arkusze nie mają niestandardowej nazwy.

Kiedy próbuję otworzyć plik, otrzymuję:

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.

Jeśli jednak otworzę plik i zmienię nazwę arkusza na „test” lub coś, co działa dobrze. Co muszę poprawić, aby mógł obsługiwać nazwy domyślne? (Arkusz 1 itp.)

Plik, który próbuję obecnie otworzyć, ma tylko 1 arkusz o nazwie Arkusz1.

David Oneill
źródło

Odpowiedzi:

22

Tak, to jest trochę zuchwałe. Zacznijmy od zainstalowania dwóch pakietów:

sudo apt-get install python-excelerator w3m

Stamtąd używamy dołączonego skryptu, python-exceleratoraby przekonwertować dokument na plik HTML. Następnie potokujemy to do przeglądarki wiersza poleceń ( w3m) i wyświetlamy.

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

Możesz utworzyć funkcję bash lub alias, jeśli nie chcesz jej pisać. Powinien dać ci taki wynik:

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

Bardzo pretteh. Oczywiście nie będzie to obsługiwać żadnego makra, edycji ani żadnej interaktywności. To jest wyłącznie widz. Możesz także pracować nad usuwaniem cudzysłowów, które otaczają rzeczy. W tym momencie nie przejmuję się nimi szczególnie.

Jeśli nie potrzebujesz być tak tabelaryczny, możesz po prostu mieć coś takiego:

py_xls2csv spreadsheet.xls 2>&1 | less

Możesz pójść o krok dalej i wyświetlić go w nieco ładniejszy sposób:

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

To daje następujące możliwości:

  1 this   is    a       spreadsheet
  2 it     is    very    nice
  3 this   has   three   rows
Oli
źródło
Aby zrzucić go do zwykłego pliku tekstowego: links -dump /tmp/tempspreadsheet.html ..... Również: tak, jak jest, drukuje znaki Unicode w \u0950formacie ... Może istnieje jakiś sposób przetworzenia danych wyjściowych w celu utworzenia znaku Unicode ... Jeśli ktoś zna „ prosty "sposób, chciałbym to zobaczyć ...
Peter.O,
@ fred Zmieniłem go w3mteraz (ponieważ po prostu wygląda ładniej) i ma kilka opcji zestawu znaków (patrz w3m --help). Skróciłem również długość, w tym zasugerowałem potrzebę przeniesienia jej do pliku.
Oli
Niesamowite! Działa to w większości przypadków: zobacz edycję do głównego postu w części 2 pytania (tam łatwiej sformatować rzeczy niż w komentarzu)
David Oneill
py_xls2csvjest zakodowany do pracy z kodowej cp1251 .. Odkryłem, że zastępując 3 przypadki cp1251z utf-8rozwiązuje „problem” z nie wyświetla znaki Unicode ... Przypuszczam, że to zależy od tego, co jest w spreadsheed., ale przy użyciu UTF-8 pracował dla mnie ... (nie zdawałem sobie z tego sprawy, dopóki nie opublikowałem odpowiedzi, ale może się
przydać
Spóźniony komentarz ... Właśnie próbowałem użyć tego do tabelarycznego pliku tekstowego csv (najpierw konwertując na xls) .. i mimo że wygenerowane htmlzachowało wiele spacji, renderowane dane wyjściowe wyświetlają je jako pojedynczą spację (typową dla html) .. , tzn. <td> cows         moo </td>wyświetla się jako cows moo... Prawdopodobnie istnieje kilka prostych poprawek w tym zakresie, ale moja wiedza HTML nie wykracza daleko poza pisownię „HTML” .. :)
Peter.O
1

Oto metoda, która utrzymuje znaki Unicode.
to znaczy. wyświetla zamiast wyświetlać wartość Unicode Codepoint\U0906

Skrypt wykorzystuje OpenOffice.org i PyODConverter.py do konwersji jednego formatu dokumentu OOo na inny format OOo. Typy konwersji są oparte na rozszerzeniach nazw plików:

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

Prawdopodobnie istnieje inny sposób na wyjście z OOo (ale nie wiem).
Prawdopodobnie istnieje też sposób na uruchomienie niezależnej instancji OOo, ale nie wiem też, jak to zrobić, ponieważ tak jest, wymaga, aby OOo nie działało ...

Peter.O
źródło