Schreiben in eine Excel-Tabelle

149

Ich bin neu in Python. Ich muss einige Daten aus meinem Programm in eine Tabelle schreiben. Ich habe online gesucht und es scheinen viele Pakete verfügbar zu sein (xlwt, XlsXcessive, openpyxl). Andere schlagen vor, in eine CSV-Datei zu schreiben (nie CSV verwendet und nicht wirklich verstanden, was es ist).

Das Programm ist sehr einfach. Ich habe zwei Listen (float) und drei Variablen (Strings). Ich kenne die Länge der beiden Listen nicht und sie werden wahrscheinlich nicht gleich lang sein.

Ich möchte, dass das Layout wie im Bild unten aussieht:

Layoutbeispiel

Die rosa Spalte enthält die Werte der ersten Liste und die grüne Spalte enthält die Werte der zweiten Liste.

Was ist der beste Weg, dies zu tun?

PS Ich verwende Windows 7, aber Office muss nicht unbedingt auf den Computern installiert sein, auf denen dieses Programm ausgeführt wird.

import xlwt

x=1
y=2
z=3

list1=[2.34,4.346,4.234]

book = xlwt.Workbook(encoding="utf-8")

sheet1 = book.add_sheet("Sheet 1")

sheet1.write(0, 0, "Display")
sheet1.write(1, 0, "Dominance")
sheet1.write(2, 0, "Test")

sheet1.write(0, 1, x)
sheet1.write(1, 1, y)
sheet1.write(2, 1, z)

sheet1.write(4, 0, "Stimulus Time")
sheet1.write(4, 1, "Reaction Time")

i=4

for n in list1:
    i = i+1
    sheet1.write(i, 0, n)



book.save("trial.xls")

Ich habe dies mit all Ihren Vorschlägen geschrieben. Es erledigt die Arbeit, kann aber leicht verbessert werden.

Wie formatiere ich die in der for-Schleife (list1-Werte) erstellten Zellen als wissenschaftlich oder als Zahl?

Ich möchte die Werte nicht abschneiden. Die im Programm verwendeten tatsächlichen Werte würden nach der Dezimalstelle etwa 10 Stellen haben.

Jey
quelle
Sie werden verstehen, was eine tsv-Datei ist, wenn Sie sie in einem Texteditor wie Notepad / Wordpad öffnen. Der Hauptvorteil bei der Verwendung von tsv besteht darin, dass Sie sicher sein können, dass im Grunde jede Version eines Tabellenkalkulationsprogramms es öffnen kann, und nicht nur die Excel-Version von Office 2010
Goncalopp,
Verwenden Sie das Zeichenfolgenformat in Python, um die Anzeige der numerischen Daten zu steuern.
Fred Mitchell
Überprüfen Sie openpyxl , um mit XLSX-Dateien zu arbeiten
Santiago

Antworten:

95
import xlwt

def output(filename, sheet, list1, list2, x, y, z):
    book = xlwt.Workbook()
    sh = book.add_sheet(sheet)

    variables = [x, y, z]
    x_desc = 'Display'
    y_desc = 'Dominance'
    z_desc = 'Test'
    desc = [x_desc, y_desc, z_desc]

    col1_name = 'Stimulus Time'
    col2_name = 'Reaction Time'

    #You may need to group the variables together
    #for n, (v_desc, v) in enumerate(zip(desc, variables)):
    for n, v_desc, v in enumerate(zip(desc, variables)):
        sh.write(n, 0, v_desc)
        sh.write(n, 1, v)

    n+=1

    sh.write(n, 0, col1_name)
    sh.write(n, 1, col2_name)

    for m, e1 in enumerate(list1, n+1):
        sh.write(m, 0, e1)

    for m, e2 in enumerate(list2, n+1):
        sh.write(m, 1, e2)

    book.save(filename)

Weitere Erklärungen: https://github.com/python-excel

thkang
quelle
13
Wenn Sie Python unter Windows ausführen und Excel auf demselben Computer installiert haben, können Sie die Python COM-Schnittstelle verwenden, um Excel direkt zu steuern.
Michael Dillon
1
Der Link war sehr hilfreich. Danke
Jey
3
Beachten Sie nur, dass mit diesem Code die maximale Zeilenbegrenzung 65536 Zeilen beträgt, da XLS-Dateien nur so viele Zeilen unterstützen
Shreyas Pimpalgaonkar
1
Um klar zu sein, xlwtdient nur zum Schreiben der alten .xlsDateien für Excel 2003 oder früher. Dies kann veraltet sein (abhängig von Ihren Anforderungen).
Cowlinator
Sie können openpyxl überprüfen , um mit XLSX-Dateien zu arbeiten
Santiago
138

Verwenden Sie DataFrame.to_excel von Pandas . Mit Pandas können Sie Ihre Daten in funktionsreichen Datenstrukturen darstellen und auch Excel-Dateien einlesen .

Sie müssen Ihre Daten zuerst in einen DataFrame konvertieren und dann in einer Excel-Datei wie folgt speichern:

In [1]: from pandas import DataFrame
In [2]: l1 = [1,2,3,4]
In [3]: l2 = [1,2,3,4]
In [3]: df = DataFrame({'Stimulus Time': l1, 'Reaction Time': l2})
In [4]: df
Out[4]: 
   Reaction Time  Stimulus Time
0              1              1
1              2              2
2              3              3
3              4              4

In [5]: df.to_excel('test.xlsx', sheet_name='sheet1', index=False)

und die Excel-Datei, die herauskommt, sieht folgendermaßen aus:

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass beide Listen gleich lang sein müssen, sonst beschweren sich Pandas. Um dies zu beheben, ersetzen Sie alle fehlenden Werte durch None.

Diliop
quelle
Danke, scheint aber zu kompliziert für meine Bedürfnisse.
Jey
Schön, aber ein bisschen übertrieben +1
Burhan Khalid
2
Ziemlich sicher, dass Pandas die xlrd / xlwt-Bibliotheken für seine Excel-Funktionen verwendet. Pandas.pydata.org/pandas-docs/stable/io.html#excel-files
mrmagooey
6
Ich nahm an, dass es auch verwendet wurde xlwt, bekam aber einen openpyxlFehler. Für alle anderen, die davon verwirrt sind - alles in dem gewünschten Dateityp. In den Pandas (0.12) -Dokumenten heißt es: "Dateien mit einer .xlsErweiterung werden mit xlwt und Dateien mit einer Erweiterung mit openpyxl .xlsxgeschrieben."
Racing Tadpole
5
Ich bin mir nicht sicher, warum die Leute sagen, dass es übertrieben ist. Für meine Zwecke war es genau das, wonach ich gesucht habe. Vielen Dank!
Abe
35
  • xlrd / xlwt (Standard): Python hat diese Funktionalität nicht in seiner Standardbibliothek, aber ich denke, xlrd / xlwt ist die "Standard" -Methode zum Lesen und Schreiben von Excel-Dateien. Es ist ziemlich einfach, eine Arbeitsmappe zu erstellen, Blätter hinzuzufügen, Daten / Formeln zu schreiben und Zellen zu formatieren. Wenn Sie all diese Dinge benötigen, haben Sie möglicherweise den größten Erfolg mit dieser Bibliothek. Ich denke, Sie könnten stattdessen openpyxl wählen und es wäre ziemlich ähnlich, aber ich habe es nicht verwendet.

    Um Zellen mit xlwt zu formatieren, definieren Sie a XFStyleund geben Sie den Stil an, wenn Sie auf ein Blatt schreiben. Hier ist ein Beispiel mit vielen Zahlenformaten . Siehe Beispielcode unten.

  • Tablib (leistungsstark, intuitiv): Tablib ist eine leistungsstärkere und dennoch intuitive Bibliothek für die Arbeit mit Tabellendaten. Es kann Excel-Arbeitsmappen mit mehreren Blättern sowie anderen Formaten wie CSV, JSON und YamL schreiben. Wenn Sie keine formatierten Zellen (wie Hintergrundfarbe) benötigen, tun Sie sich selbst einen Gefallen, um diese Bibliothek zu verwenden, die Sie auf lange Sicht weiter bringt.

  • csv (einfach): Dateien auf Ihrem Computer sind entweder Text oder Binär . Textdateien sind nur Zeichen, einschließlich spezieller Zeichen wie Zeilenumbrüche und Registerkarten, und können problemlos überall geöffnet werden (z. B. Notizblock, Webbrowser oder Office-Produkte). Eine CSV-Datei ist eine Textdatei, die auf eine bestimmte Weise formatiert ist: Jede Zeile ist eine Liste von Werten, die durch Kommas getrennt sind. Python-Programme können leicht Text lesen und schreiben, daher ist eine CSV-Datei die einfachste und schnellste Möglichkeit, Daten aus Ihrem Python-Programm in Excel (oder ein anderes Python-Programm) zu exportieren.

    Excel-Dateien sind binär und erfordern spezielle Bibliotheken, die das Dateiformat kennen. Deshalb benötigen Sie eine zusätzliche Bibliothek für Python oder ein spezielles Programm wie Microsoft Excel, Gnumeric oder LibreOffice, um sie zu lesen / schreiben.


