Django таблицы как в excel

Обновлено: 08.07.2024

I want to export the information display in the template under table tag to excel. I already tried to implement code but it is now exporting the information.

This is my template:

Above is my updated assisted by Marcell. Ive managed to export the required data. My question is: am I allowed to use if-else statement in my views.py? What i am trying to do is, to convert the mark to percentage. If students have 200 marks, then it will display 100%, if 100 marks then 90% or so.

Currently, when i cleck the link: export-data, it just refreshed the page and no excel file is downloaded. So i m not sure what is the problem with it as it doesnt prompt any error. Just not downloading the content of the table into excel sheet @brunodesthuilliers

3 Answers 3

You can use django-tables2. Install it and add it to INSTALLED_APPS . You'll also need to install tablib for the export feature. Create a tables.py file under your app folder:

Then use the SingleTableView class with ExportMixin in your views.py :

Finally your student_list.html template should look like this:

There's a lot more you can do with django-tables2 , this is just a basic implementation. You can also combine it with django-filter.


First of all the report_line dictionary is referencing a student variable that does not exists in the scope of the method. Based on your question here I presume you want to export the data displayed in your template.

Also I would recommend updating current question with the complete code set.

In order to achieve that you can do something like this:

Your url will look something like this:

In your template:

This is for exporting data to csv file. Looking at your file name extension it seems this is the behaviour you are looking for. If you want to export to excel file I would recommend looking at a third party library like xlwt

у меня есть рабочая таблица, сгенерированная django-tables2:

приведенный выше код возвращает таблицу с сотнями объектов, которые аккуратно разбиты на страницы с 10 элементами на странице. Когда я нажимаю "далее" в нижней части таблицы, разбиение на страницы работает хорошо, и я могу перемещаться по разным страницам. Однако, я заметил следующее поведение:

  • нажать на кнопку my_filter который отображает подмножество исходной нефильтрованной таблицы
  • нажмите "Next" на нижняя часть отфильтрованной таблицы приведет к отображению 2-й страницы нефильтрованной таблицы
  • нажать на кнопку my_filter снова отображает 2-ю страницу отфильтрованной таблицы

Я хотел бы, чтобы фильтр сохранялся при навигации по разным страницам. Я нашел аналогичный вопрос здесь. Это решение указывает на необходимость изменения html-кода. Однако в моем случае django-tables2 генерирует html.

как я могу правильно реализовать разбиение на страницы с фильтрацией с использованием django-tables2?

-обновить-

Я пробовал использовать GET вместо POST:

это приводит к KeyError из-за my_choice не существует в GET. В результате страница даже не загружается.

какую версию django_tables2 вы используете? Я проверил источник и увидел, что django_tables2 использует тег шаблона с именем querystring для создания ссылок разбиения на страницы в table.html шаблон. the querystring tag обновления текущий url с параметрами подкачки. таким образом, django_tables2 поддерживает разбиение на страницы + фильтрацию из коробки (это то, что я запомнил).

пожалуйста, попробуйте обновить до последней версии django_tables2 и убедитесь, что вы используете значение по умолчанию table.html шаблон для рендеринга таблиц.

наконец-то, пожалуйста, взгляните на мой ответ на этот вопрос Таблицы Django-Фильтрация Столбцов

обновление: я внимательно посмотрел в коде, который вы опубликовали: прежде всего, вы передаете данные post в фильтр: вы не можете использовать POST для этого, POST должен быть используется только для действий, изменяющих данные. также я видел, что вы ничего не фильтруете, а вместо этого проходите.все к столу! где выполняется фактическая фильтрация? вы должны передать отфильтрованные данные в таблицу, как я описываю в ответе выше!

обновление 2: Проблема с вашим представлением заключается в том, что при первом посещении страницы GET словарь не содержит my_choice атрибут, поэтому он будет выдавать исключение при попытке доступа к my_choice атрибут через [] оператор, поэтому вы должны проверить, существует ли он на самом деле, используя, например, .get() , что-то вроде этого:

выше должно работать, однако, делая фильтрацию запросов самостоятельно -вы нарушаете почти все философия дизайна django !

вот почему я сказал вам прочитать мой другой ответ на аналогичный вопрос (Таблицы Django-Фильтрация Столбцов), в котором я рекомендую используя Джанго-фильтр который является пакетом, явно используемым для фильтрации запросов. Пожалуйста, проверьте документацию или мой ответ, чтобы узнать, как его можно использовать (я буду рад помочь, если у вас есть вопросы).

кроме того, существует ряд других незначительных проблем с вашим кодом:

вам не нужно проверять, если request.method и GET - Она всегда будет GET так как вы не будете делать ничего POST s

вы не следует включать > для вашего шаблона-это необходимо только для POST .

на TestFilter класс-это на самом деле Form вот почему я рекомендую назвать его TestFilterForm или что-то подобное -- если бы вы использовали django-filter, вы бы создали FilterSet класс, который будет называться TestFilter . Правильное название классов очень важно, когда я впервые увидел ваш код, я подумал, что TestFilter класс был a FilterSet , а не Form !

Так случилось, что моя работа связана с написанием отчетов.
Этому я посвятил около 8 лет. Отчеты — это глаза бизнес-процесса и информация,
необходимая для принятия оперативных решений.

Вначале наш отдел делал отчеты,
— Принимая задачи по outlook
— Составляя sql-запрос
— Отправляя результаты заказчику в xls
— В лучшем случае, сохраняя sql-код куда-то в папку (а иногда и не сохраняя)

Но это было скучно и неинтересно. Так появилось простейшее приложение на PHP,
в котором каждый отчет был представлен в виде php-файла с одним классом, имеющим единственный (помимо конструктора) метод show()

В таком виде, система прожила 5,5 лет, за которые мной и еще одним человеком было написано более 500 различных отчетов.
В процессе появился опыт и стало понятно, что многое (если не все) сделано не так, да и PHP уже не устраивал.

Сервер отчетов был переписан на django, где была «админка» и код приложения уже не правился.
В процессе работы снова накопилось несколько мыслей,
в итоге сервер был снова переписан.

Я решил представить сообществу текущую версию системы, возможно, она кому-то облегчит жизнь,
сняв рутину отчетности и переложит ее на машину, которая готова сотни раз формировать отчеты
тысячи людям по сотни разных входных параметров.

Это рабочий инструмент, который вы можете (если захотите) использовать в работе,
который нам использовать просто нравится.

Структура проекта

Концепция и основные элементы

Система состоит из набора отчетов.
— Отчеты слабо (практически никак) не связаны друг с другом, чтоб разработчик мог быть уверен, что ничего не испортит в других отчетах, отредактировав какой-то один.
— Элементы отчета жестко связанны внутри отчета и влияют друг на друга.

Отчеты не организованы в иерархию (от этого ушли), а помечаются набором тэгов.
На главной системы отчетов можно щелчками набирать нужные сочетания тэгов, которые работают, как фильтр
и поиск отчетов.

Элементы отчета «ленивые» и начинают выполнятся в момент сборки на уровне компоновщика виджетов,
что дает возможность выполнять только те запросы к базе, которые необходимы,
размещая в отчете и группированные данные и детализацию.
За счет кэширования данных на уровне источника, несколько виджетов, выводящих данные из одного источника, дают только один запрос в базу данных.


Есть параметры доступа пользователю к отчету, помимо самого факта доступности.
Которые могут быть использованы для предоставлении доступа к части отчета или части данных


При необходимости одного варианта вызова менеджера в шаблонной системе, используется __call__
Если возможны несколько вариантов, используется __getitem__ для словарного объекта.

Каждый отчет может состоять из:

Инициализируется именованными аргументами и используется для рендеринга всего
с учетом тех переменных, которыми инициализирован.

За счет этого, мы можем гарантировать наличие из любого места заранее известного набора переменных.
Может рендерить sql-запросы, которые являются источниками данных (но об этом чуть ниже)

Поставляет:
— Данные в виде кортежа (field_names, rows,)
Для визуализации различными типами виджетов, выгрузки в excel
— Данные в виде списка словарей (каждая строка является словарем)
Для прямого обращения к источнику и генерации html, javascript, css кода в менеджере компоновки (о нем немного позже)
— sql-код без обработки переменных привязки
Используется для организации вложенных источников данных, например:

— sql-код и переменные привязки
Просто для отладки и выводе в отчет

За счет этого, можно:
— Менять на лету sql-запрос в зависимости от переменных менеджера окружения
— На основе одного запроса, можно делать другие так, чтоб у вас группировка и детализация никогда не будут отличатся,
так как основаны на одном источнике, и вы никогда не забудите доработать группировку и забыть сделать это в детализации
— Выборку из одного источника данных использовать для динамической сборки другого.
Например, создать заранее неизвестное кол-во колонок в запросе помесячно, по месяцам (или неделям), входящим в отчетный период (задается пользователем в форме, но о них тоже чуть ниже),
и все это независимо от возможностей базы данных (без pivot|unpivot oracle и xml_query oracle)

