我们有几千个xls文件,每个文件中有几十张。我们正在开发一个更大的项目来组合文件和工作表,但首先需要将它们转换为xlsx。
以下代码适用于单个文件:
import xlrd
from openpyxl.workbook import Workbook as openpyxlWorkbook
xlsBook = xlrd.open_workbook(C://path)
workbook = openpyxlWorkbook()
for i in xrange(0, xlsBook.nsheets):
xlsSheet = xlsBook.sheet_by_index(i)
sheet = workbook.active if i == 0 else workbook.create_sheet()
sheet.title = xlsSheet.name
for row in xrange(0, xlsSheet.nrows):
for col in xrange(0, xlsSheet.ncols):
sheet.cell(row=row+1, column=col+1).value = xlsSheet.cell_value(row, col)
workbook.save(c://path/workbook.xlsx")
这很有效。
尝试循环浏览所有文件时,我们使用:
import xlrd
from openpyxl.workbook import Workbook as openpyxlWorkbook
import glob
import pandas as pd
from pandas import ExcelWriter
import os
path ="C://path"
path2 = "C://path2"
allFiles = glob.glob(path + "/*.xls")
for file_ in allFiles:
xlsBook = xlrd.open_workbook(file_)
workbook = openpyxlWorkbook()
for i in xrange(0, xlsBook.nsheets):
xlsSheet = xlsBook.sheet_by_index(i)
sheet = workbook.active if i == 0 else workbook.create_sheet()
sheet.title = xlsSheet.name
for row in xrange(0, xlsSheet.nrows):
for col in xrange(0, xlsSheet.ncols):
sheet.cell(row=row+1, column=col+1).value = xlsSheet.cell_value(row, col)
##workbook.save(os.path.join(path2,file_))
##workbook.to_excel(os.path.join(path2,file_))
workbook.save("C://path/workbook.xlsx")
对于前两个注释掉的保存方法,workbook.save似乎什么也没做,而to_excel告诉我工作簿没有名为to_excel的属性...是因为我没有在循环中调用pandas吗? / p>
最终的workbook.save是一个测试 - 我认为它会正确地保存循环的最后一次迭代,因为它只在一个文件的脚本中工作。
相反,它会创建文件,所有工作表都已正确命名,但任何工作表中都没有数据。
知道我错过了什么吗?为了清楚起见,我希望在循环结束时让每个文件以其原始文件名命名,并使用有效的xlsx扩展名。
答案 0 :(得分:1)
我试试这种方式。更简单的代码,它在我测试时起作用。
import pandas as pd
import glob
def converter(filename):
xl = pd.ExcelFile(filename) # reads file in
sheet_names = xl.sheet_names # gets the sheet names of the file
sheets_dict = {} # dictionary with sheet_names as keys and data as values
for sheet in sheet_names:
sheets_dict[sheet] = xl.parse(sheet)
writer = pd.ExcelWriter(r'C:\Users\you\Desktop\\' + filename.split('\\')[-1][:-4] + '.xlsx') # takes the file path and only returns the file name, now with format xlsx
for sheet_name, data in sheets_dict.iteritems():
data.to_excel(writer, sheet_name, index = False)
writer.save()
files = glob.glob(r'C:\Users\you\Desktop' + '\*.xls')
for file in files:
converter(file)
编辑:我对openpyxl不太熟悉,但我不相信它有.to_excel
方法。我认为你正在创建一个openpyxl工作簿,但后来尝试使用pandas方法保存它。