接了一个小单,需求是:

  1. 用Python实现自动生成并更新Tracker表格。
  2. Tracker表格中有两个sheet,分别对应相同名字的文件夹,SAV是doc文件合集,每个文件夹将会有上百个文件(目前只放了几个用于测试,实际上需要录入七八百个文件),需要实现自动按照ID的顺序将信息自动录入Tracker这个excel中。
  3. 待提取内容部分来自表格,部分来自文本。
  4. 当文件夹中加入新文件时,再次运行代码可以更新excel。

字段对应关系非常简单,同名即对应。

背景如上,开始设计程序。基本思路是:首先针对单个word文档进行提取,然后加入遍历文件夹操作。

 这个word涉及表格和文字,所以分别提取内容存至列表col_values。

    file=Document(doc_path)
    col_keys = [] # 获取列名
    col_values = [] # 获取全部列值
    # 添加一个去重机制
    index_num = 0
    fore_str = ''
    for table in file.tables:
        for row_index,row in enumerate(table.rows):
            for col_index,cell in enumerate(row.cells):
                if fore_str != cell.text:
                    if index_num % 2==0:
                        col_keys.append(cell.text)
                    else:
                        col_values.append(cell.text)
                    fore_str = cell.text
                    index_num +=1

    for para in file.paragraphs:
        col_values.append(para.text)

然后输出col_values的值,使用自己需要的内容在列表中的位置(索引)将需要的col_values按顺序存放至列表doc_values。

    date = col_values[1].split('\n')
    doc_values = [] # 获取需要的列值
    doc_values.append(col_values[0])
    doc_values.append(date[1])
    doc_values.append(col_values[7])
    doc_values.append(col_values[9])
    doc_values.append(' ')
    doc_values.append(col_values[4])
    doc_values.append(col_values[3])
    doc_values.append(col_values[23])

至此完成对单个word文档的内容提取。

开始设计遍历文件夹部分。

if __name__ == '__main__':
    for filepath,dirnames,filenames in os.walk(r"D:\install\desktop\AM\SAV"):
        for filename in filenames:
            doc_path = os.path.join(filepath,filename)
            doc_values = write_word(doc_path)
            wb = load_workbook('D:/install/desktop/Tracker.xlsx')
            ws2 = wb['SAV']
            rows = ws2.max_row

因为我使用os.walk每次都会遍历文件夹里的所有文件,所以需要加入一个判断结构:判断当前文件是否已经被写入excel,同时注意写入excel时使用的是追加操作。

            columnA_data = []#存放当前excel里的所有ID
            for i in range(1, rows):
                cell_value = ws2.cell(row=i+1, column=1).value
                columnA_data.append(cell_value)
            if doc_values[0] in columnA_data:
                print("文件{}已被写入excel".format(doc_values[0]))
            else:
                ws2.append(doc_values)
                wb.save('D:/install/desktop/Tracker.xlsx')
                print('保存成功')

至此全部完成。

完整代码如下:

from docx import Document
from openpyxl import load_workbook
import os

def write_word(doc_path):
    file=Document(doc_path)
    col_keys = [] # 获取列名
    col_values = [] # 获取全部列值
    # 添加一个去重机制
    index_num = 0
    fore_str = ''
    for table in file.tables:
        for row_index,row in enumerate(table.rows):
            for col_index,cell in enumerate(row.cells):
                if fore_str != cell.text:
                    if index_num % 2==0:
                        col_keys.append(cell.text)
                    else:
                        col_values.append(cell.text)
                    fore_str = cell.text
                    index_num +=1

    for para in file.paragraphs:
        col_values.append(para.text)
    print(col_values)
    date = col_values[1].split('\n')
    doc_values = [] # 获取需要的列值
    doc_values.append(col_values[0])
    doc_values.append(date[1])
    doc_values.append(col_values[7])
    doc_values.append(col_values[9])
    doc_values.append(' ')
    doc_values.append(col_values[4])
    doc_values.append(col_values[3])
    doc_values.append(col_values[23])
    return doc_values


if __name__ == '__main__':
    for filepath,dirnames,filenames in os.walk(r"D:\install\desktop\AM\SAV"):
        for filename in filenames:
            doc_path = os.path.join(filepath,filename)
            doc_values = write_word(doc_path)
            wb = load_workbook('D:/install/desktop/Tracker.xlsx')
            ws2 = wb['SAV']
            rows = ws2.max_row
            columnA_data = []
            for i in range(1, rows):
                cell_value = ws2.cell(row=i+1, column=1).value
                columnA_data.append(cell_value)
            if doc_values[0] in columnA_data:
                print("文件{}已被写入excel".format(doc_values[0]))
            else:
                ws2.append(doc_values)
                wb.save('D:/install/desktop/Tracker.xlsx')
                print('保存成功')

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