menu 牢记自己是菜
Python--脚本实战练习2 从word文档中读取数据写回电子表格
1373 浏览 | 2020-07-24 | 阅读时间: 约 3 分钟 | 分类: python脚本实战 | 标签:
请注意,本文编写于 1601 天前,最后修改于 1601 天前,其中某些信息可能已经过时。

0x1 前言

又是连续两三天没有更新博客了,虽然有和同学出去玩耍的成分,但是最主要的时间还是花在了这个脚本上。这个工作是母上大人布置的,原因是退休职工需要移交社会,所以母上大人就要为社会那边准备材料。但是材料的形式又很有意思,是一个大量表格的大word文档,每个表格都记录着一个退休职工的基本信息,但是社会那边需要一个电子表格。但是总不能让我母上大人带着手底下的人一个一个敲吧!于是就想让我给她整一个自动化的程序来处理这个问题。为啥这个专题是2,而不是1.原因很简单,因为我之前也帮她解决过类似的事件,上次是筛选没有提交照片人的名单。但是我没有写到博客里面,但是这次在次当我需要处理电子表格的时候,发现手上没有资料可以查阅。所以这次就将这次经历写到这里,以便下次进行参考。


0x2 程序基本要求

由于是一个筛选的程序,所以在一张大表格中我们只需要16个数据,分别是DATA=["编号","姓名","户籍所在地","现居住地","异地居住地","配偶姓名","配偶原工作单位","第一家庭联系人姓名","第一家庭联系人工作单位","第一家庭联系人关系","第一家庭联系人联系方式","第二家庭联系人姓名","第二家庭联系人工作单位","第二家庭联系人关系","第二家庭联系人联系方式","联系电话"]其余的信息都是垃圾信息。所以我们需要先将信息挑拣出来,再将信息写回电子表格即可。

0x3 基本思路

其实整个程序逻辑其实很加单,但是由于数据量很大,所以在编写程序的时候要注意优化问题。尽量少进行传参。这次主要用到了docx库(处理word文档的库),xml(处理电子表格的库),re(正则表达式),和一些class的知识。由于没并没有系统的学过python所以在写脚本的过程中还是比较吃力的。并且遇到了如下问题:

  1. 运行效率慢,大量的表格可能要处理到3~4分钟
  2. word文档正则表达式会因为word格式问题有提取失败的可能性(word文档本身不合规范,导致docx库提供的函数将段落拆分,导致关键信息与数据分离)
  3. 表格信息提取采用了笨办法,即数格子的方式,确定数据在表格的那一栏,代码复用性差

0x4 主要代码(草稿很乱)

import docx
from docx import Document
import sys
import os
import re
from xml.dom import minidom
from xlwt import *
#global Biao=[]        #总表
#global name=[]       #本表姓名
#global Domicile=[]    #户籍所在地
#global nowplace=[]    #现居住地
#global anotherplace=[]#异地居住地
#global partner=[]     #配偶情况
#global workplace=[]#工作单位
#global firstname=[]#第一联系人姓名
#global firstwork=[]#工作单位
#global firstrelation=[]#关系
#global firstphone=[]#联系方式
#global secondname=[]#第二联系人姓名
#global secondwork=[]#工作单位
#global secondrelation=[]#关系
#global secondphon=[]#联系方式
#root = os.getcwd()
#print(root)
class people:
    def __init__(self, name, Domicile,nowplace,anotherplace,partner,workplace,firstname,firstwork,firstrelation,firstphone,secondname,secondwork,secondrelation,secondphon,number,phone):
        self.name=name
        self.Domicile=Domicile
        self.nowplace=nowplace
        self.anotherplace=anotherplace
        self.partner=partner
        self.workplace=workplace
        self.firstname=firstname
        self.firstwork=firstwork
        self.firstrelation=firstrelation
        self.firstphone=firstphone
        self.secondname=secondname
        self.secondwork=secondwork
        self.secondrelation=secondrelation
        self.secondphon=secondphon
        self.number=number
        self.phone=phone
    def detail(self):
        print(self.number)
        print(self.name)
        print(self.Domicile)
        print(self.nowplace)
        print(self.anotherplace)
        print(self.partner)
        print(self.workplace)
        print(self.firstname)
        print(self.firstwork)
        print(self.firstrelation)
        print(self.firstphone)
        print(self.secondname)
        print(self.secondwork)
        print(self.secondrelation)
        print(self.secondphon)
        print(self.phone)
