Найти - Пользователи
Полная версия: Диалоги открытия и сохранения файла.
Начало » Pyramid / Pylons / TurboGears » Диалоги открытия и сохранения файла.
1 2
hildi
И снова здравствуйте! Я не дам зачахнуть этому форуму :-)

Ситуация простая: есть функция апдейта базы из эксель-файла, и есть функция экспорта из базы в эксель файл, которые используют 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
где fname - это инстанс файла, который передается функции.
Вот если бы этот виджет только путь к файлу передавал… Но он не хочет никак.

А насчет “save as” у меня вообще никаких идей, кроме tk или wx, которые в моем случае бесполезны…

Спасите-помогите, пожалста :-) Куда идти читать про это?

(ушла курить ява-скрипт с горя)
PooH
hildi
Вот если бы этот виджет только путь к файлу передавал… Но он не хочет никак.
Ну сохраните во временный файл, подсуньте ему, а потом времянку удалите
hildi
А насчет “save as” у меня вообще никаких идей, кроме tk или wx, которые в моем случае бесполезны…
А про это вообще не беспокойтесь, это дело броузера, только правильный content-type в response поставте и все
pythonwin
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)
hildi
Спасибо большое!

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
в этот filename надо что-то подставлять?
ничего не понимаю :-(
pythonwin
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)
pythonwin
но serveFile я бы рекомендовал использовать если отчет большой, а возможности ПК не большие или например данные в отчете меняются не часто. но отчет запрашивают множество пользователей. то тогда можно в начале метода проверять не устарел ли отчет и если не устарел. то просто отдавать пользователю файл. а если данные изменились. то тогда нужно будет пересоздать файл
hildi
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")
То есть, генерируется файл и тупо сохраняется в заданную директорию. А мне надо, чтобы перед сохранением спросилось, куда сохраняться.
hildi
pythonwin
но serveFile я бы рекомендовал использовать если отчет большой, а возможности ПК не большие или например данные в отчете меняются не часто. но отчет запрашивают множество пользователей. то тогда можно в начале метода проверять не устарел ли отчет и если не устарел. то просто отдавать пользователю файл. а если данные изменились. то тогда нужно будет пересоздать файл
Все наоборот, к сожалению. Отчет сравнительно небольшой, а запрашивать его будут часто.
pythonwin
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
попробуй так
hildi
Ага… Такое решение мне в голову не пришло. Остроумно :-). Спасибо огромное!

Уникальное имя не то, что бы нужно, но нужно, чтобы оно содержало дату и время экспорта. Я секунды только для себя приписала, а то тыцаю ведь во время написания кода по 30 раз в минуту, так чтобы оно сильно не возмущалось.

Я решила это сохранением файла на сервере и генерирования к нему ссылки для скачивания. Как обычно, правой ногой левое ухо :-)
Так гораздо красивее, конечно! Еще раз спасибо!

*ушла пробовать*
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB