word文档(选择题)转换为excl表格

Word转excl表格

同事在作一个批量性的工做,就是将word文档中的题目和选项,转移到xml文档中。
实例:
word文档(选择题)转换为excl表格
转:
word文档(选择题)转换为excl表格python

再网上有不少将各类文档转化的工具和例子,可是不多有将固定格式进行转化的。linux

由于在这以前也是不明因此,老大直接让写个脚本,本能的感受这个脚本不是很好写,有危险。可是哪有惧怕就不作的道理,不会也要干。json

首先肯定好转化思路app

一、查了不少资料,转excl的都是用的json文件转字典再转excl或者将字典、元组、列表转为json再转excl。归根结底就是将字典转excl。比较欣喜的是正好能够将题目当作key,选项和答案当作values。这样很是符合转换过程。
二、那么接下来的问题变成了如何将word文档内容转换为字典的形式。其实也同样很简单,接下来一点一点的分析就OK了。ide

环境问题:
python3:在编写过程当中,由于出现中文,会遇到编码问题,而python3又将编码优化的很好,因此选择python3。(若是你出现乱码,或编码不正确,请考虑编码转化对错问题)
操做系统:linux(deepin)函数

困难又简单的编写历程工具

一、将word文档转换为字典形式

(1)读取word文档内容,python中给出了模块,python-docx
下载模块:测试

sudo pip3 install python-docx优化

咱们须要用到的这个模块方法很简单,只须要读取和输出就能够了编码

import docx
file = docx.Document("./密码学竞赛习题.docx")

Document() 用来打开一个文档
(2)循环输出文档内容,将内容添加到字典当中

从word文档中我发现从第六行开始,没六行为一个题目加上答案。因此我想出先将每一个题目循环输出出来,而后在将每一个题目的内容循环加入的字典当中。又由于每一个键对用多个值,因此,我将选项建立一个列表。

a={}
file = docx.Document("./密码学竞赛习题.docx")
for l in range(1,61):
    b=[]
    for idx,para in enumerate(file.paragraphs[6*l:6+6*l]):
        if idx==0:
            key=para.text
        elif idx==1:
            v1=para.text
            b.append(v1)
        elif idx==2:
            v2=para.text
            b.append(v2)
        elif idx==3:
            v3=para.text
            b.append(v3)
        elif idx==4:
            v4=para.text
            b.append(v4)
        elif idx==5:
            v5=para.text
            b.append(v5)
    a.update({key:b})

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,通常用在 for 循环当中。(百度获得,说白了就是给每行起个行号)

二、将字典转化为excl文件

(1)首先建立excl文件
python也给出了处理表格的模块xlwt,能够直接去下载

sudo pip3 install xlwt
建立一个表格

book = xlwt.Workbook()        #建立excl文件
sheet = book.add_sheet('sheet1')       #建立一个表
title = ['题目','A','B','C','D','答案']           #每一列标题
for col in range(len(title)):                    #将标题逐个添加到表格当中
    sheet.write(0,col,title[col])
row=1                                     #设置行号

(2)正儿八经转excl

一切准备就绪,接下来就是将字典中的内容逐个加入到建立的excl中就OK

for k in a:
    data=a[k]
    data.insert(0,k)               #第一列加入序号
    for index in range(len(data)):             #依次写入每一行
        sheet.write(row,index,data[index])
    row += 1
book.save('TimuTest.xls')                     #保存excl的文件名

三、执行命令获得想要的excl表格

python3 docxToexcl.py

四、整个脚本代码

#!/usr/bin/python3
#coding:utf-8

import docx
import re
import json
import xlwt

a={}
file = docx.Document("./密码学竞赛习题.docx")
for l in range(1,61):
    b=[]
    for idx,para in enumerate(file.paragraphs[6*l:6+6*l]):
        if idx==0:
            key=para.text
        elif idx==1:
            v1=para.text
            b.append(v1)
        elif idx==2:
            v2=para.text
            b.append(v2)
        elif idx==3:
            v3=para.text
            b.append(v3)
        elif idx==4:
            v4=para.text
            b.append(v4)
        elif idx==5:
            v5=para.text
            b.append(v5)
    a.update({key:b})
book = xlwt.Workbook()
sheet = book.add_sheet('sheet1')
title = ['题目','A','B','C','D','答案']
for col in range(len(title)):
    sheet.write(0,col,title[col])
row=1
for k in a:
    data=a[k]
    data.insert(0,k)
    for index in range(len(data)):
        sheet.write(row,index,data[index])
    row += 1
book.save('test.xls')

总结:

其实这个脚本写出来并不满意,由于我在写的时候,只考虑到了正在测试的word文档格式,既然是批量的,文档的格式也不必定都是同样的。因此很难作到将别的格式的文档转化为想要的excl表格。最大的问题就是若是文档中出现来一个空行,脚本依然会计算进去,同时每六行循环依次的话,结果就会出来差异。脚本须要改进,现在感受好一点的办法是利用正则匹配选项。等有机会写出来的话再贴上来吧!!!