2020-01-02

关于用python 将word信息提取写入excel中

由于开发奇特思维,把寄存器描述文档写成word格式,其中居然还有文本描述,所以不得不将word信息提取并读到excel中,里边用了python的正则匹配和判断。

-- coding: utf-8 --

Author: Neng Qi

import re
import sys

import docx
import xlwt
from xlwt import *

from docx import Document # 导入库

从命令行 打开带读取文件

path = “wordsample.docx” # 文件路径
outFile = “data.xls”
if len(sys.argv) > 1:
path = sys.argv[1]
if len(sys.argv) > 2:
outFile = sys.argv[2]
document = Document(path) # 读入文件
tables = document.tables # 获取文件中的表格集

aragraphs = list(document.paragraphs)

for i in aragraphs:

print(i.text)

table = tables[0] # 获取文件中的第一个表格

for i in range(1, len(table.rows)): # 从表格第二行开始循环读取表格数据

result = table.cell(i, 0).text + “” + table.cell(i, 1).text + table.cell(i, 2).text + table.cell(i, 3).text

# cell(i,0)表示第(i+1)行第1列数据,以此类推

print(result)

读取所有的段落文本到程序里面

all_text = document.paragraphs

这个用来放置寄存器的table 标题字段

register_list = []

这个用来存储所有的寄存器表格数据

register_tables = []

转换成ox0000000格式

def tranfer2Ox(str_given: str):
ten_value = 0

try:
    if "’h" in str_given or "'h" in str_given:
        h_str = str_given[str_given.index('h') + 1:]
        ten_value = str(int(h_str.upper(), 16))
    if "’b" in str_given or "'b" in str_given:
        b_str = str_given[str_given.index('b') + 1:]
        ten_value = str(int(b_str, 2))
    ten_value = int(ten_value) * 4
except Exception as E:
    ten_value = 0

return '0x' + hex(ten_value)[2:].zfill(8)

for i in all_text:
# 所有的寄存器必须以 x.x.x.x.x xx寄存器 [寄存器名称] [默认值] 这个格式来存储
strs = “5.2.1.5.6 RX寄存器——[RX_Desc_Queue_timer_cnt_Register] [12’h1x]”
# 正则判断是否存储的是寄存器标题和默认值,只判断文档中的文本,除去表格
# 这个正则匹配两项,一项是寄存器名称,存储在group1. 一项是默认值,存储在grou2 里面
matchObj = re.match(r’[\d\.]{3,}[\s\S]?寄存器[\s\S]?[([\s\S]?)][\s\S]?[([\s\S]*?)]’, i.text, re.M | re.I)
if matchObj:
print(i.text)
print(matchObj.group(1))
print(matchObj.group(2))
register_one = []
register_one.append(matchObj.group(1))
register_one.append(tranfer2Ox(matchObj.group(2)))
# 存入到寄存器列表中,与下面的表格数据相对应
register_list.append(register_one)

从表格中读取数据,并按照excel中的数据格式进行存储

for t in tables:
content_t = []
for i in range(1, len(t.rows)):
bit = t.cell(i, 0).text
bits = bit.split("-")
if len(bits) == 1:
bit_begin = bits[0]
bit_end = 0
else:
bit_begin = bits[0]
bit_end = bits[1]
rw = t.cell(i, 1).text
description = t.cell(i, 2).text
default = t.cell(i, 3).text
rows_content = []
rows_content.append("")
rows_content.append(rw)
rows_content.append(int(bit_begin))
rows_content.append(int(bit_end))
rows_content.append(int(bit_begin) - int(bit_end) + 1)
rows_content.append(tranfer2Ox(default))
rows_content.append("")
rows_content.append("")
rows_content.append("")
rows_content.append("")
rows_content.append(description)
rows_content.append("")
rows_content.append("")
content_t.append(rows_content)
register_tables.append(content_t)

print(“Done with word”)

file = Workbook(encoding=‘utf-8’)
table = file.add_sheet(‘data’)
style = xlwt.XFStyle()
pattern = xlwt.Pattern() # Create the Pattern
pattern.pattern = xlwt.Pattern.SOLID_PATTERN # May be: NO_PATTERN, SOLID_PATTERN, or 0x00 through 0x12
pattern.pattern_fore_colour = xlwt.Style.colour_map[‘gray_ega’]
style.pattern = pattern # Add Pattern to Style
table.write(0, 0, “模块地址位宽”, style)

寄存器名称 woe_en_reg 偏移地址 0x00000000(地址转换为现在0x格式,并且地址乘以4) Direct Reg? YES

字段名称 类型 位号 位长 初始值 测试值 最小值 最大值 reserved 功能和描述 MASK Data Type

Reserrved(当是reserved的时候后边reserved的值默认为1) RW 31 3 29 0x0(就是文档中的default转为0x形式16进制) 1

woe使能 RW 2 2 1 0x0

RX使能 RW 1 1 1 0x0

TX使能 RW 0 0 1 0x0

寄存器说明

rows = 1
title_list = [“字段名称”, “类型”, “位号”, “”, “位长”, “初始值”, “测试值”, “最小值”, “最大值”, “reserved”, “功能和描述”, “MASK”, “Data Type”]
for i, j in zip(register_list, register_tables):
table.write(rows, 0, “寄存器名称”, style)
table.write(rows, 1, i[0])
table.write(rows, 5, “偏移地址”, style)
table.write(rows, 6, “0x00000000”)
table.write(rows, 12, “Direct Reg?”)
table.write(rows, 13, “YES”)
rows += 1
for p, t in enumerate(title_list):
table.write(rows, p, t, style)
rows += 1
for p_rows in j:
for p, t in enumerate(p_rows):
table.write(rows, p, t)
rows += 1
table.write(rows, 0, “寄存器说明”)
rows += 2
file.save(‘data.xls’)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值