Attachment 'xls.py'

Download

   1 # -*- coding: ISO-8859-1 -*-
   2 import sys
   3 sys.path.extend(['./site-packages'])
   4 import datetime
   5 import xlrd
   6 from xlwt import *
   7 
   8 import tempfile
   9 
  10 class XlsReader:
  11    """
  12    Lesen von XLS Dateien.
  13 
  14    HINT:
  15       verwendet xlrd Moudle
  16       http://www.python-excel.org/
  17    """
  18 
  19    workbook    = None
  20    sheet       = None
  21    nvl         = None
  22    emptyval    = None
  23    encoding    = 'utf8'
  24 
  25    def __init__ (self,nvl=None,emptyval=None):
  26       self.nvl          = nvl
  27       self.emptyval     = emptyval
  28 
  29    def openWorkbook (self,filename,sheetid=0,encoding_override='utf8'):
  30       """
  31       Oeffnen eines Arbeitsblattes
  32 
  33       @param   filename          Dateiname und Pfad auf ein existierendes Excel
  34       @param   sheetid           Kennzeichen des Arbeitsblattes
  35          Vorgabewert 0 (1. Arbeitsblatt)
  36          Als Integer   
  37             es wird das Arbeitsblatt mit der
  38             uebergebenen Nummer genommen
  39          Als Zeichenkette 
  40             das Arbeitsblatt mit dem Uebergenen
  41             Namen wird ausgewaehlt.
  42 
  43      HINT:
  44         Kann kein Arbeitsblatt gefunden werden
  45         wird eine Ausnahme geworten
  46       """
  47       try:
  48          self.workbook = xlrd.open_workbook(filename,encoding_override)
  49       except IOError as e:
  50           raise Exception("I/O error({0}): {1}".format(e.errno, e.strerror))
  51       
  52       self.encoding = encoding_override
  53 
  54       if isinstance(sheetid,str):         
  55          self.sheet = self.workbook.sheet_by_name(sheetid)
  56       elif isinstance(sheetid,int):
  57          self.sheet = self.workbook.sheet_by_index(sheetid)
  58       else:
  59          raise ValueError("Der Parameter sheetid muss Integer oder String sein.")
  60 
  61    def getWorkbook(self):
  62       """
  63       Liefert workbook objekt
  64 
  65       @return  workbook
  66       """
  67       return self.workbook
  68 
  69    def getRows(self):
  70       """
  71       Liefert die Anzahl der Zeilen in aktuellem Sheet
  72 
  73       @return  cnt
  74       """
  75       return self.sheet.nrows
  76 
  77    
  78    def getValue (self,row=0,col=0):
  79       """
  80       Liefert den Inhalt einer Zelle oder ein Kennzeichen wenn nicht gefunden.
  81 
  82       @param   row         Zeile (Null-Relativ)
  83       @param   col         Spalte (Null-Relativ)
  84 
  85       @return  Inhalt
  86 
  87       """
  88       retval = None
  89       try:
  90          celltype = self.sheet.cell_type(row,col)
  91          if celltype == xlrd.XL_CELL_EMPTY:
  92             retval = self.emptyval
  93          
  94          elif celltype == xlrd.XL_CELL_BLANK:
  95             retval = self.sheet.cell_value(row,col)
  96 
  97          elif celltype == xlrd.XL_CELL_NUMBER:
  98             retval = self.sheet.cell_value(row,col)
  99 
 100          elif celltype == xlrd.XL_CELL_DATE:
 101             ms_date_number = self.sheet.cell_value(row,col)
 102             year, month, day, hour, minute, second = xlrd.xldate_as_tuple(ms_date_number, self.workbook.datemode)
 103             py_date = datetime.datetime(year, month, day, hour, minute)
 104             retval = py_date
 105          
 106          elif celltype == xlrd.XL_CELL_TEXT:
 107             retval = self.sheet.cell_value(row,col).encode(self.encoding)
 108          
 109          elif celltype == xlrd.XL_CELL_ERROR:            
 110             retval = xlrd.error_text_from_code.get(self.sheet.cell_value(row,col))
 111 
 112          elif celltype == xlrd.XL_CELL_BOOLEAN:
 113             retval = True if self.sheet.cell_value(row,col) else False
 114 
 115       except:
 116          retval = self.nvl
 117 
 118       return retval
 119 
 120 
 121    def datarow(self,row):
 122       """
 123       Liefert eine Liste von allen Zellen der Datenzeile (row)
 124       Dabei werden die Inhalte durch getValue erzeugt.
 125 
 126       @row        Datenzeile (Null-Relativ)
 127 
 128       @return     Liste (None wenn keine Vorhanden)
 129 
 130       """
 131       retval = []
 132       therow = self.sheet.row(row)
 133 
 134       for col in range(0,self.sheet.ncols):
 135          retval.append(self.getValue(row,col))
 136       return retval
 137    
 138    def allRows(self,firstline=None, lastline=None):
 139       """
 140       Itteriert ueber alle Zeilen eines Arbeitsblattes (solange nicht
 141       anders angegegen und liefert fuer jede Zeile eine Liste mit Werten,
 142       welche durch getValue erzeugt wurde.
 143 
 144       @param   firstline         Beginn mit Datenzeile oder mit 0
 145       @param   lastline          Ende mit Datenzeile oder alle
 146 
 147       """
 148 
 149       firstline = 0                if firstline is None else firstline
 150       lastline  = self.sheet.nrows if lastline is None else lastline
 151       
 152       for row in range(firstline,lastline):
 153          yield xls.datarow(row)      
 154    
 155    def closeWorkbook(self):
 156       """
 157       Schlieszen Arbeitsblatt und Arbeitsbuch
 158       """
 159       del self.sheet
 160       del self.workbook
 161 
 162    
 163 
 164 class XlsWriter:
 165    """
 166    Lesen von XLS Dateien.
 167 
 168    HINT:
 169       verwendet xlrd Moudle
 170       http://www.python-excel.org/
 171    """
 172    workbook    = None
 173    sheet       = None
 174    xlsfile     = None
 175 
 176    sheets      = []
 177 
 178 
 179    def addSheet(self,sheetname):
 180       """
 181       Fuegt der Arbeitsmappe ein Arbeitsblatt hinzu
 182 
 183       @param      sheetname         Name des Arbeitsblattes
 184 
 185       HINT:
 186          das aktelle Arbeitsblatt wird gesetzt
 187 
 188       """
 189       assert self.workbook is not None,"Noch keine Arbeitsmappe angelegt"
 190       self.sheet = self.workbook.add_sheet(sheetname)
 191       self.sheets.append(sheetname)
 192          
 193 
 194    def openWorkbook(self,sheetname=None,encoding=None):
 195       """
 196       Anlegen einer Arbeitsmappe
 197 
 198       @param   shettname         Anlegen eines Arbeitsblattes                                 wenn Name uebergeben.
 199       @param   encoding          Encoding, Vorgabewert 'windows-1252'
 200 
 201       HINT:
 202          das aktelle Arbeitsblatt wird gesetzt
 203       
 204       """
 205 
 206       encoding = 'windows-1252' if encoding is None else encoding
 207       self.workbook = Workbook(encoding=encoding)
 208       if sheetname is not None:
 209          self.addSheet(sheetname)
 210 
 211    def currentSheet(self,sheetid):
 212       """
 213       Setzen des aktellen Arbeitsblattes auf den uebergebenen Namen
 214 
 215       @param   sheetid     Kann String oder Integer sein
 216       """
 217       if isinstance(sheetid,str):         
 218          sheetid = self.sheets.index(sheetid)
 219          self.sheet = self.workbook.get_sheet(sheetid)
 220       elif isinstance(sheetid,int):
 221          self.sheet = self.workbook.get_sheet(sheetid)
 222       else:
 223          raise ValueError("Der Parameter sheetid muss Integer oder String sein.")
 224 
 225    
 226    def setCell(self,row,col,value,sheetid=None):
 227       """
 228       Schreibt den Inhalt von Value auf das aktuelle Arbeitsblatt.
 229       Dabei wird die Position row, col verwendet.
 230 
 231       @param row        Zeile
 232       @param col        Spalte
 233       @param value      Inhalt
 234       @param sheetname  Optional,
 235                         es wird auf das uebergebene Arbeitsblatt geschrieben
 236                         dabei wird der Wert des aktellen Arbeitsblattes nicht 
 237                         veraendert.
 238       """
 239 
 240       curSheet = None
 241 
 242       if sheetid is None:
 243          curSheet = self.sheet
 244       elif isinstance(sheetid,str):         
 245          sheetid = self.sheets.index(sheetid)
 246          curSheet = self.workbook.get_sheet(sheetid)
 247       elif isinstance(sheetid,int):
 248          curSheet = self.workbook.get_sheet(sheetid)         
 249       else:
 250          raise ValueError("Der Parameter sheetid muss Integer oder String sein.")      
 251          
 252       curSheet.write(row,col,value)
 253    
 254 
 255    def write(self,xlsfile=None):
 256       """
 257       Schreiben des XLS Files
 258 
 259       @param   xlsfile  Output Datei
 260          
 261       HINT:
 262          Gueltige Parametertypen
 263             + None         Es wird ein temporaeres File angelegt
 264             + String       es wird eine Datei mit uebergebenen Namen
 265                            eingerichtet
 266             + fileobjekt   Es wird das uebergebene Filehandle verwendet
 267                            
 268       """
 269 
 270       if isinstance(xlsfile,str):
 271          self.xlsfile = open(xlsfile,'wb')
 272       elif isinstance(xlsfile,file):
 273          self.xlsfile = xlsfile
 274       elif xlsfile is None:
 275          self.xlsfile = tempfile.TemporaryFile(delete=False)
 276       else:
 277          raise Exception('Parameter muss den Type None, String oder Filehandle haben.')
 278          
 279       try:
 280          self.workbook.save(self.xlsfile)
 281       except Exception,e:
 282          raise Exception(e)
 283 
 284       
 285 if __name__ == '__main__':
 286    
 287    xls = XlsReader()
 288    xls.openWorkbook('myfile.xlsx','Data')
 289 
 290    for row in range(xls.sheet.nrows):
 291       print row
 292 
 293 
 294    for row in xls.allRows():
 295       print row[0],row[1]
 296    xls.closeWorkbook()
 297 
 298    xls = XlsWriter()
 299    xls.openWorkbook()
 300    xls.addSheet('Tabelle1')
 301    xls.addSheet('Tabelle2')
 302    
 303    xls.setCell(1,1,'EinTest tabelle 2')
 304    xls.setCell(1,1,'EinTest tabelle 1','Tabelle1')
 305    xls.setCell(2,1,'EinTest tabelle 2,zeile2')
 306    xls.currentSheet('Tabelle1')
 307    for row  in range(128):   
 308       xls.setCell(row,0,"Row: {0}".format(row))
 309    
 310    f = open ('test.xls','wb')
 311    xls.write(f)
 312    print xls.xlsfile.name

Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.

You are not allowed to attach a file to this page.