import xlwt

style = xlwt.XFStyle()
style.num_format_str = '0.00E+00'

...

for i,n in enumerate(list1):
    sheet1.write(i, 0, n, fmt)
jmilloy
quelle
2
Sie möchten wahrscheinlich das in der Standardbibliothek enthaltene CSV- Modul verwenden, wenn Sie eine CSV-Datei schreiben möchten .
Flimm
1
Nicht, dass es besonders wichtig wäre, aber Tablib verwendet, wie so viele andere übergeordnete Pakete, xlwt, um Excel-Dateien auszugeben.
John Y
13

Ich habe einige Excel-Module für Python untersucht und festgestellt, dass openpyxl das beste ist.

Das kostenlose Buch Automate the Boring Stuff with Python enthält ein Kapitel über openpyxl mit weiteren Details. Sie können auch die Website Read the Docs lesen . Sie müssen weder Office noch Excel installieren, um openpyxl verwenden zu können.

Ihr Programm würde ungefähr so ​​aussehen:

import openpyxl
wb = openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')

stimulusTimes = [1, 2, 3]
reactionTimes = [2.3, 5.1, 7.0]

for i in range(len(stimulusTimes)):
    sheet['A' + str(i + 6)].value = stimulusTimes[i]
    sheet['B' + str(i + 6)].value = reactionTimes[i]

wb.save('example.xlsx')
Al Sweigart
quelle
Ich erhalte die Fehlermeldung: int64 kann nicht in excel konvertiert werden
pnkjmndhl
11

CSV steht für durch Kommas getrennte Werte. CSV ist wie eine Textdatei und kann einfach durch Hinzufügen der Erweiterung .CSV erstellt werden

Schreiben Sie zum Beispiel diesen Code:

f = open('example.csv','w')
f.write("display,variable x")
f.close()

Sie können diese Datei mit Excel öffnen.

2 8
quelle
5
Sie können die Spaltenhintergründe nicht mit CSV formatieren. Es ist nur ein Datenformat für den Import und Export.
Michael Dillon
5
Sie möchten wahrscheinlich das in der Standardbibliothek enthaltene CSV-Modul verwenden, wenn Sie dies tun möchten . Zum Beispiel wird das Zitieren besser gehandhabt.
Flimm
@Flimm wie schreibe ich einfach in verschiedene Zellen?
Oldboy
Wenn Sie Python 3 verwenden und die Datei Nicht-ASCII-Zeichen wie éoder enthält , sollten Sie f.write('\xEF\xBB\xBF')direkt nach dem open(). Dies ist die Stückliste ( Byte Order Mark , siehe auch), die von der Microsoft-Software benötigt wird, um die UTF-8-Codierung zu erkennen
Walter Tross,
10
import xlsxwriter


