当前位置: 首页 > news >正文

Django实战:基于Django和openpyxl实现Excel导入导出功能

文章目录

    • 一、openpyxl 介绍
    • 二、Excel文件下载
      • 创建并保存 Excel 文件
      • Excel工具函数
      • 项目实战:Excel文件下载
    • 三、Excel 文件上传
      • 获取上传的文件
      • 读取Excel中的数据
      • 项目实战: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_letterdef 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 rowdef 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.activesheet.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 = 15return workbookdef 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"] = (0if user_data["status"] == "开启"else 1 if user_data["status"] == "关闭" else None)data.append(user_data)return data

实现效果:点击查看完整代码

在这里插入图片描述


您正在阅读的是《Django从入门到实战》专栏!关注不迷路~

http://www.dtcms.com/a/289944.html

相关文章:

  • 基于python django的BOSS直聘网站计算机岗位数据分析与可视化系统,包括薪酬预测及岗位推荐,推荐算法为融合算法
  • 智能体性能优化:延迟、吞吐量与成本控制
  • django filter按两个属性 去重
  • JAVA面试宝典 -《 架构演进:从单体到 Service Mesh》
  • Go从入门到精通(26) - 一个简单web项目-实现服务注册
  • Go语言实战案例-读取CSV文件并打印
  • python 正则表达式
  • 借助 Amazon SageMaker Catalog 功能,简化从数据到洞察的路径
  • FastLLVE:实时低光视频增强新突破
  • 大端小端:数据存储的核心密码
  • Apache IoTDB(2):时序数据库 IoTDB 集群安装部署的技术优势与适用场景分析
  • 论文Review Lidar 3DGS Splat-LOAM: Gaussian Splatting LiDAR Odometry and Mapping
  • 【软件基础学习配置那些事 4-3】3ds Max2026 菜单栏常用命令-----文件、视图、编辑、工具、组
  • 深入详解随机森林在放射治疗计划优化中的应用及实现细节
  • 暴力破解练习
  • Reptile元学习算法复现实战:在Omniglot数据集上的少样本学习探索
  • 【AlphaFold3】网络架构篇(1)|概览+预测算法
  • 面试总结第54天微服务开始
  • 基础神经网络模型搭建
  • AI效能之AI单测(一)
  • MCP协议解析:如何通过Model Context Protocol 实现高效的AI客户端与服务端交互
  • c++ duiLib 使用xml文件编写界面布局
  • MyBatis Plus高效开发指南
  • 【PyTorch】图像二分类项目
  • JWT原理及利用手法
  • XTTS实现语音克隆:精确控制音频格式与生成流程【TTS的实战指南】
  • `SearchTransportService` 是 **协调节点与数据节点之间“搜索子请求”通信的运输层**
  • 如何用immich将苹果手机中的照片备份到指定文件夹
  • 开发工具缓存目录
  • 零基础学习性能测试第一章:核心性能指标-响应时间