【问题标题】:Converting all worksheets in an Excel workbook to csv format将 Excel 工作簿中的所有工作表转换为 csv 格式
【发布时间】:2019-10-26 10:53:42
【问题描述】:

我的 Excel 文档 my.xlsx 有两个名为 Sheet1Sheet2 的工作表。我想使用xlsx2csv 将所有工作表转换为csv 格式。我使用了以下命令:

from xlsx2csv import *
xlsx2csv my.xlsx convert.csv
File "<stdin>", line 1
    xlsx2csv my.xlsx convert.csv
              ^
SyntaxError: invalid syntax

x2c -a my.xlsx my1.csv
  File "<stdin>", line 1
    x2c -a my.xlsx my1.csv
            ^
SyntaxError: invalid syntax

请帮忙。

【问题讨论】:

    标签: python excel


    【解决方案1】:

    我之前没有用过xlsx2csv,但我们为什么不试试pandas

    您的要求可以这样解决:

    import pandas as pd
    for sheet in ['Sheet1', 'Sheet2']:
        df = pd.read_excel('my.xlsx', sheetname=sheet)
        df.to_csv(sheet + '_output.csv', index=False)
    

    【讨论】:

    • 感谢@Kelvin 的回答。如果您提供不使用工作表名称的解决方案,将不胜感激。 B/c 我的 xlsx 非常大,使用 Excel 不容易打开,所以不知道手头的工作表名称。谢谢
    • @MYaseen208 是的,绝对的。您可以执行以下操作:my_file = pd.ExcelFile('my.xlsx'),然后循环遍历所有工作表:for sheet in my_file.sheet_names: df = pd.read_excel('my.xlsx', sheetname=sheet)
    • 因为 pd.read_excel 非常慢。
    • 似乎是自 2018 年以来在pd.read_excel('my.xlsx', sheet_name=sheet) 中的 sheet_name。见typeerror-with-pandas-read-excel
    【解决方案2】:

    您可以执行以下操作:

    import pandas as pd
    
    xls_file = pd.ExcelFile('<path_to_your_excel_file>')
    sheet_names = xls_file.sheet_names
    
    for sheet in sheet_names:
        df = xls_file.parse(sheet)
    

    【讨论】:

      【解决方案3】:

      Xlsx2csv python 实现:
      只能使用 sheetid 参数执行 Xlsx2csv。为了获取工作表名称和 ID,使用了 get_sheet_details
      csvfrmxlsx 为父目录下 csv 文件夹中的每个工作表创建 csv 文件。

      import pandas as pd
      from pathlib import Path
      
      
      def get_sheet_details(filename):
          import os
          import xmltodict
          import shutil
          import zipfile
          sheets = []
          # Make a temporary directory with the file name
          directory_to_extract_to = (filename.with_suffix(''))
          os.mkdir(directory_to_extract_to)
          # Extract the xlsx file as it is just a zip file
          zip_ref = zipfile.ZipFile(filename, 'r')
          zip_ref.extractall(directory_to_extract_to)
          zip_ref.close()
          # Open the workbook.xml which is very light and only has meta data, get sheets from it
          path_to_workbook = directory_to_extract_to / 'xl' / 'workbook.xml'
          with open(path_to_workbook, 'r') as f:
              xml = f.read()
              dictionary = xmltodict.parse(xml)
              for sheet in dictionary['workbook']['sheets']['sheet']:
                  sheet_details = {
                      'id': sheet['@sheetId'],  # can be sheetId for some versions
                      'name': sheet['@name']  # can be name
                  }
                  sheets.append(sheet_details)
          # Delete the extracted files directory
          shutil.rmtree(directory_to_extract_to)
          return sheets
      
      
      def csvfrmxlsx(xlsxfl, df):  # create csv files in csv folder on parent directory
          from xlsx2csv import Xlsx2csv
          for index, row in df.iterrows():  
              shnum = row['id']
              shnph = xlsxfl.parent / 'csv' / Path(row['name'] + '.csv')  # path for converted csv file
              Xlsx2csv(str(xlsxfl), outputencoding="utf-8").convert(str(shnph), sheetid=int(shnum))  
          return
      
      
      pthfnc = 'c:/xlsx/'
      wrkfl = 'my.xlsx'
      xls_file = Path(pthfnc + wrkfl)
      sheetsdic = get_sheet_details(xls_file)  # dictionary with sheet names and ids without opening xlsx file
      df = pd.DataFrame.from_dict(sheetsdic)
      csvfrmxlsx(xls_file, df)  # df with sheets to be converted
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-18
        • 2021-08-26
        • 1970-01-01
        • 1970-01-01
        • 2018-04-28
        • 2011-08-08
        • 1970-01-01
        相关资源
        最近更新 更多