Bearbeiten von MS Excel Dateien

W. Nagy

Dieser Kurzvortrag zeigt die Verwendung der Module: http://www.python-excel.org/

Modul

download

xlrd

Lesen von XLS Dateien

xlwt

Erzeugen einer Arbeitsmappe

zum Platformneutralen Gewinnen oder Erzeugen von MS Excel Dateien ohne Excel oder COM zu verweden.

Beispiel Modul

Enthält zwei Klassen (xlsReader, xlsWriter). Ist ein kleiner Wrapper, der als Beispielcode für diesen Artikel dient und das Leben ein klein wenig erleichtern kann.

Download

xlrd

Library for developers to extract data from Microsoft Excel (tm) spreadsheet files

Extract data from Excel spreadsheets (.xls and .xlsx, versions 2.0 onwards) on any platform. Pure Python (2.6, 2.7, 3.2+). Strong support for Excel dates. Unicode-aware.

xlwt

Library to create spreadsheet files compatible with MS Excel 97/2000/XP/2003 XLS files, on any platform, with Python 2.3 to 2.7

xlwt is a library for generating spreadsheet files that are compatible with Excel 97/2000/XP/2003, OpenOffice.org Calc, and Gnumeric. xlwt has full support for Unicode. Excel spreadsheets can be generated on any platform without needing Excel or a COM server. The only requirement is Python 2.3 to 2.7.

Beispiele xlrd

Öffenen einer Arbeitsmappe

   1 import datetime
   2 import xlrd
   3 from xlwt import *
   4 
   5 ...
   6 
   7 try:
   8    self.workbook = xlrd.open_workbook('myexcel.xls','utf8')
   9 except IOError as e:
  10    raise Exception("I/O error({0}): {1}".format(e.errno, e.strerror))

Aktuelles Arbeitsblatt

In sheetid ist entweder ein Integer oder eine Zeichenkette mit dem Namen des Arbeitsblattes

   1 if isinstance(sheetid,str):         
   2    self.sheet = self.workbook.sheet_by_name(sheetid)
   3 elif isinstance(sheetid,int):
   4    self.sheet = self.workbook.sheet_by_index(sheetid)
   5 else:
   6    raise ValueError("Der Parameter sheetid muss Integer oder String sein.")

Inhalt einer Zelle gewinnen

   1 value = self.sheet.cell_value(row,col)

Dieser Code wirft eine Ausnahme, wenn die Zelle nicht erreichbar ist.

Methode zum gewinnen eines typengerechten Zelleninhalts

Diese Methode liefert den Zellenihalt und versucht dabei einen möglichst passenden Python Typ zu erzeugen.

Ist die Zelle nicht definiert (Außerhalbe der used-region) wird None zurückgeliefert.

Ist die Zelle Fehlerhaft (Excel Fehler) wird diese als String zugrückgegeben. Datumszellen werde als datetime Objekt geliefert.

   1    def getValue (self,row=0,col=0):
   2 
   3       retval = None
   4       try:
   5          celltype = self.sheet.cell_type(row,col)
   6          if celltype == xlrd.XL_CELL_EMPTY:
   7             retval = self.emptyval
   8          
   9          elif celltype == xlrd.XL_CELL_BLANK:
  10             retval = self.sheet.cell_value(row,col)
  11 
  12          elif celltype == xlrd.XL_CELL_NUMBER:
  13             retval = self.sheet.cell_value(row,col)
  14 
  15          elif celltype == xlrd.XL_CELL_DATE:
  16             ms_date_number = self.sheet.cell_value(row,col)
  17             year, month, day, hour, minute, second = 
  18                   xlrd.xldate_as_tuple(ms_date_number, self.workbook.datemode)
  19             py_date = datetime.datetime(year, month, day, hour, minute)
  20             retval = py_date
  21          
  22          elif celltype == xlrd.XL_CELL_TEXT:
  23             retval = self.sheet.cell_value(row,col).encode(self.encoding)
  24          
  25          elif celltype == xlrd.XL_CELL_ERROR:            
  26             retval = xlrd.error_text_from_code.get(self.sheet.cell_value(row,col))
  27 
  28          elif celltype == xlrd.XL_CELL_BOOLEAN:
  29             retval = True if self.sheet.cell_value(row,col) else False
  30 
  31       except:
  32          retval = self.nvl
  33 
  34       return retval

Durchlaufen aller vorhandener Zeilen

nrows Liefert die Anzahl der Zeilen der UsesRegion.

   1 for row in range(sheet.nrows):
   2    print sheet.cell_value(row,0)

Durchlaufen aller vorhandener Spalten

Achtung:

es werd nicht die Anzahl der Spalten in der Aktellen Zelle sondern die Anzahl der Spalten der UsesRegion angezeigt.

   1 for col in range(sheet.ncols):
   2    print sheet.cell_value(1,col)

Zusammenspiel der Methoden

   1    def datarow(self,row):
   2       retval = []
   3       for col in range(0,self.sheet.ncols):
   4          retval.append(self.getValue(row,col))
   5       return retval
   6 
   7    def allRows(self,firstline=None, lastline=None):
   8       firstline = 0                if firstline is None else firstline
   9       lastline  = self.sheet.nrows if lastline is None else lastline
  10       
  11       for row in range(firstline,lastline):
  12          yield xls.datarow(row)      
  13 
  14 ...
  15 
  16 for row in xls.allRows():
  17    print row[0],row[1]

Gewinnen aller Spalten in einer Liste einer bestimmten Zeile

   1 therow = self.sheet.row(row)

Beispiele xlwt

Öffnen einer Arbeitsmappe

   1 self.workbook = Workbook(encoding='windows-1252')

Anlegen eines Arbeitsblattes

   1 self.sheet = self.workbook.add_sheet(sheetname)

Beschreiben einer Zelle

   1 curSheet.write(row,col,value)

Das Modul versucht so gut es geht den "Pyhton Datentyp" in die Excel Enstrpechnung umzuwandeln.

z.B True wird zu WAHR

Schließen und speichern der Arbeitsmappe

   1 self.workbook.save(self.xlsfile)

File kann ein Dateiname oder ein Stream sein.

PyUGAT: Talks/RumspielenMitExcel (last edited 2013-02-24 22:12:09 by hop)