Форум сайта python.su
И снова здравствуйте :-)
У меня два разнообразных вопроса теперь:
1. Т. к. ТГ при каждом рестарте плодит по коннекшну, не убивая предыдущие, я попыталась это дело победить как-то так:
from sqlalchemy import *
engine = create_engine("postgres://stat_admin:password@172.0.0.0:5433/gf_cfv?pool=2&pool_recycle=300")
from sqlalchemy import *
engine = create_engine("postgres://stat_admin:password@172.0.0.0:5433/gf_cfv", connect_args=dict(pool=2, pool_recycle=300))
from win32com.client import Dispatch
import datetime
@expose
def graph2xl(self):
sheetName = 'H:\\team-ne\\team_ne\\templates\\report.xls'
xlApp = Dispatch("Excel.Application")
reportBook = xlApp.Workbooks.Open(sheetName)
#xlApp.Visible = 1
row = 6
try:
for k in finance_report: #<--- глобальная переменная со словарем с данными, определяется в другой функции.
reportBook.ActiveSheet.Cells(row, 1).Value = k.anbieter
reportBook.ActiveSheet.Cells(row, 10).Value = year_from #<--- глобальная переменная, определяется в другой функции.
reportBook.ActiveSheet.Cells(row, 22).Value = year_from+1
row += 6
finally:
reportBook.SaveAs("H:\\team-ne\\team_ne\\berichte\\"+time.strftime('%d-%m-%y_%H-%M-%S')+".xls")
xlApp.Quit()
return str("hallo welt")#<---- не совсем понятно, что тут вообще писать в этом случае, и надо ли оно ваще тут?
Офлайн
по первому вопросу завтра посмотрю, сходу сказать не могу. по поводу экспорта в excel, дайте начало трайсбека, не понятно на какую строчку он ругается, а еще лучше не используйте COM, а используйте библиотеку pyExcelerator, работать будет куда быстрее и избежите кучи непонятных проблем, вот вам маленький пример:
@expose()
def awalance_report(self, kind=0, code=0, dateChange=None):
#здесь формируется выборка, я выкинул как неинтересное
import pyExcelerator as ex
import cStringIO as StringIO
w = ex.Workbook()
sheet = w.add_sheet(u'Льготники')
ex.UnicodeUtils.DEFAULT_ENCODING = 'cp1251' #кодировка документа, вам наверно не понадобится
for row, obj in enumerate(query):
sheet.write(row, 1, obj.subject.lastName)
sheet.write(row, 2, obj.subject.firstName)
sheet.write(row, 3, obj.subject.middleName or '')
sheet.write(row, 4, formatDate(obj.subject.birthDate))
sheet.write(row, 5, obj.subject.inn or '')
ofile = StringIO.StringIO()
w.save(ofile)
result = ofile.getvalue()
ofile.close()
#устанавливаем правильный MIME-тип
cherrypy.response.headers["Content-Type"] = "application/vnd.ms-excel"
cherrypy.response.headers['Content-Disposition'] = 'attachment; filename=result.xls'
return result
Отредактировано (Янв. 7, 2009 19:54:27)
Офлайн
PooHсогласно документации от w3c вариант “application/vnd.ms-excel” более правильный чем
cherrypy.response.headers = “application/vnd.ms-excel”
cherrypy.response.headers['Content-Type'] = "application/ms-excel"
Офлайн
Спасибо огромное!
Я на работу только завтра пойду, буду пробовать.
А почему СОМ лучше не использовать? У меня про него такой хороший учебник…
Офлайн
hildi1. Теряем кросплатформенность
А почему СОМ лучше не использовать? У меня про него такой хороший учебник…
Офлайн
По первому вопросу: а зачем вам понадобилось явно создавать engine? ТГ с ней сам прекрасно работает
в методах контроллера:
from turbogears.database import session
offers = session.query(model.Offer).filter(model.Offer.contact == manager)
from turbogears.database import metadata
visits_table = Table('visit', metadata,
Column('visit_key', String(40), primary_key=True),
Column('created', DateTime, nullable=False, default=datetime.now),
Column('expiry', DateTime)
)
from sqlalchemy.orm import object_session
class BuildingComplex(Building):
u"Комплекс зданий"
def _get_construction_count(self):
return object_session(self).query(Realty).filter(and_(realty_table.c.complex_id == self.id,
realty_table.c.type == 'construction')).count()
construction_count = property(_get_construction_count)
Офлайн
engine я создавала, чтобы включить ORM, у меня там существующие таблицы маппятся в классы. Это можно сделать и без engine?
я делала, как в учебнике написано :-)
Пусть пока лучше будет, так я хоть могу себе представить, как оно работает, а то вы такие ужасы пишете, а говорите, что просто :-)
Офлайн
hildiУгу, по-боцмански - безобразно, но однообразно ИЛИ человек - сам писец своего счастья :)
Пусть пока лучше будет, так я хоть могу себе представить, как оно работает, а то вы такие ужасы пишете, а говорите, что просто :-)
Офлайн
Код у меня на работе, я завтра запощу. Там довольно мало букв, но я их наизусть не помню :-)
Вообще, то, что эта штука у меня вообще работает, я склонна рассматривать как чудо, так что бог с ней, пусть пока будет боцманская и безобразная, работает ведь :-)
У меня пока оч. мало опыта, и довольно мало времени, но я быстро учусь. Очень неудобно, что у меня в окружении нет ни одного умного питонщика. Один только есть, но у него мой уровень, он мне уже помочь не может :-(
Спасибо большое!
Офлайн
hildiможет в данном случае чтобы не “застрять” на этой вроде решённой проблеме и можно оставить как есть, но в будущем советую прислушаться к совету PooH, т.к. с выше описанными пунктами отрицательного использования COM можете столкнуться и учитывая вероятную сложность проекта потратите много времени на переход с COM
Вообще, то, что эта штука у меня вообще работает, я склонна рассматривать как чудо, так что бог с ней, пусть пока будет боцманская и безобразная, работает ведь :-)
Офлайн