Django设计批量导入Excel数据接口(包含图片)

Django设计批量导入Excel数据接口(包含图片)

目录

  • Django设计批量导入Excel数据接口(包含图片)
    • 示例xlsx文件
    • 接口详情
      • 前端上传FormData
      • 后端APIView
      • 调用函数

Django                        4.2.7
openpyxl                      3.1.5

示例xlsx文件

image-20240926094248909

接口详情

前端上传FormData

随便弄个上传按钮即可

image-20240926095002094

这里上传我用的是ElementUI自带的action()

<el-uploadclass="upload-Excel-demo"name="Excel_File":action=$config.BASEURL+$config.ExcelUploadURL:with-credentials=true:on-success="handleSuccess"multiple:file-list="ExcelFileList"><el-button size="small">Excel批量导入</el-button>
</el-upload>

后端APIView

class UploadExcelApiView(APIView):def post(self, request, *args, **kwargs):# 上传Excel文件excel_file = request.FILES.get('Excel_File', None)print(excel_file)# 验证文件格式file_extension = os.path.splitext(excel_file.name)[1]assert file_extension.lower() in ['.xlsx', '.xls'], "不支持的文件格式,请上传 .xlsx 或 .xls 文件"# 定义一个允许的字段字典allowed_fields = {'男/女': '', '款号': '', '产品类型': '', '针型': '', '克重': '', '材质': '', '针法': '','织机时间': '', '描述': '', '工艺师': '', '生产日期': '', '产品图片': ''}# 读取Excel文件并将每个sheet表格放入列表中wb = openpyxl.load_workbook(excel_file)sheet_list = [wb[sheet] for sheet in wb.sheetnames]# 定义临时变量 存储数据对象garment_knowledge_objects = []garment_image_objects = []try:for sheet in sheet_list:# 验证表头是否正确first_row = next(sheet.iter_rows(values_only=True))print(f'first_row: {first_row}')allowed_fields = xlsx_first_row_validator(allowed_fields, first_row)print(f'allowed_fields: {allowed_fields}')# 提取图片for img in sheet._images:# 图片转base64 以便上传到服务器img_file = xlsx_img_to_base64(img)img_row = img.anchor._from.row  # 图片所在行img_col = img.anchor._from.col  # 图片所在列# 格式化数据formatted_data = extract_and_format_date(sheet.cell(row=img_row + 1, column=(first_row.index(allowed_fields['生产日期'])) + 1).value)formatted_gender = format_gender_handler(sheet.cell(row=img_row + 1, column=(first_row.index(allowed_fields['男/女'])) + 1).value)product_id = sheet.cell(row=img_row + 1, column=(first_row.index(allowed_fields['款号'])) + 1).valueprint(f'正在上传{product_id}')# GarmentKnowledge就是自己创建的模型类g_obj, created = GarmentKnowledge.objects.update_or_create(product_id=product_id,defaults={'user': request.user,'product_type': sheet.cell(row=img_row + 1,column=(first_row.index(allowed_fields['产品类型'])) + 1).value,'needle_type': sheet.cell(row=img_row + 1,column=(first_row.index(allowed_fields['针型'])) + 1).value,'knitting_time': sheet.cell(row=img_row + 1,column=(first_row.index(allowed_fields['织机时间'])) + 1).value,'gram_weight': sheet.cell(row=img_row + 1,column=(first_row.index(allowed_fields['克重'])) + 1).value,'composition': sheet.cell(row=img_row + 1,column=(first_row.index(allowed_fields['材质'])) + 1).value,'technologist': sheet.cell(row=img_row + 1,column=(first_row.index(allowed_fields['工艺师'])) + 1).value,'description': sheet.cell(row=img_row + 1,column=(first_row.index(allowed_fields['描述'])) + 1).value,'manufactured_at': formatted_data,'pattern': sheet.cell(row=img_row + 1,column=(first_row.index(allowed_fields['针法'])) + 1).value,'gender_type': formatted_gender,})img_obj = GarmentImagesFile(garment_knowledge=g_obj, image=img_file)garment_knowledge_objects.append(g_obj)garment_image_objects.append(img_obj)# 批量创建对象GarmentKnowledge.objects.bulk_create(garment_knowledge_objects)GarmentImagesFile.objects.bulk_create(garment_image_objects)print('上传成功')except Exception as e:print(f'错误信息:{e}')return APIResponse(code_msg='error', detail=e, data=None, status=status.HTTP_400_BAD_REQUEST)return APIResponse(code_msg='success', detail='上传成功', data=None, status=status.HTTP_200_OK)

调用函数