# Create an new Excel file and add a worksheet.
workbook = xlsxwriter.Workbook('demo.xlsx')
worksheet = workbook.add_worksheet()

# Widen the first column to make the text clearer.
worksheet.set_column('A:A', 20)

# Add a bold format to use to highlight cells.
bold = workbook.add_format({'bold': True})

# Write some simple text.
worksheet.write('A1', 'Hello')

# Text with formatting.
worksheet.write('A2', 'World', bold)

# Write some numbers, with row/column notation.
worksheet.write(2, 0, 123)
worksheet.write(3, 0, 123.456)

# Insert an image.
worksheet.insert_image('B5', 'logo.png')

workbook.close()
Naveen Agarwal
quelle
7

Schauen Sie sich auch die folgenden Bibliotheken an:

xlwings - zum Ein- und Auslesen von Daten in eine Tabelle aus Python sowie zum Bearbeiten von Arbeitsmappen und Diagrammen

ExcelPython - ein Excel-Add-In zum Schreiben von benutzerdefinierten Funktionen (UDFs) und Makros in Python anstelle von VBA

ehremo
quelle
2

OpenPyxl ist eine ziemlich schöne Bibliothek zum Lesen / Schreiben von Excel 2010 xlsx / xlsm-Dateien:

https://openpyxl.readthedocs.io/en/stable

Die andere Antwort , die sich darauf bezieht, ist die Verwendung der Funktion deperciated ( get_sheet_by_name). So geht's ohne:

import openpyxl

wbkName = 'New.xlsx'        #The file should be created before running the code.
wbk = openpyxl.load_workbook(wbkName)
wks = wbk['test1']
someValue = 1337
wks.cell(row=10, column=1).value = someValue
wbk.save(wbkName)
wbk.close
Vityata
quelle
1
Der FileNotFoundError: [Errno 2] No such file or directory: 'New.xlsx'
obige
@Atinesh - Vielen Dank für das Feedback - openpyxl.load_workbooklädt eine Arbeitsmappe, die bereits vorhanden ist. Erstellen Sie eine Datei New.xlsx, um diesen Fehler zu vermeiden.
Vityata
1
OK Danke für den Vorschlag
Atinesh
Beachten Sie, dass openpyxl kein älteres 'xls'-Format unterstützt.
Timothy C. Quinn
2

Die xlsxwriterBibliothek eignet sich hervorragend zum Erstellen von .xlsxDateien. Das folgende Snippet generiert eine .xlsxDatei aus einer Liste von Diktaten unter Angabe der Reihenfolge und der angezeigten Namen :

from xlsxwriter import Workbook


def create_xlsx_file(file_path: str, headers: dict, items: list):
    with Workbook(file_path) as workbook:
        worksheet = workbook.add_worksheet()
        worksheet.write_row(row=0, col=0, data=headers.values())
        header_keys = list(headers.keys())
        for index, item in enumerate(items):
            row = map(lambda field_id: item.get(field_id, ''), header_keys)
            worksheet.write_row(row=index + 1, col=0, data=row)


headers = {
    'id': 'User Id',
    'name': 'Full Name',
    'rating': 'Rating',
}

items = [
    {'id': 1, 'name': "Ilir Meta", 'rating': 0.06},
    {'id': 2, 'name': "Abdelmadjid Tebboune", 'rating': 4.0},
    {'id': 3, 'name': "Alexander Lukashenko", 'rating': 3.1},
    {'id': 4, 'name': "Miguel Díaz-Canel", 'rating': 0.32}
]

