Форумы сайта 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где fname - это инстанс файла, который передается функции.
Вот если бы этот виджет только путь к файлу передавал... Но он не хочет никак.
А насчет "save as" у меня вообще никаких идей, кроме tk или wx, которые в моем случае бесполезны...
Спасите-помогите, пожалста :-) Куда идти читать про это?
(ушла курить ява-скрипт с горя)
Неактивен
hildi написал:
Вот если бы этот виджет только путь к файлу передавал... Но он не хочет никак.
Ну сохраните во временный файл, подсуньте ему, а потом времянку удалите
hildi написал:
А насчет "save as" у меня вообще никаких идей, кроме tk или wx, которые в моем случае бесполезны...
А про это вообще не беспокойтесь, это дело броузера, только правильный content-type в response поставте и все
Неактивен
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в этот filename надо что-то подставлять?
ничего не понимаю :-(
Отредактированно hildi (2009-03-16 16: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 раз в минуту, так чтобы оно сильно не возмущалось.
Я решила это сохранением файла на сервере и генерирования к нему ссылки для скачивания. Как обычно, правой ногой левое ухо :-)
Так гораздо красивее, конечно! Еще раз спасибо!
*ушла пробовать*
Неактивен
hildi написал:
Спасибо огромное!
пожалуйста ![]()
Неактивен
Не работает... Почему-то не пишутся данные в файл и выскакивает ошибка "неизвестный формат файла".
Сам файл содержит только одно слово: "ÐÏࡱ".
Эх. Пес с ним, в общем.
Спасибо в любом случае :-)
Неактивен
попробуй
data = open(filename, 'rb').read()и попробуй закоментировать os.remove и открыть файл сохраненный временный файл.
Неактивен