用python合并execl做统计分析

news2025/1/10 5:47:22

背景: 我们有项目问题记录的表格,每一个项目都会反馈来一个execl表格,表格的格式都是统一的,我需要定期把这些项目上反馈来的表格进行统计,但是表格非常多,我要每个都统计出来在来相加,这样操作很麻烦,所以我想有没有一个方法可以把所有的execl 都合并成为一个execl ,然后再去做统计分析 。这样会节省不少时间。最后我发现可以用python 来做合并execl的事情。

1、目录结构

在这里插入图片描述

  • util : 是工具包,里面是封装的execl的类,实现了execl的基本操作
  • sources : 这里存放的需要进行合并的所有execl文件
  • results : 存放合并后的execl文件
  • main : 主函数 实现execl合并的方法

2、实现过程

ExcelUtil类的实现

在util包里面创建excel_util.py文件
导入相关的模块,实现ExcelUtil的初始化方法
初始化方法的时候,要传入execl文件的路径excel_path,不传是使用一个默认地址,index 是指定execl的哪个sheet,不传默认操作的是第一个sheet

# --coding:utf-8--
# ! python3
import xlrd
from xlutils.copy import copy
import os
import json
import codecs


class ExcelUtil:
    def __init__(self, excel_path=None, index=None):
        if excel_path == None:
            self.excel_path = "E:\\python\\问题列表文档\\execl合并\\results\\result.xlsx"
        else:
            self.excel_path = excel_path
        if index == None:
            self.index = 0       # 0 代表第一个sheet
        else:
            self.index = index
        self.data = xlrd.open_workbook(self.excel_path)    #将整个execl内容读到self.data里面
        self.table = self.data.sheets()[self.index]  #在从data里面获取指定sheet的内容

获取sheet中的行数

def get_lines(self):
        # 行数
        rows = self.table.nrows
        if rows >= 1:
            return rows
        return None

获取sheet中某个单元格的数据,需要传入行和列

 def get_col_value(self, row, col):
        # print
        if self.get_lines() > row:
            data = self.table.cell(row, col).value
            return data
        return None

获取整个sheet中的数据,并且存放到一个list中

获取sheet数据,按照每行一个list,添加到一个大的list里面
def get_data(self):
        result = []
        rows = self.get_lines()
        if rows != None:
            for i in range(rows):
                col = self.table.row_values(i)
                result.append(col)
            return result
        return None

给单元格写入数据,需要传入行和列,还有要写入的内容

def write_value(self, row, col, value):
        read_value = xlrd.open_workbook(self.excel_path)
        write_data = copy(read_value)   #将execl的内容读取出来拷贝一份
        write_data.get_sheet(self.index).write(row, col, value)   #写入数据
        write_data.save(self.excel_path)   #保存数据

添加新的sheet, 要传入sheet的名称

def add_excel_sheet(self,sheetname):
        rb = xlrd.open_workbook(self.excel_path, formatting_info=True)
        # make a copy of it
        wb = copy(rb)
        # add sheet to workbook with existing sheets
        wb.add_sheet(sheetname)
        wb.save(self.excel_path)

execl 的合并

在main包下面创建combine.py的文件
合并execl 要用到pandas模块

# --coding:utf-8--
# ! python3
import os
import pandas as pd

class CombineExcel(object):
    '''合并sources目录下的所有excel文件'''
    def __init__(self,pwd=None):
        '''pwd为要合并的当前目录'''
        if pwd == None:
            self.pwd = 'sources'
        else:
            self.pwd = pwd

合并的方法,需要传入index指定哪个sheet, 合并后的文件保存路径,以及合并的sheet名称

def combine_all(self,index,file_name,re_sheetname='sheet1'):
        '''合并文件夹下的excel
            index:指定要合并excel文件的哪个sheet,取值0,1,2,.......
            file_name:合并后生成的excel文件的保存路径
            re_sheetname:合并后sheet的名字,默认为sheet1
        '''
        # 新建列表,存放文件名
        file_list = []
        # 新建列表存放每个文件数据(依次读取多个相同结构的execl文件并创建DataFrame)
        dfs = []
        for root, dirs, files in os.walk(self.pwd):
            for file in files:
                file_path = os.path.join(root, file)
                file_list.append(file_path)
                print(file_path)
                df = pd.read_excel(io=file_path, sheet_name=index, header=None)
                dfs.append(df)
        df = pd.concat(dfs)
        df.to_excel(file_name, sheet_name=re_sheetname, index=False)

通过CombineExcel 类就可以把execl合并,合并后还需要统计分析,需要用到ExcelUtil类的方法。

数据统计分析

在main包中创建了statistics_main.py 就是来对合并后的execlt统计分析的。

#--coding:utf-8--
#! python3
import sys
sys.path.append('E:\python\问题列表文档\execl合并')
from util.excel_util import ExcelUtil
from main.combine import CombineExcel
import os
import xlrd
from xlutils.copy import copy

class Statistics(object):
    '''统计每个项目问题列表的解决情况,和每个组的问题解决情况统计'''
    def __init__(self,excel_path,index):
        self.excel_path = excel_path
        self.index = index
        self.ex = ExcelUtil(self.excel_path, self.index)

这里的统计分析代码比较多,而且统计的代码跟自己的execl的内容有关,需要自己去实现,但是都是对execl的操作,方法在ExcelUtil中都已经实现了,只需要调用即可。

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

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

相关文章

Mysql 数据库开发及企业级应用

文章目录 1、Mysql 数据库开发及企业级应用1.1、为什么要使用数据库1.1.1、数据库概念(Database)1.1.2、为什么需要数据库 1.2、程序员为什么要学习数据库1.3、数据库的选择1.3.1、主流数据库简介1.3.2、使用 MySQL 的优势1.3.3、版本选择 1.4、Windows …

C语言,通过多文件编辑定义字符指针,指向堆区空间,计算字符串长度

通过多文件编辑,定义字符指针,分别指向堆区空间,计算字符串长度 要求: 1、定义函数实现堆区空间申请 2、在主函数中实现输入字符串 3、定义函数实现字符串长度 函数原型:size_t my_strlen(const char *s) 4、定义函数释…

vue 下拉框显示从后端请求的数据

下拉框<!-- 给产品添加推广人员弹出框 --><el-dialog :title"titlePerson" :visible.sync"openAddPerson" width"1000px" append-to-body><el-select v-model"this.bindingProductPerson.recommendId" filterable plac…

分层解耦-IOCDI-IOC详解

目录 Bean的声明 注意 声明bean的时候&#xff0c;可以通过value属性指定bean的名字&#xff0c;如果没有指定&#xff0c;默认为类名首字母小写 使用以上四个注解都可以声明bean&#xff0c;但在SpringBoot集成Web开发中&#xff0c;声明控制器bean只能使用Controller或者R…

springboot时间管理系统

通过前面的功能分析可以将时间管理系统的功能分为管理员&#xff0c;用户两个部门&#xff0c;系统的主要功能包括首页&#xff0c;个人中心&#xff0c;系统公告管理&#xff0c;用户管理&#xff0c;时间分类管理&#xff0c;事件数据管理&#xff0c;目标数据管理&#xff0…

MySQL数据库第七课————数据的增删改查----------简单操作

作者前言 欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com —————————————————————————————— 目录 SQL增删改查 新增数据 删除数据 修改&#xff08;更新&#xff09;数据 查询数据 条件 ————————————————…

java ajax

1.ajax定义:异步刷新技术 2.ajax语法 3.ajax实战 在不需要点击刷新按钮时达到局部刷新显示&#xff0c;如下图所示 步骤一&#xff1a;创建工程/包/js 步骤二&#xff1a;数据库/表创建 步骤三&#xff1a;实体类 步骤四&#xff1a;UserDao package cn.kgc.dao;import cn…

linux_driver_day10

作业1 题目&#xff1a; 使用驱动代码实现如下要求 应用程序通过阻塞的io模型来读取number变量的值 number是内核驱动中的一个变量 number的值随着按键按下而改变&#xff08;按键中断&#xff09; 例如 numbero 按下按键 number1&#xff0c;再次按下按键 number0 在按下按…

pdf文件怎么删除密码?4个方法实用简单!

PDF文件作为一种常见的电子文档格式&#xff0c;广泛应用于各行各业。有时候&#xff0c;我们可能会遇到需要删除PDF文件密码的情况&#xff0c;无论是因为忘记密码、接收到加密的文件或是需要与他人共享文件等。为了帮助你轻松解决这一问题&#xff0c;本文将介绍四种简单实用…

【GitHub】腾讯这一款设计神器,开源了!PAG 动效组件

作为一个资深的互联网用户&#xff0c;我们经常会在各种产品上看到十分酷炫的动画效果。比如&#xff0c;短视频中有趣的虚拟场景、直播间粉丝打榜的 “火箭”、“轮船” 等等。 如今&#xff0c;优质的动效不仅可以使用户更容易地理解产品功能和操作方式&#xff0c;减少用户…

简单分享怎么做卖货小程序

微信卖货小程序是一种基于微信平台开发的小程序应用&#xff0c;它可以帮助用户在小程序中完成商品展示、下单购买、在线支付等操作。下面我们来介绍微信卖货小程序的好处和优点。 一、便捷快速 微信卖货小程序可以直接在微信App中使用&#xff0c;无需下载和安装&#xff0c;…

docker-compose安装gitlab

docker安装gitlab 1、创建docker-compose.yml文件 version: 3 services:gitlab:image: twang2218/gitlab-ce-zh:11.1.4restart: unless-stoppedhostname: gitlab.example.comenvironment:TZ: Asia/ShanghaiGITLAB_OMNIBUS_CONFIG: |external_url http://gitlab.example.comgi…

基于STM32LVGL8.2保姆级教程①软件资料准备

下载LVGL源码 LVGL资料包下载点击直达 点击master -》选择8.2分支,也就是倒数第二个 准备开发环境 这个软件玩STM32的有好吧 准备代码模板 需要准备一份能够成功点亮屏幕的keil工程 既然是保姆级教程 So我免费分享出来 私信或评论区获取 此屏幕驱动 就是图片里面的那块屏幕 具…

【安装】windows环境下的 JDK官网下载 安装配置 环境变量

目录 官网下载JDK8windows安装JDKJava环境配置JDK、JRE、JVMJava环境配置1.JAVA_HOME2.PATH3.CLASSPATH 测试环境变量运行命令行cmd查看jdk是否安装 官网下载JDK8 Oracle 甲骨文中国 | 云应用和云平台 选择产品/Java 下载JDK8 点击下载Java 选择Java archive 选择x64位安装包 …

读笛卡尔《方法论》有感

1.新书到手 今天又到手一本新书《谈谈方法》&#xff08;又称《方法论》&#xff09;&#xff0c;此书的作者是笛卡尔&#xff0c;本书介绍了笛卡尔是如何运用自己的理性在各门学科里寻求真理的方法。 勒内笛卡尔&#xff08;1596年3月31日-1650年2月11日&#xff09;&#xf…

MySQL每日一练:单表查询、连接查询

目录 1、创建两张表 student表&#xff1a; score表 &#xff1a; 2.为student表和score表增加记录 student表&#xff1a; score表&#xff1a; 3、按条件查找 1、创建两张表 student表&#xff1a; CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY…

dubbo核心知识

1、简介 Apache Dubbo (incubating) |ˈdʌbəʊ|是一款高性能、轻量级的开源Java RPC框架&#xff0c;它提供了三大核心能力&#xff1a;面向接口的远程方法调用&#xff0c;智能容错和负载均衡&#xff0c;以及服务自动注册和发现。 官网&#xff1a;http://dubbo.apache.or…

【导航驾驶引导(DG)模块功能】

什么是DG&#xff1f; 相信每个人都有迷路的经历&#xff0c;当你徘徊在十字路口时&#xff0c;你需要的可能是一张地图&#xff0c;当你在地图上找不到参照物的时候&#xff0c;你需要的是一个能告诉你正确道路的好心人&#xff0c;但对于一个Driver来说&#xff0c;在驾驶期间…

什么是超网,和子网有什么区别

将 IP 地址分组到子网和超网中是 IP 地址管理的一个基本方面。使网络管理员能够将其海量网络地址空间的不同 IP 组分解并聚合为可管理的实体&#xff0c;IP 子网划分和超网已成为有效网络地址空间管理的核心组件。 了解超网的细微差别以及超网和子网之间的主要区别对于设计和管…

离线安装Docker

查看可用的软件版本 关注回复&#xff1a;1001 可直接获取docker镜像 下载到指定文件夹 解压后复制到目标服务器之后进入文件夹安装 启动docker 测试docker是否安装成功