利用Python实现读取Word表格计算汇总并写入Excel
作者:XieJava 发布时间:2021-06-24 06:15:47
前言
快过年了,又到了公司年底评级的时候了。今年的评级和往常一下,每个人都要填写公司的民主评议表,给各个同事进行评价打分,然后部门收集起来根据收集上来的评价表进行汇总统计。想想要收集几十号人的评价表,并根据每个人的评价表又要填到Excel中进行汇总计算统计给出每个人的评价,就头大。虽然不是个什么难事,但是是个无脑的细致活。几十个人的评价也得要花大半天的时间来弄,而且搞多了还容易搞错。如是就想起干脆用Python写个小程序自动来处理这些脏活累活,评级年年都要评,每年都可以用。
要做的事情就是读放到某个文件夹中的word文档中的评价表格,根据表格内容进行处理,然后汇总所有的表格数据,根据计算规则,算出每个人的评分,在根据评分计算每个人的评价。汇总后写入Excel中。
不可否认用Python来实现这样的事情真的是太方便了,人生苦短我用Python。
我是用的python的docx包来处理word,用pandas来处理数据并写入excel
一、首先导入包
pip install docx
pip install pandas
pandas写excel依赖openpyxl包所以也到导入
pip install openpyxl
二、读评价表所在的目录文件
通过python的os包,列出文件夹里面的文件,识别出.docx的文件
files=os.listdir(filepah)
for file in files:
if file.find('.docx')>0:
docfilepah=filepah+file
三、读word文件,处理word中的表格数据
data=[]
#读word的docx评议表文件,并读取word中的表格数据
def procdoc(docfilepath):
document=Document(docfilepath)
tables=document.tables
table=tables[0]
for i in range(1,len(table.rows)):
id=int(table.cell(i,0).text)
name=table.cell(i,1).text
excellent=0
if table.cell(i,2).text!='' and table.cell(i,2).text is not None:
excellent=1
competent = 0
if table.cell(i, 3).text!='' and table.cell(i, 3).text is not None:
competent=1
basicacompetent=0
if table.cell(i, 4).text!='' and table.cell(i, 4).text is not None:
basicacompetent=1
notcompetent = 0
if table.cell(i, 5).text!='' and table.cell(i, 5).text is not None:
notcompetent=1
dontunderstand =0
if table.cell(i, 6).text!='' and table.cell(i, 6).text is not None:
dontunderstand=1
appraisedata=[id,name,excellent,competent,basicacompetent,notcompetent,dontunderstand]
data.append(appraisedata)
四、统计计算
通过pandas直接对数据进行统计计算,避免了传统的循环计算。
df = pd.DataFrame(data,columns=['序号','姓名','优秀','称职','基本称职','不称职','不了解'])
df=df.groupby(['序号','姓名']).sum() #汇总每个人每一项的评分
df['票数'] = df.apply(lambda x: x.sum(), axis=1) #统计票数
df['计分'] = (df['优秀']*95+df['称职']*85+df['基本称职']*75+df['不称职']*65+df['不了解']*0)/len(df)#根据规则计分
df['评价']=df['计分'].map(getscore) #根据规则评价评级
计分方法:民主评议得分=Σ各等级票数*等级计分分数/总票数,其中“优秀”计95分,“称职”计85分,“基本称职”计75分,“不称职”计65分,“不了解”不计分。
#根据评分规则计算评级
def getscore(x):
if x>=95:
score='优秀'
elif x>=80 and x<95:
score='称职'
elif x>=75 and x<80:
score='基本称职'
elif x<75:
score='不称职'
return score
五、将统计计算结果写入汇总Excel
通过pandas直接可以将dataframe写入到Excel文件
#将汇总计算好的数据写入Excel
def write2excle(exclefile,dataframe):
writer = pd.ExcelWriter(exclefile)
dataframe.to_excel(writer)
writer.save()
print('输出成功')
完整代码
Python不到八十行代码,实现读Word->处理表格数据->汇总计算数据->写Excel。
完整的代码如下:
import os
import pandas as pd
from docx import Document
data=[]
#读word的docx评议表文件,并读取word中的表格数据
def procdoc(docfilepath):
document=Document(docfilepath)
tables=document.tables
table=tables[0]
for i in range(1,len(table.rows)):
id=int(table.cell(i,0).text)
name=table.cell(i,1).text
excellent=0
if table.cell(i,2).text!='' and table.cell(i,2).text is not None:
excellent=1
competent = 0
if table.cell(i, 3).text!='' and table.cell(i, 3).text is not None:
competent=1
basicacompetent=0
if table.cell(i, 4).text!='' and table.cell(i, 4).text is not None:
basicacompetent=1
notcompetent = 0
if table.cell(i, 5).text!='' and table.cell(i, 5).text is not None:
notcompetent=1
dontunderstand =0
if table.cell(i, 6).text!='' and table.cell(i, 6).text is not None:
dontunderstand=1
appraisedata=[id,name,excellent,competent,basicacompetent,notcompetent,dontunderstand]
data.append(appraisedata)
#读取评议表的目录,并处理目录中的docx文件,根据评议表计算评分,写入汇总表。
def readfile(filepah):
files=os.listdir(filepah)
for file in files:
if file.find('.docx')>0:
docfilepah=filepah+file
procdoc(docfilepah)
df = pd.DataFrame(data,columns=['序号','姓名','优秀','称职','基本称职','不称职','不了解'])
print(df)
df=df.groupby(['序号','姓名']).sum()
df['票数'] = df.apply(lambda x: x.sum(), axis=1)
df['计分'] = (df['优秀']*95+df['称职']*85+df['基本称职']*75+df['不称职']*65+df['不了解']*0)/len(df)
df['评价']=df['计分'].map(getscore)
print(df)
write2excle('民主评议\\民主评议表汇总.xlsx',df)
#根据评分规则计算评级
def getscore(x):
if x>=95:
score='优秀'
elif x>=80 and x<95:
score='称职'
elif x>=75 and x<80:
score='基本称职'
elif x<75:
score='不称职'
return score
#将汇总计算好的数据写入Excel
def write2excle(exclefile,dataframe):
writer = pd.ExcelWriter(exclefile)
dataframe.to_excel(writer)
writer.save()
print('输出成功')
if __name__ == '__main__':
readfile('民主评议\\')
全部源代码:https://github.com/xiejava1018/pythonprocword
来源:https://xiejava.gitee.io/posts/14434407/
猜你喜欢
- 从字符串载入模板我们可以定义模板字符串,然后载入并解析渲染:template.New(tplName string).Parse(tpl s
- 引言什么是数据结构?数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。简单来说,数据结构就是设计数据
- 本文首先举例阐述了两种排序方法的操作步骤,然后列出了用python进行的实现过程,最后对桶式排序方法的优劣进行了简单总结。一、桶排序:排序一
- 主要涉及:JOIN 、JOIN 更新、GROUP BY HAVING 数据查重/去重1 INNER JOIN、LEFT JOIN、RIGHT
- 本文实例讲述了Go语言接口用法。分享给大家供大家参考。具体分析如下:接口类型是由一组方法定义的集合。接口类型的值可以存放实现这些方法的任何值
- 网上讨论的文章已经很多了,这里举一个简单的例子来讨论一下 Composition API 的用法,具体问题才好具体讨论嘛。假如我们要做一个论
- 从文本文件中调出记录出现丢失换行?解决方法:<%Dim fsDim tsset fs=Server.Cr
- 将来电脑的大显示屏会越来越普及,并且从现在web设计作品中能观察到两点趋势:页面布局普遍更宽;页面内容文字普遍更大。使用1280×800和1
- 本文大纲os模块是Python标准库中一个重要的模块,里面提供了对目录和文件的一般常用操作。而Python另外一个标准库——shutil库,
- tpch是TPC(Transaction Processing Performance Council)组织提供的工具包。用于进行OLAP测
- 由于文件夹可能有多层目录,因此需要对其进行递归遍历。本文采取了简单的协议定制,定义了五条命令,指令Head如下:Sync:标识开始同步文件夹
- 环境搭建准备工具:pyton3.5,selenium,phantomjs我的电脑里面已经装好了python3.5安装Seleniumpip3
- 本文实例讲述了Python面向对象编程基础。分享给大家供大家参考,具体如下:1、类的定义Python中类的定义与对象的初始化如下,pytho
- 一、UDP编程1.客户端Client:发起访问的一方。2.服务器端3.server段编程(1)建立socket,socket是负责具体通信的
- 前言因为自已平时会把一个常用到逻辑写成一个工具python脚本,像关于时间字符串处理,像关于路径和文件夹遍历什么的工具。每一次新建一个项目的
- 代码如下#!/bin/python#coding=utf-8#python-version=2.75  
- 来一个简单的例子,看Python如何操作数据库,相比Java的JDBC来说,确实非常简单,省去了很多复杂的重复工作,只关心数据的获取与操作。
- 1、标识符与关键字在了解数据类型之前,先了解一下go的标识符和关键字1.1 标识符在编程语言中标识符就是定义的具有某种意义的词,比如变量名、
- <% pagenum=55'指定打印行数 %> <HTML> <HEAD> <
- 前言 大家好,好男人就是我,我就是好男人,我就是-0nise。在各大漏洞举报平台,我们时常会