如何在 Django 中生成 Excel 文件并上传至 FastDFS

news2024/11/14 11:57:39

文章目录

  • 如何在 Django 中生成 Excel 文件并上传至 FastDFS
    • 需求背景
      • 主要任务
    • 实现步骤
  • 创建 Excel 文件
  • 上传 Excel 文件到 FastDFS
    • client.conf
  • 保存文件 URL 到数据库
  • 组合完整的流程
  • 总结


如何在 Django 中生成 Excel 文件并上传至 FastDFS

在很多实际应用场景中,我们需要批量处理数据并生成 Excel 文件,然后将这些文件上传到远程存储系统,比如 FastDFS。本文将详细介绍如何在 Django 中实现这一过程,尤其是如何生成多个工作表,每个工作表存放一个提示词的内容,并将生成的文件上传至 FastDFS,最后将文件 URL 存储到数据库中。

需求背景

假设我们有一个任务管理系统,每个任务都有多个提示词。每个提示词需要在一个新的工作表中生成,最终将这些 Excel 文件上传到 FastDFS,然后将文件的 URL 保存到数据库中,以便后续使用。

主要任务

  1. 从数据库中获取任务和提示词数据。
  2. 生成包含多个工作表的 Excel 文件,每个工作表包含一个提示词的名称和内容。
  3. 上传生成的 Excel 文件到 FastDFS。
  4. 将返回的文件 URL 保存到数据库中的相应字段。

实现步骤

创建 Excel 文件

首先,我们需要根据提示词的数量生成一个包含多个工作表的 Excel 文件。每个工作表的名称为 Sheet1, Sheet2, 等等,内容为提示词的名称和详情。

import openpyxl
from django.utils import timezone
import os

def generate_excel_and_upload(cue_data, job_name):
    """
    生成 Excel 文件并上传到 FastDFS
    每个提示词在一个新的工作表中
    """
    # 创建一个新的 Excel 文件
    wb = openpyxl.Workbook()
    
    # 使用默认的命名方式,例如 Sheet1, Sheet2, ...
    for index, cue in enumerate(cue_data, 1):
        sheet_name = f"Sheet{index}"  # 默认命名为 Sheet1, Sheet2, ...
        sheet = wb.create_sheet(title=sheet_name)  # 创建新的工作表
        
        # 在工作表中写入提示词详情
        sheet['A1'] = "提示词名称"
        sheet['B1'] = cue['name']
        sheet['A2'] = "提示词详情"
        sheet['B2'] = cue['prompt_details']
        
        # 你可以根据需要继续添加更多的行或列
        
    # 删除默认创建的工作表
    del wb['Sheet']
    
    # 生成临时文件名
    file_path = f'temp_{job_name}_{timezone.now().strftime("%Y%m%d%H%M%S")}.xlsx'
    
    # 保存为本地 Excel 文件
    wb.save(file_path)
    
    # 返回文件路径
    return file_path

在这段代码中:

  • openpyxl.Workbook() 用于创建新的 Excel 工作簿。
  • 我们使用 enumerate 来遍历提示词数据,并为每个提示词创建一个新的工作表,命名为 Sheet1, Sheet2,依此类推。
  • sheet['A1']sheet['B1'] 用于写入提示词的名称和详情。

上传 Excel 文件到 FastDFS

FastDFS 是一个高性能的分布式文件系统,我们可以将生成的 Excel 文件上传到 FastDFS,并返回一个文件 URL。为了上传文件,我们需要使用 FastDFS 客户端。

from fdfs_client.client import Fdfs_client

def uploadFile(file_path):
    """
    上传文件到 FastDFS 并返回文件 URL
    """
    client = Fdfs_client('client.conf')  # 配置文件路径
    ret = client.upload(filepath=file_path)
    if ret:
        return ret['Remote file_id']  # 返回文件 ID 或 URL
    else:
        raise Exception("文件上传失败")

在这段代码中:

  • Fdfs_client('client.conf') 用于初始化 FastDFS 客户端,client.conf 是 FastDFS 客户端的配置文件。
  • client.upload(filepath=file_path) 用于上传文件并返回上传结果。

client.conf

tracker_server=192.168.1.1:22122
http.tracker_server.port=8888
connect_timeout=30
network_timeout=60

保存文件 URL 到数据库

上传文件后,我们会得到一个文件 URL,需要将该 URL 保存到数据库中的相应字段。在本例中,保存文件 URL 的字段是 cue_txttitle

from Workers.models import JobId
from django.utils import timezone

def save_job_to_db(job_name, file_url):
    """
    保存任务信息到数据库,包括文件 URL
    """
    job_instance = JobId(
        job_name=job_name,
        status=JobId.StatusChoices.RUNNING,
        create_time=timezone.now(),
        update_time=timezone.now(),
        cue_txttitle=file_url,  # 将文件 URL 存储到 cue_txttitle 字段
        jobtotal=0  # 初始总数为 0
    )
    job_instance.save()  # 保存任务记录
    
    return job_instance.id  # 返回任务的 ID

在这段代码中:

  • JobId 是任务记录的模型,我们将文件 URL 存储到 cue_txttitle 字段。
  • timezone.now() 获取当前时间,用于记录任务的创建和更新时间。

组合完整的流程

最后,我们将所有步骤组合成一个完整的流程来处理请求。假设用户发送一个包含任务信息的请求,我们将从数据库中获取提示词信息,生成 Excel 文件,上传文件到 FastDFS,并将文件 URL 保存到数据库中。

import json
from django.http import JsonResponse
from django.views import View
from utils.InitMq import InitMq
from Workers.models import jobmanage
from promptword.models import PromptData

class Execute(View):
    def post(self, request):
        try:
            data = json.loads(request.body)
            job_name = data.get('name')
            job_id = data.get('jobid')
            job_type = int(data.get('taskType'))
            
            # 参数验证
            if not (job_name, job_id, job_type):
                return JsonResponse({'code': 400, 'message': "参数不全!"})
            
            # 获取任务数据
            db_alias = 'prod' if job_type == 0 else 'default'
            job_data = jobmanage.objects.using(db_alias).filter(id=job_id).first()
            
            if not job_data:
                return JsonResponse({'code': 400, 'message': '未找到相应的任务数据'})
            
            # 获取提示词数据
            cue_ids = eval(job_data.cue_id)
            cue_data = []
            if cue_ids:
                names = PromptData.objects.filter(id__in=cue_ids).values_list('id', 'name', 'prompt_details')
                for cue_id, name, prompt_details in names:
                    cue_data.append({'id': cue_id, 'name': name, 'prompt_details': prompt_details})
            
            # 生成 Excel 文件并上传
            file_path = generate_excel_and_upload(cue_data, job_name)
            file_url = uploadFile(file_path)
            
            # 保存 URL 到数据库
            job_id = save_job_to_db(job_name, file_url)
            
            return JsonResponse({
                'code': 200,
                'message': '成功生成并上传 Excel 文件',
                'data': file_url
            })
        
        except Exception as e:
            return JsonResponse({'code': 500, 'message': str(e)})

总结

通过这篇文章,我们展示了如何在 Django 中实现以下功能:

  1. 从数据库中获取提示词数据。
  2. 生成包含多个工作表的 Excel 文件,每个工作表保存一个提示词的名称和详情。
  3. 上传生成的 Excel 文件到 FastDFS 并获取文件 URL。
  4. 将文件 URL 保存到数据库中的任务记录中。

这种方法不仅能处理批量数据,还能灵活地将文件上传到分布式文件系统,实现高效的文件管理。
在这里插入图片描述

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

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

相关文章

电子应用产品设计方案-3:插座式自动温控器设计

一、设计 插座式自动温控器作为一种便捷的温度控制设备,在日常生活和工业应用中发挥着重要作用。它能够根据环境温度的变化自动控制连接设备的电源通断,实现对温度的精确调节和节能控制。本设计旨在提供一种功能强大、易于使用、安全可靠的插座式自动温控…

Redis的常用命令大全

目录 一、Redis简介 1.键值型 2.NoSQL 2.1关联和非关联 2.2查询方式 2.3事务 2.4总结 二、Redis常见命令 2.1 通用命令 2.2 String 命令 2.3 Hash类型 2.4 List类 2.5 Set集合 2.6 SortedSet类型 一、Redis简介 Redis是一种键值型的NoSql数据库,这里…

浅谈PostGIS中的抽稀技术——实现高效空间数据可视化的关键

目录 前言 一、原始数据介绍 1、原始完整数据 2、Qgis中展示原始数据 二、减少数据精度 1、查询函数简介 2、减少精度实战 三、ST_Simplify抽稀实现 1、ST_Simplify函数介绍 2、ST_Simplify抽稀结果 四、ST_SimplifyPreserveTopology抽稀 1、函数介绍 2、抽稀结果 …

网约车管理:规范发展,保障安全与便捷

在数字化时代,网约车已成为城市出行的重要组成部分,为公众提供了前所未有的便捷性。然而,随着网约车行业的迅猛发展,一系列管理问题也随之浮现,如司机资质审核不严、车辆安全标准不一、乘客权益保护不足等。这些问题不…

vue3入门和实战-vue3项目布局

文章目录 前言一、项目目标二、页面布局1.首页布局分析2. 首页布局实现App.vueLayoutIndex.vueLayoutLeft.vueHome.vueHome/components/Header.vueHome/components/Footer.vue3.首页路由4.首页效果显示总结前言 上一节,部署了vue3官方案例,我们需要结合自身项目页面的布局改…

