usage: xlscat [-s
[-c | -m] [-u] [ Selection ] file.xls
-i [ -S sheets ] file.xls
-v[#] Set verbose level (xlscat)
-d[#] Set debug level (Spreadsheet::Read)
-u Use unformatted values
--noclip Do not strip empty sheets and
trailing empty rows and columns
--in-sep=c Set input sep_char for CSV
--dtfmt=fmt Specify the default date format to replace 'm-d-yy'
the default replacement is 'yyyy-mm-dd'
Output Text (default):
-L Line up the columns
-n Number lines (prefix with column number)
-A Show field attributes in ANSI escapes
Output Index only:
-i Show sheet names and size only
-c Output CSV, separator = ','
-m Output CSV, separator = ';'
-H Output HTML
Default only prints the first sheet
Therefore to read rows 5-100 in first worksheet of file in.xlsx and output as semi-colon delimited file out.csv
xlscat -m -R 5-100 in.xlsx > out.csv
When there isn't a output format option, xlscat defaults to use "|" as delimiter and I found it's more convenient to use TAB (\t) as the delimiter. Therefore I changed the program of /usr/local/bin/xlscat at line 129 to
defined $opt_s or $opt_s = "\t";
After the above change, I can use the following command to read rows 50-100 in first worksheet of file in.xlsx and output as TAB (\t) delimited file out.csv
xlscat -R 50-100 in.xlsx > out.csv