Daten in eine Excel-Arbeitsmappe schreiben (mit ODBC)

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Donnerstag 5. April 2007, 20:12

Es gibt eine recht einfache Methode, Daten in Excel-Arbeitsmappen zu schreiben. Siehe: http://www.python-forum.de/post-63832.html#63832

Allerdings ist diese Methode nicht die schnellste, wenn es darum geht, viele, viele Werte in eine Excel-Arbeitsmappe zu schreiben.

Schneller geht es mit ODBC. Siehe: http://www.python-forum.de/post-40738.html#40738

Aber auch diese Methode hat einen Nachteil -- man muss vorher einem Bereich einen Namen geben. Aber hier ist die Lösung --> Automatisiere das Vergeben des Namens, schreibe dann alles per ODBC in die Datei und formatiere dann die Feldnamen fett.

Wie das geht zeigt dieses Codesnippet:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
"""
Werte in eine Excel-Arbeitsmappe schreiben. 

Die Arbeitsmappe wird zuerst vorbereitet, erst danach werden die Daten 
per ODBC in die Arbeitsmappe geschrieben.

Requirements:  Python: http://www.python.org/
               pywin32: http://sourceforge.net/projects/pywin32/
"""

import dbi
import odbc
import datetime
import win32com.client

FILENAME = u"adressen.xls"


#
# Werte
#
fieldnames = (u"Vorname", u"Nachname", u"Geburtstag")
values = (
    (u"Max", u"Mustermann", datetime.date(1974, 8, 18)),
    (u"Leo", u"Mustermann", datetime.date(1974, 8, 19)),
    (u"Maria", u"Musterfrau", datetime.date(1974, 8, 20)),
)

# Werte vermehren -- zum Testen
values = 500 * values


# 
# Excel-Datei vorbereiten (Feldnamen schreiben und Bereichsname vergeben)
#

# Verbindung zu Excel aufnehmen
app = win32com.client.dynamic.Dispatch("Excel.Application")

# Neue Arbeitsmappe
workbook = app.Workbooks.Add()

# Neues Arbeitsblatt
worksheet = workbook.Worksheets.Add()
worksheet.Name = "Adressen"

# Hinweis: Cells-Syntax: Cells(row_id, col_id)

# Feldnamen schreiben
for index, fieldname in enumerate(fieldnames):
    worksheet.Cells(1, (index + 1)).value = fieldname

# Bereichsnamen vergeben
cells = worksheet.Range("A1", worksheet.Cells(1, len(fieldnames)))
cells.Name = u"Adressen"

# Workbook speichern und schließen
workbook.SaveAs(FILENAME)
workbook.Close()

# Excel schließen
app.Quit()

# Objekte in der richtigen Reihenfolge löschen
del worksheet
del workbook
del app


#
# Daten per ODBC in die Excel-Datei schreiben
#
connstr = (
    "DRIVER={MICROSOFT EXCEL DRIVER (*.XLS)};"
    "DSN='';"
    "FIRSTROWHASNAMES=1;"
    "READONLY=FALSE;"
    "DBQ=%s"
) % FILENAME

conn = odbc.odbc(connstr)
cur = conn.cursor()

for vorname, nachname, geburtstag in values:
    sql = """
    INSERT INTO adressen (
        Vorname, Nachname, Geburtstag
    ) VALUES (
        ?, ?, ?
    )
    """
    cur.execute(sql, (vorname, nachname, geburtstag))

conn.commit()
cur.close()
conn.close()

# ... ohne `del` gehts nicht (Zugriff auf Excel-Datei wird verweigert)
del cur
del conn


# 
# Feldnamen formatieren
#

# Verbindung zu Excel aufnehmen
app = win32com.client.dynamic.Dispatch("Excel.Application")

# Arbeitsmappe öffnen
workbook = app.Workbooks.Open(FILENAME)

# Arbeitsblatt auswählen
worksheet = workbook.Worksheets("Adressen")

# Hinweis: Cells-Syntax: Cells(row_id, col_id)

# Feldnamen fett formatieren
for index, fieldname in enumerate(fieldnames):
    worksheet.Cells(1, (index + 1)).Font.Bold = True

# Workbook speichern und schließen
workbook.Save()
workbook.Close()

# Excel schließen
app.Quit()

# Objekte in der richtigen Reihenfolge löschen
del worksheet
del workbook
del app
mfg
Gerold
:-)

Stichworte: Excel Arbeitsmappe Arbeitsblatt Workbook Worksheet pywin32 win32com dispatch ODBC schnell
Zuletzt geändert von gerold am Donnerstag 5. April 2007, 20:57, insgesamt 2-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Donnerstag 5. April 2007, 20:19

Hi!

Diese ODBC-Lösung hat allerdings einen Nachteil: So wie sie derzeit geschrieben ist, kann sie nicht mit Umlauten in den Feldwerten umgehen.

Aber ich bin jetzt zu faul, dafür auch noch eine Lösung zu finden.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten