在填写一些档案的时候,有了如下的数据表,查找其政策就相对来说容易了很多。
如果能够根据表格项目内容,自动生成每一户的情况,能够省去查找政策的时间。因时间紧迫,所以代码没有用类和函数进行优化,未来如果有时间再将其优化。
基本思路:首先将每户享受的政策,按着户编号相同的原则,输出pandas表,再就整个表进行与扶贫手册项目的对应值,分别输出字符串,将所有字符串汇总至一个列表,最终将此列表,每一个元素作为一行输出至word文档。
- 将每一户输出为excel(其实可以直接用生成的这个dataframe,这里有点麻烦了)
import pandas as pd tablePath = '14-16享受政策.xls' #数据母表的模板 name = '户编号' filePath = '测试word' #输出word所在的文件夹 df = pd.DataFrame(pd.read_excel(tablePath)) # 将数据总表模板 加载 huNum = df[name].unique() #看 列 有多少不同的值 for i in huNum: idNum = str(i) mask = df[name].isin([idNum]) littleData = df[mask] #获得按 户编号分类的每一个dataframe,户编号都相同,人数不同的表,有所有政策 #print(littleData) nameList = littleData['姓名'].unique() nameHuzhu = str(nameList[0]) fileName = filePath+'/'+ nameHuzhu + '.xls' #构建文件夹名,最终存储为新的xls littleData.to_excel(fileName)
2.根据每一户的dataframe,生成列表,并将其生成word,库是python-docx
import pandas as pd
import os
from docx import Document
filePath = 'Excel'
wordPath = 'word'
for filename in os.listdir(filePath): #读取文件名称
if filename[-3:] == 'xls': #OS系统中,有.DStore这种设置文件,所以可以从文件后缀名来判断是否是需要的文件
mList = [] #新建空列表,用来存储一户中所有的信息,都是字符串。后期可以考虑每个元素都是dataframe,用来在html中写列表<li>
zhengceList = []
targetPath = filePath + '/' + filename #构造文件绝对路径
#print(targetPath)
zongTable = pd.DataFrame(pd.read_excel(targetPath)) #读取每一个excel
zongTable = zongTable.fillna(0) #在读取总表的时候,有些数值为空,这里可以填充为0,或者设定为空值,这里我选择了0
zongTable=zongTable.reset_index() #重置索引,将原来混乱的索引重置为0123...
#print(zongTable)
huzhuName = filename.split('.',1)[0] #获取户主姓名,也就是文件的主文件名,也可以由遍历dataframe,取关系为户主的姓名得到
mList.append('户主姓名:'+ huzhuName) #信息:户主姓名:XXX
idList = list(zongTable['身份证号'].unique()) #确定身份证号有几个不同的值,则家庭人口数为几。 这里可以考虑身份证号或者姓名不同的值进行对应,如果数字不一样要弹出警告
idNum = len((idList))
mList.append('家庭人口'+str(idNum))
bornData = str(idList[0]) #获得户主的身份证号,并将其出生年月提取。 这里写的不太明显了,应该采用遍历的方法,可读性更好
mList.append('出生时间:%s年 %s月 %s 日' % (bornData[6:10],bornData[10:12],bornData[12:14]))
fami = str(list(zongTable['家庭情况'])[0]) #获得家庭情况信息,并返回字符串。 其实应该采用家庭情况一整列,判断非零值,然后进行字符串合并的方式,可能更加综合
if fami!=0:
mList.append('家庭情况:'+ fami)
teleNum = str(list(zongTable['电话'])[0]) #获取家庭的电话号码
mList.append('电话:%s' % teleNum)
mList.append('识别标准:国家标准') #增加两条公共信息
mList.append('家庭住址:丰宁满族自治县土城镇土城村')
dibaoList=zongTable['低保共计'] #获得低保列,如果相加大于零,说明是低保贫困户,否则是一般贫困户
dibaoSum = dibaoList.sum()
if dibaoSum>0:
mList.append('贫困户属性:低保贫困户')
else:
mList.append('贫困户属性:一般贫困户')
pinReason = str(list(zongTable['致贫原因'])[0]) #
bingTable = zongTable[['姓名','疾病种类']]
for index, row in bingTable.iterrows(): #将疾病种类列的字符串连接,形成疾病的情况,以看是因病致贫还是其他原因
if row['疾病种类'] != 0:
if len(str(row['疾病种类']).strip())!=0:
mList.append(str(row['姓名'])+':'+str(row['疾病种类']))
#pass
#print(mList)
gengdiMoney = zongTable['18年粮食直补107.7'].sum()
if float(gengdiMoney)!=0:
gengArea = float('%.1f' % gengdiMoney/107.7) #计算国家认定的耕地面积,注意要保留1位小数
mList.append('耕地面积:'+str(gengArea))
linArea =zongTable['退耕亩数'].sum() #林地面积,就是退耕还林的亩数
if linArea!=0:
mList.append('林地面积'+str(linArea))
peopleTable = zongTable[['姓名','身份证号','与户主关系']] #遍历每一行,获得家庭中 姓名,身份证号,与户主关系
for index,row in peopleTable.iterrows():
mList.append(str(row['姓名'])+' '+str(row['身份证号'])+' '+str(row['与户主关系'])) #这里注意要转化为字符串,否则身份证号可能识别为数字
helpTab = zongTable[['帮扶单位','责任人姓名','帮扶电话']] #获得帮扶单位,帮扶责任人姓名以及帮扶电话号码,也要注意转化为字符串
for index,row in helpTab.iterrows():
if row['帮扶单位']:
mList.append('帮扶责任人:'+str(row['责任人姓名'])+' '+str(row['帮扶单位'])+' '+str(row['帮扶电话']))
if float(gengdiMoney)!=0:
gengArea = float('%.1f' % gengdiMoney/107.7) #根据粮食直补计算出耕地面积,并格式化补贴
mList.append('帮扶措施:粮食直补'+' 成效:'+'粮食直补'+str(gengArea)+'亩'+'获得补贴'+str(float('%.2f' % gengdiMoney))+'元')
linArea = zongTable['退耕亩数'].sum()
if linArea != 0: #获得退耕还林面积,以及格式化相关补贴内容
mList.append('帮扶措施:退耕还林'+' 成效:退耕还林' + str(linArea)+'亩,获得补贴'+str(float('%.2f' %zongTable['退耕金额'].sum()))+'元')
if dibaoSum>0: #dibaoList是低保列
diList = list(zongTable['低保共计']) #[0, 0, 2880, 0]
realList = [i for i in diList if i !=0] #[2880, 2880] 删除0元素
perMonth = dibaoSum/len(realList)/12 #获取低保人数,以及总数额
mList.append('帮扶措施:最低生活保障政策,申请低保,享受低保政策%d元/人/月,共%d人, 成效:共领取低保金%s元'
% (perMonth,len(realList),dibaoSum))
wujiaSum = zongTable['物价补贴2-5月'].sum() #物价补贴和电费补贴
if wujiaSum>0:
mList.append('帮扶措施:物价补贴, 帮扶成效:领取物价补贴2-5月共计%d元' %wujiaSum)
eleSum= zongTable['电费补贴1-5月7.8'].sum()
if eleSum > 0:
mList.append('帮扶措施:电费补贴, 帮扶成效:领取电费补贴7.8元/月')
yanglaoList = zongTable[['姓名','养老11月','养老1-11']]
yanglaoSum = yanglaoList['养老1-11'].sum()
yanglaoMessage = '' # 养老每人的信息
yangNum = 0 # 享受养老人数
if yanglaoSum>0:
for index, row in yanglaoList.iterrows(): #养老只有1-11月的,应再加上最后一个月
if row['养老11月']!=0:
yanglaoMessage=yanglaoMessage+'%d元/人/月(%s);' % (row['养老11月'],row['姓名'])
yangNum = yangNum+1
mList.append('帮扶措施:享受社会基本养老保险政策,%s 领取社会基本养老保险共%d元,共%d人'
% (yanglaoMessage,yanglaoSum+row['养老11月'],yangNum))
#yanglaoSum+row['养老11月'] 是将1-11月 再加一个11月,变为1-12月的养老金
canjiList = zongTable[['姓名','残疾补贴']]
canjiSum = canjiList['残疾补贴'].sum()
canjiName = ''
if canjiSum>0:
for index, row in canjiList.iterrows():
if row['残疾补贴']>0:
canjiName = canjiName+row['姓名']+' '
mList.append('帮扶措施:享受残疾补助政策%d元/人/月(%s),帮扶成效:共领取残疾补助%d元'
%(row['残疾补贴']/12,canjiName,canjiSum))
houseSum = zongTable['危房补助资金'].sum()
if houseSum>0:
houseList = list(zongTable['危房改造方式'])
houseList = [i for i in houseList if i !=0] #删除0数据
houseMess = ','.join(houseList)
mList.append('帮扶措施:危房改造,%s房屋, 帮扶成效:获得危房改造资金%s元,改善居住条件' %(houseMess,houseSum))
hulinMoney = zongTable['临时护林员2-5月'].sum()
if hulinMoney>0:
mList.append('帮扶措施:选聘为临时护林员, 帮扶成效:临时护林员2-5月工资%d元' % hulinMoney)
workList = zongTable[['姓名','务工单位','务工收入']]
workGo=''
workMess = ''
if workList['务工收入'].sum()>0:
for index, row in workList.iterrows():
if row['务工收入']>0:
workGo = workGo+row['姓名']+'在'+row['务工单位']+'工作,'
workMess = workMess + row['姓名'] +'务工年收入'+str(row['务工收入'])+'元 '
mList.append('帮扶措施:%s 帮扶成效:%s' %(workGo,workMess))
jishengList = zongTable['计生奖扶']
jishengSum = jishengList.sum()
if jishengSum>0:
mList.append('帮扶措施:计生奖扶, 帮扶成效:领取计生奖扶金%d元' % jishengSum)
chongyangList = zongTable[['姓名','重阳慰问']]
if chongyangList['重阳慰问'].sum()>0:
for index, row in chongyangList.iterrows():
if row['重阳慰问']>0:
mList.append('帮扶措施:重阳节慰问, 帮扶成效:领取重阳节慰问金%d元' %row['重阳慰问'])
xueList = zongTable[['姓名', '18春学前资助','18年秋学前资助','18春土城小学寄宿补助',
'18年秋土城小学寄宿补助','18年春土城中学寄宿补助','18年秋土城中学寄宿补助']]
for index, row in xueList.iterrows():
if row['18春学前资助']!=0:
mList.append('帮扶措施:享受学前资助政策, 帮扶成效:%s获得18年春学前资助%d元' % (row['姓名'],row['18春学前资助']))
if row['18年秋学前资助']!=0:
mList.append('帮扶措施:享受学前资助政策, 帮扶成效:%s获得18年秋学前资助%d元' % (row['姓名'],row['18年秋学前资助']))
if row['18年秋土城小学寄宿补助']!=0:
mList.append('帮扶措施:享受两免一补政策, 帮扶成效:免除学杂费、免费提供教科书、%s获得18年秋季学期寄宿补助%d元' % (row['姓名'],row['18年秋土城小学寄宿补助']))
if row['18年春土城中学寄宿补助']!=0:
mList.append('帮扶措施:享受两免一补政策, 帮扶成效:免除学杂费、免费提供教科书、%s获得18年春季学期寄宿补助%d元' % (row['姓名'],row['18年春土城中学寄宿补助']))
if row['18年秋土城中学寄宿补助']!=0:
mList.append('帮扶措施:享受两免一补政策, 帮扶成效:免除学杂费、免费提供教科书、%s获得18年秋季学期寄宿补助%d元' % (row['姓名'],row['18年秋土城中学寄宿补助']))
yuluList = zongTable[['姓名','雨露计划']]
try:
yuluList['雨露计划'].sum() #因为雨露计划的列是字符串,如果无法相加,则说明有非零值
except:
for index, row in yuluList.iterrows():
if row['雨露计划']!=0:
mList.append('帮扶措施:享受雨露计划政策, 帮扶成效:%s在%s学习,领取雨露计划助学金' %(row['姓名'],row['雨露计划']))
menzhenList = zongTable[['姓名', '医疗政策(门诊统筹)']]
menzhenMess = ''
for index, row in menzhenList.iterrows():
if row['医疗政策(门诊统筹)'] != 0:
if '500' in str(row['医疗政策(门诊统筹)']):
menzhenMess = menzhenMess + ('%s%s,用于买药;' % (row['姓名'], row['医疗政策(门诊统筹)']))
else:
menzhenMess = menzhenMess + ('%s%s;' % (row['姓名'], row['医疗政策(门诊统筹)']))
if len(menzhenMess) > 0:
mList.append('8组先别写!!帮扶措施:医疗政策(门诊统筹),帮扶成效:%s' % menzhenMess)
doctorList = zongTable[['姓名','总费用','报销']]
doctorMess =''
if doctorList['总费用'].sum():
for index, row in doctorList.iterrows():
if row['总费用']>0:
doctorMess = doctorMess +row['姓名']+'2018年花费'+str(float('%.2f' % row['总费用']))+'元,报销'+str(float('%.2f' % row['报销']))+'元 '
mList.append('帮扶措施:享受先诊疗后付费政策,提高基本医疗保险、大病保险、医疗救助待遇 帮扶成效:%s' %doctorMess)
#print(mList)
wordFilePath = wordPath + '/' + huzhuName+'.docx' # 构造文件绝对路径
document = Document()
#document.add_heading(huzhuName, 0)
for i in mList:
document.add_paragraph(i)
document.save(wordFilePath)
最终在word文件夹里生成了许多的doc文档,同时每个文档内容就是每一户的情况: