Skip to content

Instantly share code, notes, and snippets.

@danie1k
Created November 4, 2016 10:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danie1k/02ed2f7e50302b86403ce263333b6485 to your computer and use it in GitHub Desktop.
Save danie1k/02ed2f7e50302b86403ce263333b6485 to your computer and use it in GitHub Desktop.
"""
csv exporter
~~~~~
Usage:
* in your admin class for model, insert: actions = [ download_as_csv_view ]
* add columns names in HEADER
* add data columns in _make_csv_row
:copyright: (c) https://github.com/danie1k
:license: GNU General Public License
"""
def download_as_csv_view(modeladmin, request, queryset):
"""A view that streams a large CSV file."""
MAX_PER_PAGE = 65536
FILENAME = ''
HEADER = [] # Document header row with columns names
import csv, tempfile, StringIO, zipfile
from django.http import HttpResponse
from django.core.paginator import Paginator
def _make_csv_row(row):
return [] # Columns with data in row
paginator = Paginator(queryset, MAX_PER_PAGE)
if paginator.num_pages == 1:
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = ('attachment; '
'filename="{}.csv"'.format(FILENAME))
writer = csv.writer(response, delimiter=';', dialect='excel')
writer.writerow(HEADER)
for row in queryset:
writer.writerow(_make_csv_row(row))
return response
response = HttpResponse(content_type='application/x-zip-compressed')
response['Content-Disposition'] = ('attachment; '
'filename="{}.zip"'.format(FILENAME))
# This is where my zip will be written
buff = StringIO.StringIO()
# This is my zip file
zip_archive = zipfile.ZipFile(buff, mode='w')
for page in paginator.page_range:
temp_file = StringIO.StringIO()
writer = csv.writer(temp_file, delimiter=';', dialect='excel')
writer.writerow(HEADER)
rows = paginator.page(page)
for row in rows:
writer.writerow(_make_csv_row(row))
zip_archive.writestr('{}.part{}.csv'.format(FILENAME, page),
temp_file.getvalue())
zip_archive.close()
response.write(buff.getvalue())
return response
download_as_csv_view.short_description = "Download as CSV"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment