跳到主要内容

使用 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 全栈课程」,查看后续完整讲解、案例演示和配套资料。

查看课程详情