2017-02-24 21 views
1

我們有幾千個xls文件,每個文件中有幾十個工作表。我們正在開發一個更大的項目來合併文件和工作表,但首先需要將它們轉換爲xlsx。將多個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 ...是因爲我沒有在循環中調用熊貓?

最終的workbook.save是一個測試 - 我認爲它會正確保存循環的最終迭代,因爲它只用一個文件在腳本中工作。

取而代之的是,它創建了所有工作表都正確命名的文件,但沒有任何工作表中的數據。

任何想法我失蹤?爲了清楚起見,我正在尋找在循環結束時使用其原始文件名命名的每個文件以及一個有效的xlsx擴展名。

+0

如果你確實有成千上萬的文件,我建議你看看openpyxl提供的'只寫'模式。 'to_excel'是Pandas的DataFrames的一種方法。 –

回答

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

+0

這工作完美...謝謝! – datahappy

+0

關於我們在上面的保存調用中搞砸了什麼的想法? – datahappy

+0

有一點,它不會刪除.xls,只是在結尾添加.xslx ...會在其他腳本中讀取錯誤嗎? – datahappy

相關問題