Django 导出 Excel 代码的实例详解


Posted in Python onAugust 11, 2017

这篇技术贴讲怎样在Django的框架下导出Excel, 最开始打算用ajax post data 过去,但是发现不行,所以改用了get的方式。如果只有一个id(pk)那用get的方式很简单就可以访问对应的view section,但是如果是多个ids,我用的是session,大家还有其他好的例子吗?希望一起讨论。

Python3.5 Django 1.10, sqlite3, windows 10

1. virtualenv export_excel  <--- create a virtualenv for django

Django 导出 Excel 代码的实例详解

2. cd export_excel   <--- Go into the export_excel folder

3. Script\active <--- activate env environment.

Django 导出 Excel 代码的实例详解

once activate the environment, in the windows would be liked as above.

4. pip install django.

5. pip install django-bootstrap3. <-- bootstrap3 for django.

6. pip install xlsxwriter.  <-- this uses for excel export.(用xlsxwriter 这个Python 库)

1. urls.py

"""export_excel URL Configuration 
 
 
The `urlpatterns` list routes URLs to views. For more information please see: 
  https://docs.djangoproject.com/en/1.10/topics/http/urls/ 
Examples: 
Function views 
  1. Add an import: from my_app import views 
  2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 
Class-based views 
  1. Add an import: from other_app.views import Home 
  2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 
Including another URLconf 
  1. Import the include() function: from django.conf.urls import url, include 
  2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 
""" 
from django.conf.urls import url 
from django.contrib import admin 
from django.views.generic import ListView 
 
 
from .models import ExcelDemoData 
from . import views 
 
 
urlpatterns = [ 
  url(r'^admin/', admin.site.urls), 
  url(r'^$', ListView.as_view(queryset = ExcelDemoData.objects.all().defer('id', 'part_number').order_by('id')[:100], template_name="part_num_list.html"), name = 'home'), 
  url(r'^demo/exportall/$', views.export_all_to_excel, name = 'export_all_to_excel'), 
]

2. views.py

from django.http import JsonResponse, Http404 
from django.shortcuts import render, get_object_or_404, render_to_response  
from django.http import HttpResponseRedirect 
from django.contrib import messages 
from django.core.urlresolvers import reverse 
from django.http import HttpResponse 
 
from .models import ExcelDemoData 
from .forms import ExcelDemoForm 
from .excel_utils import WriteToExcel 
 
from . import attrs_override as attr 
 
     
def export_sig_to_excel(request, pk): 
 
  if request.method == 'GET': 
    demo_list = [] 
    try: 
      demo_row = ExcelDemoData.objects.get(pk = pk) 
    except ExcelDemoData.DoesNotExist: 
      messages.add_message(request, messages.ERROR, 'the Part Number: [%s] does not exist in database.' % str(pk)) 
    else:   
      demo_list.append(demo_row) 
        
    response = HttpResponse(content_type='application/ms-excel') 
    response['Content-Disposition'] = 'attachment; filename=ExcelDemoData_%s.xlsx' % demo_row.demo_row_part_number  
    xlsx_data = WriteToExcel(demo_list) 
    response.write(xlsx_data) 
    return response 
         
         
def export_all_to_excel(request): 
  if request.method == 'GET': 
    if 'store_modi_id' in request.session: 
       messages.add_message(request, messages.ERROR, 'The Part Number have been lost, please re-search them.') 
       return HttpResponseRedirect(reverse('home')) 
       
    demo_list = [] 
    pn_id_list = request.session['searched_sb_list'] #<--- the session will be created when a list page was created. 
    for id in pn_id_list: 
      try: 
        demo_row = ExcelDemoData.objects.get(pk = id) 
      except SmartBuy.DoesNotExist: 
        messages.add_message(request, messages.ERROR, 'the Part Number does not exist in database.' ) 
      else:   
        demo_list.append(demo_row) 
        
    response = HttpResponse(content_type='application/ms-excel') 
    response['Content-Disposition'] = 'attachment; filename=ExcelDemoData_%s.xlsx' % attr.get_current_timestamp()  
    xlsx_data = WriteToExcel(demo_list) 
    response.write(xlsx_data) 
    return response

