Django导出Excel,前端下载_django 生成excel 并返回地址给前端下载

题记:实现这个功能也是遇到各自坑,各自查资料,从昨天到今天早上,也算是理通了,实现了交互与下载excel表小功能,这个下载功能也算是比较常用的,也感谢那些免费提供资料的网上的小伙伴们,我也把问题记录下来,大家有需要都可以查阅。

文章目录

坑一:出现403(Forbidden)的错误。

在这里插入图片描述
在这里插入图片描述
问题解决:可以在django项目的setting.py下注释‘‘django.middleware.csrf.CsrfViewMiddleware’’。
在这里插入图片描述

坑二:用ajax请求不能异步下载文件,这是小点,不过进去了,就是无底洞。

django后台代码:

from django.http import HttpResponse
from django.shortcuts import render
import openpyxl
from io import BytesIO
#显示界面
def index(request):
    return render(request,'index.html')
#生成所需方法
base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)]
# bin2dec
# 二进制 to 十进制: int(str,n=10)
def bin2dec(string_num):
    return str(int(string_num, 2))
# dec2bin
# 十进制 to 二进制: bin()
def dec2bin(string_num):
    num = int(string_num)
    mid = []
    while True:
        if num == 0: break
        num,rem = divmod(num, 2)
        mid.append(base[rem])
    return ''.join([str(x) for x in mid[::-1]])
# dec2hex
# 十进制 to 十六进制: hex()
def dec2hex(string_num):
    num = int(string_num)
    mid = []
    while True:
        if num == 0: break
        num,rem = divmod(num, 16)
        mid.append(base[rem])
    return ''.join([str(x) for x in mid[::-1]])
#二进制 to 十六进制
def bin2hex(string_num):
    return dec2hex(bin2dec(string_num))
# hex2dec
# 十六进制 to 十进制
def hex2dec(string_num):
    return str(int(string_num.upper(), 16))
# 十六进制 to 二进制: bin(int(str,16))
def hex2bin(string_num):
    return dec2bin(hex2dec(string_num.upper()))
#为字符串按照输入长度补'0'
def add\_zero(str,gd_length):
    if (str.__len__() < gd_length):
        add_zero = '0'
        for i in range(gd_length - str.__len__() - 1):
            add_zero += '0'
        str = add_zero + str
    return str

