Django的简单电子表格导出
django-tabular-export的Python项目详细描述
从django 1.8+导出简单的电子表格
文档
此模块包含获取(头、行)对并返回带有xlsx或 csv下载和django管理操作,可以添加到任何modeladmin中进行通用导出。它提供了 两个函数(export_to_csv_response和export_to_xlsx_response)接受一个文件名, 列标题列表和django QuerySet、类列表对象或生成器,并返回响应。
目标
- 此项目不是一个通用的电子表格操作库。唯一的目标是 快速安全地导出数据。
- 这个api故意很简单,让您可以完全控制头或 数据。flatten_queryset只对两种类型的数据进行特殊处理:None将转换为 空字符串和date或datetime实例将使用isoformat()序列化。全部 其他值将被指定为文本数据类型,以避免在出现这些值时Excel中的数据损坏 类似于当前区域设置中的日期。
- unicode安全性:使用django的 force_text 函数,并始终以utf-8的形式发出
- performance:已知代码可以处理多达数十万行的数据集。CSV响应 使用StreamingHttpResponse,使用最少的内存,并快速启动。Excel(XLSX)响应不能为 流式但是xlsxwriter是一种更快的实现 并启用了内存大小优化。
快速启动
安装Django表格导出:
pip install django-tabular-export
然后在项目中使用:
from tabular_export import export_to_csv_response, export_to_xlsx_response, flatten_queryset def my_view(request): return export_to_csv_response('test.csv', ['Column 1'], [['Data 1'], ['Data 2']]) def my_other_view(request): headers = ['Title', 'Date Created'] rows = MyModel.objects.values_list('title', 'date_created') return export_to_excel_response('items.xlsx', headers, rows) def export_using_a_generator(request): headers = ['A Number'] def my_generator(): for i in range(0, 100000): yield (i, ) return export_to_excel_response('numbers.xlsx', headers, my_generator()) def export_renaming_columns(request): qs = MyModel.objects.filter(foo="…").select_related("…") headers, data = flatten_queryset(qs, field_names=['title', 'related_model__title_en'], extra_verbose_names={'related_model__title_en': 'English Title'}) return export_to_csv_response('custom_export.csv', headers, data)
管理集成
有两种方便方式admin actions 这使得添加“导出到Excel”和“导出到CSV”操作变得简单:
from tabular_export.admin import export_to_csv_action, export_to_excel_action class MyModelAdmin(admin.ModelAdmin): actions = (export_to_excel_action, export_to_csv_action)
默认列将与在ModelAdmin的默认值上调用values_list相同 由ModelAdmin.get_queryset()返回的queryset。如果要自定义此项,只需声明一个新的 对您的ModelAdmin执行操作,它将执行任何必要的数据准备:
from tabular_export.admin import export_to_excel_action class MyModelAdmin(admin.ModelAdmin): actions = ('export_batch_summary_action', ) def export_batch_summary_action(self, request, queryset): headers = ['Batch Name', 'My Computed Field'] rows = queryset.annotate("…").values_list('title', 'computed_field_name') return export_to_excel_response('batch-summary.xlsx', headers, rows) export_batch_summary_action.short_description = 'Export Batch Summary'
调试
TABULAR_RESPONSE_DEBUG = True设置将导致所有视图返回HTML表