Django实战:基于Django和openpyxl实现Excel导入导出功能
一、openpyxl 介绍
openpyxl 是一个用于读取和写入 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 库。使用场景包括:
- 数据分析:从 Excel 文件中读取数据,进行处理和分析。
- 自动化办公:自动生成报告、填写表格等。
- 数据导入导出:将数据从 Python 程序导入到 Excel,或将 Excel 数据导入到 Python 程序中。
安装openpyxl
pip install openpyxl
二、Excel文件下载
创建并保存 Excel 文件
示例:创建一个新的 Excel 工作簿,并写入一些数据,最后保存为文件
from openpyxl import Workbook
# 创建一个新的工作簿
workbook = Workbook()
# 获取默认的工作表
sheet = workbook.active
sheet.title = "MySheet" # 设置工作表标题
# 写入数据到单元格
sheet['A1'] = "Hello, Openpyxl!"
sheet['B2'] = 42
# 保存工作簿
workbook.save('new_example.xlsx')
Excel工具函数
为提高代码复用率,整理处理Excel工具函数
- create_excel_workbook():将数据
data按照指定字段和标签写入一个新的 Excel 工作簿,并设置表头和列宽。 - generate_excel_response():将
workbook(Excel 工作簿)生成 Excel 文件,并通过 HTTP 响应返回给客户端下载 - process_item():将一个数据项
item按照指定字段顺序fields转换为一行数据(列表) - convert_datetime():将带有时区信息的 ISO 格式时间字符串(如
"2023-01-01T12:34:56.789+08:00")转换为去除时区、毫秒并替换T为空格的字符串,输出格式为"YYYY-MM-DD HH:MM:SS"。
from urllib.parse import quote
from django.http import HttpResponse
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
def convert_datetime(datetime_str):
# 移除时区部分(+08:00)
datetime_without_tz = datetime_str.replace("+08:00", "")
# 移除 "T" 并截取到秒部分(去掉毫秒)
return datetime_without_tz.replace("T", " ").split(".")[0]
def process_item(item, fields, data_map={}):
"""将单个数据项转换为行数据"""
row = []
for field in fields:
value = item.get(field)
# 友好显示转换
if field in data_map:
value = data_map[field].get(value, None)
# 特殊字段类型转换
elif field == "id" or field == "job_id":
value = str(value)
elif field == "create_time" or field == "date_created" or field == "date_done":
value = convert_datetime(value)
row.append(value)
return row
def create_excel_workbook(data, fields_labels, data_map={}, sheet_name="Sheet1"):
"""
将数据写入Excel文件
"""
fields = list(fields_labels.keys())
labels = list(fields_labels.values())
# 创建一个 Excel 工作簿
workbook = Workbook()
sheet = workbook.active
sheet.title = sheet_name
# 设置表头
sheet.append(labels)
# 添加数据
for item in data:
row = process_item(item, fields, data_map)
sheet.append(row)
# 设置列宽
for col_num in range(1, len(labels) + 1):
col_letter = get_column_letter(col_num)
sheet.column_dimensions[col_letter].width = 15
return workbook
def generate_excel_response(workbook, file_name="export.xlsx"):
"""
生成 Excel 文件并返回 HTTP 响应。
"""
response = HttpResponse(
content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
)
response["Content-Disposition"] = f"attachment; filename={quote(file_name)}"
workbook.save(response)
return response
项目实战:Excel文件下载
实战场景:在Django+Vue3后台管理系统中,实现用户的导入导出功能是常见需求。用户导入功能,一般需要先下载模板,填写后再导入。

实战代码:定义视图,将示例数据导出为 Excel 文件并返回给用户下载,实现下载模板功能
@extend_schema(summary="获得用户导入模板")
@action(
methods=["get"],
detail=False,
url_path="get-import-template",
)
def get_import_template(self, request, *args, **kwargs):
"""获得用户导入模板"""
# 定义示例数据
data = [
{
"username": "xiaozhang",
"nickname": "小张",
"deptId": "103",
"email": "xz@qq.com",
"mobile": "13312345670",
"sex": "男",
"status": "开启",
},
{
"username": "xiaoli",
"nickname": "小李",
"deptId": "",
"email": "",
"mobile": "",
"sex": "",
"status": "关闭",
},
]
fields_labels = {
"username": "用户账号",
"nickname": "用户昵称",
"deptId": "部门编号",
"email": "用户邮箱",
"mobile": "手机号码",
"sex": "用户性别",
"status": "账号状态",
}
# 返回工作簿
workbook = create_excel_workbook(data, fields_labels)
return generate_excel_response(workbook, "用户导入模板.xlsx")
实现效果

三、Excel 文件上传
获取上传的文件
当 Django 处理文件上传时,文件数据会被放置在 request.FILES 中。获取上传文件示例
file = request.FILES.get("file")
读取Excel中的数据
示例:读取example.xlsx文件中的标题、单元格等信息
from openpyxl import load_workbook
# 加载一个已存在的Excel文件
workbook = load_workbook('example.xlsx')
# 获取工作簿中的工作表
sheet = workbook.active # 获取当前活动的工作表
print(sheet.title) # 输出工作表的标题
# 读取单元格的值
cell_value = sheet['A1'].value
print(cell_value)
项目实战:Excel文件上传
实战场景:在Django+Vue3后台管理系统中,实现用户导入功能
- 第一步:获取用户上传的文件
- 第二步:调用
get_user_import_data()函数,读取Excel文件中的用户数据,并将其转换为系统所需格式的字典列表。 - 第三步:使用序列化器,将用户信息保存到数据库

def get_user_import_data(file) -> list:
"""
读取Excel文件中的用户信息,并将其转换为字典列表
"""
# 加载Excel文件
workbook = load_workbook(file)
sheet = workbook.active
# 固定表头,以确保数据字段的一致性
headers = ["username", "nickname", "deptId", "email", "mobile", "sex", "status"]
# 初始化数据列表
data = []
# 遍历每一行数据
for row in sheet.iter_rows(min_row=2, values_only=True):
# 将当前行数据与表头 zip 后转换为字典
user_data = dict(zip(headers, row))
# 转换 sex 和 status 字段
user_data["sex"] = (
1 if user_data["sex"] == "男" else 2 if user_data["sex"] == "女" else 0
)
user_data["status"] = (
0
if user_data["status"] == "开启"
else 1 if user_data["status"] == "关闭" else None
)
data.append(user_data)
return data
实现效果:点击查看完整代码

