【Python】按格式输出指定内容至新的Excel表中

news2024/9/22 13:43:17

优化之前写的文档更新工具,输出指定列的数据到公式表中,且确保数值单元格不会被识别为文本,导致Excel文档数值计算公式失效

ExcelTool.py

import os
import pandas as pd
from openpyxl import load_workbook
import json

### Excel表指定sheet更新

# 更新计算文档所需表的内容
class update_calculate_excel:
    def __init__(self):
        # 此处先初始化所需数据信息
        # 读取json文件,获取数据表对应信息
        data_json = json.loads(open('excel_data.json','r',encoding='UTF-8').read())
        # 配置表位置
        self.file_path = data_json['数据来源']
        # 要导入到哪个计算公式表
        self.excel_path = data_json['公式表']
        # 要导入哪些表
        self.sheet_name = data_json['excel_name']

    # 更新工作表
    def update_sheet(self):
        # 读取需要导入更新的工作表
        for excel_name in self.sheet_name:
            # 拼接Excel文件路径:Excel\xxxxx.xlsx
            read_excel_doc = self.file_path + "\\" + excel_name + ".xlsx"
            # 判断文件是否存在
            if not os.path.exists(read_excel_doc):
                print("------------------------------------------------")
                print(read_excel_doc, "文件不存在!!!!!", )
                print("------------------------------------------------")
                # 此处仅是中断不存在表的读取,如果还有其他表,会继续循环,尝试读取
                continue
            # 存在,则读取文件内容
            data = self.read_sheet(read_excel_doc,excel_name)
            if data:
                # 将读取到的数据写入公式表中
                if self.write_calculation_excel(excel_name, data):
                    print(excel_name, "复制完成")
            else:
                print("------------------------------------------------")
                print(excel_name, "内容不存在!")
                print("------------------------------------------------")


    # 读取工作表内容并拷贝
    def read_sheet(self,excel_path,name):
        data = None
        try:
            # 读取Excel表内容
            # 如果要从指定行开始读取,比如想从第3行开始读取数据,参数header设置为2即可
            raw_data = pd.read_excel(excel_path, header=None, index_col=None )
            data = raw_data.values.tolist()
        except ValueError:
            print("------------------------------------------------")
            print(name , "不存在!")
            print("------------------------------------------------")
        finally:
            return data

    # 写入数据
    def write_calculation_excel(self,name, data):
        # 此时只是设置插入公式表中的sheet名
        if len(name.split("-")) < 2:
            print("------------------------------------------------")
            print(name, "名字格式异常")
            print("------------------------------------------------")
            return False
        sheet_name = name.split('-')[1]

        # 加载公式表
        calculate_excel_sheet = load_workbook(self.excel_path)
        # 查找公式表中是否有同名工作表
        if sheet_name in calculate_excel_sheet.sheetnames:
            # 删除公式文档内原有的工作表
            calculate_excel_sheet.remove(calculate_excel_sheet[sheet_name])
        # 创建空白工作表sheet_name
        calculate_excel_sheet.create_sheet(sheet_name)
        
        # 格式化数据内容
        self.data_format(calculate_excel_sheet[sheet_name],data,self.sheet_name[name])

        # 保存文件
        calculate_excel_sheet.save(self.excel_path)
        # 关闭文件
        calculate_excel_sheet.close()

        return True

    # 将字符串分割成list
    def to_str_rt_list(self,str):
        rt_list = []
        if len(str.split(";")) > 1 and len(str.split(";")[1]) != 0:
            for l in str.split(";"):
                rt_list.append(l.split(","))
        else:
            rt_list=str.split(";")[0].split(",")
        return rt_list

    # 按需求格式返回所需数据
    def data_format(self,sheet_name,data,data_row):
        i = 0
        type_row =[]
        for row_data in data:
            # 记录每列数据的类型
            row_list = []
            # 当前处理列
            t_id = 0
            for row_id in data_row:
                if i < 2:
                    # 前两行为无用数据
                    break
                elif i == 2:
                    # 第三行为类型,用于处理数据类型
                    type_row.append(row_data[row_id])
                elif i == 3:
                    # 第四行为标题,
                    row_list.append(row_data[row_id])
                    # 如果该列类型为array,则数据做拆分处理,此处暂处理k,y形式的值
                    if type_row[t_id] == "array":
                        row_list.append(row_data[row_id] +"_值")
                else:
                    # 其他行为具体数据,根据类型强转成指定类型,避免数据插入后变为文本类型,导致对数值操作的Excel公式失效
                    if type_row[t_id] == "int":
                        row_list.append(int(row_data[row_id]))
                    elif type_row[t_id] == "float":
                        row_list.append(float(row_data[row_id]))
                    elif type_row[t_id] == "array":
                        list = self.to_str_rt_list(str(row_data[row_id]))
                        # 拆分成单独列
                        if len(list) > 1:
                            row_list.append(float(list[0]))
                            row_list.append(float(list[1]))
                        elif len(list) == 1 and type_row[t_id] == type_row[t_id]:
                            row_list.append(float(list[0]))
                            row_list.append("")
                        else:
                            row_list.append("")
                            row_list.append("")
                    else:
                        row_list.append(str(row_data[row_id]))
                t_id = t_id + 1
            i = i + 1
            if i <= 3:
                # 前三行无需追加新表中
                continue
            sheet_name.append(row_list)

