Convert xlsx to csv in Linux with command line

LinuxExcelCsvConverterXlsx

Linux Problem Overview


I'm looking for a way to convert xlsx files to csv files on Linux.

I do not want to use PHP/Perl or anything like that since I'm looking at processing several millions of lines, so I need something quick. I found a program on the Ubuntu repos called xls2csv but it will only convert xls (Office 2003) files (which I'm currently using) but I need support for the newer Excel files.

Any ideas?

Linux Solutions


Solution 1 - Linux

The Gnumeric spreadsheet application comes with a command line utility called ssconvert that can convert between a variety of spreadsheet formats:

$ 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

To install on Ubuntu:

apt-get install gnumeric

To install on Mac:

brew install gnumeric

Solution 2 - Linux

You can do this with LibreOffice:

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

For reasons not clear to me, you might need to run this with sudo. You can make LibreOffice work with sudo without requiring a password by adding this line to you sudoers file:

users ALL=(ALL) NOPASSWD: libreoffice

Solution 3 - Linux

If you already have a Desktop environment then I'm sure Gnumeric / LibreOffice would work well, but on a headless server (such as Amazon Web Services), they require dozens of dependencies that you also need to install.

I found this Python alternative:

https://github.com/dilshod/xlsx2csv

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

Took 2 seconds to install and works like a charm.

If you have multiple sheets you can export all at once, or one at a time:

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

He also links to several alternatives built in Bash, Python, Ruby, and Java.

Solution 4 - Linux

In bash, I used this libreoffice command to convert all my xlsx files in the current directory:

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

Close all your Libre Office open instances before executing, or it will fail silently.

The command takes care of spaces in the filename.

Tried again some years later, and it didn't work. This thread gives some tips, but the quickest solution was to run as root (or running a sudo libreoffice). Not elegant, but quick.

Use the command scalc.exe in Windows

Solution 5 - Linux

Use csvkit

in2csv data.xlsx > data.csv

For details check their excellent docs

Solution 6 - Linux

Another option would be to use R via a small bash wrapper for convenience:

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

Solution 7 - Linux

If .xlsx file has many sheets, -s flag can be used to get the sheet you want. For example:

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

second_sheet.csv would contain data of 2nd sheet in my_file.xlsx.

Solution 8 - Linux

Using the Gnumeric spreadsheet application which comes which a commandline utility called ssconvert is indeed super simple:

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

and you're done!

Solution 9 - Linux

If you are OK to run Java command line then you can do it with Apache POI HSSF's Excel Extractor. It has a main method that says to be the command line extractor. This one seems to just dump everything out. They point out to this example that converts to CSV. You would have to compile it before you can run it but it too has a main method so you should not have to do much coding per se to make it work.

Another option that might fly but will require some work on the other end is to make your Excel files come to you as Excel XML Data or XML Spreadsheet of whatever MS calls that format these days. It will open a whole new world of opportunities for you to slice and dice it the way you want.

Solution 10 - Linux

As others said, libreoffice can convert xls files to csv. The problem for me was the sheet selection.

This libreoffice Python script does a fine job at converting a single sheet to CSV.

Usage is:

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

The only downside (on my end) is that --headless doesn't seem to work. I have a LO window that shows up for a second and then quits.
That's OK with me, it's the only tool that does the job rapidly.

Solution 11 - Linux

you can use libreoffice to convert your .xlsx files to csv

$ libreoffice --headless --convert-to csv ABC.xlsx

argument --headless indicates that we don't need GUI.

Solution 12 - Linux

https://gist.github.com/scottming/99c09685360376d4cac2de7c891e8050

You can use this script. Add dependencies first:

pip3 install pandas xlrd openpyxl

Then call script: python3 getsheets.py <file.xlsx>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1390150View Question on Stackoverflow
Solution 1 - LinuxjmcnamaraView Answer on Stackoverflow
Solution 2 - LinuxspiffytechView Answer on Stackoverflow
Solution 3 - LinuxandrewtweberView Answer on Stackoverflow
Solution 4 - LinuxnevesView Answer on Stackoverflow
Solution 5 - LinuxHolger BrandlView Answer on Stackoverflow
Solution 6 - LinuxHolger BrandlView Answer on Stackoverflow
Solution 7 - LinuxAkavallView Answer on Stackoverflow
Solution 8 - LinuxPascal-Louis PerezView Answer on Stackoverflow
Solution 9 - LinuxPavel VellerView Answer on Stackoverflow
Solution 10 - LinuxBenoit DuffezView Answer on Stackoverflow
Solution 11 - LinuxUdesh RanjanView Answer on Stackoverflow
Solution 12 - LinuxkaiyaView Answer on Stackoverflow