使用 openpyxl 解析 Excel 并批量写入数据库
使用 openpyxl 解析 Excel 并批量写入数据库
上一节我们使用了SweetAlert上传了学生信息的excel,单击upload并不会真正的提交。接下来,我们就正式进入Excel 数据解析与入库的核心环节。
现在要做的事情是先准备后端的路由和视图,然后再把 Excel 里的学生数据,安全、规范地写入数据库。
1.创建上传视图函数
由于导入功能是一个相对独立的操作,这里我们不使用 CBV(类视图),而是采用简单的函数视图,逻辑更直观。
1.创建 URL
# 代码位置:students/urls.py
from django.urls import path
from .views import upload_student
urlpatterns = [
# 新增
path('upload_student', upload_student, name='upload_student'),
]
2.定义视图函数
def upload_student(request):
pass
这里我们先把函数定义好,接下来逐步补全逻辑。
1️⃣ 判断请求方式
由于前端使用的是 POST 请求,上传的文件可以通过 request.FILES 获取,如果用户没有上传文件,返回错误信息,代码如下:
# 代码位置:students/views.py
def upload_student(request):
if request.method == 'POST':
file = request.FILES.get('excel_file')
print(f"file is {file}")
# 判断文件是否上传
if not file:
return JsonResponse({
'status': 'error',
'messages': '请上传excel文件'
}, status=400)
2️⃣ 校验文件类型(是否为 Excel)
接下来需要判断用户上传的是否为excel文件。你可能会说在前端SweetAlert已经校验了,但是请记住:永远不要相信前端提交的数据,一定要在后端进行校验。
这里我们使用 Python 内置模块 pathlib 来处理文件后缀:
from pathlib import Path
获取文件后缀名:
ext = Path(file.name).suffix.lower()
upload_student()方法中继续编写代码,判断是否为 Excel 文件:
# 代码位置:students/views.py
def upload_student(request):
"""上传学生信息excel"""
if request.method == 'POST':
file = request.FILES.get('excel_file')
print(f"file is {file}")
# 判断文件是否上传
if not file:
return JsonResponse({
'status': 'error',
'messages': '请上传excel文件'
}, status=400)
# 判断文件类型是否为excel
ext = Path(file.name).suffix
if ext.lower() != '.xlsx':
return JsonResponse({
'status': 'error',
'messages': '文件类型错误,请上传.xlsx格式的文件'
}, status=400)
2.Excel 数据解析与入库
1.读取 Excel 数据
这里我们继续使用 openpyxl 来处理 Excel 文件的读取。
在我们的 utils 目录中,其实已经封装好了一个专门用来处理 Excel 的文件 —— handle_excel.py,里面有一个读取 Excel 的类,所以这里我们直接导入即可:
from utils.handle_excel import ReadExcel
接下来我们先实例化这个读取类,把前面接收到的 file 传进去:
reader = ReadExcel(file)
然后调用它的方法,获取 Excel 中的所有数据:
data = reader.get_data()
此时的 data 是一个二维列表:
- 外层列表:代表每一行
- 内层列表:代表这一行中的每一个单元格数据
2.校验 Excel 表头格式
在真正写入数据库之前,第一件必须要做的事情就是校验表头。
也就是说,我们要检查 Excel 的第一行,是不是我们系统所规定的格式,比如:
- 班级
- 姓名
- 学籍号
- 性别
- 出生日期
- 联系电话
- 家庭住址
如果用户上传的 Excel 表头不符合这个规范,那么后续的数据我们是无法正确入库的。
继续阅读完整内容
以上为免费预览。前往「Django + Vue 全栈课程」,查看后续完整讲解、案例演示和配套资料。
查看课程详情