Convert .xls/.xlsx spreadsheets to multiple .csv's based on a list





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}







8















I need to convert all sheets of a single .xls/.xlsx file to a .csv. This will be done on all .xls files in all directories and sub-directories (recursively).



Step 1: Get the sheetnames of all .xls into a .csv using:



for file in $(find . -name '*.xls' -o -name '*.xlsx');do in2csv -n "$file" > ${file%.xls}-sheetnames-list.csv; done


filename-sheetnames-list.csv can act as a list:



sheetname1
sheetname2
sheetname3


Step 2 :
The code for converting a specific sheet into a .csv using in2csv is:



in2csv --sheet "SHEETNAME" filename.xls > filename-SHEETNAME.csv


How can I get every sheetname in a .xls/x and write every sheet separately for all directories containing a .xls/x ?



in2csv --write-sheets "-" filename.xls > filename-sheet1.csv filename-sheet2.csv .... gives output only on sheet1.csv, not sure how to get all sheets from this.










share|improve this question




















  • 2





    Why not just find every .xls{,x} and loop over every sheet using -exec?

    – dessert
    Nov 6 '17 at 14:23






  • 1





    @glennjackman this is perfectly on topic here, just as it would be on Unix & Linux.

    – terdon
    Nov 6 '17 at 16:07


















8















I need to convert all sheets of a single .xls/.xlsx file to a .csv. This will be done on all .xls files in all directories and sub-directories (recursively).



Step 1: Get the sheetnames of all .xls into a .csv using:



for file in $(find . -name '*.xls' -o -name '*.xlsx');do in2csv -n "$file" > ${file%.xls}-sheetnames-list.csv; done


filename-sheetnames-list.csv can act as a list:



sheetname1
sheetname2
sheetname3


Step 2 :
The code for converting a specific sheet into a .csv using in2csv is:



in2csv --sheet "SHEETNAME" filename.xls > filename-SHEETNAME.csv


How can I get every sheetname in a .xls/x and write every sheet separately for all directories containing a .xls/x ?



in2csv --write-sheets "-" filename.xls > filename-sheet1.csv filename-sheet2.csv .... gives output only on sheet1.csv, not sure how to get all sheets from this.










share|improve this question




















  • 2





    Why not just find every .xls{,x} and loop over every sheet using -exec?

    – dessert
    Nov 6 '17 at 14:23






  • 1





    @glennjackman this is perfectly on topic here, just as it would be on Unix & Linux.

    – terdon
    Nov 6 '17 at 16:07














8












8








8


2






I need to convert all sheets of a single .xls/.xlsx file to a .csv. This will be done on all .xls files in all directories and sub-directories (recursively).



Step 1: Get the sheetnames of all .xls into a .csv using:



for file in $(find . -name '*.xls' -o -name '*.xlsx');do in2csv -n "$file" > ${file%.xls}-sheetnames-list.csv; done


filename-sheetnames-list.csv can act as a list:



sheetname1
sheetname2
sheetname3


Step 2 :
The code for converting a specific sheet into a .csv using in2csv is:



in2csv --sheet "SHEETNAME" filename.xls > filename-SHEETNAME.csv


How can I get every sheetname in a .xls/x and write every sheet separately for all directories containing a .xls/x ?



in2csv --write-sheets "-" filename.xls > filename-sheet1.csv filename-sheet2.csv .... gives output only on sheet1.csv, not sure how to get all sheets from this.










share|improve this question
















I need to convert all sheets of a single .xls/.xlsx file to a .csv. This will be done on all .xls files in all directories and sub-directories (recursively).



Step 1: Get the sheetnames of all .xls into a .csv using:



for file in $(find . -name '*.xls' -o -name '*.xlsx');do in2csv -n "$file" > ${file%.xls}-sheetnames-list.csv; done


filename-sheetnames-list.csv can act as a list:



sheetname1
sheetname2
sheetname3