import io
import refrom django.core.files.uploadedfile import InMemoryUploadedFiledef format_gender_handler(gender_str):if gender_str.lower() == '男':return '男装'elif gender_str.lower() == '女':return '女装'else:return Nonedef extract_and_format_date(date_str):date_str = str(date_str)# 使用正则表达式提取字符串中的第一个四位数年份、月份和日期match = re.search(r'(\d{4}).*?(\d{1,2}).*?(\d{1,2})', date_str)if match:year = match.group(1)  # 提取年份month = match.group(2).zfill(2)  # 提取月份,补全两位数day = match.group(3).zfill(2)  # 提取日期,补全两位数return f"{year}-{month}-{day}"else:raise ValueError("无法从输入中提取日期")def xlsx_img_to_base64(img_obj):"""img_obj必须是一个xlsx文件中的图片对象例:sheet._images"""img_bytes = io.BytesIO(img_obj._data())img_bytes.seek(0)img_file = InMemoryUploadedFile(file=img_bytes,  # 图像字节流field_name=None,  # 字段名,保持为 Nonename='image.png',  # 使用图像对象的名字或默认名content_type='image/png',  # 根据实际图像格式设置内容类型size=img_bytes.getbuffer().nbytes,  # 获取图像字节大小charset=None  # 字符编码,通常不需要)return img_filedef xlsx_first_row_validator(allowed_fields, first_row):"""first_row必须是一个由表头字段组成的可遍历对象例:('款号', '产品类型', '针型', '克重(克)', '材质', '针法')返回值allowed_fields将会更新为由规定字段和接收字段组成的字典例:{'款号': '款号', '产品类型': '产品类型', '针型': '针型', '克重': '克重'}"""for first_cell in first_row:for key, value in allowed_fields.items():if key in first_cell or first_cell in key:allowed_fields[key] = first_cellreturn allowed_fieldsfor key, value in allowed_fields.items():if key in first_cell or first_cell in key:allowed_fields[key] = first_cellreturn allowed_fields

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1546758.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

自动驾驶规划算法(一):A*算法原理和代码(c++与python)

1. A*算法简介 A*算法&#xff08;A-star algorithm&#xff09;诞生于1968年&#xff0c;由彼得哈特&#xff08;Peter Hart&#xff09;、尼尔森尼尔森&#xff08;Nils Nilsson&#xff09;和伯特拉波特&#xff08;Bertram Raphael&#xff09;三位计算机科学家提出。它的…

基于大数据可视化的图书推荐及数据分析系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

快速订餐:Spring Boot 点餐系统

第二章关键技术的研究 2.1相关技术 网上点餐系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统&#xff0c;因为它的…

WanFangAi论文写作研究生论文写作神器在线生成真实数据,标注参考文献位置,表格公式代码流程图查重20以内,研究生论文开题报告写作技巧

撰写开题报告时&#xff0c;遭循以下结构将有助于你条理清晰地展示你的研究计划: 研究目标 1.研究背景:简要介绍你选择该研究题目的背景&#xff0c;阐述研究的重要性。 2.研究问题:明确阐述你的研究将解决的核心问题。 研究价值 1.理论价值:探讨你的研究在学术领域内的贡献&a…

C语言 | Leetcode C语言题解之第437题路径总和III

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ //递归遍历树节点&#xff0c;判断是否为有效路径 int dfs(struct TreeNode * root, int ta…

基于RealSense D435相机实现手部姿态重定向

基于Intel RealSense D435 相机和 MediaPipe的手部姿态检测&#xff0c;进一步简单实现手部姿态与机器人末端的重定向。 假设已经按照【基于 RealSenseD435i相机实现手部姿态检测】配置好所需的库和环境&#xff0c;并且有一个可以控制的机器人接口。 一、手部姿态重定向介绍 …

【WRF运行第二期(Ubuntu)】ARWpost安装及错误总结

WRF运行第二期&#xff1a;ARWpost安装及错误总结 1 ARWpost介绍2 ARWpost安装2.1 ARWpost_V3安装前准备2.2 安装ARWpost2.3 修改Makefile文件2.4 修改configure.arwp文件2.5 生成可执行文件EXE另&#xff1a;报错1-Error: Type mismatch between actual argument at (1) and a…

【项目】基于Linux和C++的动态在线视频点播系统设计

文章目录 1. 前言1.1 源码1.2 项目简介1.3 实现内容1.4 涉及技术 / 环境 2. 整体架构2.1 服务器功能2.2 服务器结构 3. 前提步骤3.1 思路分析3.2 创建视频表 4. 后端 基本功能实现&#xff08;视频点播&#xff09;4.1 服务端工具类实现4.2 日志输出类4.3 数据库/表 管理类4.4 …

