명령 줄을 사용하여 Linux에서 xlsx를 csv로 변환


266

Linux에서 xlsx 파일을 csv 파일로 변환하는 방법을 찾고 있습니다.

수백만 줄의 처리를보고 있기 때문에 PHP / Perl 등을 사용하고 싶지 않기 때문에 빠른 것이 필요합니다. xls2csv라는 우분투 저장소에서 프로그램을 찾았지만 현재 사용중인 xls (Office 2003) 파일 만 변환하지만 최신 Excel 파일에 대한 지원이 필요합니다.

어떤 아이디어?


10
스크립팅 언어로 구현 된 모든 것이 본질적으로 느려질 것이라고 생각하는 것은 조금 잘못 인도 된 것 같습니다. 특히 해당 언어의 흥미로운 라이브러리에 C로 작성된 백엔드가있는 경향이 있기 때문에 약간 잘못 안내됩니다.
Charles Duffy

2
Excel은 65536 행으로 제한되었습니다. 이제 1,048,576입니다 ( support.microsoft.com/kb/120596 ). 그 안에 "수백만 줄"을 맞추는 것은 힘들 것입니다. 그냥 ...
Pavel Veller

1
@Pavel은 여러 파일을 넘을 수 있습니다.
Charles Duffy

2
... 개인적으로 파이썬 용 xlsv 라이브러리를 사용 하여이 작업을 수행하지만 스크립팅 기반 접근 방식은 문제가 아닌 것으로 설명되므로 ... shrug . (프로그래밍 도구가 답변에서 제외되면 어떻게 프로그래밍 질문입니까?)
Charles Duffy

1
@CharlesDuffy 저는 현재 PHP 라이브러리를 사용하여 xls2csv를 1 초가 걸리는 데 PHP 10 분이 걸립니다. 말 그대로.
user1390150

답변:


239

Gnumeric을의 스프레드 시트 응용 프로그램라는 명령 줄 유틸리티와 함께 제공 ssconvert 스프레드 시트 다양한 형식 사이의 변환을 할 수 있습니다 :

$ ssconvert Book1.xlsx newfile.csv
Using exporter Gnumeric_stf:stf_csv

$ cat newfile.csv 
Foo,Bar,Baz
1,2,3
123.6,7.89,
2012/05/14,,
The,last,Line

우분투에 설치하려면 :

apt-get install gnumeric

Mac에 설치하려면

brew install gnumeric

19
스프레드 시트를 변환하는 가장 번거 로움없는 방법입니다. bash 스크립트와 함께 사용하면 여러 파일을 일괄 처리 할 수 ​​있습니다. for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; doneLibreOffice 방법은 아마도 다른 형식을 처리 할 수는 있지만 작동시킬 수는 없습니다 (매번 빈 파일을 열 수도 있습니다.--headless 인수로 ).
sleblanc

6
@sebleblanc 번거롭지 않습니다. 헤드리스 서버에서이 작업을 수행하는 경우 종속성 수를 고려하면 설치가 어려워집니다. 지금까지 gcc, intltool, zlib-devel, GTK ... GTK에는 glib, atk, pango, cairo, cairo-object, gdk-pixbuf-2.0이 필요합니다 ...
andrewtweber

11
와 함께 헤드리스 데비안 서버에 설치했습니다 apt-get install gnumeric --no-install-recommends. 유일한 단점은 많은 경고를 발생 시킨다는 것입니다. GConf-WARNING ** : 클라이언트가 실행 중 D-BUS 데몬에 연결하지 못했습니다 . 간단한 ssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1것이 트릭을 수행합니다.
Benjamin Delichere

7
csv에 쓰려면 -S플래그가 여러 시트를 쓰도록 할 수 있습니다. 각각 자체 파일로 이동합니다.
Ed Avis

5
@hhh 구분 기호 옵션은 txt 내보내기 유형에서만 작동합니다. 이것을 사용하여 stdout으로 인쇄 할 수 있습니다 : ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1.
exic

135

LibreOffice를 사용하여이 작업을 수행 할 수 있습니다.

libreoffice --headless --convert-to csv $filename --outdir $outdir

나에게 분명하지 않은 이유로 sudo로 이것을 실행해야 할 수도 있습니다. sudoers 파일에 다음 줄을 추가하여 암호 없이도 LibreOffice를 sudo와 함께 사용할 수 있습니다.

users ALL=(ALL) NOPASSWD: libreoffice

35
libreoffice에 두 번째 시트를 원한다고 어떻게 말합니까?
dmeu

30
암호없이 모든 사람이 sudo를 libreoffice에 허용하면 웜 캔이 열립니다. 다중 사용자 플랫폼에서 루트 권한을 획득 할 수있는 가능성을 포함하여 그 결과에주의하십시오
Interarticle

5
이것은 나를 위해 일했다 (sudo는 필요하지 않음). 내 버전 : libreoffice-calc-3.6.7.2-4.fc18.x86_64
Brad Hein

5
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filename나를 위해 OS X에서 일했습니다.
Nobu

12
ASCII 이외의 문자를 유지하면서 utf-8로 변환하려면 대신을 사용하십시오 --convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1". 자세한 내용은 오픈 오피스 위키 를 참조하십시오.
Aryeh Leib Taurog

132

데스크톱 환경이 이미있는 경우 Gnumeric / LibreOffice가 제대로 작동하지만 헤드리스 서버 (예 : Amazon Web Services)에서는 설치해야 할 수십 가지 종속성이 필요합니다.

이 파이썬 대안을 찾았습니다.

https://github.com/dilshod/xlsx2csv

$ easy_install xlsx2csv
$ xlsx2csv file.xlsx > newfile.csv

설치하는 데 2 ​​초가 걸렸으며 매력처럼 작동합니다.

시트가 여러 개인 경우 한 번에 또는 한 번에 하나씩 내보낼 수 있습니다.

$ xlsx2csv file.xlsx --all > all.csv
$ xlsx2csv file.xlsx --all -p '' > all-no-delimiter.csv
$ xlsx2csv file.xlsx -s 1 > sheet1.csv

또한 Bash, Python, Ruby 및 Java에 내장 된 여러 대안으로 연결됩니다.


잘 작동하지만 sudo ( IOError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/prettytable-0.7.2-py2.7.egg/EGG-INFO/top_level.txt') 로만 실행할 수 있습니다 . 이제 생각해 보니와 같은 오류가 발생했습니다 csvkit.
user2105469

2
나를 위해 큰 노력하고 -s 옵션을 사용하여 개별 파일에 각 시트의 추출 수있게되었습니다 .... - LibreOffice와는 시트의 크기를 처리 할 수 없습니다, xlsx2csv는 아무런 문제가 없었다
소렌을

감사! 우분투에서 매우 편리합니다.
zhuguowei

5
데비안과 우분투에는 xlsx2csv패키지가 있으므로 수동으로 설치할 필요는 easy_install없지만 패키지 관리자를 사용할 수 있습니다.
josch

MacOS의 경우sudo easy_install xlsx2csv
Frank Hintsch

32

bash에서는이 libreoffice 명령을 사용하여 현재 디렉토리의 모든 xlsx 파일을 변환했습니다.

for i   in *.xlsx; do  libreoffice --headless --convert-to csv "$i" ; done

파일 이름에서 공백을 처리합니다.

몇 년 후 다시 시도했지만 작동하지 않았습니다. 이 스레드 는 몇 가지 팁을 제공하지만 가장 빠른 솔루션은 루트로 실행하는 것입니다 (또는 sudo libreoffice). 우아하지는 않지만 빠릅니다.

Windows에서 scalc.exe 명령을 사용하십시오.


13
이 작업을 시도하기 전에 모든 열린 사무실 창을 닫아야합니다. 그렇지 않으면 자동으로 실패합니다.
tacone

또한 Windows에서는 명령이 scalc.exe아닌 libreoffice입니다. 현재 안정적인 LO 버전에서 오늘 저를 위해 일했습니다.
AronVanAmmers


8

또 다른 옵션은 편의를 위해 작은 bash 래퍼를 통해 R을 사용하는 것입니다.

xlsx2txt(){
echo '
require(xlsx)
write.table(read.xlsx2(commandArgs(TRUE)[1], 1), stdout(), quote=F, row.names=FALSE, col.names=T, sep="\t")
' | Rscript --vanilla - $1 2>/dev/null
}

xlsx2txt file.xlsx > file.txt

8

.xlsx파일에 많은 시트가 있으면 -s플래그를 사용하여 원하는 시트를 얻을 수 있습니다. 예를 들면 다음과 같습니다.

xlsx2csv "my_file.xlsx" -s 2 second_sheet.csv

second_sheet.csv에 두 번째 시트의 데이터가 포함됩니다 my_file.xlsx.


5

ssconvert라는 명령 줄 유틸리티가 제공되는 Gnumeric 스프레드 시트 응용 프로그램을 사용하면 실제로 매우 간단합니다.

find . -name '*.xlsx' -exec ssconvert -T Gnumeric_stf:stf_csv {} \;

그리고 당신은 끝났습니다!


매우 유용하고 감사합니다 Mr.Pascal-Louis Perez
Karthickkumar Nagaraj

1
위의 명령 'ssconvert'는 65536 줄만 변환하지만 둘 이상의 줄이 부족합니다. 도와 줄 수 있습니까?
Karthickkumar Nagaraj

4

Java 명령 행을 실행해도 괜찮다면 Apache POI HSSF의 Excel Extractor를 사용 하여 수행 할 수 있습니다 . 그것은이 명령 줄 추출기로 말한다 방법 . 이것은 모든 것을 버리는 것 같습니다. CSV로 변환하는이 예제를 가리 킵니다 . 실행하기 전에 컴파일해야하지만 메소드도 있으므로 작동하기 위해 많은 코딩을 할 필요가 없습니다.mainmain

날아갈 수 있지만 다른 쪽 끝에서 약간의 작업이 필요한 다른 옵션은 Excel 파일을 요즘 형식화하는 모든 MS 호출의 Excel XML 데이터 또는 XML 스프레드 시트 로 제공하는 것입니다. 그것은 당신이 원하는 방식으로 슬라이스하고 주사위를 for 수있는 ​​완전히 새로운 기회의 세계를 열어 줄 것입니다.


1
이것이 .xlsx도 지원하는지 알고 있습니까?
dimroc 2012

1

다른 사람들이 말했듯이 libreofficexls 파일을 csv로 변환 할 수 있습니다. 나에게 문제는 시트 선택이었습니다.

libreoffice Python 스크립트 는 단일 시트를 CSV로 변환 할 때 잘 작동합니다.

사용법은 :

./libreconverter.py File.xls:"Sheet Name" output.csv

내 단점은 유일 --headless하게 작동하지 않는 것입니다. LO 창이 1 초 동안 표시된 다음 종료됩니다.
그것은 나에게도 괜찮습니다. 그것은 작업을 빠르게 수행하는 유일한 도구입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.