excel_data.json

{
  "数据来源": "Excel",
  "公式表": "Excel\\导入公式表.xlsx",
  "excel_name":  {
    "out-导出数据-out": [0,1,2,3,4]
  }
}

执行后,导入公式表.xlsx便会新增工作表【导入数据】,并且有我们所需的数据内容
在这里插入图片描述

也可导入多张表,以及选择指定列导入

{
  "数据来源": "Excel",
  "公式表": "Excel\\导入公式表.xlsx",
  "excel_name":  {
    "out-导出数据-out": [0,1,2,3,4],
    "out2-导出数据2-out2": [0,2,4]
  }
}

导出数据表内容

在这里插入图片描述

执行后,公式表内容,其中工作表【导出数据2】并没有标题和float数据列

在这里插入图片描述

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

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

相关文章

论文《Improving your graph neural networks:A High-Frequency Booster》笔记

【CLAR 2022 ICDMW】作者指出&#xff0c;现有的GNN模型主要关注于消息传递机制&#xff0c;但这些模型往往受限于低通滤波器的局限&#xff0c;导致在多层堆叠时性能下降。为了解决这个问题&#xff0c;论文提出了一种新的正则化方法&#xff0c;称为补全拉普拉斯正则化&#…

PP强酸强碱氮气柜和普通氮气柜的区别及共同点

PP强酸强碱氮气柜通常采用聚丙烯&#xff08;PP&#xff09;材料制成&#xff0c;聚丙烯是一种耐腐蚀性强的塑料材质&#xff0c;能有效抵抗强酸、强碱、盐溶液等腐蚀性物质的侵蚀&#xff0c;不易老化&#xff0c;使用寿命长。因其优秀的化学稳定性和耐腐蚀性&#xff0c;特别…

2024第三届大学生算法大赛 真题训练一 解题报告 | 珂学家

前言 题解 这是第三届大学生算法大赛(第二届为清华社杯)的赛前练习赛一. 这是上界比赛的体验报告: 2023第二届“清华社杯”大学生算法大赛 解题报告(流水账版) | 珂学家&#xff0c;个人还是非常推荐这个比赛。 难度分布&#xff1a;4 easy/4 mid-hard/2 hard 赛前练习赛一…

15、Django Admin添加自定义字段功能

修改模型类HeroAdmin admin.register(Hero) class HeroAdmin(admin.ModelAdmin):change_list_template "entities/heroes_changelist.html"... # 此处原代码不动&#xff0c;只增加此前后代码def get_urls(self):urls super().get_urls()my_urls [path(immort…

Linux【2】文件目录-ls进阶

目录 ls 组合使用&#xff1a;ls -lha​编辑 ls 通配符 ls .是隐藏文件 ls -a可以显示所有文件包括隐藏文件 ls- l列表形式&#xff0c;详细信息 ls -l -h 大小更详细 组合使用&#xff1a;ls -lha ls 通配符 *任意长度 &#xff1f;一个字符 带扩展名 可选from…

开源 AI 智能名片 S2B2C 商城小程序在社区团购中的应用与价值

摘要&#xff1a;本文探讨了开源 AI 智能名片 S2B2C 商城小程序在社区团购中的重要作用。社区团购的团长角色多元&#xff0c;包括小区店主、水站与快递站站长、宝妈等&#xff0c;其用户基础广泛。优秀团长的专业引导和良好服务至关重要&#xff0c;而开源 AI 智能名片 S2B2C …

Open3D 曲率下采样

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 三、实现效果 3.1原始点云 3.2曲率下采样后点云 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、概述 曲…

R3 天气预测

天气预测 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 这周学习对天气预测的数据分析与模型训练&#xff0c;创建一个用于预测未来是否下雨的机器学习模型。 数据导入与预处理 首先&#xff0c;我们从CS…