def read1(): #word文件数据的打开
    I=1
    #root = os.getcwd()
    #print(root)
    #A=os.getcwd()
    #name="11.doc"
    #B=os.path.join(A, name)
    #print(B)
    #docName ="C:/Users/Administrator/Desktop/filemake/11.docx"
    #docStr = docx.Document(docName)
    #print(docStr)
    #document = Document('22.docx')
    #print(document)
    number44=[]
    phone44=[]
    Biao=[]        #总表
    porson=[]      #类表
    path = '99.docx' #文件路径
    document = Document(path) #读入文件
    tables = document.tables
    #print(table.rows[:])
    pat=re.compile("编号")
    #m=pat.search("ABCAADDDDDAAAA")#被校验
    #print(m)
    pat1=re.compile("联系电话")
    doc=""
    for para in document.paragraphs:
        #print(para.text)
        match =pat.search(para.text)
        match1 =pat1.search(para.text)
        #print(match)
        #print(match1)
        if match!=None:
            end = match.end()+1
            number1 = para.text[end:end+8]
            #print(number1)
            number44.append(number1)
        if match1!=None:
            end = match1.end()+1
            number2 = para.text[end:end+11]
            #print(number2)
            phone44.append(number2)
    #print(number44)
    #print(phone44)
    for table in tables[:]:
        Biao=[]
        for i, row in enumerate(table.rows[:]):   # 读每行
            row_content = []
            for cell in row.cells[:]:  # 读一行中的所有单元格
                c = cell.text
                row_content.append(c)
            Biao+=row_content
        fix(Biao,number44[I-1],phone44[I-1],I)
        I=I+1
            #print (row_content) #以列表形式导出每一行数据
            #print(Biao)    
        #print(len(Biao))#176
        #fix(Biao,name,Domicile,nowplace,anotherplace)
        
    
def fix(Biao,P,O,I): #word文件的处理
    #print(Biao[1])   #姓名
    A=Biao[1]
    #print(Biao[81])  #户籍所在地
    #print(Biao[82])  #D户籍所在地
    B=Biao[82]
    #print(Biao[89])  #现居住地
    #print(Biao[90])  #D现居住地
    C=Biao[90]
    #print(Biao[98])  #D异地居住
    D=Biao[98]
    #print(Biao[130]) #配偶姓名
    E=Biao[130]
    #print(Biao[132]) #原工作单位
    F=Biao[132]
    #print(Biao[146]) #firstname
    G=Biao[146]
    #print(Biao[148])
    H=Biao[148]
    #print(Biao[154])
    Q=Biao[154]
    #print(Biao[156])
    W=Biao[156]
    #print(Biao[162]) #第二个
    T=Biao[162]
    #print(Biao[164])
    R=Biao[164]
    #print(Biao[170])
    T=Biao[170]
    #print(Biao[172])
    Y=Biao[172]
    obj1 = people(A,B,C,D,E,F,G,H,Q,W,T,R,T,Y,P,O)
    #obj1.detail()
    readback(obj1,I)
def readback(obj,I):#xlm数据写回  
    ldata = []
    ldata.append(obj.number)
    ldata.append(obj.name)
    ldata.append(obj.Domicile)
    ldata.append(obj.nowplace)
    ldata.append(obj.anotherplace)
    ldata.append(obj.partner)
    ldata.append(obj.workplace)
    ldata.append(obj.firstname)
    ldata.append(obj.firstwork)
    ldata.append(obj.firstrelation)
    ldata.append(obj.firstphone)
    ldata.append(obj.secondname)
    ldata.append(obj.secondwork)
    ldata.append(obj.secondrelation)
    ldata.append(obj.secondphon)
    ldata.append(obj.phone)
    #print(ldata)
    for i,p in enumerate(ldata):
    #将数据写入文件,i是enumerate()函数返回的序号数
        table.write(I,i,str(p))
    #table.write(obj.name,obj.Domicile,obj.nowplace)
    #file.save('data.xlsx')#保存
    print(I)
if __name__ == '__main__':
    file = Workbook(encoding = 'utf-8')
    table = file.add_sheet('data')
    DATA=["编号","姓名","户籍所在地","现居住地","异地居住地","配偶姓名","配偶原工作单位","第一家庭联系人姓名","第一家庭联系人工作单位","第一家庭联系人关系","第一家庭联系人联系方式","第二家庭联系人姓名","第二家庭联系人工作单位","第二家庭联系人关系","第二家庭联系人联系方式","联系电话"]
    for i,p in enumerate(DATA):
    #将数据写入文件,i是enumerate()函数返回的序号数
        table.write(0,i,str(p))
    file.save('data.xlsx')
    read1()
    file.save('data.xlsx')
    print("done")

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!

Emoji

Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /www/wwwroot/116.62.100.243/usr/themes/Cuckoo-master/includes/owo.php on line 47

Warning: file_get_contents(): Failed to enable crypto in /www/wwwroot/116.62.100.243/usr/themes/Cuckoo-master/includes/owo.php on line 47

Warning: file_get_contents(https://ljzjsc.com/usr/themes/Cuckoo-master/assets/json/owo.json): failed to open stream: operation failed in /www/wwwroot/116.62.100.243/usr/themes/Cuckoo-master/includes/owo.php on line 47

Warning: array_keys() expects parameter 1 to be array, null given in /www/wwwroot/116.62.100.243/usr/themes/Cuckoo-master/includes/owo.php on line 49

Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /www/wwwroot/116.62.100.243/usr/themes/Cuckoo-master/includes/owo.php on line 88

Warning: file_get_contents(): Failed to enable crypto in /www/wwwroot/116.62.100.243/usr/themes/Cuckoo-master/includes/owo.php on line 88

Warning: file_get_contents(https://ljzjsc.com/usr/themes/Cuckoo-master/assets/json/owo.json): failed to open stream: operation failed in /www/wwwroot/116.62.100.243/usr/themes/Cuckoo-master/includes/owo.php on line 88

Warning: array_keys() expects parameter 1 to be array, null given in /www/wwwroot/116.62.100.243/usr/themes/Cuckoo-master/includes/owo.php on line 90