128 lines
3.3 KiB
Markdown
128 lines
3.3 KiB
Markdown
# 导入导出
|
||
|
||
<!-- Copyright (c) 2021-2026 小蚂蚁云团队 版权所有 -->
|
||
|
||
:::tip 说明
|
||
基于 `openpyxl` 实现 Excel 导入导出功能,支持通过 `file_template` 模块管理导入模板配置。
|
||
:::
|
||
|
||
## 功能概述
|
||
|
||
Excel 导入导出是后台管理系统的常见需求,通过 `openpyxl` 库实现:
|
||
|
||
```
|
||
Excel 导出:
|
||
1. 将数据库中的数据导出为 Excel 文件,支持自定义表头和格式
|
||
2. 适用于生成报表、数据备份等场景
|
||
|
||
Excel 导入:
|
||
1. 将 Excel 文件中的数据导入到数据库,支持批量处理和校验
|
||
2. 适用于批量数据录入、数据迁移等场景
|
||
```
|
||
|
||
## 依赖说明
|
||
|
||
在 `requirements.txt` 中已包含:
|
||
|
||
```
|
||
openpyxl>=3.1.0
|
||
```
|
||
|
||
## 导出实现
|
||
|
||
导出接口通常在各业务模块的 views.py 中定义,返回 `HttpResponse`:
|
||
|
||
```python
|
||
from openpyxl import Workbook
|
||
from django.http import HttpResponse
|
||
import io
|
||
|
||
class ExportView(PermissionRequired, View):
|
||
permission_required = ("sys:user:export",)
|
||
|
||
def get(self, request):
|
||
# 查询数据
|
||
data_list = services.get_export_data(request)
|
||
|
||
# 创建工作簿
|
||
wb = Workbook()
|
||
ws = wb.active
|
||
ws.title = "用户信息"
|
||
|
||
# 写入表头
|
||
ws.append(["用户名", "姓名", "手机号", "邮箱", "状态"])
|
||
|
||
# 写入数据
|
||
for item in data_list:
|
||
ws.append([item.username, item.realname, item.phone, item.email, item.status_name])
|
||
|
||
# 返回流式响应
|
||
output = io.BytesIO()
|
||
wb.save(output)
|
||
output.seek(0)
|
||
|
||
response = HttpResponse(
|
||
output.getvalue(),
|
||
content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
||
)
|
||
response["Content-Disposition"] = "attachment; filename=export.xlsx"
|
||
return response
|
||
```
|
||
|
||
## 导入实现
|
||
|
||
导入接口接收上传的 Excel 文件,解析后逐行校验并入库:
|
||
|
||
```python
|
||
class ImportView(PermissionRequired, View):
|
||
permission_required = ("sys:user:import",)
|
||
|
||
def post(self, request):
|
||
file = request.FILES.get('file')
|
||
if not file:
|
||
return R.failed(msg="请选择要上传的文件")
|
||
|
||
wb = load_workbook(io.BytesIO(file.read()))
|
||
ws = wb.active
|
||
|
||
# 跳过表头,逐行解析
|
||
for row in ws.iter_rows(min_row=2, values_only=True):
|
||
username, realname, phone, email, status = row
|
||
# 校验并入库 ...
|
||
```
|
||
|
||
## file_template 模块
|
||
|
||
`file_template` 模块用于管理导入模板的配置信息,定义模板的字段映射、校验规则等。
|
||
|
||
模块路径:`application/file_template/`
|
||
|
||
```
|
||
模板配置包含:
|
||
- 模板名称
|
||
- 关联模块
|
||
- 字段映射关系
|
||
- 校验规则
|
||
```
|
||
|
||
:::tip 温馨提示
|
||
导入时建议先下载模板文件,按模板格式填写数据后再导入,可减少格式错误。
|
||
:::
|
||
|
||
## 错误处理
|
||
|
||
导入过程中遇到校验错误时,返回详细的错误信息:
|
||
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"msg": "导入失败:第3行用户名已存在,第5行手机号格式错误",
|
||
"data": null,
|
||
"ok": false
|
||
}
|
||
```
|
||
|
||
## 总结
|
||
|
||
Excel 导入导出功能基于 `openpyxl` 实现,导出使用 `HttpResponse` 流式返回避免内存溢出,导入逐行校验并提供详细错误信息。`file_template` 模块可管理导入模板配置,便于维护字段映射和校验规则。
|