springboot中会话技术方案cookie/session/jwt

会话跟踪 - 传统方案 cookie http协议支持的技术缺点 移动端app中不支持不安全&#xff0c;用户可以自己禁用cookiecookie不能跨域 session 存储在服务端&#xff0c;安全缺点 服务端集群的场景下&#xff0c;无法使用sessioncookie的缺点 会话跟踪 - 现代方案 jwt令牌 优…

华为云征文|华为云Flexus X实例部署k3s与kuboard图形化管理工具

华为云征文&#xff5c;华为云Flexus X实例部署k3s与kuboard图形化管理工具 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体验跃级、面向中小企业和开发者打造的高品价比云服务产品。Flexus云服务器X实例是新一代面向中小企业和开发者打造的柔性算力…

Linux服务器CPU和IO的监控利器-iostat简介

目录 一.下载方式 1.1Debian和Ubuntu系统的的下载方式 1.2Centos&#xff0c;RHEL和Fedoar系统的下载方式 二.基本用法说明 三.范例 3.1显示所有设备的负载情况 3.2每隔4秒显示所有设备的负载情况 3.2.1定时不定次显示所有信息 3.2.2定时定次显示所有信息 3.3显示磁盘…

使用AI写WebSocket知识是一种怎么样的体验?

一、WebSocket基础知识 1. WebSocket概念 1.1 为什么会出现WebSocket 一般的Http请求我们只有主动去请求接口&#xff0c;才能获取到服务器的数据。例如前后端分离的开发场景&#xff0c;自嘲为切图仔的前端大佬找你要一个配置信息的接口&#xff0c;我们后端开发三下两下开…

Edge PDF 关闭 提供支持的应用Adobe Acrobat

Edge 在浏览PDF时启用 Adobe Acrobat支持后&#xff0c;对一些长PDF会出现上下滚动会出现无法正常显示PDF内容的情况。在关闭了Adobe Acrobat计算支持后&#xff0c;问题得到解决。关闭Adobe Acrobat的方式如下&#xff1a; 1. Edge地址栏输入 edge://flags &#xff0c;进入如…

Java 入门指南:Java 并发编程 —— 并发容器 ConcurrentSkipListSet

SkipList SkipList&#xff08;跳表&#xff09;是一种有序链表加多级索引数据结构&#xff0c;基于有序的单链表&#xff0c;类似于平衡二叉树&#xff0c;但其查找、插入和删除操作的时间复杂度都是 O(logN)&#xff0c;并且不需要进行旋转平衡等复杂操作。 跳表利用二分查…

【滑动窗口】将 x 减到 0 的最小操作数

将 x 减到 0 的最小操作数 将 x 减到 0 的最小操作数题目思路讲解代码书写 将 x 减到 0 的最小操作数 题目 题目链接: 将 x 减到 0 的最小操作数 思路讲解 按照题目的思路去做这一题是非常恶心的, 因此我们采用正难则反思路. 将问题转换为: 求中间某一个最长的数组长度, 使…

mybatis搭建,参数传递,增删改查事务管理

1.mybatis概述 原是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了 Google Code&#xff0c;随着开发团队转投Google Code 旗下&#xff0c; iBatis3.x正式更名为MyBatis。 MyBatis 是一款优秀的持久层框架。 框架就是对技术的封装&am…

Spring源码之reader、scanner

目录 1.Spring的整体启动流程 2.reader 3.Scanner ApplicationContext的三种加载应用上下文的方式&#xff08;创建Spring容器&#xff09;&#xff1a; AnnotationConfigApplicationContextClassPathXmlApplicationContextFileSystemXmlApplicationContext 1.Spring的整体…

SprinBoot+Vue阅读交流微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

观测云核心技术解密:eBPF Tracing 实现原理

前言 eBPF 是一种强大的内核技术&#xff0c;允许在内核中安全地执行自定义代码。通过 eBPF&#xff0c;开发者可以在不修改内核源码的情况下&#xff0c;对内核功能进行扩展和监控。eBPF Tracing 利用这一技术&#xff0c;对系统调用、内核函数等进行跟踪&#xff0c;从而实现…

X86架构(六)——移位指令与无条件转移指令

移位指令 shr 逻辑右移 逻辑右移指令会将操作数连续地向右移动指定的次数&#xff0c;移出的比特被移到标志寄存器的CF位&#xff0c;左边空出来的位置用0填充 ;目的操作数可以是8位或16位的通用寄存器或者内存单元 ;源操作数可以是数字1、8位立即数或者寄存器CL shr r/m8, …