博主今天整理下Django框架中上传Excel文件并读取

博主是要在管理平台中新增用例的维护功能,想着通过上传Excel文件来展示用例,下面是项目的路径图:

首先先建数据库模型

model.py

可以根据上传的日期区分目录

 # 用例文件
class CaseFile(models.Model):
case_class = models.ForeignKey(CaseClass)
file_name = models.FileField(upload_to='case/%Y/%m/%d/', verbose_name=u"文件名称") # 不注释会报错
# def __str__(self):
# return self.file_name # 定义表名称
class Meta:
verbose_name = "用例文件管理"
verbose_name_plural = "用例文件管理"

第二步

settings.py

配置文件上传路径

 # 文件上传配置
MEDIA_ROOT = os.path.join(BASE_DIR, 'upload/')
MEDIA_URL = '/upload/'

第三步

新建excel.py

根据excel的数据来提取自己需要的转化成json格式,再组成数组

 # -*- coding: utf-8 -*-

 import xlrd
from MyPlatform.settings import MEDIA_ROOT class ExcelImport:
def __init__(self, file_name, version):
# self.file_name = unicode(file_name, "utf-8")
# 文件路径修改
self.file_name = (MEDIA_ROOT + str(file_name)).replace("/", "\\").decode("utf-8")
# print self.file_name
self.workbook = xlrd.open_workbook(self.file_name)
self.table = self.workbook.sheets()[0]
# 获取总行数
self.nrows = self.table.nrows # 版本号
self.version = version self.cases = [] def get_cases(self):
# 从第二行开始
for x in range(1, self.nrows):
row = self.table.row_values(x)
self.cases.append(
{
"case_class": row[3],
"name": row[4],
"code": row[0],
"level": row[5],
"condition": row[6],
"step": row[7],
"expected_result": row[9],
"version": self.version
}
)

第四步

forms.py

表单中新建文件表单

 # 文件上传表单
class FileForm(forms.Form):
file_name = forms.FileField(label=u"用例文件")

第五步

views.py

完成上传的逻辑

 # 用例导入
def case_excel_import(request, class_id):
# 判断是否有session
username = request.session.get("username")
if username:
# 如果有session 获取指定信息
if request.method == "POST":
ff = FileForm(request.POST, request.FILES)
# file_name = request.FILES.get('exampleInputFile')
if ff.is_valid():
file_name = ff.cleaned_data["file_name"] # 向数据库中新增用例文件数据
case_file = CaseFile()
case_file.case_class_id = int(class_id)
case_file.file_name = file_name
case_file.save()
# print case_file.file_name # 返回上传成功
messages.add_message(request, messages.INFO, u"上传成功!")
try:
build_case_import(file_name=case_file.file_name)
except Exception, e:
messages.add_message(request, messages.INFO, u"用例导入出错:" + str(e))
return HttpResponseRedirect("/caseList/" + class_id, {"ff": ff})
else:
ff = FileForm()
messages.add_message(request, messages.INFO, u"请选择文件!")
return HttpResponseRedirect("/caseList/" + class_id, {"ff": ff})
else:
ff = FileForm()
return HttpResponseRedirect("/caseList/" + class_id, {"ff": ff})
else:
# 如果没有session,重定向到路由 /login/, 返回表单
uf = UserForm(request.POST)
# 重定向
return HttpResponseRedirect("/login/", {"uf": uf})

导入成功后前端回显展示

前端代码:

博主使用的是模态框

 <div class="modal modal-default fade" id="modal-class">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span></button>
<h4 class="modal-title">上传用例文件</h4>
</div>
<div class="modal-body">
<form class="form-group" enctype="multipart/form-data" method="post" action="/caseExcelImport/{{ case_class_one.id }}">
{% csrf_token %}
{{ ff.as_p }}
<p class="help-block">请求确保文件格式正确 .</p>
<p class="help-block">用例模块文件可下载 .</p>
<a href="/download/template" class="btn btn-default">
<i class="fa fa-download"> 下载</i>
</a>
<p class="help-block">excel格式的文件 .</p>
<p class="help-block">文件中小模块一栏填入最终所属测试模块 .</p>
<input type="submit" class="btn btn-default" value="上传"/>
<button type="button" class="btn btn-default pull-right" data-dismiss="modal">取消</button>
</form>
</div>
</div>
</div>
</div>

列表展示代码:

 <div class="row">
