Python 将多个xls文件转换为xlsx-从单个文件放大的问题

Python 将多个xls文件转换为xlsx-从单个文件放大的问题,python,pandas,openpyxl,Python,Pandas,Openpyxl,我们有几千个xls文件,每个文件中有几十张纸。我们正在进行一个更大的项目来合并文件和工作表,但首先需要将它们转换为xlsx 以下代码在单个文件上运行良好: import xlrd from openpyxl.workbook import Workbook as openpyxlWorkbook xlsBook = xlrd.open_workbook(C://path) workbook = openpyxlWorkbook() for i in xrange(0, xlsBoo

我们有几千个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吗

最终的workbook.save是一个测试——我认为它会正确地保存循环的最终迭代,因为它在脚本中只使用一个文件

相反,它会创建文件,正确命名所有工作表,但任何工作表中都没有数据


知道我错过了什么吗?为了清楚起见,我希望在循环结束时使用原始文件名命名每个文件,并使用有效的xlsx扩展名。

我会尝试这种方法。更简单的代码,在我测试它时,它工作了

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\u excel
方法。我想您正在创建一个openpyxl工作簿,但试图使用pandas方法保存它。

关于我们在上面的保存调用中搞砸了什么,您有什么想法吗?有一点,它没有删除.xls,只是在末尾添加了.xslx…这会导致其他脚本中的读取错误吗?我添加了[:-4]添加到filename.split调用的结尾,这样它也将省略文件名(.xls)上的最后4个字符。那应该可以解决它!如果你真的有数千个文件,我建议你看看openpyxl提供的
只写
模式
到excel
是熊猫数据帧的一种方法。