diff --git a/management/templates/management/election.html b/management/templates/management/election.html
index 88e11c48063b222f5df320df65a860b4028ac145..fed03b0f37d8089a33fadc67b1c86f7b1e827526 100644
--- a/management/templates/management/election.html
+++ b/management/templates/management/election.html
@@ -112,6 +112,10 @@
               {{ election_upload_application_form |crispy }}
               <button type="submit" class="btn btn-info">Apply</button>
             </form>
+            <hr>
+            <h5>Export result</h5>
+            <a href="{% url 'management:export_csv' election.pk %}" class="btn btn-primary mr-2">CSV</a>
+            <a href="{% url 'management:export_json' election.pk %}" class="btn btn-primary">JSON</a>
           {% endif %}
         </div>
       </div>
diff --git a/management/urls.py b/management/urls.py
index cc7ba836e83f8b8bf76da21adf06909b3bc8b0ff..0cea2f70541f54519cbbff8e624e16d75d7c0bd0 100644
--- a/management/urls.py
+++ b/management/urls.py
@@ -18,6 +18,8 @@ urlpatterns = [
     path('election/<int:pk>', views.election_detail, name='election'),
     path('election/<int:pk>/delete_voter', views.delete_voter, name='delete_voter'),
     path('election/<int:pk>/delete_election', views.delete_election, name='delete_election'),
+    path('election/<int:pk>/export_csv', views.export_csv, name='export_csv'),
+    path('election/<int:pk>/export_json', views.export_json, name='export_json'),
     path('meeting/<int:pk>/delete_session', views.delete_session, name='delete_session'),
     path('meeting/<int:pk>/print_token', views.print_token, name='print_token'),
     path('meeting/<int:pk>/import_csv', views.import_csv, name='import_csv'),
diff --git a/management/views.py b/management/views.py
index 3c3f06762e119abfdb25270c2bf50f8a5acee534..d72ceabe8be8e23150e0c53b38b9e62b775a08a1 100644
--- a/management/views.py
+++ b/management/views.py
@@ -4,6 +4,8 @@ from pathlib import Path
 from typing import Dict
 
 import qrcode
+import csv
+import json
 from django.conf import settings
 from django.contrib import messages
 from django.contrib.auth import views as auth_views
@@ -301,3 +303,46 @@ def import_csv(request, pk):
     else:
         form = CSVUploaderForm(session)
     return render(request, 'management/import_csv.html', {'form': form, 'session': session})
+
+
+@management_login_required
+def export_csv(request, pk):
+    e = Election.objects.filter(session__in=request.user.sessions.all(), pk=pk)
+    if not e.exists():
+        raise Http404('Election does not exist')
+    e = e.first()
+
+    response = HttpResponse(content_type='text/csv')
+    response['Content-Disposition'] = 'attachment; filename="results.csv"'
+
+    writer = csv.writer(response)
+    writer.writerow(['#', 'applicant', 'yes', 'no', 'abstention'])
+    for i in range(len(e.election_summary)):
+        a = e.election_summary[i]
+        writer.writerow([i+1, a.get_display_name(), a.votes_accept, a.votes_reject, a.votes_abstention])
+
+    return response
+
+
+@management_login_required
+def export_json(request, pk):
+    e = Election.objects.filter(session__in=request.user.sessions.all(), pk=pk)
+    if not e.exists():
+        raise Http404('Election does not exist')
+    e = e.first()
+
+    json_data = []
+    for a in e.election_summary:
+        json_data.append({
+            "applicant": a.get_display_name(),
+            "yes": a.votes_accept,
+            "no": a.votes_reject,
+            "abstention": a.votes_abstention
+        })
+
+    json_str = json.dumps(json_data)
+
+    response = HttpResponse(json_str, content_type='application/json')
+    response['Content-Disposition'] = 'attachment; filename=result.json'
+
+    return response