前端开发之代理模式

介绍 代理模式是一种结构型设计模式&#xff0c;它通过为一个对象提供一个代理对象来控制对该对象的访问。代理对象可以在访问真实对象之前或之后添加一些额外的操作。 class RealImg {fileName: string;constructor(fileName: string) {this.fileName fileName;}disPlay()…

ValueError: Out of range float values are not JSON compliant

可能原因一 可能原因二 数据里面有NaN

优化java中 HashMap 的容量](capacity值)

我们很多人都知道&#xff0c;分配比我们所需更多的内存可能会对应用程序的性能产生负面影响。因此&#xff0c;使用带有容量的构造函数创建列表可能会产生很大的不同。 但是&#xff0c;使用Maps时&#xff0c;这个优化步骤可能不是那么简单。在本文中&#xff0c;我们将学习…

Django 基础之启动命令和启动配置修改

Django启动 django启动一般可以通过ide或者命令启动 ide启动&#xff1a; 启动命令&#xff1a; python manage.py runserver该命令后续可以增加参数&#xff0c;如&#xff1a; python manage.py runserver 8081 python manage.py runserver 127.0.0.1:8082 注意&#xff1…

PDF转换器哪个好?这5款PDF工具值得推荐

PDF转换器哪个好&#xff1f;选择一款优质的PDF转换器&#xff0c;能够极大地提升我们的工作效率与灵活性。它不仅能轻松实现PDF文件与Word、Excel、PPT等多种格式间的互转&#xff0c;还支持图片、TXT等多种格式的转换&#xff0c;满足多样化的办公与学习需求。此外&#xff0…

南卡首款耳夹开放式耳机,舒适与音质双双达行业峰值,再次“颠覆”行业!

近日&#xff0c;南卡Ultra夹耳式蓝牙耳机的正式上市&#xff0c;再次在蓝牙耳机圈内掀起波澜。这款耳机以其超舒适的夹耳式设计和卓越音质&#xff0c;为用户带来了全新的音乐体验&#xff0c;有望重新定义夹耳式耳机的市场标准。 南卡品牌背后有着强大的研发实力和丰富的行业…

一文读懂Service以及实践攻略

一文读懂Service以及实践攻略 目录 1 一文读懂 Kubernetes Service 以及实践攻略 1.1 1. 什么是 Service&#xff1f; 1.1.1 为什么需要 Service&#xff1f; 1.2 2. Service 的工作原理 1.2.1 核心概念1.2.2 流量转发过程 1.3 3. Service 的几种类型及应用场景 2 实践&#…

网络与信息安全工程师(工信部教育与考试中心)

在当今数字化时代&#xff0c;大量的敏感信息与业务流程在网络上传输和处理&#xff0c;使得网络与信息安全成为保障企业运营、政务管理以及金融交易等关键领域不可忽视的一环。 因此&#xff0c;对网络安全专家的需求日益增长。 例如&#xff0c;金融机构、大型电信运营商以…

云专线和虚拟专线是什么?两者有什么区别?

云专线和虚拟专线是两种用于企业网络连接的技术方案&#xff0c;它们各自有不同的特点和适用场景。下面将分别介绍这两种技术&#xff0c;并指出它们之间的主要区别。 云专线 云专线是一种物理的或逻辑的专用线路&#xff0c;它直接连接企业的本地数据中心或分支机构与云端服务…

为什么美联储降息和我国刺激措施可能提振铜价

美联储降低利率通常对铜价产生积极影响。这主要是由于利率与美元汇率之间的关系。当美联储降息时&#xff0c;往往会使美元对其他货币贬值。 由于全球市场上的铜价是以美元计价的&#xff0c;美元走弱会使用其他货币购买的金属价格更便宜。这可能刺激来自国际买家的需求&#x…

RTE 大会报名丨AI 时代新基建:云边端架构和 AI Infra ,RTE2024 技术专场第二弹!

所有 AI Infra 都在探寻规格和性能的最佳平衡&#xff0c;如何构建高可用的云边端协同架构&#xff1f; 语音 AI 实现 human-like 的最后一步是什么&#xff1f; AI 视频的爆炸增长&#xff0c;给新一代编解码技术提出了什么新挑战&#xff1f; 当大模型进化到实时多模态&am…

【深度学习】(7)--神经网络之保存最优模型

文章目录 保存最优模型一、两种保存方法1. 保存模型参数2. 保存完整模型 二、迭代模型 总结 保存最优模型 我们在迭代模型训练时&#xff0c;随着次数初始的增多&#xff0c;模型的准确率会逐渐的上升&#xff0c;但是同时也随着迭代次数越来越多&#xff0c;由于模型会开始学…