将多个xls文件转换为xlsx-从单个文件扩展到问题

时间:2017-02-24 16:20:15

标签: 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, 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扩展名。

1 个答案:

答案 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方法保存它。