Создание файлов Excel
В статье «Почему форматы Microsoft Office такие сложные?» Джоэл Спольски пишет:
Заставьте Office делать грязную работу за вас. Word и Excel завязаны на сложных объектных моделях, основанных на автоматизации COM, что позволяет программно делать всё, что угодно. Во многих ситуациях проще будет использовать код Office, чем пытаться реализовать его с нуля.
Действительно, если требуется сформировать сложный офисный документ, проще сделать это вызовами API через COM-соединение. Однако, для создания простой эксель-таблички можно задействовать библиотеку xlwt.
Библиотека ставиться просто:
pip install xlwt
Требуется сформировать таблицу с тремя колонками:
- номер лицевого счета абонента, строковый тип;
- дата показания, тип дата;
- показание, тип число.
Проект выполнен на Джанго. Есть модель показания, переданного абонентом:
class Statement(models.Model):
user = models.ForeignKey(User)
value = models.DecimalField(max_digits=12, decimal_places=6)
date = models.DateTimeField(default=datetime.now)
Показания, которые необходимо записать в таблицу, извлекаются следующим образом
statements = Statement.objects.filter(date__range=(t1, t2))
Формирование файла Excel будет выглядеть так:
import xlwt
# Определяем формат ячеек для дат
date_style = xlwt.XFStyle()
date_style.num_format_str = "M/D/YY"
# Определяем формат ячеек для чисел
num_style = xlwt.XFStyle()
num_style.num_format_str = "0.00"
wbk = xlwt.Workbook() # Новая книга
sheet = wbk.add_sheet("statements") # Новый лист в книге
# Добавляем шапку таблицы
sheet.write(0, 0, u"Лицевой счет")
sheet.write(0, 1, u"Дата")
sheet.write(0, 2, u"Показание")
# Обход показаний, statements — объект QuerySet из Джанго
for i, s in enumerate(statements):
# i — индекс итерации, используется как номер строки
sheet.write(i+1, 0, s.user.username)
sheet.write(i+1, 1, s.date, date_style)
sheet.write(i+1, 2, s.value, num_style)
# Задаем ширину колонок
sheet.col(0).width = 5000
sheet.col(1).width = 5000
sheet.col(2).width = 5000
# Запись файла
wbk.save("path/to/file.xls")
Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter