it-swarm.com.de

wie konvertiert man xls in xlsx?

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

Ich verwende das Paket uno python, wenn ich die Dokumente speichere, Ich kann den Filternamen einstellen: MS Excel 97 Es gibt jedoch keinen Filternamen wie 'MS Excel 2007'.

bitte helfen sie mir, wie kann man den filternamen einstellen, um xls in xlsx zu konvertieren?

18
Thomas

Ich musste das schon mal machen. Die Hauptidee ist, mit dem Modul xlrd eine xls - Datei zu öffnen und zu parsen und den Inhalt Mit dem Modul openpyxl in eine xlsx - Datei zu schreiben.

Hier ist mein Code. Achtung! Es kann keine komplexen xls-Dateien verarbeiten. Sie sollten Ihre eigene Parsing-Logik hinzufügen, wenn Sie sie verwenden möchten.

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
17
Ray

Hier ist meine Lösung, ohne Schriftarten, Diagramme und Bilder zu berücksichtigen:

$ pip install pyexcel pyexcel-xls pyexcel-xlsx

Dann mach das ::

import pyexcel as p

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

Wenn Sie kein Programm benötigen, können Sie ein Zusatzpaket pyexcel-cli installieren:

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

Das obige Transkodierungsverfahren verwendet xlrd und openpyxl.

10
chfw

Sie müssen win32com auf Ihrem Computer 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()
10
kvdogan

Ich fand keine der Antworten hier zu 100% richtig. Also poste 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)
9
Jackypengyu

Die Antwort von Ray hat mir sehr geholfen, aber für diejenigen, die eine einfache Möglichkeit suchen, alle Blätter von einem XLS in ein XLSX umzuwandeln, habe ich diese 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)):".

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

6
Malexandre

Ich bin Leistung verbessern für @Jackypengyu-Methode.

Zusammengeführte Zellen werden ebenfalls konvertiert.

Ergebnisse

Gleiche 12 Dateien in derselben Reihenfolge konvertieren:

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


    You need -> from openpyxl.utils.cell import get_column_letter
    """

    book_xls = xlrd.open_workbook(*args, formatting_info=True, ragged_rows=True, **kw)
    book_xlsx = 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))
            ))

        for rowx in range(sheet_xls.nrows):
            if sheet_xls.rowinfo_map[rowx].hidden != 0:
                print sheet_names[sheet_index], rowx
                sheet_xlsx.row_dimensions[rowx+1].hidden = True
        for coly in range(sheet_xls.ncols):
            if sheet_xls.colinfo_map[coly].hidden != 0:
                print sheet_names[sheet_index], coly
                coly_letter = get_column_letter(coly+1)
                sheet_xlsx.column_dimensions[coly_letter].hidden = True

    return book_xlsx
3
Jhon Anderson

Einfache Lösung

Ich brauchte eine einfache Lösung, um ein Paar von xlx in ein xlsx-Format zu konvertieren. Hier gibt es viele Antworten, aber sie tun "Magie", die ich nicht ganz verstehe.

Eine einfache Lösung wurde von chfw gegeben, aber nicht vollständig.

Abhängigkeiten installieren

Verwenden Sie pip zum Installieren

pip install pyexcel-cli pyexcel-xls pyexcel-xlsx

Execute

Das gesamte Styling und die Makros sind verschwunden, aber die Informationen sind intakt.

Für eine einzelne Datei

pyexcel transcode your-file-in.xls your-new-file-out.xlsx

Für alle Dateien im Ordner ein Liner

for file in *.xls; do; echo "Transcoding $file"; pyexcel transcode "$file" "${file}x"; done;
1
Atais

Konvertieren Sie die XLS-Datei in XLSX

Mit python3.6 Ich bin gerade durch dasselbe Problem gekommen und nach stundenlangem Kampf habe ich es gelöst, indem ich die ff gemacht habe, werden Sie wahrscheinlich nicht alle Pakete brauchen: (Ich werde so klar wie möglich sein)

stellen Sie sicher, dass Sie die folgenden Pakete installieren, bevor Sie fortfahren

pip install pyexcel, pip install pyexcel-xls, pip install pyexcel-xlsx,

pip install pyexcel-cli

Schritt 1:

import pyexcel

Schritt 2: "example.xls", "example.xlsx", "example.xlsm"

sheet0 = pyexcel.get_sheet(file_name="your_file_path.xls", name_columns_by_row=0)

step3: Array aus Inhalten erstellen

xlsarray = sheet.to_array() 

Schritt4: Variableninhalt prüfen, um zu überprüfen

xlsarray

step5: Übergeben Sie das in der Variablen (xlsarray) gehaltene Array an eine neue Arbeitsmappenvariable namens (sheet1)

sheet1 = pyexcel.Sheet(xlsarray)

step6: speichere das neue Blatt mit .xlsx (in meinem Fall möchte ich xlsx)

sheet1.save_as("test.xlsx")
0
lordwilliamsr

Die Antwort von Ray schnitt die erste Zeile und letzte Spalte der Daten ab. 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
0
benmichae2.

@CaKel und @Jhon Anderson Lösung:

def _get_xlrd_cell_value(cell):
    value = cell.value
        if cell.ctype == xlrd.XL_CELL_DATE:
            # Start: if time is 00:00 this fix is necessary
            if value == 1.0:
                datetime_tup = (0, 0, 0)
            else:
            # end
                datetime_tup = xlrd.xldate_as_Tuple(value, 0)

            if datetime_tup[0:3] == (0, 0, 0):
                value = datetime.time(*datetime_tup[3:])
            else:
                value = datetime.datetime(*datetime_tup)
    return value

Und jetzt läuft dieser Code perfekt für mich!

0
droebi

Ich habe @Jhon Andersons Lösung ausprobiert, funktioniert gut, bekam aber einen Fehler "Jahr außerhalb des Bereichs", wenn es Zeitzellen wie HH: mm: ss ohne Datum gibt. Dafür habe ich den Algorithmus nochmals 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 arbeite perfekt!

0
CakeL

Versuchte @ Jhons Lösung zuerst, dann verwandelte ich mich in Pyexcel als Lösung

pyexcel.save_as(file_name=oldfilename, dest_file_name=newfilename)

Es funktioniert einwandfrei, bis ich versucht habe, mein Projekt mit PyInstaller in eine einzelne exe-Datei zu packen. Ich habe alle versteckten Importoptionen ausprobiert. Der folgende Fehler ist immer noch vorhanden:

  File "utils.py", line 27, in __enter__
    pyexcel.save_as(file_name=self.filename, dest_file_name=newfilename)
  File "site-packages\pyexcel\core.py", line 77, in save_as
  File "site-packages\pyexcel\internal\core.py", line 22, in get_sheet_stream
  File "site-packages\pyexcel\plugins\sources\file_input.py", line 39, in get_da
ta
  File "site-packages\pyexcel\plugins\parsers\Excel.py", line 19, in parse_file
  File "site-packages\pyexcel\plugins\parsers\Excel.py", line 40, in _parse_any
  File "site-packages\pyexcel_io\io.py", line 73, in get_data
  File "site-packages\pyexcel_io\io.py", line 91, in _get_data
  File "site-packages\pyexcel_io\io.py", line 188, in load_data
  File "site-packages\pyexcel_io\plugins.py", line 90, in get_a_plugin
  File "site-packages\lml\plugin.py", line 290, in load_me_now
  File "site-packages\pyexcel_io\plugins.py", line 107, in raise_exception
pyexcel_io.exceptions.SupportingPluginAvailableButNotInstalled: Please install p
yexcel-xls
[3192] Failed to execute script

Dann bin ich zu Pandas gesprungen:

pd.read_Excel(oldfilename).to_Excel(newfilename, sheet_name=self.sheetname,index=False)
0
Xb74Dkjb