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.

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

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 ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.