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
Gerold

Stichworte: Excel Arbeitsmappe Arbeitsblatt Workbook Worksheet pywin32 win32com dispatch ODBC schnell