Wie man xls in xlsx umwandelt

Ich habe einige * .xls (Excel 2003) Dateien, und ich möchte diese Dateien in xlsx konvertieren (excel 2007).

Ich benutze das Uno-Python-Paket, wenn ich die Dokumente speichere, kann ich den Filternamen setzen: MS Excel 97 Aber es gibt keinen Filternamen wie 'MS Excel 2007',

Hilf mir bitte, wie kann man den filternamen setzen, um xls zu xlsx zu konvertieren?

8 Solutions collect form web for “Wie man xls in xlsx umwandelt”

Das musste ich schon mal machen Die Hauptidee ist es, das xlrd- Modul zu verwenden, um eine xls-Datei zu öffnen und zu analysieren und den Inhalt in eine xlsx- Datei mit dem openpyxl- Modul zu schreiben .

Hier ist mein Code. Aufmerksamkeit! Es kann nicht behandeln komplexe xls-Dateien, sollten Sie hinzufügen Sie eigene Parsing-Logik, wenn Sie es verwenden werden.

import xlrd from openpyxl.workbook import Workbook from openpyxl.reader.excel import load_workbook, InvalidFileException def open_xls_as_xlsx(filename): # first open using xlrd book = xlrd.open_workbook(filename) index = 0 nrows, ncols = 0, 0 while nrows * ncols == 0: sheet = book.sheet_by_index(index) nrows = sheet.nrows ncols = sheet.ncols index += 1 # prepare a xlsx sheet book1 = Workbook() sheet1 = book1.get_active_sheet() for row in xrange(0, nrows): for col in xrange(0, ncols): sheet1.cell(row=row, column=col).value = sheet.cell_value(row, col) return book1 

Sie müssen win32com auf Ihrem Rechner installiert haben. Hier ist mein Code:

 import win32com.client as win32 fname = "full+path+to+xls_file" excel = win32.gencache.EnsureDispatch('Excel.Application') wb = excel.Workbooks.Open(fname) wb.SaveAs(fname+"x", FileFormat = 51) #FileFormat = 51 is for .xlsx extension wb.Close() #FileFormat = 56 is for .xls extension excel.Application.Quit() 

Die Antwort von Ray half mir sehr, aber für diejenigen, die einen einfachen Weg suchen, um alle Blätter von einem xls zu einem xlsx zu konvertieren, machte ich diesen Gist :

 import xlrd from openpyxl.workbook import Workbook as openpyxlWorkbook # content is a string containing the file. For example the result of an http.request(url). # You can also use a filepath by calling "xlrd.open_workbook(filepath)". xlsBook = xlrd.open_workbook(file_contents=content) 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, column=col).value = xlsSheet.cell_value(row, col) # The new xlsx file is in "workbook", without iterators (iter_rows). # For iteration, use "for row in worksheet.rows:". # For range iteration, use "for row in worksheet.range("{}:{}".format(startCell, endCell)):". 

Hier finden Sie die xlrd lib hier und die openpyxl hier (Sie müssen zum Beispiel xlrd in Ihrem Projekt für Google App Engine herunterladen).

Hier ist meine Lösung, ohne Betrachtung von Schriften, Diagrammen und Bildern:

 $ pip install pyexcel pyexcel-xls pyexcel-xlsx 

Dann mache das

 import pyexcel as p p.save_book_as(file_name='your-file-in.xls', dest_file_name='your-new-file-out.xlsx') 

Wenn du kein Programm brauchst, kannst du ein Additinalpaket installieren pyexcel-cli ::

 $ pip install pyexcel-cli $ pyexcel transcode your-file-in.xls your-new-file-out.xlsx 

Das oben beschriebene Transcoding-Verfahren verwendet xlrd und openpyxl.

Ich fand keine Antwort hier 100% richtig. Also posten ich meine codes hier:

 import xlrd from openpyxl.workbook import Workbook def cvt_xls_to_xlsx(src_file_path, dst_file_path): book_xls = xlrd.open_workbook(src_file_path) book_xlsx = Workbook() sheet_names = book_xls.sheet_names() for sheet_index in range(0,len(sheet_names)): sheet_xls = book_xls.sheet_by_name(sheet_names[sheet_index]) if sheet_index == 0: sheet_xlsx = book_xlsx.active() sheet_xlsx.title = sheet_names[sheet_index] else: sheet_xlsx = book_xlsx.create_sheet(title=sheet_names[sheet_index]) for row in range(0, sheet_xls.nrows): for col in range(0, sheet_xls.ncols): sheet_xlsx.cell(row = row+1 , column = col+1).value = sheet_xls.cell_value(row, col) book_xlsx.save(dst_file_path) 

Ich bin Verbesserung der Leistung für @Jackypengyu Methode.

Zusammengeführte Zellen werden auch umgewandelt.

Ergebnisse

Konvertiere dieselben 12 Dateien in derselben Reihenfolge:

Original :

 0:00:01.958159 0:00:02.115891 0:00:02.018643 0:00:02.057803 0:00:01.267079 0:00:01.308073 0:00:01.245989 0:00:01.289295 0:00:01.273805 0:00:01.276003 0:00:01.293834 0:00:01.261401 

Verbessert :

 0:00:00.774101 0:00:00.734749 0:00:00.741434 0:00:00.744491 0:00:00.320796 0:00:00.279045 0:00:00.315829 0:00:00.280769 0:00:00.316380 0:00:00.289196 0:00:00.347819 0:00:00.284242 

Lösung

 def cvt_xls_to_xlsx(*args, **kw): """Open and convert XLS file to openpyxl.workbook.Workbook object @param args: args for xlrd.open_workbook @param kw: kwargs for xlrd.open_workbook @return: openpyxl.workbook.Workbook """ book_xls = xlrd.open_workbook(*args, formatting_info=True, ragged_rows=True, **kw) book_xlsx = openpyxl.workbook.Workbook() sheet_names = book_xls.sheet_names() for sheet_index in range(len(sheet_names)): sheet_xls = book_xls.sheet_by_name(sheet_names[sheet_index]) if sheet_index == 0: sheet_xlsx = book_xlsx.active sheet_xlsx.title = sheet_names[sheet_index] else: sheet_xlsx = book_xlsx.create_sheet(title=sheet_names[sheet_index]) for crange in sheet_xls.merged_cells: rlo, rhi, clo, chi = crange sheet_xlsx.merge_cells( start_row=rlo + 1, end_row=rhi, start_column=clo + 1, end_column=chi, ) def _get_xlrd_cell_value(cell): value = cell.value if cell.ctype == xlrd.XL_CELL_DATE: value = datetime.datetime(*xlrd.xldate_as_tuple(value, 0)) return value for row in range(sheet_xls.nrows): sheet_xlsx.append(( _get_xlrd_cell_value(cell) for cell in sheet_xls.row_slice(row, end_colx=sheet_xls.row_len(row)) )) return book_xlsx 

Die Antwort von Ray schneidet die erste Zeile und die letzte Spalte der Daten aus. Hier ist meine modifizierte Lösung (für python3):

 def open_xls_as_xlsx(filename): # first open using xlrd book = xlrd.open_workbook(filename) index = 0 nrows, ncols = 0, 0 while nrows * ncols == 0: sheet = book.sheet_by_index(index) nrows = sheet.nrows+1 #bm added +1 ncols = sheet.ncols+1 #bm added +1 index += 1 # prepare a xlsx sheet book1 = Workbook() sheet1 = book1.get_active_sheet() for row in range(1, nrows): for col in range(1, ncols): sheet1.cell(row=row, column=col).value = sheet.cell_value(row-1, col-1) #bm added -1's return book1 

Ich habe versucht @Jhon Andersons Lösung, funktioniert gut aber bekam ein "Jahr ist außerhalb des Bereichs" Fehler, wenn es Zellen der Zeitformat wie HH: mm: ss ohne Datum. Dort habe ich den Algorithmus wieder verbessert:

 def xls_to_xlsx(*args, **kw): """ open and convert an XLS file to openpyxl.workbook.Workbook ---------- @param args: args for xlrd.open_workbook @param kw: kwargs for xlrd.open_workbook @return: openpyxl.workbook.Workbook对象""" book_xls = xlrd.open_workbook(*args, formatting_info=True, ragged_rows=True, **kw) book_xlsx = openpyxl.workbook.Workbook() sheet_names = book_xls.sheet_names() for sheet_index in range(len(sheet_names)): sheet_xls = book_xls.sheet_by_name(sheet_names[sheet_index]) if sheet_index == 0: sheet_xlsx = book_xlsx.active sheet_xlsx.title = sheet_names[sheet_index] else: sheet_xlsx = book_xlsx.create_sheet(title=sheet_names[sheet_index]) for crange in sheet_xls.merged_cells: rlo, rhi, clo, chi = crange sheet_xlsx.merge_cells(start_row=rlo + 1, end_row=rhi, start_column=clo + 1, end_column=chi,) def _get_xlrd_cell_value(cell): value = cell.value if cell.ctype == xlrd.XL_CELL_DATE: datetime_tup = xlrd.xldate_as_tuple(value,0) if datetime_tup[0:3] == (0, 0, 0): # time format without date value = datetime.time(*datetime_tup[3:]) else: value = datetime.datetime(*datetime_tup) return value for row in range(sheet_xls.nrows): sheet_xlsx.append(( _get_xlrd_cell_value(cell) for cell in sheet_xls.row_slice(row, end_colx=sheet_xls.row_len(row)) )) return book_xlsx 

Dann arbeiten Sie perfekt!

  • Openpyxl Grundsuche
  • Csv & xlsx Dateien importieren in pandas data frame: speed issue
  • Wie kann ich die Formeln einer Excel-Kalkulationstabelle in Pandas / Python sehen?
  • Python ist die beste Programmiersprache der Welt.