一、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导入导出功能的更多相关文章

  1. ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码

    实用类:UtilityClass 包含如下方法 判断对象是否为空或NULL,如果是空或NULL返回true,否则返回false 验证手机号是否正确 13,15,18 验证邮箱 验证网址 MD5加密,返 ...

  2. java 实现Excel导入导出功能

    本文记录 首先需要准备一个导入模板的实体类 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; import cn ...

  3. 实现excel导入导出功能,excel导入数据到页面中,页面数据导出生成excel文件

    今天接到项目中的一个功能,要实现excel的导入,导出功能.这个看起来思路比较清楚,但是做起了就遇到了不少问题. 不过核心的问题,大家也不会遇到了.每个项目前台页面,以及数据填充方式都不一样,不过大多 ...

  4. thinkphp-PHP实现Excel导入 导出功能

    Excel导出 //功能:导出题库模板 public function get_contract_ex() { ob_get_clean(); header("Content-Typ:tex ...

  5. 基于 POI 封装 ExcelUtil 精简的 Excel 导入导出

    注 本文是使用 org.apache.poi 进行一次简单的封装,适用于大部分 excel 导入导出功能.过程中可能会用到反射,如若有对于性能有极致强迫症的同学,看看就好. 序 由于 poi 本身只是 ...

  6. 企业级自定义表单引擎解决方案(十六)--Excel导入导出

    Excel对于后端管理系统来说,永远都是绕不开的话题,开发Excel导入导出功能往往都比较麻烦,因为涉及到Excel导入模板制作.Excel表格数据与系统数据库表字段映射.Excel导入数据验证.验证 ...

  7. 基于EPPlus和NPOI实现的Excel导入导出

    基于EPPlus和NPOI实现的Excel导入导出 CollapseNav.Net.Tool.Excel(NuGet地址) 太长不看 导入 excel 文件流将会转为 ExcelTestDto 类型的 ...

  8. 基于POI的Excel导入导出(JAVA实现)

    今天做了个excel的导入导出功能,在这记录下. 首先现在相关poi的相关jar包,资源链接:http://download.csdn.net/detail/opening_world/9663247 ...

  9. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  10. Mego(04) - NET简单实现EXCEL导入导出

    前言 相信做过信息系统的朋友都会遇到EXCEL导入导出的相关开发,做过不少EXCEL导入导出后总结起来大致有如下几种方式实现: ADO.NET的OldDb或ODBC连接EXCEL使用DataTable ...

随机推荐

  1. linux 指定运行级别

    目录 基本介绍 指定运行级别 基本介绍 0:关机 1:单用户 2:多用户状态没有网络服务 3:多用户状态有网络服务 4:系统未使用保留给用户 5:图形界面 6:系统重启 常用的运行级别是3和5,也可以 ...

  2. windows11 安装WSL2详细过程

    一.什么是 WSL 2 时间来到 2017 年,事情正在起变化.微软正式发布了「适用于 Linux 的 Windows 子系统」,即人们熟知的 Windows Subsystem for Linux, ...

  3. AxureRP大型综合商场APP高保真交互原型图含VR试衣间停车缴费会员卡楼层导购

    大型综合商场APP AxureRP高保真交互原型图含VR试衣间停车缴费会员卡楼层导购,是一款完全原创的,关于大型综合商场的综合类应用APP,app中包含在线VR试衣间.楼层导购.会员码支付.在线停车缴 ...

  4. TVM:TensorIR

    TensorIR是一种用于深度学习的特定领域语言,主要有两个目的. 在各种硬件后端进行程序变换和优化的实现 用于自动张量化程序优化的抽象 import tvm from tvm.script.pars ...

  5. 结合pandas,sqlite3批量将csv数据导入sqlite数据库

    import sqlite3 import pandas as pd conn=sqlite3.connect(r'demo.db') c=conn.cursor() 创建新表 c.execute(& ...

  6. Spring AI 1.0 正式发布!核心内容和智能体详解

    在经历了八个里程碑式的版本之后(M1~M8),Spring AI 1.0 正式版本,终于在 2025 年 5 月 20 日正式发布了,这是另一个新高度的里程碑式的版本,标志着 Spring 生态系统正 ...

  7. AtCoder Beginner Contest 357-D

    Problem For a positive integer \(N\), let \(V_N\) be the integer formed by concatenating \(N\) exact ...

  8. 机器学习中的"食材挑选术":特征选择方法

    想象你要做一道美食,面对琳琅满目的食材,优秀的厨师不会把所有原料都扔进锅里,而是会选择最适合的几种. 在机器学习中,特征选择就是这个挑选过程,从原始数据中选择对预测目标最有用的特征(列),就像挑选优质 ...

  9. linux 配置定时任务

    注意:定时任务执行默认路径,我们配置的命令如kubectl要配置绝对路径/usr/local/bin/kubectl,或者在脚本中全局定义PATH 配置说明 linux 配置定时任务的方式比较多,可以 ...

  10. Mac Book Pro 开机失败记录

    今天周一一大早来到公司,打开电脑发现,屏幕上一直出现Apple 的图标,进入不了系统,过了一会系统自动重启,还是停留在Apple 图标的界面上(虽然图标很好看,但是还是要进去系统的呀).自己开始有那么 ...