Форум сайта python.su
И снова здравствуйте! Я не дам зачахнуть этому форуму :-)
Ситуация простая: есть функция апдейта базы из эксель-файла, и есть функция экспорта из базы в эксель файл, которые используют xlrd и xlrt соответственно.
Но я что-то никак не могу сообразить, как при импорте и экспорте файла вызывать соответственно диалоги “open file” и “save file as”.
В ТГ есть соотв. виджет FileField, но он передает инстанс файла, а мне надо для xlrd только путь к нему, и этот инстанс xlrd не читает, выдает ошибку:
File "H:\team-ne\team_ne\controllers.py", line 988, in xlread
sh = fname.sheet_by_index(0)
File "c:\Python25\lib\cgi.py", line 548, in __getattr__
raise AttributeError, name
AttributeError: sheet_by_index
Офлайн
hildiНу сохраните во временный файл, подсуньте ему, а потом времянку удалите
Вот если бы этот виджет только путь к файлу передавал… Но он не хочет никак.
hildiА про это вообще не беспокойтесь, это дело броузера, только правильный content-type в response поставте и все
А насчет “save as” у меня вообще никаких идей, кроме tk или wx, которые в моем случае бесполезны…
Офлайн
from cherrypy.lib.cptools import serveFile
import os
full_filename = os.path.abspath(filename)
cherrypy.response.headers["Content-Type"] = "application/vnd.ms-excel"
cherrypy.response.headers['Content-Disposition'] = 'attachment; filename=%s'%filename
return serveFile(full_filename)
Офлайн
Спасибо большое!
PooH, а как сохранить путь к файлу, если я не могу его получить? Если бы я могла его получить, то я бы его и следующей функции передала…
А в последней строчке после последней запятой вообще не поняла ни слова :-( response - это где? Это надо где-то в head писать?
pythonwin, спасибо!
File "H:\team-ne\team_ne\controllers.py", line 1034, in xlopen
fname = os.path.abspath(filename)
NameError: global name 'filename' is not defined
Отредактировано (Март 16, 2009 15:33:42)
Офлайн
hildiда - это переменная
в этот filename надо что-то подставлять?
filename = 'report.xls'
#
.. здесь тебе нужно создать документ MSExcel и сохранить в например report.xls в папке temp/, которая находится у тебя в проекте
#
from cherrypy.lib.cptools import serveFile
import os
full_filename = os.path.join(os.path.abspath(temp/), filename)
cherrypy.response.headers["Content-Type"] = "application/vnd.ms-excel"
cherrypy.response.headers['Content-Disposition'] = 'attachment; filename=%s'%filename
return serveFile(full_filename)
Офлайн
но serveFile я бы рекомендовал использовать если отчет большой, а возможности ПК не большие или например данные в отчете меняются не часто. но отчет запрашивают множество пользователей. то тогда можно в начале метода проверять не устарел ли отчет и если не устарел. то просто отдавать пользователю файл. а если данные изменились. то тогда нужно будет пересоздать файл
Офлайн
pythonwin, огромное спасибо!
дело в том, что мне это решение не подходит :-(
Мой код выглядит примерно так:
import pyExcelerator as ex
import cherrypy
@expose()
def graph2xl(self, *args):
w = ex.Workbook()
sheet = w.add_sheet(u'Rechnungsbericht')
ex.UnicodeUtils.DEFAULT_ENCODING = 'utf-8'
row = 6
year_to = int(year_from)+1
for k in finance_report:
sheet.write(row, 1, k.anbieter)
sheet.write(row, 10, str(year_from))
sheet.write(row, 22, str(year_to))
row +=6
ofile = "H:\\test\\report"+time.strftime('%d-%m-%y_%H-%M-%S')+".xls"
w.save(ofile)
redirect("/report?year_from=2008&tg_flash=report exported successfully")
Офлайн
pythonwinВсе наоборот, к сожалению. Отчет сравнительно небольшой, а запрашивать его будут часто.
но serveFile я бы рекомендовал использовать если отчет большой, а возможности ПК не большие или например данные в отчете меняются не часто. но отчет запрашивают множество пользователей. то тогда можно в начале метода проверять не устарел ли отчет и если не устарел. то просто отдавать пользователю файл. а если данные изменились. то тогда нужно будет пересоздать файл
Офлайн
hildiа зачем? какая цель? нужно уникальное имя файла?
То есть, генерируется файл и тупо сохраняется в заданную директорию. А мне надо, чтобы перед сохранением спросилось, куда сохраняться.
hildi
Все наоборот, к сожалению. Отчет сравнительно небольшой, а запрашивать его будут часто.
import pyExcelerator as ex
import cherrypy
@expose()
def graph2xl(self, *args):
w = ex.Workbook()
sheet = w.add_sheet(u'Rechnungsbericht')
ex.UnicodeUtils.DEFAULT_ENCODING = 'utf-8'
row = 6
year_to = int(year_from)+1
for k in finance_report:
sheet.write(row, 1, k.anbieter)
sheet.write(row, 10, str(year_from))
sheet.write(row, 22, str(year_to))
row +=6
filename = "report%s.xls"%time.strftime('%d-%m-%y_%H-%M-%S')
w.save(filename )
#redirect("/report?year_from=2008&tg_flash=report exported successfully")
data = open(filename, 'r').read()
os.remove(filename)
cherrypy.response.headers["Content-Type"] = "application/vnd.ms-excel"
cherrypy.response.headers['Content-Disposition'] = 'attachment; filename=%s'%filename
return data
Офлайн
Ага… Такое решение мне в голову не пришло. Остроумно :-). Спасибо огромное!
Уникальное имя не то, что бы нужно, но нужно, чтобы оно содержало дату и время экспорта. Я секунды только для себя приписала, а то тыцаю ведь во время написания кода по 30 раз в минуту, так чтобы оно сильно не возмущалось.
Я решила это сохранением файла на сервере и генерирования к нему ссылки для скачивания. Как обычно, правой ногой левое ухо :-)
Так гораздо красивее, конечно! Еще раз спасибо!
*ушла пробовать*
Офлайн