import mysql.connector import datetime import xlwt class MySheet: dateStyle = xlwt.XFStyle() dateStyle.num_format_str = 'DD.MM.YYYY hh:mm:ss' numStyle = xlwt.XFStyle() numStyle.num_format_str = '#,##0' def __init__(self, sheet): self.sheet = sheet self.rowCnt = 0 self.colCnt = 0 self.widthFactor = 268 def write(self, txt, style=None): if isinstance(txt, datetime.datetime): self.sheet.row(self.rowCnt).write(self.colCnt, txt, MySheet.dateStyle) elif style is not None: self.sheet.row(self.rowCnt).write(self.colCnt, txt, style) else: self.sheet.row(self.rowCnt).write(self.colCnt, txt) l = len(unicode(txt)) * self.widthFactor if l > self.sheet.col(self.colCnt).width: self.sheet.col(self.colCnt).width = l def writeFirstFirst(self, txt, style=None): self.rowCnt = 0 self.colCnt = 0 self.write(txt, style) def writeNextFirst(self, txt, style=None): self.rowCnt += 1 self.colCnt = 0 self.write(txt, style) def writeSameNext(self, txt, style=None): self.colCnt += 1 self.write(txt, style) dbh = None cur = None xls = None sheet = None try: dbh = mysql.connector.connect(user='statsuser', password='test123', host='192.168.3.22', database='statsdb') cur = dbh.cursor() query = """ SELECT d.description, d.address, di.description, cd.ts, cd.value, cd.id FROM device_t d, dataitem_t di, devicedataitem_t ddi, collecteddata_t cd WHERE ddi.device = d.id AND ddi.dataitem = di.id AND cd.devicedataitem = ddi.id AND cd.ts BETWEEN %s AND %s ORDER BY cd.id """ cur.execute(query, (datetime.datetime(1970, 1, 1), datetime.datetime(2100, 12, 31))) devices = {} sheets = {} for (deviceName, deviceAddress, dataItem, timestamp, value, id) in cur: value = int(value) key = deviceAddress + ' ' + dataItem if not devices.has_key(key): devices[key] = {'name': deviceName, 'address': deviceAddress, 'dataItem': dataItem, 'first': {'timestamp': timestamp, 'value': value}, 'last': {'timestamp': timestamp, 'value': value}} else: devices[key]['last'] = {'timestamp': timestamp, 'value': value} if not sheets.has_key(dataItem): sheets[dataItem] = dataItem secondsPerMonth = datetime.timedelta(30).total_seconds() secondsPerWeek = datetime.timedelta(7).total_seconds() xls = xlwt.Workbook() for sheetName in sheets.keys(): mySheet = MySheet(xls.add_sheet(sheetName)) sheets[sheetName] = mySheet mySheet.writeFirstFirst('Name') mySheet.writeSameNext('Address') # mySheet.writeSameNext('DataItem') mySheet.writeSameNext('First Sample Date') mySheet.writeSameNext('First Sample Value') mySheet.writeSameNext('Last Sample Date') mySheet.writeSameNext('Last Sample Value') mySheet.writeSameNext('Length of SampleBox') mySheet.writeSameNext('Diff in SampleBox') mySheet.writeSameNext('MonthFactor') mySheet.writeSameNext('WeekFactor') mySheet.writeSameNext('Month Average/Forecast') mySheet.writeSameNext('Week Average/Forecast') for device in devices.values(): mySheet = sheets[device['dataItem']] print("Device: %s, %s, %s" % (device['name'], device['address'], device['dataItem'])) mySheet.writeNextFirst(device['name']) mySheet.writeSameNext(device['address']) # mySheet.writeSameNext(device['dataItem']) print(" First: %s, %s" % (device['first']['timestamp'], device['first']['value'])) mySheet.writeSameNext(device['first']['timestamp']) mySheet.writeSameNext(device['first']['value'], style=MySheet.numStyle) print(" Last: %s, %s" % (device['last']['timestamp'], device['last']['value'])) mySheet.writeSameNext(device['last']['timestamp']) mySheet.writeSameNext(device['last']['value'], style=MySheet.numStyle) deltaTime = device['last']['timestamp'] - device['first']['timestamp'] deltaValue = device['last']['value'] - device['first']['value'] print(" Diff: %s, %s" % (deltaTime, deltaValue)) mySheet.writeSameNext(str(deltaTime)) mySheet.writeSameNext(deltaValue, style=MySheet.numStyle) factorMonth = secondsPerMonth / deltaTime.total_seconds() mySheet.writeSameNext(factorMonth) factorWeek = secondsPerWeek / deltaTime.total_seconds() mySheet.writeSameNext(factorWeek) print(" Month average/forecast: %s" % (int(deltaValue * factorMonth))) mySheet.writeSameNext(int(deltaValue * factorMonth), style=MySheet.numStyle) print(" Week average/forecast: %s" % (int(deltaValue * factorWeek))) mySheet.writeSameNext(int(deltaValue * factorWeek), style=MySheet.numStyle) except mysql.connector.Error as err: print("Failure when using database: %s" % (err)) except Exception as err: print("Failure: %s" % (err)) finally: if xls is not None: xls.save('deviceStats.xls') if cur is not None: cur.close() if dbh is not None: dbh.close()