2017-02-24 12 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はテストでした。ループの最終的な反復を正しく保存すると仮定しました。これは、1つのファイルだけでスクリプトで機能したためです。

代わりに、すべてのワークシートの名前は正しく指定されていますが、どのワークシートにもデータは含まれていないファイルが作成されます。

何が不足していると思いますか?明確にするために、私はループの終わりに元のファイル名と有効なxlsx拡張子を付けた名前のファイルを用意したいと考えています。

+0

本当に何千ものファイルがあるなら、openpyxlが提供する 'write-only'モードを見ることをお勧めします。 '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

1つは、.xlsを削除しないで、最後に.xslxを追加すると、他のスクリプトで読み取りエラーが発生しますか? – datahappy

関連する問題