<div class="col-xs-12">
<div class="box">
<div class="box-header">
<h3 class="box-title">用例模块:{{ case_class_one.name }}</h3>
</div>
<!-- /.box-header -->
<div class="box-body">
<p>
<button type="button" class="btn btn-default" data-toggle="modal" data-target="#modal-class" data-id="{{ case_class_one.id }}">
<i class="fa fa-caret-square-o-right"> 导入</i>
</button>
</p>
<table id="testcase" class="table table-bordered table-striped">
<thead>
<tr>
<th>用例编号</th>
<th>用例名称</th>
<th>用例等级</th>
<th>期望结果</th>
<th>操作按钮</th>
</tr>
</thead>
<tbody>
{% for case in cases %}
<tr>
<td>{{ case.code }}</td>
<td>{{ case.name }}</td>
<td>Level {{ case.level }}</td>
<td>{{ case.expected_result }}</td>
<td>
<a href="/caseInfo/{{ case_class_one.id }}/{{ case.case_id }}" >
<i class="fa fa-folder-open"> 查看</i>
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<!-- /.box-body -->
</div>
</div>
</div>

前端效果:

Django框架(上传Excel文件并读取)的更多相关文章

  1. 【asp.net】asp.net实现上传Excel文件并读取数据

    #前台代码:使用服务端控件实现上传 <form id="form1" runat="server"> <div> <asp:Fil ...

  2. 上传excel文件,读取内容,增加事务写入数据库

    package com.inspur.icpmg.itss.asset.dao.impl; import com.inspur.icpmg.util.DBHelper; import org.apac ...

  3. ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据

    ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案   ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不 ...

  4. java上传excel文件及解析

      java上传excel文件及解析 CreateTime--2018年3月5日16:25:14 Author:Marydon 一.准备工作 1.1 文件上传插件:swfupload: 1.2 文件上 ...

  5. js上传Excel文件

    一.问题 需要在项目里添加一个上传excel文件的功能,因为其他同样的后台里面有上传文件的功能,第一反应就是想着直接用.了解了一下发现它是利用bootstrap的fileinput实现的,但是我怎么都 ...

  6. asp.net上传Excel文件到服务端进行读取

    1.我们IIS是使用7.5,由于在网站中上传Excel文件到服务端进行数据读取时候出现读取失败情况.一开始以为是没有按照office软件问题,其实不然,因为server是64位操作系统,如果我们要使用 ...

  7. jsp上传excel文件并导入数据库

    1,excel文件的上传 需要借助jar包:commons-fileupload-1.2.1.jar以及commons-io-1.3.2.jar 前端的html文件 <form id=" ...

  8. jmert中如何测试上传文件接口(测试上传excel文件)

    第一次用jmeter这个工具测试上传接口,以前没做过这一块,导致走了很多弯路.特地把经验谢谢,怕自己以后忘记... 一,jmeter如何上传文件 jmeter 的 http requests post ...

  9. 基于Spring MVC实现基于form表单上传Excel文件,批量导入数据

    在pom.xml中引入: <!--处理2003 excel--> <dependency> <groupId>org.apache.poi</groupId& ...

随机推荐

  1. 其他ip无法访问Yii的gii,配置ip就可以

    该文件下的IP ///public $allowedIPs = ['127.0.0.1', '::1']; 修改这里的IP就可以了  

  2. EasyUI之Layout布局和Tabs页签的使用

    1.JQuery EasyUI之LayOut布局 EasyUI是一款基于JQuery开发的前端框架,它集成很多漂亮的样式和相应的功能,大大方便了我们对前端开发的难度.对于web项目而言,主页面的一定是 ...

  3. Android中的Apk的加固(加壳)原理解析和实现(转)

    一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...

  4. Java中内部类揭秘(一):外部类与非静态内部类的”相互可见性“

               声明:本博客为原创博客.未经同意,不得转载.原文链接为 http://blog.csdn.net/bettarwang/article/details/27012421.     ...

  5. Linux /proc/pid目录下各文件含义

    /proc 是一个伪文件系统, 被用作内核数据结构的接口, 而不仅仅是解释说明/dev/kmem. /proc 里的大多数文件都是只读的, 但也可以通过写一些文件来改变内核变量. ( Linux 内核 ...

  6. Status Code状态码详解对照表

    状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必须在 ...

  7. 《大话设计模式》ruby版代码:建造者模式

    需求: 画一个小人,有头,有身体,两手两脚即可. 初始代码: # -*- encoding: utf-8 -*- #小人一 puts '这是第一个小人' puts '小人一:头' puts '小人一: ...

  8. [LeetCode]206. Reverse Linked List(链表反转)

    Reverse a singly linked list. click to show more hints. Subscribe to see which companies asked this ...

  9. 382. Linked List Random Node(蓄水池采样)

    1. 问题 给定一个单链表,随机返回一个结点,要求每个结点被选中的概率相等. 2. 思路 在一个给定长度的数组中等概率抽取一个数,可以简单用随机函数random.randint(0, n-1)得到索引 ...

  10. Python: 矩阵与线性代数运算

    需要执行矩阵和线性代数运算,比如矩阵乘法.寻找行列式.求解线性方程组等等. 矩阵类似于3.9 小节中数组对象,但是遵循线性代数的计算规则.下面的一个例子展示了矩阵的一些基本特性: >>&g ...