тест
Давеча переехал на flickr - теперь заливаю фотки только туда, ибо используемый из-за лени Вконтакте просто умер для меня в качестве галереи после того, как сравнил качество фото в нем и Flickr’e. Не знаю чего уж там делает Вконтакте в связке с php+gd+imagemagick, но фотки просто ужасно портятся.
Конечно хотелось бы немножко выпердриться, да создать свою галерею, но фотки пока недотягивают по уровню на хорошее портфолио в стиле персональной странички с работами как у известных фотографов. Да и времени нет. Хочется очень многого.
И так, мы хотим, чтобы пользовал клацнув на кнопочку “Экспорт в Excel” получил это документ и был доволен. Что может проще скажете вы - взять положить файл в каталог и тупо его HTTP сервером отдавать. Но не все так просто в случае если вам необходимо, чтобы этот файл генерировался динамически (из-за меняющихся в нем данных), например django, на котором крутиться сайт.
Насколько мне удалось узнать, в мире существует один адеватный генератор Excel файлов - xlwt, который можно юзать на Unix системах. Это клон pyExcelator’a, но лучше подходит для django и сохранения не в файл. С документацией у него беда, но парочку линков все же нашел: обзор и пример.
Кроме того, примеры есть и в тарболе с pyexcelator’ом или в самом xlwt.
И так создаем во views.py приложения django функцию, которая будет возрвращать xls файл:
Но это еще не все. Далее нам нужно этот документ каким-то образом передать пользователю. Отсюда вытекают 2 проблемы или вопроса:
Начну пожалуй со второй проблемы, ибо она решается довольно просто. Если залезть в RFC 2183, то можно узнать про интересное поле в HTTP заголовке - Content-Disposition, которое то и позволит присвоить имя файлу через присвоение ему типа attachment с параметром filename. Для Django это будет выглядеть так:
И так, для решения первой проблемы (в случае если используется pyExcelator) я порылся в коде pyExcelator’a и выкопал следующее. Оказывается метод save() класса Workbook делает следующее:
CompoundDoc.XlsDoc() собственно и представляет собой обертку над бинарными данными, который сгенерировал Workbook (их получаем с помощью self.get_biff_data()). Как раз после save() класса CompoundDoc.XlsDoc() и получаем конечный Excel документ. Но смотрим далее в метод save() этого XlsDoc‘a:
Как видно, опять, тут идет работа с файлов. Слава богу это конечный пункт сохранения файла, поэтому смело овверайдим эти два класса для работы с Django:
Вставляем этот код в views.py нашего приложения и в коде нашей функции export_xls() после создания и генерации данных пишем:
Здесь wb - это WoorBook из первого листинга (но это не тот Workbook, что из pyExcelator’a, а наш, который мы переопределили).
Вот собственно и все. Небольшая компиляция собранных с краев интернета кусочков. Может и есть какой-то более прямой способ.
UPD В случае использования xlwt все проще. Юзаем:
Ask-art.net

И foot ashtray:

via http://designyoutrust.com
Чтобы сплитнуть репозитарий или, например, вытащить какую-нибудь поддиректорию в корень нового репозитария в делаем:
В этой же директории где лежит и старый репозитарий old_repo, который требуется разделить.
Т.е. игнорируем все файлы из old_repo, переименовываем subdir в “.”, чтобы эта директория стала корнем new_repo и включаем ее в копирование
Собственна все, далее можно из old_repo удалять subdir:
Импульсивно взял и купил себе canon 450d. Теперь творчеству нет предела
Мануал уже весь прочитал, теперь думаю… насколько мне китового объектива хватит…

Два дня минус почти просто так. Были потрачены они на поиск баги в моем питоньем скрипте, который р аботает с MySQL. Работа эта заключается в получении данных и распихивании их по словарикам (питоний). Так вот, было замечено, что для двух одинаковых значений ключа создается 2 записи в словаре (какого ху…дожника?!). При более внимательном рассмотрении было выяснено, что эти два якобы одинаковых ключа на самом деле разные, а разные они в регистре одной буквы. При запросе из MySQL возвращалось 2 значения вместо одного - отсюда возникали глюки. А все потому, что MySQL по-дефолту при сравнении строк не учитывает регистр, если не указаны collations для поля/таблицы в *_bin или *_cs. Век живи - век учись. Это конечно должно было известно быть - оно мне и было известно, но я об этом успешно давно забыл, ибо уже не помню когда последний раз с этим сталкивался. Взято отсюда
Похакал немного текущую тему для блога. Прикрутил к ней сайдбар с виджетами и подогнал к общей стилистике. Вроде ничотак, а вы как думаете? Но немного жаль потраченного часа - слишком уж много заморочек с CSS. Благо Inspector в Safari сильно помогает в разборе.