def EPC(request):
    #获取数据
    CompanyPrefixLength = int(request.POST.get('CompanyPrefixLength', 0))
    FilterValue = request.POST.get('FilterValue', 0)
    UPC = request.POST.get('UPC', 0)
    SerialNumber = int(request.POST.get('SerialNumber', 0)) - 1
    StartSerialNumber = SerialNumber + 1
    AllNumber = int(request.POST.get('AllNumber', 0))
    #创建excel表
    wb = openpyxl.Workbook()
    wa = wb.active
    wa.column_dimensions['B'].width = 15
    wa.column_dimensions['C'].width = 20
    wa.column_dimensions['D'].width = 30
    wa.append(['ID', 'SerialNumber', 'BarCode', 'EPC'])
    ID = 0
    ExcelIndex = 1  # excel插入行数据索引
    #Header 二进制8bits
    Header_bits = '00110000'
    #filter过滤值3bits
    if FilterValue == '0':
        Filter_bits = '000'
    elif FilterValue == '1':
        Filter_bits = '001'
    elif FilterValue == '2':
        Filter_bits = '010'
    elif FilterValue == '3':
        Filter_bits = '011'
    elif FilterValue == '4':
        Filter_bits = '100'
    elif FilterValue == '5':
        Filter_bits = '101'
    elif FilterValue == '6':
        Filter_bits = '110'
    elif FilterValue == '7':
        Filter_bits = '111'
    else:
        print('error')
    # 根据GS1公司前缀长度进而判断
    if CompanyPrefixLength == 6:
        Cutoff_Point = 7
        GS1_Company_Prefix_bitslen = 20
        ID_IRN_bitslen = 24
        Partition_bits = '110'  # 6
    elif CompanyPrefixLength == 7:
        Cutoff_Point = 8
        GS1_Company_Prefix_bitslen = 24
        ID_IRN_bitslen = 20
        Partition_bits = '101'  # 5
    elif CompanyPrefixLength == 8:
        Cutoff_Point = 9
        GS1_Company_Prefix_bitslen = 27
        ID_IRN_bitslen = 17
        Partition_bits = '100'  # 4
    elif CompanyPrefixLength == 9:
        Cutoff_Point = 10
        GS1_Company_Prefix_bitslen = 30
        ID_IRN_bitslen = 14
        Partition_bits = '011'  # 3
    elif CompanyPrefixLength == 10:
        Cutoff_Point = 11
        GS1_Company_Prefix_bitslen = 34
        ID_IRN_bitslen = 10
        Partition_bits = '010'  # 2
    elif CompanyPrefixLength == 11:
        Cutoff_Point = 12
        GS1_Company_Prefix_bitslen = 37
        ID_IRN_bitslen = 7
        Partition_bits = '001'  # 1
    elif CompanyPrefixLength == 12:
        Cutoff_Point = 13
        GS1_Company_Prefix_bitslen = 40
        ID_IRN_bitslen = 4
        Partition_bits = '000'  # 0

    GTIN_BITS_PRO = Header_bits + Filter_bits + Partition_bits
    GS1_Company_Prefix = UPC[1:Cutoff_Point]
    ID_IRN = UPC[0] + UPC[Cutoff_Point:13]
    # GS1\_Company\_Prefix化为二进制,如果不够规定位数,前面加'0'
    GS1_Company_Prefix_bits = add_zero(dec2bin(GS1_Company_Prefix), GS1_Company_Prefix_bitslen)  # 24bits
    # ID\_IRN 化为二进制,如果不够规定位数,前面加'0'


### 学习笔记

主要内容包括**html,css,html5,css3,JavaScript,正则表达式,函数,BOM,DOM,jQuery,AJAX,vue**等等

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**

>**HTML/CSS**

**HTML:**HTML基本结构,标签属性,事件属性,文本标签,多媒体标签,列表 / 表格 / 表单标签,其他语义化标签,网页结构,模块划分

**CSS:**CSS代码语法,CSS 放置位置,CSS的继承,选择器的种类/优先级,背景样式,字体样式,文本属性,基本样式,样式重置,盒模型样式,浮动float,定位position,浏览器默认样式

![](https://img-blog.csdnimg.cn/img_convert/07bd88684c148d87af2f45992483beb1.webp?x-oss-process=image/format,png)

>**HTML5 /CSS3**

**HTML5:**HTML5 的优势,HTML5 废弃元素,HTML5 新增元素,HTML5 表单相关元素和属性

**CSS3:**CSS3 新增选择器,CSS3 新增属性,新增变形动画属性,3D变形属性,CSS3 的过渡属性,CSS3 的动画属性,CSS3 新增多列属性,CSS3新增单位,弹性盒模型

![](https://img-blog.csdnimg.cn/img_convert/9a84fe3bc13a8a485b1fe91e6c4593b0.webp?x-oss-process=image/format,png)

>**JavaScript**

**JavaScript:**JavaScript基础,JavaScript数据类型,算术运算,强制转换,赋值运算,关系运算,逻辑运算,三元运算,分支循环,switch,while,do-while,for,break,continue,数组,数组方法,二维数组,字符串

转存中...(img-131vOqfR-1714142053808)]

>**JavaScript**

**JavaScript:**JavaScript基础,JavaScript数据类型,算术运算,强制转换,赋值运算,关系运算,逻辑运算,三元运算,分支循环,switch,while,do-while,for,break,continue,数组,数组方法,二维数组,字符串

![](https://img-blog.csdnimg.cn/img_convert/060c0b20598413d3b55b7719a396f9d1.webp?x-oss-process=image/format,png)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值