Тут все достаточно тривиально. Собираем форму и отдаем форму и измененные данные

Берет данные из источника данных и выводит в табличном виде. Поддерживает
— форматирование
— Генерацию ссылок (которые могут использоваться для детализации ячейки в другой таблице, график или excel)
— Генерацию произвольных аттрибутов строк (для работы javascript, скрытия или показа итоговых строк и т.п.)

Тут тоже просто. Берет данные из источника, XML-настройки переводит в dict и рендерит шаблон,
собирая javascript-код графика (используется amcharts)
тэги XML-узлов преобразуются в название парамерта, текст в значение параметра,
то есть можно использовать практически все параметры библиотеки amcharts,
просто поместив нужный тэг у нужную секцию

И, как завершение теоретической части, привожу код класса, который всем этим управляет,
размещая виджеты, или возвращая xls или произвольный документ (html с расширением .doc или .xls)

Берет данные из источника данных и выводит в табличном виде. Поддерживает
— форматирование
— Генерацию ссылок (которые могут использоваться для детализации ячейки в другой таблице, график или excel)
— Генерацию произвольных аттрибутов строк (для работы javascript, скрытия или показа итоговых строк и т.п.)

Вот, в общем-то и все.
Интерфейс администратора описывать не стал.

css от bootstrap

Немного практики и картинок

Табличный виджет t:
Создадим, выбрав из списка источник ds1
и прописав название. Все остальное не трогаем.

django-excel - Let you focus on data, instead of file formats

https://raw.githubusercontent.com/pyexcel/pyexcel.github.io/master/images/patreon.jpg

Support the project

If your company has embedded pyexcel and its components into a revenue generating product, please support me on github, patreon or bounty source to maintain the project and develop it further.

If you are an individual, you are welcome to support me too and for however long you feel like. As my backer, you will receive early access to pyexcel related contents.

And your issues will get prioritized if you would like to become my patreon as pyexcel pro user.

With your financial support, I will be able to invest a little bit more time in coding, documentation and writing interesting posts.

Fonts, colors and charts are not supported.

Nor to read password protected xls, xlsx and ods files.

Here is a typical conversation between the developer and the user:

The idea originated from the common usability problem: when an excel file driven web application is delivered for non-developer users (ie: team assistant, human resource administrator etc). The fact is that not everyone knows (or cares) about the differences between various excel formats: csv, xls, xlsx are all the same to them. Instead of training those users about file formats, this library helps web developers to handle most of the excel file formats by providing a common programming interface. To add a specific excel file format type to you application, all you need is to install an extra pyexcel plugin. Hence no code changes to your application and no issues with excel file formats any more. Looking at the community, this library and its associated ones try to become a small and easy to install alternative to Pandas.

  1. excel data import into and export from databases
  2. turn uploaded excel file directly into Python data structure
  3. pass Python data structures as an excel file download
  4. provide data persistence as an excel file in server side
  5. supports csv, tsv, csvz, tsvz by default and other formats are supported via the following plugins:

Plugin shopping guide

Since 2020, all pyexcel-io plugins have dropped the support for python version lower than 3.6. If you want to use any python verions, please use pyexcel-io and its plugins version lower than 0.6.0.

Except csv files, xls, xlsx and ods files are a zip of a folder containing a lot of xml files

The dedicated readers for excel files can stream read

In order to manage the list of plugins installed, you need to use pip to add or remove a plugin. When you use virtualenv, you can have different plugins per virtual environment. In the situation where you have multiple plugins that does the same thing in your environment, you need to tell pyexcel which plugin to use per function call. For example, pyexcel-ods and pyexcel-odsr, and you want to get_array to use pyexcel-odsr. You need to append get_array(. library='pyexcel-odsr').

Other data renderers

Package name Supported file formats Dependencies Python versions
pyexcel-text write only:rst, mediawiki, html, latex, grid, pipe, orgtbl, plain simple read only: ndjson r/w: json tabulate 2.6, 2.7, 3.3, 3.4 3.5, 3.6, pypy
pyexcel-handsontable handsontable in html handsontable same as above
pyexcel-pygal svg chart pygal 2.7, 3.3, 3.4, 3.5 3.6, pypy
pyexcel-sortable sortable table in html csvtotable same as above
pyexcel-gantt gantt chart in html frappe-gantt except pypy, same as above

[1]zipped csv file
[2]zipped tsv file

This library makes information processing involving various excel files as easy as processing array, dictionary when processing file upload/download, data import into and export from SQL databases, information analysis and persistence. It uses pyexcel and its plugins:

Читайте также: