Уведомления

Группа в Telegram: @pythonsu

#1 Март 16, 2009 12:02:09

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Диалоги открытия и сохранения файла.

И снова здравствуйте! Я не дам зачахнуть этому форуму :-)

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

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

(ушла курить ява-скрипт с горя)



Офлайн

#2 Март 16, 2009 13:02:28

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Диалоги открытия и сохранения файла.

hildi
Вот если бы этот виджет только путь к файлу передавал… Но он не хочет никак.
Ну сохраните во временный файл, подсуньте ему, а потом времянку удалите
hildi
А насчет “save as” у меня вообще никаких идей, кроме tk или wx, которые в моем случае бесполезны…
А про это вообще не беспокойтесь, это дело броузера, только правильный content-type в response поставте и все



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Март 16, 2009 13:30:59

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Диалоги открытия и сохранения файла.

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)



Офлайн

#4 Март 16, 2009 15:27:14

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Диалоги открытия и сохранения файла.

Спасибо большое!

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 надо что-то подставлять?
ничего не понимаю :-(



Отредактировано (Март 16, 2009 15:33:42)

Офлайн

#5 Март 16, 2009 15:41:19

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Диалоги открытия и сохранения файла.

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)



Офлайн

#6 Март 16, 2009 15:44:16

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Диалоги открытия и сохранения файла.

но serveFile я бы рекомендовал использовать если отчет большой, а возможности ПК не большие или например данные в отчете меняются не часто. но отчет запрашивают множество пользователей. то тогда можно в начале метода проверять не устарел ли отчет и если не устарел. то просто отдавать пользователю файл. а если данные изменились. то тогда нужно будет пересоздать файл



Офлайн

#7 Март 16, 2009 16:09:31

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Диалоги открытия и сохранения файла.

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")
То есть, генерируется файл и тупо сохраняется в заданную директорию. А мне надо, чтобы перед сохранением спросилось, куда сохраняться.



Офлайн

#8 Март 16, 2009 16:12:40

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Диалоги открытия и сохранения файла.

pythonwin
но serveFile я бы рекомендовал использовать если отчет большой, а возможности ПК не большие или например данные в отчете меняются не часто. но отчет запрашивают множество пользователей. то тогда можно в начале метода проверять не устарел ли отчет и если не устарел. то просто отдавать пользователю файл. а если данные изменились. то тогда нужно будет пересоздать файл
Все наоборот, к сожалению. Отчет сравнительно небольшой, а запрашивать его будут часто.



Офлайн

#9 Март 16, 2009 21:01:53

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Диалоги открытия и сохранения файла.

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
попробуй так



Офлайн

#10 Март 17, 2009 11:00:06

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Диалоги открытия и сохранения файла.

Ага… Такое решение мне в голову не пришло. Остроумно :-). Спасибо огромное!

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

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

*ушла пробовать*



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version