深度学习经典模型之VGGNet

1 VGGNet 1.1 模型介绍 ​ VGGNet是由牛津大学视觉几何小组(Visual Geometry Group, VGG)提出的一种深层卷积网络结构,他们以7.32%的错误率赢得了2014年ILSVRC分类任务的亚军(冠军由GoogLeNet以6.65%的错误率夺得)和…

【364】基于springboot的高校科研信息管理系统

摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古…

【Windows】CMD命令学习——系统命令

CMD(命令提示符)是Windows操作系统中的一个命令行解释器,允许用户通过输入命令来执行各种系统操作。 系统命令 systeminfo - 显示计算机的详细配置信息。 tasklist - 显示当前正在运行的进程列表。 taskkill - 终止正在运行的进程。例如&am…

深入探索Waymo自动驾驶技术发展:从DARPA挑战赛到第五代系统的突破

引言 自动驾驶技术正引领着未来出行方式的革命,而Waymo作为全球自动驾驶领域的先锋,始终走在技术发展的最前沿。本文基于Waymo联席CEO德米特里多尔戈夫(Dmitri Dolgov)在No Priors节目中的访谈,全面介绍Waymo的技术发展…

泷羽sec学习打卡-Windows基础virus

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于windows virus的那些事儿 一、Windows-Virus资源耗尽之无限弹窗cmd-virus测试锁机virus测试无限重启…

python机器人Agent编程——实现一个本地大模型和爬虫结合的手机号归属地天气查询Agent

目录 一、前言二、准备工作三、Agent结构四、python模块实现4.1 实现手机号归属地查询工具4.2实现天气查询工具4.3定义创建Agent主体4.4创建聊天界面 五、小结PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源ps3.wifi小车控制相关…

如何线程安全的使用HashMap

前言 Map一直是面试中经常被问到的问题。博主在找工作的过程中,就被问到了这样一个问题: Map是线程安全的吗?我不考虑使用线程安全的Map(eg:ConcurrentHashMap) 。如何在多线程/高并发下安全使用 HashMap? 当时博主…

基于MATLAB+opencv人脸疲劳检测

我们可以通过多种方式从现实世界中获取数字图像,比如:数码相机、扫描仪、计算机扫描和磁共振成像等等。在这些情况中,虽然我们肉眼看到的是图像,但是当需要将图像在数字设备中变换传输时,图像的每个像素则对应一个数值…

区块链技术在知识产权保护中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 区块链技术在知识产权保护中的应用 区块链技术在知识产权保护中的应用 区块链技术在知识产权保护中的应用 引言 区块链技术概述 …

交友系统app源码优势,怎么去开发一个交友系统,它适合的场景

https://gitee.com/fantnerd/hunlian.githttps://gitee.com/fantnerd/hunlian.git 语音交友app源码技术优势: 1、语音交友app源码服务端开发语言采用PHP。 2、服务端开发框架主要TP6 3、开发环境:Nginx或者Apache 数据库mysql5.6。 交友程序源码的开发…

mac 中python 安装mysqlclient 出现 ld: library ‘ssl‘ not found错误

1. 出现报错 2. 获取openssl位置 brew info openssl 3. 配置环境变量(我的是在~/.bash.profile) export LDFLAGS"-L/opt/homebrew/Cellar/openssl3/3.4.0/lib" export CPPFLAGS"-I/opt/homebrew/Cellar/openssl3/…

qt QClipboard详解

1、概述 QClipboard是Qt框架中的一个类,它提供了对窗口系统剪贴板的访问能力。剪贴板是一个临时存储区域,通常用于在应用程序之间传递文本、图像和其他数据。QClipboard通过统一的接口来操作剪贴板内容,使得开发者能够方便地实现剪切、复制和…

第3篇 滑动开关控制LED__ARM汇编语言工程<一>

Q:如何设计实现滑动开关控制LED的ARM汇编程序呢?与Nios II汇编语言有何不同呢? A:基本原理:该应用程序用到DE1-SoC开发板上的10个红色LED、10个滑动开关SW和4个按钮开关。DE1-SoC_Computer system的qsys系统中IP的硬件…

Jenkins安装自定义插件

看到这个博客,你可能遇到跟我一样的问题:直接使用jenkins插件时,在线安装的插件可能版本不符合要求。 怎么办呢 找到相关插件的版本 https://plugins.jenkins.io/build-name-setter/ 下载相应版本 安装

uniapp—android原生插件开发(4uniapp引用aar插件)

本篇文章从实战角度出发,将UniApp集成新大陆PDA设备RFID的全过程分为四部曲,涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程,轻松应对安卓原生插件开发与打包需求! 一、将android程序打包成aar插件包 直接使…