您正在阅读的是《Django从入门到实战》专栏!关注不迷路~
Django实战:基于Django和openpyxl实现Excel导入导出功能的更多相关文章
- ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码
实用类:UtilityClass 包含如下方法 判断对象是否为空或NULL,如果是空或NULL返回true,否则返回false 验证手机号是否正确 13,15,18 验证邮箱 验证网址 MD5加密,返 ...
- java 实现Excel导入导出功能
本文记录 首先需要准备一个导入模板的实体类 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn ...
- 实现excel导入导出功能,excel导入数据到页面中,页面数据导出生成excel文件
今天接到项目中的一个功能,要实现excel的导入,导出功能.这个看起来思路比较清楚,但是做起了就遇到了不少问题. 不过核心的问题,大家也不会遇到了.每个项目前台页面,以及数据填充方式都不一样,不过大多 ...
- thinkphp-PHP实现Excel导入 导出功能
Excel导出 //功能:导出题库模板 public function get_contract_ex() { ob_get_clean(); header("Content-Typ:tex ...
- 基于 POI 封装 ExcelUtil 精简的 Excel 导入导出
注 本文是使用 org.apache.poi 进行一次简单的封装,适用于大部分 excel 导入导出功能.过程中可能会用到反射,如若有对于性能有极致强迫症的同学,看看就好. 序 由于 poi 本身只是 ...
- 企业级自定义表单引擎解决方案(十六)--Excel导入导出
Excel对于后端管理系统来说,永远都是绕不开的话题,开发Excel导入导出功能往往都比较麻烦,因为涉及到Excel导入模板制作.Excel表格数据与系统数据库表字段映射.Excel导入数据验证.验证 ...
- 基于EPPlus和NPOI实现的Excel导入导出
基于EPPlus和NPOI实现的Excel导入导出 CollapseNav.Net.Tool.Excel(NuGet地址) 太长不看 导入 excel 文件流将会转为 ExcelTestDto 类型的 ...
- 基于POI的Excel导入导出(JAVA实现)
今天做了个excel的导入导出功能,在这记录下. 首先现在相关poi的相关jar包,资源链接:http://download.csdn.net/detail/opening_world/9663247 ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- Mego(04) - NET简单实现EXCEL导入导出
前言 相信做过信息系统的朋友都会遇到EXCEL导入导出的相关开发,做过不少EXCEL导入导出后总结起来大致有如下几种方式实现: ADO.NET的OldDb或ODBC连接EXCEL使用DataTable ...
随机推荐
- final year project:C++手写numpy并移植到RISC-V上——纪念我在中科院实习的日子
我毕设做的项目是用C++去实现一个Numpy,因为我是大数据专业,Numpy又是跟数据分析有关的工具,所以我打算自己动手去实现一个小型的Numpy,目前代码规模大概在六千多行左右,并且可以成功移植 ...
- Grid 布局-容器项
grid 网格布局是一个用于web的二维布局系统, 多行多列. flex 单行布局则更倾向于一维布局, 一行或者一列. Grid 重点 只是用表格进行排版哈, 横向内容直接无关联哦. 容器项 子项 布 ...
- C#之使用线程池
简述 创建线程是昂贵的操作,所以为每个短暂的异步操作创建线程会产生显著的开销,线程池就是该问题的解决方案,我们事先分配一定的资源,将这些资源放入资源池,每次需要新的资源,只需从池中获取一个,而不用创建 ...
- AI 制作游戏美术素材流程分享(程序员方向粗糙版)
AI 制作游戏美术素材分享(程序员方向粗糙版) 视频讲解: 抖音:https://www.douyin.com/user/self?from_tab_name=main&modal_id=75 ...
- linux下动态壁纸(ubuntu20.04测试)
linux下实现动态壁纸(ubuntu20.04测试) github地址: https://github.com/dependon/fantascene-dynamic-wallpaper bilib ...
- 【Spring Boot】ActiveMQ 设置访问密码
Apache ActiveMQ是Apache出品,是最流行的,能力很强的开源消息总线.默认情况下,程序连接ActiveMQ是不需要密码的,为了安装起见,需要设置密码,提高安全性.本文分享如何设置访问A ...
- pytorch入门 - LetNet5 神经网络
1.LetNet5简介 LeNet5是由Yann LeCun等人在1998年提出的一种卷积神经网络架构,主要用于手写数字识别.它是早期卷积神经网络的成功应用之一,为现代深度学习模型奠定了基础.LeNe ...
- Graph ⋈ Agent:Chat2Graph 如何重构 GraphRAG 范式?
引言 去年年底,我在<2024年度 Graph+AI 开源探索思考>一文中,细致拆解并总结了 TuGraph 在「Graph+AI」领域的开源技术实践经验.文中引用了一段业内不成文的观点: ...
- CAE科普!电池仿真的必要性
在当前高油价与低排放的双重挑战下,新能源汽车以其动力电池驱动的特性成为了低碳环保.节能减排的必然选择.然而,电池系统性能的好坏直接关系到新能源电动汽车的行驶里程和使用便利性,其中充电时间.效率.能量密 ...
- HarmonyOS应用一键置灰指南
一键置灰通常应用于如下场景 1. 重大悼念活动: 在国家发生重大灾难.事故或举行悼念日等特殊时期,为了表达对逝者的尊重和哀悼,许多 APP 会将界面置灰.例如,在一些地震.空难等灾难事件发生后,以及全 ...