Django框架(上传Excel文件并读取)
博主今天整理下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">×</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文件并读取)的更多相关文章
- 【asp.net】asp.net实现上传Excel文件并读取数据
#前台代码:使用服务端控件实现上传 <form id="form1" runat="server"> <div> <asp:Fil ...
- 上传excel文件,读取内容,增加事务写入数据库
package com.inspur.icpmg.itss.asset.dao.impl; import com.inspur.icpmg.util.DBHelper; import org.apac ...
- 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的路由方案,与原来的方案在使用上差别不 ...
- java上传excel文件及解析
java上传excel文件及解析 CreateTime--2018年3月5日16:25:14 Author:Marydon 一.准备工作 1.1 文件上传插件:swfupload: 1.2 文件上 ...
- js上传Excel文件
一.问题 需要在项目里添加一个上传excel文件的功能,因为其他同样的后台里面有上传文件的功能,第一反应就是想着直接用.了解了一下发现它是利用bootstrap的fileinput实现的,但是我怎么都 ...
- asp.net上传Excel文件到服务端进行读取
1.我们IIS是使用7.5,由于在网站中上传Excel文件到服务端进行数据读取时候出现读取失败情况.一开始以为是没有按照office软件问题,其实不然,因为server是64位操作系统,如果我们要使用 ...
- jsp上传excel文件并导入数据库
1,excel文件的上传 需要借助jar包:commons-fileupload-1.2.1.jar以及commons-io-1.3.2.jar 前端的html文件 <form id=" ...
- jmert中如何测试上传文件接口(测试上传excel文件)
第一次用jmeter这个工具测试上传接口,以前没做过这一块,导致走了很多弯路.特地把经验谢谢,怕自己以后忘记... 一,jmeter如何上传文件 jmeter 的 http requests post ...
- 基于Spring MVC实现基于form表单上传Excel文件,批量导入数据
在pom.xml中引入: <!--处理2003 excel--> <dependency> <groupId>org.apache.poi</groupId& ...
随机推荐
- Eclipse中将Java项目转换成Web项目的方法(转)
前言: 用Eclipse开发项目的时候,把一个Web项目导入到Eclipse里会变成了一个java工程,将无法在Tomcat中进行部署运行. 方法: 1.找到.project文件,找到里面的<n ...
- vscode 中使用 csscomb
我看中 csscomb 主要是用来给 css 属性排序用的,当然他也有格式化的作用: 1.安装不必说,但是装了之后,默认似乎没用: 2.点开 文件-首选项,搜下 csscomb 就知道了: 3.第一个 ...
- shell 变量定义技巧总结
可以多学习和模仿操作系统自带的/etc/init.d/functions函数库脚本的定义思路,多学习Linux系统脚本中的定义,有经验的读者最终应形成一套适合自己的规范和习惯. (1)变量名及变量内容 ...
- uva 11105 - Semi-prime H-numbers(数论)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011328934/article/details/36644069 option=com_onli ...
- Spring源码解析(二)BeanDefinition的Resource定位
IOC容器的初始化过程主要包括BeanDefinition的Resource定位.载入和注册.在实际项目中我们基本上操作的都是ApplicationContex的实现,我们比较熟悉的ClassPath ...
- namenode 问题小记
问题1:namenode进程故障 Namenode挂掉,Namenode gc日志里面YGC报错promotion failed 现象描述 NameNode进程挂掉,Namenode gc日志里面YG ...
- Mybatis怎么在mapper中用多个参数
原文地址:https://github.com/mybatis/mybatis-3/wiki/FAQ How do I use multiple parameters in a mapper? Jav ...
- 1107 Social Clusters[并查集][难]
1107 Social Clusters(30 分) When register on a social network, you are always asked to specify your h ...
- Hadoop mapreduce自定义排序WritableComparable
本文发表于本人博客. 今天继续写练习题,上次对分区稍微理解了一下,那根据那个步骤分区.排序.分组.规约来的话,今天应该是要写个排序有关的例子了,那好现在就开始! 说到排序我们可以查看下hadoop源码 ...
- Ubuntu 添加用户到 sudoer
一.概述 新建用户后,我们可能需要该用户能够使用一些越权的东西.sudo命令能够暂时提升该用户的权限到root,但是前提是要求该用户存在与 sudoer list 中. sudoers 存储在 /et ...