3. models.py

from django.db import models 
 
# Create your models here. 
class ExcelDemoData(models.Model): 
   
  # ---- this is ExcelDemoData scope ----  
  demo_qty = models.PositiveIntegerField(blank = True, null=True) 
  demo_part_number = models.CharField(max_length = 20, blank = True, null=True) # smart buy part number cannot be empty. 
  demo_nonfio_sku = models.CharField(max_length = 200, blank = True, null=True) 
  demo_desc = models.CharField(max_length = 500, blank = True, null=True) 
  demo_cost = models.DecimalField(max_digits=15, decimal_places=2, blank = True, null=True) 
  demo_ex_cost = models.DecimalField(max_digits=15, decimal_places=2, blank = True, null=True) 
  demo_msrp = models.DecimalField(max_digits=15, decimal_places=2, blank = True, null=True) 
  demo_ex_msrp = models.DecimalField(max_digits=15, decimal_places=2, blank = True, null=True) 
   
   
  def __str__(self): 
    return str(self.pk) + ' Part Number: ' + self.demo_part_number

4. forms.py

from django import forms 
from django.utils.translation import ugettext_lazy as _ 
from .models import ExcelDemoData 
 
from .attrs_override import * 
 
  
class ExcelDemoForm(forms.ModelForm): 
    
  class Meta: 
    model = <span style="font-family: Arial, Helvetica, sans-serif;">ExcelDemoData</span> 
     
    widgets = { 
      # ----- Smart ------ 
      'demo_qty': forms.NumberInput(attrs = {'class': INPUT_CSS}), 
      'demo_part_number': forms.TextInput(attrs = {'class': INPUT_CSS}), 
      'demo_nonfio_sku': forms.TextInput(attrs = {'class': INPUT_CSS}), 
      'demo_desc': forms.TextInput(attrs = {'class': SELECT_CSS}), 
      'demo_cost': forms.TextInput(attrs = {'class': INPUT_CSS}), 
      'demo_ex_cost': forms.TextInput(attrs = {'class': INPUT_CSS}), 
      'demo_msrp': forms.TextInput(attrs = {'class': INPUT_CSS}), 
      'demo_ex_msrp': forms.TextInput(attrs = {'class': INPUT_CSS}), 
    } 
     
    labels = { 
      # ----- Smart ------ 
      'demo_qty': _(DEMO_TXT + ' ' + QTY_TXT), 
      'demo_part_number': _(DEMO_TXT + ' ' + PART_NUM_TXT), 
      'demo_nonfio_sku': _(DEMO_TXT + ' ' + NONFIO_SKU), 
      'demo_desc': _(DEMO_TXT + ' ' + DESC_TXT), 
      'demo_cost': _(DEMO_TXT + ' ' + COST_TXT), 
      'demo_ex_cost': _(DEMO_TXT + ' ' + EX_COST_TXT), 
      'demo_msrp': _(DEMO_TXT + ' ' + MSRP_TXT), 
      'demo_ex_msrp': _(DEMO_TXT + ' ' + EX_MSRP_TXT), 
       
 
    } 
     
    exclude = []

5. excel_utils.py

try: 
  from BytesIO import BytesIO 
except ImportError: 
  from io import BytesIO 
   
import xlsxwriter 
from django.utils.translation import ugettext as _ 
 
 
from .models import ExcelDemoData 
from .attrs_override import * 
 
 
 
 
def WriteToExcel(demo_list): 
   
  output = BytesIO() 
  workbook = xlsxwriter.Workbook(output) 
  worksheet_s = workbook.add_worksheet('Smart Buy') 
  worksheet_b = workbook.add_worksheet('Part Number List') 
   
  # excel styles 
  title = workbook.add_format({ 
    'bold': True, 
    'font_size': 14, 
    'align': 'center', 
    'valign': 'vcenter' 
  }) 
  header = workbook.add_format({ 
    'bg_color': '#F7F7F7', 
    'color': 'black', 
    'align': 'center', 
    'valign': 'top', 
    'border': 1 
  }) 
   
  bold_header = workbook.add_format({ 
    'bold': True, 
    'bg_color': '#F7F7F7', 
    'color': 'black', 
    'align': 'center', 
    'valign': 'top', 
    'border': 1 
  }) 
   
  cell = workbook.add_format({ 
    'align': 'left', 
    'valign': 'top', 
    'text_wrap': True, 
    'border': 1 
  }) 
   
  bold_cell = workbook.add_format({ 
    'bold': True, 
    'align': 'left', 
    'valign': 'top', 
    'text_wrap': True, 
    'border': 1 
  }) 
   
  cell_center = workbook.add_format({ 
    'align': 'center', 
    'valign': 'top', 
    'border': 1 
  }) 
   
  # write header, this is row 1 in excel 
  worksheet_s.write(0, 0, _(HEADER_ITEM_TXT), header) 
  worksheet_s.write(0, 1, _(QTY_TXT), header) 
  worksheet_s.write(0, 2, _(PART_NUM_TXT), header) 
  worksheet_s.write(0, 3, _(NONFIO_SKU), header) 
  worksheet_s.write(0, 4, _(DESC_TXT), header) 
  worksheet_s.write(0, 5, _(COST_TXT), header) 
  worksheet_s.write(0, 6, _(EX_COST_TXT), header) 
  worksheet_s.write(0, 7, _(MSRP_TXT), bold_header) 
  worksheet_s.write(0, 8, _(EX_MSRP_TXT), header) 
   
  # column widths  
  item_name_col_width = 20 
  qty_col_width = 10 
  part_num_col_width = 20 
  nonfio_sku_col_width = 30 
  desc_col_width = 80 
  cost_col_width = 10 
  ex_cost_col_width= 10 
  msrp_col_width = 10 
  ex_msrp_col_width = 10 
   
  # add data into the table 
  data_row = 1 
  second_sheet_data_row = 0 
  for sb in demo_list: 
     
    if data_row is not 1: 
      for index in range(9): 
        worksheet_s.write(data_row, index, '', cell) 
      data_row += 1 
     
    # this is for smartbuy row, row 2 in excel 
    worksheet_s.write_string(data_row, 0, _(SMART_BUY_TXT), cell) 
    if not sb.demo_qty:  
      sb.demo_qty = '' 
    worksheet_s.write(data_row, 1, sb.demo_qty, cell) 
    if not sb.demo_part_number: 
      sb.demo_part_number = ''  
    worksheet_s.write_string(data_row, 2, sb.demo_part_number, bold_cell) 
    worksheet_b.write_string(second_sheet_data_row, 0, sb.demo_part_number, cell) 
    second_sheet_data_row += 1 
    if not sb.demo_nonfio_sku: 
       sb.demo_nonfio_sku = '' 
    worksheet_s.write_string(data_row, 3, sb.demo_nonfio_sku, cell) 
    if not sb.demo_desc: 
      sb.demo_desc = ''  
    worksheet_s.write_string(data_row, 4, sb.demo_desc, cell) 
    if not sb.demo_cost:  
      sb.demo_cost = '' 
    worksheet_s.write(data_row, 5, sb.demo_cost, cell) 
    if not sb.demo_ex_cost:  
      sb.demo_ex_cost = '' 
    worksheet_s.write(data_row, 6, sb.demo_ex_cost, cell) 
    if not sb.demo_msrp:  
      sb.demo_msrp = '' 
    worksheet_s.write(data_row, 7, sb.demo_msrp, bold_cell) 
    if not sb.demo_ex_msrp: 
       sb.demo_ex_msrp = '' 
    worksheet_s.write(data_row, 8, sb.demo_ex_msrp, cell) 
     
 
 
    # for each smart buy data end <<<------ 
     
    # change column widths 
    if sb.demo_qty: worksheet_s.set_column('A:A', item_name_col_width) 
    if sb.demo_qty: worksheet_s.set_column('B:B', qty_col_width) 
    if sb.demo_qty: worksheet_s.set_column('C:C', part_num_col_width) 
    if sb.demo_qty: worksheet_s.set_column('D:D', nonfio_sku_col_width) 
    if sb.demo_qty: worksheet_s.set_column('E:E', desc_col_width) 
    if sb.demo_qty: worksheet_s.set_column('F:F', cost_col_width) 
    if sb.demo_qty: worksheet_s.set_column('G:G', ex_cost_col_width) 
    if sb.demo_qty: worksheet_s.set_column('H:H', msrp_col_width) 
    if sb.demo_qty: worksheet_s.set_column('I:I', ex_msrp_col_width) 
     
    # for each smart buy data end <<<------ 
     
    # change column widths 
    worksheet_s.set_column('A:A', item_name_col_width) 
    worksheet_s.set_column('B:B', qty_col_width) 
    worksheet_s.set_column('C:C', part_num_col_width) 
    worksheet_b.set_column('A:A', part_num_col_width) 
    worksheet_s.set_column('D:D', nonfio_sku_col_width) 
    worksheet_s.set_column('E:E', desc_col_width) 
    worksheet_s.set_column('F:F', cost_col_width) 
    worksheet_s.set_column('G:G', ex_cost_col_width) 
    worksheet_s.set_column('H:H', msrp_col_width) 
    worksheet_s.set_column('I:I', ex_msrp_col_width) 
     
  # close workbook 
  workbook.close() 
  xlsx_data = output.getvalue() 
  return xlsx_data

6. html

{% extends "base.html" %} 
 
{% block content %} 
 
<div id="form_body" style="margin:20px;"> 
  <table class="table"> 
    <tr> 
      <td style="float: left"><a href="{% url 'home' %}" rel="external nofollow" class="btn btn-primary" role="button">Back</a></td> 
      <td style="float: right"> 
        {% if export_all %} 
      <a href="javascript:void(0)" rel="external nofollow" rel="external nofollow" class="btn btn-primary" role="button" data-loading-text="<i class='fa fa-circle-o-notch fa-spin'></i> Processing Export..." id="export_all_excel_a" onclick="javascript: getExportExcels('all');">Export All to Excel</a> 
      {% endif %}</td> 
    </tr> 
  </table> 
  </div> 
  <div class="table-responsive"> 
  <table class="table table-bordered usr_def_tbl"> 
    <thead class="thead-inverse"> 
      <tr style="font-size:14px; text-align: center;"> 
       <th> </th> 
       <th>Qty</th> 
       <th>Part Number</th> 
       <th>NonFIO SKU</th> 
       <th>Description</th> 
       <th>Cost</th> 
       <th>Ex.Cost</th> 
       <th>MSRP</th> 
       <th>ex.MSRP</th> 
      </tr> 
    </thead> 
    <tbody> 
      {% for s in demo_list %} 
       
      <!-- this is demo list sections --> 
      <tr> 
        <td>Demo</td> 
        <td>{% if s.demo_qty %}{{ s.demo_qty }}{% endif %} </td> 
        <td>{% if s.demo_part_number %}{{ s.demo_part_number }}{% endif %} </td> 
        <td>{% if s.demo_nonfio_sku %}{{ s.demo_nonfio_sku }}{% endif %} </td> 
        <td>{% if s.demo_desc %}{{ s.demo_desc }}{% endif %} </td> 
        <td>{% if s.demo_cost %}{{ s.demo_cost }}{% endif %} </td> 
        <td>{% if s.demo_ex_cost %}{{ s.demo_ex_cost }}{% endif %} </td> 
        <td>{% if s.demo_msrp %}{{ s.demo_msrp }}{% endif %} </td> 
        <td>{% if s.demo_ex_msrp %}{{ s.demo_ex_msrp }}{% endif %}</td> 
      </tr> 
      <tr> 
        <td colspan="7"></td> 
         <td style="text-align:right"> 
          <a href="javascript:void(0)" rel="external nofollow" rel="external nofollow" class="btn btn-primary part_num_flag" role="button" onclick="javascript: getExportExcels('{{ s.pk }}');" data-loading-text="<i class='fa fa-circle-o-notch fa-spin'></i> Processing Export..." id="sgl_export_{{ s.pk }}" >Export to Excel</a> 
        </td> 
        <td style="text-align:right"> 
          <a href="{% url 'demo_edit_id' pk=s.pk%}" rel="external nofollow" class="btn btn-primary" role="button" value="{{ s.pk }}">Edit</a> 
        </td> 
      </tr> 
      {% endfor %} 
    </tbody> 
     
  <p></p> 
  </table> 
   
