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 ...
随机推荐
- <HarmonyOS第一课10>ArkUI进阶#鸿蒙课程##鸿蒙生态#
课程介绍 <HarmonyOS第一课:ArkUI进阶>是专为HarmonyOS开发者设计的课程,旨在提升开发者在ArkUI框架中的布局技能.课程将重点讲解如何进行布局性能优化,包括精简节点 ...
- vue3 基础-条件渲染 v-if 和 v-show
本篇讲 vue 中对 dom 元素节点进行 "显示和隐藏" 的实现方式指令, 即 v-if 和 v-show. 其实一句话就能说明白, v-if 的底层是从 dom 树中增删节点; ...
- js操作session
// 保存数据到sessionStorage sessionStorage.setItem('key', 'value'); // 从sessionStorage获取数据 sessionStorage ...
- System.Drawing.Point与System.Windows.Point的异同
在C#中,System.Drawing.Point 和 System.Windows.Point 是两个不同的结构,分别属于不同的命名空间,用于表示二维平面中的点.尽管它们的功能相似,但在使用场景和实 ...
- OS期末复习总结
期末样题 : 链接:https://pan.baidu.com/s/12Mfi_lnhBDbuke6B_qCiJg 提取码:khp7 一.易错易混点: 下列进程调度算法中,可能引起进程长时间得不到运行 ...
- k维背包
题目链接:E - Product Development (atcoder.jp) 因为最多为5,因此可以暴力枚举 int dp[10][10][10][10][10]; int a[110][10] ...
- netcore 使用mongodb
docker 安装mongodb:docker pull mongo 运行容器 docker run -d -p 27017:27017 --name mongo01 -v /docker/mongo ...
- VKProxy新增速率限制功能
VKProxy 是使用c#开发的基于 Kestrel 实现 L4/L7的代理(感兴趣的同学烦请点个github小赞赞呢) 目前新添加了速率限制(限流)功能 什么是速率限制? 速率限制是限制可以访问的资 ...
- 建发弘爱 X 袋鼠云:加速提升精细化、数字化医疗健康服务能力
厦门建发弘爱医疗集团有限公司(简称"建发弘爱")创立于2022年,是厦门建发医疗健康投资有限公司的全资子公司,专业从事医疗健康领域的医疗服务. 建发弘爱通过医疗.健康及产业服务三大 ...
- window10本地搭建DeepSeek R1(二)
本章介绍在window上部署 DeepSeek R1-8B + Open WebUI :需要安装的有:Ollama,python 3.11,DeepSeek ,Open WebUI. 一:环境:我的w ...