问题
I have a *.xlsm file which has 20 sheets in it. I want to save few sheets as *.csv (formatting loss is fine) individually. Already tried xlrd-xlwt and win32com libraries but could not get through. Can anybody please provide a code snippet which does the above processing in Python? I have other python dependencies so no other language would work. Thanks
回答1:
xlrd should work fine on xlsm files as well. I tested the code with a random xlsm file, and it worked perfectly.
import csv
import xlrd
workbook = xlrd.open_workbook('test.xlsx')
for sheet in workbook.sheets():
with open('{}.csv'.format(sheet.name), 'wb') as f:
writer = csv.writer(f)
writer.writerows(sheet.row_values(row) for row in range(sheet.nrows))
If you've encoding issues, try the code below:
import csv
import xlrd
workbook = xlrd.open_workbook('test.xlsm')
for sheet in workbook.sheets():
if sheet.name == "Sheet_name_from_xlsm_file":
with open('{}.csv'.format(sheet.name), 'wb') as f:
writer = csv.writer(f)
for row in range(sheet.nrows):
out = []
for cell in sheet.row_values(row):
try:
out.append(cell.encode('utf8'))
except:
out.append(cell)
writer.writerow(out)
回答2:
You can do this easily with pandas
Install pandas and xlrd dependencies by following
- pip3 install pandas
- pip3 install xlrd (required by pandas)
Now simply read xlsm file using read_excel. Here is a demo:-
import pandas as pd
# YOU MUST PUT sheet_name=None TO READ ALL CSV FILES IN YOUR XLSM FILE
df = pd.read_excel('YourFile.xlsm', sheet_name=None)
# prints all sheets
print(df)
# prints all sheets name in an ordered dictionary
print(df.keys())
# prints first sheet name or any sheet if you know it's index
first_sheet_name = list(df.keys())[0]
print(first_sheet_name)
# prints first sheet or any sheet if know it's name
print(df[first_sheet_name])
# export first sheet to file
df[first_sheet_name].to_csv('FirstSheet.csv')
# export all sheets
for sheet_name in list(df.keys()):
df[sheet_name].to_csv(sheet_name + 'Sheet.csv')
# USE IT IN MULTIPLE WAYS #
回答3:
import pandas as pd
# YOU MUST PUT sheet_name=None
df = pd.read_excel('YourFile.xlsm', sheet_name=None)
# prints all sheets
print(df)
来源:https://stackoverflow.com/questions/23554808/how-to-extract-sheet-from-xlsm-and-save-it-as-csv-in-python