</div> 
 
<script type="text/javascript"> 
function getExportExcels(pn_id){ 
  if(pn_id == 'all'){ 
    var post_url = '/demo/exportall/'; 
    location.replace(post_url); 
  } 
  else{ 
    var post_url = '/demo/export/'; 
    location.replace(post_url + pn_id); 
  } 
}  
 
</script> 
{% endblock content %}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 可爱的大小写
Sep 06 Python
python访问纯真IP数据库的代码
May 19 Python
Python机器学习之SVM支持向量机
Dec 27 Python
解决pandas 作图无法显示中文的问题
May 24 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
Python引用计数操作示例
Aug 23 Python
Python assert语句的简单使用示例
Jul 28 Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
Python如何读取文件中图片格式
Jan 13 Python
Python3的socket使用方法详解
Feb 18 Python
OpenCV-Python 实现两张图片自动拼接成全景图
Jun 11 Python
python技能之数据导出excel的实例代码
Aug 11 #Python
利用标准库fractions模块让Python支持分数类型的方法详解
Aug 11 #Python
Python对字符串实现去重操作的方法示例
Aug 11 #Python
python中模块查找的原理与方法详解
Aug 11 #Python
python利用lxml读写xml格式的文件
Aug 10 #Python
Python编程实现及时获取新邮件的方法示例
Aug 10 #Python
Python中函数eval和ast.literal_eval的区别详解
Aug 10 #Python
You might like
一条久听不愿放下的DIY森海MX500,三言两语话神奇
2021/03/02 无线电
PHP+DBM的同学录程序(3)
2006/10/09 PHP
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
在php和MySql中计算时间差的方法
2011/04/22 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
php生成rss类用法实例
2015/04/14 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
Laravel学习教程之request validation的编写
2017/10/25 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
jQuery 事件队列调整方法
2009/09/18 Javascript
javascript确认框的三种使用方法
2013/12/17 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
jquery插件qrcode在线生成二维码
2015/04/26 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
2017/08/18 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
[48:45]Ti4 循环赛第二日 NEWBEE vs EG
2014/07/11 DOTA
利用Psyco提升Python运行速度
2014/12/24 Python
python使用datetime模块计算各种时间间隔的方法
2015/03/24 Python
Python基于回溯法子集树模板解决找零问题示例
2017/09/11 Python
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
django迁移数据库错误问题解决
2019/07/29 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
html Table 表头固定的实现
2019/01/22 HTML / CSS
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
南京软件公司的.net程序员笔试题
2014/08/31 面试题
电钳专业个人求职信
2014/01/04 职场文书
车祸赔偿收入证明
2014/01/09 职场文书
大学生水果店创业计划书
2014/01/28 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
教师思想工作总结2015
2015/05/13 职场文书
小学毕业感言100字
2015/07/30 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript
vue使用element-ui按需引入
2022/05/20 Vue.js