Step 2 :
The code for converting a specific sheet into a .csv using in2csv is:



in2csv --sheet "SHEETNAME" filename.xls > filename-SHEETNAME.csv


How can I get every sheetname in a .xls/x and write every sheet separately for all directories containing a .xls/x ?



in2csv --write-sheets "-" filename.xls > filename-sheet1.csv filename-sheet2.csv .... gives output only on sheet1.csv, not sure how to get all sheets from this.







command-line csv xls






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 8 '17 at 13:30







csheth

















asked Nov 6 '17 at 14:08









cshethcsheth

15612




15612








  • 2





    Why not just find every .xls{,x} and loop over every sheet using -exec?

    – dessert
    Nov 6 '17 at 14:23






  • 1





    @glennjackman this is perfectly on topic here, just as it would be on Unix & Linux.

    – terdon
    Nov 6 '17 at 16:07














  • 2





    Why not just find every .xls{,x} and loop over every sheet using -exec?

    – dessert
    Nov 6 '17 at 14:23






  • 1





    @glennjackman this is perfectly on topic here, just as it would be on Unix & Linux.

    – terdon
    Nov 6 '17 at 16:07








2




2





Why not just find every .xls{,x} and loop over every sheet using -exec?

– dessert
Nov 6 '17 at 14:23





Why not just find every .xls{,x} and loop over every sheet using -exec?

– dessert
Nov 6 '17 at 14:23




1




1





@glennjackman this is perfectly on topic here, just as it would be on Unix & Linux.

– terdon
Nov 6 '17 at 16:07





@glennjackman this is perfectly on topic here, just as it would be on Unix & Linux.

– terdon
Nov 6 '17 at 16:07










4 Answers
4






active

oldest

votes


















8














You can just put a loop inside another loop.



To avoid errors, don't use for with find results.



while IFS= read -r file; do
while IFS= read -r sheet; do
in2csv --sheet "$sheet" "$file" > "${file%.*}-${sheet}.csv"
done < <(in2csv -n "$file")
done < <(find . -name '*.xls' -o -name '*.xlsx')





share|improve this answer


























  • @muru ah crap. You're absolutely right. I'd tested in an environment where the IFS had already been changed so of course it propagated downwards. Idiot. Thanks, edit reverted.

    – terdon
    Nov 7 '17 at 9:01











  • @RoVo the first option works fine. The second one however gives me no output or error. I am unsure why; for a single .xls in2csv --write-sheets "-" filename.xls > sheetname.csv gives only the first sheet. I don't know what additional info to add to write all sheets. That shall give us clues to correct your code.

    – csheth
    Nov 8 '17 at 7:37











  • did you update to that version 1.0.2 ? pip install csvkit -U. I think the way it works is not what you like, with the simple skript from 1st option you have more ways to control the output and the filenames etc.

    – RoVo
    Nov 8 '17 at 8:02











  • still doesn't work with the update, and yes I'd prefer using a list than --write-sheets Maybe you can set this alternative option as another answer... I will accept the first option as the answer then. Thanks @RoVo

    – csheth
    Nov 8 '17 at 8:24








  • 1





    Maybe generally a good idea to have alternative options in another answer. Thanks, glad that I could help.

    – RoVo
    Nov 8 '17 at 8:55



















6














Skipping find and using bash:



shopt -s globstar  # enable recursive globbing
for f in **/*.xls{,x} # for files ending in .xls or .xlsx
do
in2csv -n "$f" | # get the sheetnames
xargs -I {} bash -c 'in2csv --sheet "$2" "$1" > "${1%.*}"-"$2".csv' _ "$f" {} # {} will be replaced with the sheetname
done





share|improve this answer


























  • this script looks elegant but its output is filename-{}.csv containing no data. I'm a novice and can't seem to find the error by editing the script and reading up. Some help?

    – csheth
    Nov 8 '17 at 7:23











  • @ChintanSheth my bad, I'd forgotten the redirection would be outside xargs. Corrected, not as elegant now.

    – muru
    Nov 8 '17 at 8:01











  • xargs and > is evil :-P. That's why I prefer another loop, it's less error prone.

    – RoVo
    Nov 8 '17 at 8:01











  • @RoVo I'd have usually gone for another loop too, just wanted to show another method here.

    – muru
    Nov 8 '17 at 8:03











  • This works now, however slightly slower than @RoVo answer.

    – csheth
    Nov 8 '17 at 8:25



















2














csvkit version > 1.0.2 has a builtin function to write all sheets:



--write-sheets: WRITE_SHEETS
The names of the Excel sheets to write to files, or
"-" to write all sheets.


So you could try the following:



find . -name '*.xls' -o -name '*.xlsx' -exec in2csv --write-sheets "-" {} ;


Note:



This seems not to work 100% as expected. But worth a try and as this is the first version with that option maybe in future versions the implementation is better/easier.






share|improve this answer































    0














    Use Gnumeric:



    ssconvert -S filename.xlsx filename.csv


    to get one csv file per sheet.






    share|improve this answer
























      Your Answer








      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "89"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2faskubuntu.com%2fquestions%2f973534%2fconvert-xls-xlsx-spreadsheets-to-multiple-csvs-based-on-a-list%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      4 Answers
      4






      active

      oldest

      votes








      4 Answers
      4






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      8














      You can just put a loop inside another loop.



      To avoid errors, don't use for with find results.



      while IFS= read -r file; do
      while IFS= read -r sheet; do
      in2csv --sheet "$sheet" "$file" > "${file%.*}-${sheet}.csv"
      done < <(in2csv -n "$file")
      done < <(find . -name '*.xls' -o -name '*.xlsx')





      share|improve this answer


























      • @muru ah crap. You're absolutely right. I'd tested in an environment where the IFS had already been changed so of course it propagated downwards. Idiot. Thanks, edit reverted.

        – terdon
        Nov 7 '17 at 9:01











      • @RoVo the first option works fine. The second one however gives me no output or error. I am unsure why; for a single .xls in2csv --write-sheets "-" filename.xls > sheetname.csv gives only the first sheet. I don't know what additional info to add to write all sheets. That shall give us clues to correct your code.

        – csheth
        Nov 8 '17 at 7:37











      • did you update to that version 1.0.2 ? pip install csvkit -U. I think the way it works is not what you like, with the simple skript from 1st option you have more ways to control the output and the filenames etc.

        – RoVo
        Nov 8 '17 at 8:02











      • still doesn't work with the update, and yes I'd prefer using a list than --write-sheets Maybe you can set this alternative option as another answer... I will accept the first option as the answer then. Thanks @RoVo

        – csheth
        Nov 8 '17 at 8:24








      • 1





        Maybe generally a good idea to have alternative options in another answer. Thanks, glad that I could help.

        – RoVo
        Nov 8 '17 at 8:55
















      8














      You can just put a loop inside another loop.



      To avoid errors, don't use for with find results.



      while IFS= read -r file; do
      while IFS= read -r sheet; do
      in2csv --sheet "$sheet" "$file" > "${file%.*}-${sheet}.csv"
      done < <(in2csv -n "$file")
      done < <(find . -name '*.xls' -o -name '*.xlsx')





      share|improve this answer


























      • @muru ah crap. You're absolutely right. I'd tested in an environment where the IFS had already been changed so of course it propagated downwards. Idiot. Thanks, edit reverted.

        – terdon
        Nov 7 '17 at 9:01











      • @RoVo the first option works fine. The second one however gives me no output or error. I am unsure why; for a single .xls in2csv --write-sheets "-" filename.xls > sheetname.csv gives only the first sheet. I don't know what additional info to add to write all sheets. That shall give us clues to correct your code.

        – csheth
        Nov 8 '17 at 7:37











      • did you update to that version 1.0.2 ? pip install csvkit -U. I think the way it works is not what you like, with the simple skript from 1st option you have more ways to control the output and the filenames etc.

        – RoVo
        Nov 8 '17 at 8:02











      • still doesn't work with the update, and yes I'd prefer using a list than --write-sheets Maybe you can set this alternative option as another answer... I will accept the first option as the answer then. Thanks @RoVo

        – csheth
        Nov 8 '17 at 8:24








      • 1





        Maybe generally a good idea to have alternative options in another answer. Thanks, glad that I could help.

        – RoVo
        Nov 8 '17 at 8:55














      8












      8








      8







      You can just put a loop inside another loop.



      To avoid errors, don't use for with find results.



      while IFS= read -r file; do
      while IFS= read -r sheet; do
      in2csv --sheet "$sheet" "$file" > "${file%.*}-${sheet}.csv"
      done < <(in2csv -n "$file")
      done < <(find . -name '*.xls' -o -name '*.xlsx')





      share|improve this answer















      You can just put a loop inside another loop.



      To avoid errors, don't use for with find results.



      while IFS= read -r file; do
      while IFS= read -r sheet; do
      in2csv --sheet "$sheet" "$file" > "${file%.*}-${sheet}.csv"
      done < <(in2csv -n "$file")
      done < <(find . -name '*.xls' -o -name '*.xlsx')






      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited Nov 26 '17 at 21:51









      Eliah Kagan

      83.6k22229369




      83.6k22229369










      answered Nov 6 '17 at 14:26









      RoVoRoVo

      8,5191944




      8,5191944













      • @muru ah crap. You're absolutely right. I'd tested in an environment where the IFS had already been changed so of course it propagated downwards. Idiot. Thanks, edit reverted.

        – terdon
        Nov 7 '17 at 9:01











      • @RoVo the first option works fine. The second one however gives me no output or error. I am unsure why; for a single .xls in2csv --write-sheets "-" filename.xls > sheetname.csv gives only the first sheet. I don't know what additional info to add to write all sheets. That shall give us clues to correct your code.

        – csheth
        Nov 8 '17 at 7:37











      • did you update to that version 1.0.2 ? pip install csvkit -U. I think the way it works is not what you like, with the simple skript from 1st option you have more ways to control the output and the filenames etc.

        – RoVo
        Nov 8 '17 at 8:02











      • still doesn't work with the update, and yes I'd prefer using a list than --write-sheets Maybe you can set this alternative option as another answer... I will accept the first option as the answer then. Thanks @RoVo

        – csheth
        Nov 8 '17 at 8:24








      • 1





        Maybe generally a good idea to have alternative options in another answer. Thanks, glad that I could help.

        – RoVo
        Nov 8 '17 at 8:55



















      • @muru ah crap. You're absolutely right. I'd tested in an environment where the IFS had already been changed so of course it propagated downwards. Idiot. Thanks, edit reverted.

        – terdon
        Nov 7 '17 at 9:01











      • @RoVo the first option works fine. The second one however gives me no output or error. I am unsure why; for a single .xls in2csv --write-sheets "-" filename.xls > sheetname.csv gives only the first sheet. I don't know what additional info to add to write all sheets. That shall give us clues to correct your code.

        – csheth
        Nov 8 '17 at 7:37











      • did you update to that version 1.0.2 ? pip install csvkit -U. I think the way it works is not what you like, with the simple skript from 1st option you have more ways to control the output and the filenames etc.

        – RoVo
        Nov 8 '17 at 8:02











      • still doesn't work with the update, and yes I'd prefer using a list than --write-sheets Maybe you can set this alternative option as another answer... I will accept the first option as the answer then. Thanks @RoVo

        – csheth
        Nov 8 '17 at 8:24








      • 1





        Maybe generally a good idea to have alternative options in another answer. Thanks, glad that I could help.

        – RoVo
        Nov 8 '17 at 8:55

















      @muru ah crap. You're absolutely right. I'd tested in an environment where the IFS had already been changed so of course it propagated downwards. Idiot. Thanks, edit reverted.

      – terdon
      Nov 7 '17 at 9:01





      @muru ah crap. You're absolutely right. I'd tested in an environment where the IFS had already been changed so of course it propagated downwards. Idiot. Thanks, edit reverted.

      – terdon
      Nov 7 '17 at 9:01













      @RoVo the first option works fine. The second one however gives me no output or error. I am unsure why; for a single .xls in2csv --write-sheets "-" filename.xls > sheetname.csv gives only the first sheet. I don't know what additional info to add to write all sheets. That shall give us clues to correct your code.

      – csheth
      Nov 8 '17 at 7:37





      @RoVo the first option works fine. The second one however gives me no output or error. I am unsure why; for a single .xls in2csv --write-sheets "-" filename.xls > sheetname.csv gives only the first sheet. I don't know what additional info to add to write all sheets. That shall give us clues to correct your code.

      – csheth
      Nov 8 '17 at 7:37













      did you update to that version 1.0.2 ? pip install csvkit -U. I think the way it works is not what you like, with the simple skript from 1st option you have more ways to control the output and the filenames etc.

      – RoVo
      Nov 8 '17 at 8:02





      did you update to that version 1.0.2 ? pip install csvkit -U. I think the way it works is not what you like, with the simple skript from 1st option you have more ways to control the output and the filenames etc.

      – RoVo
      Nov 8 '17 at 8:02













      still doesn't work with the update, and yes I'd prefer using a list than --write-sheets Maybe you can set this alternative option as another answer... I will accept the first option as the answer then. Thanks @RoVo

      – csheth
      Nov 8 '17 at 8:24







      still doesn't work with the update, and yes I'd prefer using a list than --write-sheets Maybe you can set this alternative option as another answer... I will accept the first option as the answer then. Thanks @RoVo

      – csheth
      Nov 8 '17 at 8:24






      1




      1





      Maybe generally a good idea to have alternative options in another answer. Thanks, glad that I could help.

      – RoVo
      Nov 8 '17 at 8:55





      Maybe generally a good idea to have alternative options in another answer. Thanks, glad that I could help.

      – RoVo
      Nov 8 '17 at 8:55













      6














      Skipping find and using bash:



      shopt -s globstar  # enable recursive globbing
      for f in **/*.xls{,x} # for files ending in .xls or .xlsx
      do
      in2csv -n "$f" | # get the sheetnames
      xargs -I {} bash -c 'in2csv --sheet "$2" "$1" > "${1%.*}"-"$2".csv' _ "$f" {} # {} will be replaced with the sheetname
      done





      share|improve this answer


























      • this script looks elegant but its output is filename-{}.csv containing no data. I'm a novice and can't seem to find the error by editing the script and reading up. Some help?

        – csheth
        Nov 8 '17 at 7:23











      • @ChintanSheth my bad, I'd forgotten the redirection would be outside xargs. Corrected, not as elegant now.

        – muru
        Nov 8 '17 at 8:01











      • xargs and > is evil :-P. That's why I prefer another loop, it's less error prone.

        – RoVo
        Nov 8 '17 at 8:01











      • @RoVo I'd have usually gone for another loop too, just wanted to show another method here.

        – muru
        Nov 8 '17 at 8:03











      • This works now, however slightly slower than @RoVo answer.

        – csheth
        Nov 8 '17 at 8:25
















      6














      Skipping find and using bash:



      shopt -s globstar  # enable recursive globbing
      for f in **/*.xls{,x} # for files ending in .xls or .xlsx
      do
      in2csv -n "$f" | # get the sheetnames
      xargs -I {} bash -c 'in2csv --sheet "$2" "$1" > "${1%.*}"-"$2".csv' _ "$f" {} # {} will be replaced with the sheetname
      done





      share|improve this answer


























      • this script looks elegant but its output is filename-{}.csv containing no data. I'm a novice and can't seem to find the error by editing the script and reading up. Some help?

        – csheth
        Nov 8 '17 at 7:23











      • @ChintanSheth my bad, I'd forgotten the redirection would be outside xargs. Corrected, not as elegant now.

        – muru
        Nov 8 '17 at 8:01











      • xargs and > is evil :-P. That's why I prefer another loop, it's less error prone.

        – RoVo
        Nov 8 '17 at 8:01











      • @RoVo I'd have usually gone for another loop too, just wanted to show another method here.

        – muru
        Nov 8 '17 at 8:03











      • This works now, however slightly slower than @RoVo answer.

        – csheth
        Nov 8 '17 at 8:25














      6












      6








      6







      Skipping find and using bash:



      shopt -s globstar  # enable recursive globbing
      for f in **/*.xls{,x} # for files ending in .xls or .xlsx
      do
      in2csv -n "$f" | # get the sheetnames
      xargs -I {} bash -c 'in2csv --sheet "$2" "$1" > "${1%.*}"-"$2".csv' _ "$f" {} # {} will be replaced with the sheetname
      done





      share|improve this answer















      Skipping find and using bash:



      shopt -s globstar  # enable recursive globbing
      for f in **/*.xls{,x} # for files ending in .xls or .xlsx
      do
      in2csv -n "$f" | # get the sheetnames
      xargs -I {} bash -c 'in2csv --sheet "$2" "$1" > "${1%.*}"-"$2".csv' _ "$f" {} # {} will be replaced with the sheetname
      done






      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited Nov 8 '17 at 8:02

























      answered Nov 6 '17 at 14:50









      murumuru

      1




      1













      • this script looks elegant but its output is filename-{}.csv containing no data. I'm a novice and can't seem to find the error by editing the script and reading up. Some help?

        – csheth
        Nov 8 '17 at 7:23











      • @ChintanSheth my bad, I'd forgotten the redirection would be outside xargs. Corrected, not as elegant now.

        – muru
        Nov 8 '17 at 8:01











      • xargs and > is evil :-P. That's why I prefer another loop, it's less error prone.

        – RoVo
        Nov 8 '17 at 8:01











      • @RoVo I'd have usually gone for another loop too, just wanted to show another method here.

        – muru
        Nov 8 '17 at 8:03











      • This works now, however slightly slower than @RoVo answer.

        – csheth
        Nov 8 '17 at 8:25



















      • this script looks elegant but its output is filename-{}.csv containing no data. I'm a novice and can't seem to find the error by editing the script and reading up. Some help?

        – csheth
        Nov 8 '17 at 7:23











      • @ChintanSheth my bad, I'd forgotten the redirection would be outside xargs. Corrected, not as elegant now.

        – muru
        Nov 8 '17 at 8:01











      • xargs and > is evil :-P. That's why I prefer another loop, it's less error prone.

        – RoVo
        Nov 8 '17 at 8:01











      • @RoVo I'd have usually gone for another loop too, just wanted to show another method here.

        – muru
        Nov 8 '17 at 8:03











      • This works now, however slightly slower than @RoVo answer.

        – csheth
        Nov 8 '17 at 8:25

















      this script looks elegant but its output is filename-{}.csv containing no data. I'm a novice and can't seem to find the error by editing the script and reading up. Some help?

      – csheth
      Nov 8 '17 at 7:23





      this script looks elegant but its output is filename-{}.csv containing no data. I'm a novice and can't seem to find the error by editing the script and reading up. Some help?

      – csheth
      Nov 8 '17 at 7:23













      @ChintanSheth my bad, I'd forgotten the redirection would be outside xargs. Corrected, not as elegant now.

      – muru
      Nov 8 '17 at 8:01





      @ChintanSheth my bad, I'd forgotten the redirection would be outside xargs. Corrected, not as elegant now.

      – muru
      Nov 8 '17 at 8:01













      xargs and > is evil :-P. That's why I prefer another loop, it's less error prone.

      – RoVo
      Nov 8 '17 at 8:01





      xargs and > is evil :-P. That's why I prefer another loop, it's less error prone.

      – RoVo
      Nov 8 '17 at 8:01













      @RoVo I'd have usually gone for another loop too, just wanted to show another method here.

      – muru
      Nov 8 '17 at 8:03





      @RoVo I'd have usually gone for another loop too, just wanted to show another method here.

      – muru
      Nov 8 '17 at 8:03













      This works now, however slightly slower than @RoVo answer.

      – csheth
      Nov 8 '17 at 8:25





      This works now, however slightly slower than @RoVo answer.

      – csheth
      Nov 8 '17 at 8:25











      2














      csvkit version > 1.0.2 has a builtin function to write all sheets:



      --write-sheets: WRITE_SHEETS
      The names of the Excel sheets to write to files, or
      "-" to write all sheets.


      So you could try the following:



      find . -name '*.xls' -o -name '*.xlsx' -exec in2csv --write-sheets "-" {} ;


      Note:



      This seems not to work 100% as expected. But worth a try and as this is the first version with that option maybe in future versions the implementation is better/easier.






      share|improve this answer




























        2














        csvkit version > 1.0.2 has a builtin function to write all sheets:



        --write-sheets: WRITE_SHEETS
        The names of the Excel sheets to write to files, or
        "-" to write all sheets.


        So you could try the following:



        find . -name '*.xls' -o -name '*.xlsx' -exec in2csv --write-sheets "-" {} ;


        Note:



        This seems not to work 100% as expected. But worth a try and as this is the first version with that option maybe in future versions the implementation is better/easier.






        share|improve this answer


























          2












          2








          2







          csvkit version > 1.0.2 has a builtin function to write all sheets:



          --write-sheets: WRITE_SHEETS
          The names of the Excel sheets to write to files, or
          "-" to write all sheets.


          So you could try the following:



          find . -name '*.xls' -o -name '*.xlsx' -exec in2csv --write-sheets "-" {} ;


          Note:



          This seems not to work 100% as expected. But worth a try and as this is the first version with that option maybe in future versions the implementation is better/easier.






          share|improve this answer













          csvkit version > 1.0.2 has a builtin function to write all sheets:



          --write-sheets: WRITE_SHEETS
          The names of the Excel sheets to write to files, or
          "-" to write all sheets.


          So you could try the following:



          find . -name '*.xls' -o -name '*.xlsx' -exec in2csv --write-sheets "-" {} ;


          Note:



          This seems not to work 100% as expected. But worth a try and as this is the first version with that option maybe in future versions the implementation is better/easier.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 8 '17 at 8:54









          RoVoRoVo

          8,5191944




          8,5191944























              0














              Use Gnumeric:



              ssconvert -S filename.xlsx filename.csv


              to get one csv file per sheet.






              share|improve this answer




























                0














                Use Gnumeric:



                ssconvert -S filename.xlsx filename.csv


                to get one csv file per sheet.






                share|improve this answer


























                  0












                  0








                  0







                  Use Gnumeric:



                  ssconvert -S filename.xlsx filename.csv


                  to get one csv file per sheet.






                  share|improve this answer













                  Use Gnumeric:



                  ssconvert -S filename.xlsx filename.csv


                  to get one csv file per sheet.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Apr 7 at 6:03









                  James HirschornJames Hirschorn

                  1065




                  1065






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Ask Ubuntu!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2faskubuntu.com%2fquestions%2f973534%2fconvert-xls-xlsx-spreadsheets-to-multiple-csvs-based-on-a-list%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      數位音樂下載

                      When can things happen in Etherscan, such as the picture below?

                      格利澤436b