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.