将 Excel 工作簿中的所有工作表转换为 csv 格式
Posted
技术标签:
【中文标题】将 Excel 工作簿中的所有工作表转换为 csv 格式【英文标题】:Converting all worksheets in an Excel workbook to csv format 【发布时间】:2019-10-26 10:53:42 【问题描述】:我的 Excel 文档 my.xlsx
有两个名为 Sheet1 和 Sheet2 的工作表。我想使用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
请帮忙。
【问题讨论】:
【参考方案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
【讨论】:
以上是关于将 Excel 工作簿中的所有工作表转换为 csv 格式的主要内容,如果未能解决你的问题,请参考以下文章
python 此要点将从Excel工作簿中提取每个单独的工作表并将其导出为CSV。
libreoffice 将所有/特定工作表从 excel 转换为 csv
我的批处理文件应该有啥代码将多个 CSV 文件合并到一个新的单个 Excel 工作簿中,但每个 CSV 文件都有自己的工作表?