博主今天整理下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. C++ 引用的辨别

    对于习惯使用C进行开发的朋友们,在看到c++中出现的&符号,可能会犯迷糊,因为在C语言中这个符号表示了取地址符,但是在C++中它却有着不同的用途,掌握C++的&符号,是提高代码执行效率 ...

  2. mysql 一对多,多对多

    一对多 一对多与多对一是一个概念,指的是一个实体的某个数据与另外一个实体的多个数据有关联关系. 班级表(一表) 名称 教室 总人数 学科 PHP141115 A814 53 PHP PHP140925 ...

  3. 云笔记类APP推荐

    一.思绪收集类 Google Keep - 记事和清单 - Google Play 上的应用 注:谷歌 Keep 是最方便的收集思绪 APP 了.卡片视图,反应迅速,流畅,UI 漂亮,功能齐全,唯一不 ...

  4. OA之为用户设置角色和为用户设置权限

    1.为用户设置角色 { Layout = null; } @using OA.Model <!DOCTYPE html> <html> <head> <met ...

  5. 表空间Tablespace

    SQL Fundamentals: 表的创建和管理(表的基本操作,闪回技术flashback,表结构修改) Oracle Schema Objects——Tables——TableStorage 数据 ...

  6. This module embeds Lua, via LuaJIT 2.0/2.1, into Nginx and by leveraging Nginx's subrequests, allows the integration of the powerful Lua threads (Lua coroutines) into the Nginx event model.

    openresty/lua-nginx-module: Embed the Power of Lua into NGINX HTTP servers https://github.com/openre ...

  7. installEventFilter可以安装到任何QObject的子类,并不仅仅是UI组件。事件过滤器和安装过滤器的组件必须在同一线程,在它们分属在不同线程时,事件过滤器也是不起作用的

    Qt的事件知识点: ①事件对象创建完毕后,Qt 将这个事件对象传递给 QObject 的 event() 函数.event() 函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的 ...

  8. 第1章 1.3计算机网络概述--规划IP地址介绍MAC地址

    IP地址的作用是:指定发送数据者和接收数据者. MAC地址的作用:指定数据包的下一跳转设备.就是说明数据下一步向谁发. 路由器的作用:在不同的网段中转发数据.路由器本质就是有2个网卡的设备. 网卡:用 ...

  9. Python-装饰器-案例-获取文件列表

    import os def get_all_path(fun): '''装饰器.功能:获取全路径文件名.如:D:/tmp/12.txt :param fun: :return:file_path_li ...

  10. [Axiom3D]第一个Axiom3D程序

    Axiom3D程序的基本渲染流程 #region Namespace Declarations using System; using System.Linq; using Axiom.Core; u ...