create_xlsx_file("my-xlsx-file.xlsx", headers, items)

Geben Sie hier die Bildbeschreibung ein


💡 Anmerkung 1 - Ich antworte absichtlich nicht auf den genauen Fall, den das OP vorgestellt hat. Stattdessen präsentiere ich meiner Meinung nach eine allgemeinere Lösung, nach der die meisten Besucher suchen. Der Titel dieser Frage ist in Suchmaschinen gut indiziert und verfolgt viel Verkehr

Geben Sie hier die Bildbeschreibung ein

💡 Hinweis 2 - Wenn Sie Python3.6 oder höher nicht verwenden, sollten Sie OrderedDictin verwenden headers. Vor Python3.6 wurde die Reihenfolge in dictnicht beibehalten.


Jossef Harush
quelle
0

Der einfachste Weg, die genauen Zahlen zu importieren, besteht darin, nach den Zahlen in Ihrem l1und eine Dezimalstelle einzufügen l2. Python interpretiert diesen Dezimalpunkt als Anweisung von Ihnen, die genaue Zahl anzugeben. Wenn Sie es auf eine Dezimalstelle beschränken müssen, sollten Sie in der Lage sein, einen Druckbefehl zu erstellen, der die Ausgabe begrenzt. Dies ist ganz einfach:

print variable_example[:13]

Würde es auf die zehnte Dezimalstelle beschränken, vorausgesetzt, Ihre Daten haben noch zwei Ganzzahlen von der Dezimalstelle.

Kyle Cyree
quelle
0

Sie können die objektorientierte Python-Bibliothek hfexcel Human Friendly basierend auf XlsxWriter ausprobieren :

from hfexcel import HFExcel

hf_workbook = HFExcel.hf_workbook('example.xlsx', set_default_styles=False)

hf_workbook.add_style(
    "headline", 
    {
       "bold": 1,
        "font_size": 14,
        "font": "Arial",
        "align": "center"
    }
)

sheet1 = hf_workbook.add_sheet("sheet1", name="Example Sheet 1")

column1, _ = sheet1.add_column('headline', name='Column 1', width=2)
column1.add_row(data='Column 1 Row 1')
column1.add_row(data='Column 1 Row 2')

column2, _ = sheet1.add_column(name='Column 2')
column2.add_row(data='Column 2 Row 1')
column2.add_row(data='Column 2 Row 2')


column3, _ = sheet1.add_column(name='Column 3')
column3.add_row(data='Column 3 Row 1')
column3.add_row(data='Column 3 Row 2')

# In order to get a row with coordinates:
# sheet[column_index][row_index] => row
print(sheet1[1][1].data)
assert(sheet1[1][1].data == 'Column 2 Row 2')

hf_workbook.save()
Emin Bugra Saral
quelle
0

Wenn Sie eine vorhandene Arbeitsmappe ändern möchten, ist die Verwendung von pyoo der sicherste Weg . Sie müssen einige Bibliotheken installiert haben und es dauert ein paar Schritte, um durch die Bibliotheken zu springen. Sobald diese eingerichtet sind, ist dies kugelsicher, da Sie die breiten und soliden APIs von LibreOffice / OpenOffice nutzen.

In meinem Gist erfahren Sie, wie Sie ein Linux-System einrichten und einige grundlegende Codierungen mit pyoo durchführen.

Hier ist ein Beispiel für den Code:

#!/usr/local/bin/python3
import pyoo
# Connect to LibreOffice using a named pipe 
# (named in the soffice process startup)
desktop = pyoo.Desktop(pipe='oo_pyuno')
wkbk = desktop.open_spreadsheet("<xls_file_name>")
sheet = wkbk.sheets['Sheet1']
# Write value 'foo' to cell E5 on Sheet1
sheet[4,4].value='foo'
wkbk.save()
wkbk.close()
Timothy C. Quinn
quelle