辦公自動化-Python如何提取Word標題并保存到Excel中?

辦公自動化-Python如何提取Word標題并保存到Excel中?

  • 應用場景
  • 需求分析
  • 實現思路
  • 實現過程
    • 安裝依賴庫
    • 打開需求文件
    • 獲取word中所有標題
    • 去除不需要的標題
    • 創建工作簿和工作表
    • 分割標題
    • 功能名稱存入測試對象
    • GN-TC+需求標識符存入測試項標識
    • 存入需求標識符
  • 完整源碼
  • 實現效果
  • 學習總結

應用場景

  • 為啥要提這個話題呢?測試小伙伴遇到一個問題,他的痛點是想把需求文檔(word版)中的需求標識符、功能名稱,挨個復制到測試計劃中;

  • 這對他來說是非常痛苦的,如果需求文檔內容過于龐大,對他來說,需要好幾天才能復制完這些標識符;

  • 具體的比如以下word:
    在這里插入圖片描述

  • 他想把以上word標題中的標識符和名稱復制到如下表格中:

測試對象測試項標識需求標識
組織管理GN-TC-US-ADMIN-ZZGLUS-ADMIN-ZZGL
組織管理GN-TC-US-ADMIN-ZZGLUS-ADMIN-ZZGL
組織管理GN-TC-US-ADMIN-ZZGLUS-ADMIN-ZZGL
組織管理GN-TC-US-ADMIN-ZZGLUS-ADMIN-ZZGL
組織管理GN-TC-US-ADMIN-ZZGLUS-ADMIN-ZZGL
  • 針對這個簡單的需求如何用python來實現呢?

需求分析

  • 需求的標題為:序號+[標識符]+功能名稱;
  • 測試計劃中表格內容:
字段說明
測試對象對應需求中的功能名稱
測試項標識GN-TC+需求中的標識符
需求標識符需求中的標識符
  • 經過分析,其實就是把需求中的標題提取出來,然后進行分割,分別寫入測試計劃對應的表格中即可。

實現思路

  • 打開指定目錄下的需求文檔;
  • 獲取需求文檔中的所有標題;
  • 當標題中只有符號“[” 和 "]"時列表;
  • 創建excel工作簿;
  • 新建工作表;
  • 給工作標添加表頭,比如測試對象、測試項標識、需求標識;
  • 分割獲取到的標題并存入excel對應的表頭下。

實現過程

安裝依賴庫

  • 我們使用Python的python-docx庫和openpyxl庫進行以上內容實現;
  • 那么需要安裝這兩個庫:
pip install python-docx
pip install openpyxl
  • 如果沒有網絡,需要在本地單獨安裝,python-docx有以下兩個依賴 lxml和typing-extensions:
C:\Users\Administrator>pip install python-docx
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: python-docx in d:\python37\lib\site-packages (1.1.0)
Requirement already satisfied: lxml>=3.1.0 in d:\python37\lib\site-packages (from python-docx) (4.6.3)
Requirement already satisfied: typing-extensions in d:\python37\lib\site-packages (from python-docx) (4.7.1)
  • 如果沒有網絡,需要在本地單獨安裝,openpyxl有以下兩個依賴 jdcal和 et-xmlfile:
C:\Users\Administrator>pip install openpyxl
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: openpyxl in d:\python37\lib\site-packages (3.0.5)
Requirement already satisfied: jdcal in d:\python37\lib\site-packages (from openpyxl) (1.4.1)
Requirement already satisfied: et-xmlfile in d:\python37\lib\site-packages (from openpyxl) (1.0.1)

打開需求文件

  • 需要導入對應的庫;
  • 文件名稱寫自己的需求文件即可;
import docx
from openpyxl import Workbookdoc = docx.Document("./XX需求.docx")

獲取word中所有標題

  • 先創建和列表用于存放標題;
headings = []for para in doc.paragraphs:if para.style.name.startswith('Heading'):headings.append(para.text)
print(headings)
  • 此時會輸出所有的標題:
['XX管理系統', '[US-ADMIN]ADMIN', '[US-ADMIN-ZZGL]組織管理', 
'[US-ADMIN-ZZGL-YHGL]用戶管理', '功能描述', '輸入輸出', 
'數據流向', '[US-ADMIN-ZZGL-JGYHGL]機構用戶管理', '功能描述', 
'輸入輸出', '數據流向', ' [US-ADMIN-PZGL]配置管理', 
'[US-ADMIN-PZGL-ZZJG]組織機構', '功能描述', '輸入輸出', 
'數據流向', '[US-ADMIN-PZGL-GWXX]崗位信息', '功能描述', 
'輸入輸出', '數據流向', ' [US-ADMIN-PZGL-JSXX]角色信息','功能描述', '輸入輸出', '數據流向', ' [US-AQGLY]SUPERADMIN','[US-SUPERADMIN-XTPZ]系統配置', ' [US-SUPERADMIN-XTPZ-PZGL]配置管理','功能描述', '輸入輸出', '數據流向', '[US-SUPERADMIN-YHPZ]用戶配置','[US-SUPERADMIN-YHPZ-YHJS]用戶角色', '功能描述', '輸入輸出', '數據流向', '[ US-SUPERADMIN-YHPZ-QXFP]權限分配', '功能描述', '數據流向', '[US-SUPERADMIN-YHPZ-CZMM]重置密碼', '功能描述', '輸入輸出', '數據流向', '[US-SUPERADMIN-RZ]日志', '功能描述', '輸入輸出', '數據流向']

去除不需要的標題

  • 以上獲取所有標題后,有的不是我們想要的;
  • 比如功能描述、輸入輸出、數據流向等標題是不需要的;
  • 我們需要的標題是比如[US-SUPERADMIN-RZ]日志;
  • 標題獲取后判斷是否有符號“[” 和 “]”,如果有,再存入列表;
headings = []for para in doc.paragraphs:if para.style.name.startswith('Heading'):if '[' in para.text or ']' in para.text:headings.append(para.text)
print(headings)
  • 此時就去掉了多余的標題內容:
['[US-ADMIN]ADMIN', '[US-ADMIN-ZZGL]組織管理', 
'[US-ADMIN-ZZGL-YHGL]用戶管理', '[US-ADMIN-ZZGL-JGYHGL]機構用戶管理', 
' [US-ADMIN-PZGL]配置管理', '[US-ADMIN-PZGL-ZZJG]組織機構','[US-ADMIN-PZGL-GWXX]崗位信息', ' [US-ADMIN-PZGL-JSXX]角色信息', ' [US-AQGLY]SUPERADMIN', '[US-SUPERADMIN-XTPZ]系統配置', ' [US-SUPERADMIN-XTPZ-PZGL]配置管理', '[US-SUPERADMIN-YHPZ]用戶配置', '[US-SUPERADMIN-YHPZ-YHJS]用戶角色', '[ US-SUPERADMIN-YHPZ-QXFP]權限分配', '[US-SUPERADMIN-YHPZ-CZMM]重置密碼', '[US-SUPERADMIN-RZ]日志']

創建工作簿和工作表

  • 創建一個工作簿;
  • 然后在工作簿中創建一個工作表;
  • 并在工作表中設置表頭為測試對象、測試項標識、需求標識;
wb = Workbook()sheet = wb.create_sheet("data")# ws = wb.active
headers = ['測試對象', '測試項標識', '需求標識符']
for col_num, header in enumerate(headers, start=1):sheet.cell(row=1, column=col_num, value=header)

分割標題

  • 去掉標題中的左書名號"[";
  • 使用右書名號“]”進行分割,左邊即為需求標識符,右邊即為功能名稱;
  • 拼接測試項標題為GN-TC+需求標識符:
c3 = []
c5 = []
c7 = []
for content in headings:c1 = content.strip('[')c2 = c1.split(']')[0]c3.append(c2)c4 = c1.split(']')[1]c5.append(c4)c6 = 'GN-TC-' + c2c7.append(c6)print(c1)
print(c3)
print(c5)
print(c7)
  • 其中c1為去掉所有左書名號:
US-ADMIN]ADMIN
US-ADMIN-ZZGL]組織管理
US-ADMIN-ZZGL-YHGL]用戶管理
US-ADMIN-ZZGL-JGYHGL]機構用戶管理[US-ADMIN-PZGL]配置管理
US-ADMIN-PZGL-ZZJG]組織機構
US-ADMIN-PZGL-GWXX]崗位信息[US-ADMIN-PZGL-JSXX]角色信息[US-AQGLY]SUPERADMIN
US-SUPERADMIN-XTPZ]系統配置[US-SUPERADMIN-XTPZ-PZGL]配置管理
US-SUPERADMIN-YHPZ]用戶配置
US-SUPERADMIN-YHPZ-YHJS]用戶角色US-SUPERADMIN-YHPZ-QXFP]權限分配
US-SUPERADMIN-YHPZ-CZMM]重置密碼
US-SUPERADMIN-RZ]日志
  • c3所有需求標識符:
['US-ADMIN', 'US-ADMIN-ZZGL', 'US-ADMIN-ZZGL-YHGL','US-ADMIN-ZZGL-JGYHGL', ' [US-ADMIN-PZGL', 'US-ADMIN-PZGL-ZZJG', 'US-ADMIN-PZGL-GWXX', ' [US-ADMIN-PZGL-JSXX', ' [US-AQGLY','US-SUPERADMIN-XTPZ', ' [US-SUPERADMIN-XTPZ-PZGL', 'US-SUPERADMIN-YHPZ','US-SUPERADMIN-YHPZ-YHJS', ' US-SUPERADMIN-YHPZ-QXFP', 'US-SUPERADMIN-YHPZ-CZMM', 'US-SUPERADMIN-RZ']
  • c5功能名稱:
['ADMIN', '組織管理', '用戶管理', '機構用戶管理', 
'配置管理', '組織機構', '崗位信息', '角色信息', 
'SUPERADMIN', '系統配置', '配置管理', '用戶配置', 
'用戶角色', '權限分配', '重置密碼', '日志']
  • c7測試項名稱:
[
'GN-TC-US-ADMIN', 
'GN-TC-US-ADMIN-ZZGL', 
'GN-TC-US-ADMIN-ZZGL-YHGL', 
'GN-TC-US-ADMIN-ZZGL-JGYHGL', 
'GN-TC-US-ADMIN-PZGL', 
'GN-TC-US-ADMIN-PZGL-ZZJG', 
'GN-TC-US-ADMIN-PZGL-GWXX', 
'GN-TC-US-ADMIN-PZGL-JSXX', 
'GN-TC-US-AQGLY', 
'GN-TC-US-SUPERADMIN-XTPZ', 
'GN-TC-US-SUPERADMIN-XTPZ-PZGL', 
'GN-TC-US-SUPERADMIN-YHPZ', 
'GN-TC-US-SUPERADMIN-YHPZ-YHJS', 
'GN-TC-US-SUPERADMIN-YHPZ-QXFP', 
'GN-TC-US-SUPERADMIN-YHPZ-CZMM', 
'GN-TC-US-SUPERADMIN-RZ']

功能名稱存入測試對象

for i, heading in enumerate(c5):sheet.cell(row=i+2, column=1, value=heading)

GN-TC+需求標識符存入測試項標識

for i, heading in enumerate(c7):sheet.cell(row=i+2, column=2, value=heading)

存入需求標識符

for i, heading in enumerate(c3):sheet.cell(row=i+2, column=3, value=heading)

完整源碼

# -*- coding:utf-8 -*-
# 作者:蟲無涯
# 日期:2024/5/23
# 文件名稱:test_word.pyimport docx
from openpyxl import Workbookdoc = docx.Document("./XX需求.docx")headings = []for para in doc.paragraphs:if para.style.name.startswith('Heading'):if '[' in para.text or ']' in para.text:headings.append(para.text)
# print(headings)wb = Workbook()sheet = wb.create_sheet("data")# ws = wb.active
headers = ['測試對象', '測試項標識', '需求標識符']
for col_num, header in enumerate(headers, start=1):sheet.cell(row=1, column=col_num, value=header)# print(headings)c3 = []
c5 = []
c7 = []
for content in headings:c1 = content.strip('[')c2 = c1.split(']')[0]c3.append(c2)c4 = c1.split(']')[1]c5.append(c4)c6 = 'GN-TC-' + c2c7.append(c6)
#     print(c1)
# print(c3)
# print(c5)
# print(c7)for i, heading in enumerate(c5):sheet.cell(row=i+2, column=1, value=heading)for i, heading in enumerate(c7):sheet.cell(row=i+2, column=2, value=heading)for i, heading in enumerate(c3):sheet.cell(row=i+2, column=3, value=heading)wb.save('./data.xlsx')

實現效果

在這里插入圖片描述

學習總結

以上還有優化的空間,比如:

  • 字符串中間有空格或者其他多余的內容如何處理?
  • 新建的excel如何對表頭進行字體、顏色等設置?
  • 表格列寬如何調整?
  • 整個表格字體如何設置?
    等等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13950.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13950.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13950.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nginx學習與使用記錄

這里寫自定義目錄標題 定義域名(本地)Nginx的一下常用命令記錄win系統使用 .bat來啟動nginx配置 定義域名(本地) 本地定義域名不需要證書,直接更改hosts文件。 注意:在這個文件夾中是無法更改hosts文件的&…

Vue02-黑馬程序員學習筆記

一、今日學習目標 1.指令補充 指令修飾符v-bind對樣式增強的操作v-model應用于其他表單元素 2.computed計算屬性 基礎語法計算屬性vs方法計算屬性的完整寫法成績案例 3.watch偵聽器 基礎寫法完整寫法 4.綜合案例 (演示) 渲染 / 刪除 / 修改數量 …

一個簡約高級視差效果PR動態圖文開場視頻模板

這是一個高質量且易于定制的pr模板。具有模塊化結構,可以輕松更改內容。包括視頻教程,即使是新手小白也可以輕松套用模板制作視頻。 主要特點: 水平(19201080)和垂直(10801920)分辨率&#xff…

c語言:利用隨機函數產生20個[120, 834] 之間互不相等的隨機數, 并利用選擇排序法將其從小到大排序后輸出(每行輸出5個)

利用隨機函數產生20個[120, 834] 之間互不相等的隨機數&#xff0c; 并利用選擇排序法將其從小到大排序后輸出&#xff08;每行輸出5個&#xff09; 代碼如下&#xff1a; #include <stdio.h> #include <time.h> #include <stdlib.h> int shenchen(int a[…

三維模型相互轉換(obj文件轉inp文件)

三維模型文件根據其含義都是可以進行相互轉換的&#xff0c;這里主要介紹obj文件轉化為inp文件。 什么是inp文件&#xff1f; inp文件是以.inp為后綴的文本文件&#xff0c;它包括了模型的全部數據信息&#xff0c;ABAQUS求解器分析的對象是inp文件&#xff0c;軟件生成的.ca…

PHP身份證真偽驗證、身份證二、三要素核驗、身份證ocr接口

實名認證有利于網絡綠化&#xff0c;所以在互聯網發展迅速的今天&#xff0c;實名認證成了“剛需”。而OCR與實名認證兩種產品的結和更是擦出了美麗的火花。翔云人工智能開放平臺提供的實名認證OCR接口良好的展現出兩種功能結合的效果。以身份實名認證產品舉例來說&#xff0c;…

AI智能體|扣子Coze“圖像流”功能速覽

大家好&#xff0c;我是無界生長。 AI智能體&#xff5c;扣子Coze“圖像流”功能速覽Coze提供易上手的圖像處理工作流&#xff0c;包含智能生成、智能編輯和基礎編輯三類節點&#xff0c;旨在通過AI技術簡化圖像處理過程。本文對扣子Coze“圖像流”功能做了簡單介紹&#xff0…

【qt】初識模型和視圖

模型和視圖 一.模型和視圖的概念1.關系2.模型3.數據4.視圖5.特點 二.文件系統模型1.那種數據&#xff1f;2.界面拖放3.創建模型4.模型設置數據5.視圖設置模型6.模型索引7.模型操作數據①文件名②文件大小③文件類型④是否是目錄⑤文件路徑 三.字符串鏈表模型1.那種數據&#xf…

論Promise在前端江湖的地位及作用

系列文章&#xff1a; 先擼清楚&#xff1a;并發/并行、單線程/多線程、同步/異步 論Promise在前端江湖的地位及作用 前言 上篇文章闡述了并發/并行、單線程/多線程、同步/異步等概念&#xff0c;這篇將會分析Promise的江湖地位。 通過本篇文章&#xff0c;你將了解到&#x…

100base-tx、100base-fx的區別

100表示網線設計的頻率&#xff0c;單位MHz。值越大&#xff0c;網線的速度越快。baseBASEband的縮寫&#xff0c;基帶t物理介質是雙絞線纜f物理介質是光纖x同一個傳輸效率下的多種不同的標準 T表示雙絞線&#xff0c;base-tx是運行超五類雙絞線的快速以太網端口&#xff0c;全…

AI崛起,掌握它,開啟智能新生活!

AI崛起&#xff0c;掌握它&#xff0c;開啟智能新生活&#xff01; &#x1f604;生命不息&#xff0c;寫作不止 &#x1f525; 繼續踏上學習之路&#xff0c;學之分享筆記 &#x1f44a; 總有一天我也能像各位大佬一樣 &#x1f3c6; 博客首頁 怒放吧德德 To記錄領地 &…

Linux中vim的基本使用

目錄 vim中的三種模式以及基本操作命令模式(默認模式)插入模式底行模式 命令模式下的命令底行模式下的命令 vim是Linux和Unix環境下最基本的文本編輯器&#xff0c;類似于windows上的記事本 vim和Visual studio相比&#xff0c;vim并不集成&#xff0c;vim只能用來寫代碼 VS把寫…

Nginx限制IP訪問詳解

在Web服務器管理中&#xff0c;限制某些IP地址訪問網站是一個常見的需求。Nginx作為一款高性能的HTTP服務器和反向代理服務器&#xff0c;提供了靈活強大的配置選項來實現這一功能。本文將詳細講解如何在Nginx中限制IP訪問&#xff0c;并通過示例代碼展示具體操作。 一、Nginx…

使用 Python 簡單幾步去除 PDF 水印

推薦一個AI網站&#xff0c;免費使用豆包AI模型&#xff0c;快去白嫖&#x1f449;海鯨AI 在處理 PDF 文件時&#xff0c;水印有時會影響文件的可讀性或美觀性。幸運的是&#xff0c;Python 提供了多種庫來操作 PDF 文件&#xff0c;其中 PyMuPDF&#xff08;又名 fitz&#xf…

2024年5月24日 十二生肖 今日運勢

小運播報&#xff1a;2024年5月24日&#xff0c;星期五&#xff0c;農歷四月十七 &#xff08;甲辰年己巳月戊子日&#xff09;&#xff0c;法定工作日。 紅榜生肖&#xff1a;龍、牛、猴 需要注意&#xff1a;兔、羊、馬 喜神方位&#xff1a;東南方 財神方位&#xff1a;…

深度學習之基于Matlab的BP神經網絡交通標志識別

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 隨著智能交通系統&#xff08;ITS&#xff09;的快速發展&#xff0c;交通標志識別&#xff0…

BUUCTF---misc---[MRCTF2020]ezmisc

1、附件下載后是一張圖片 2、查看屬性&#xff0c;winhex分析&#xff0c;沒發現什么 3、在kali中binwalk和foremost也沒找到什么信息 4、用stegsolve分析也沒發現什么 5、這里幾乎常見的misc方法都試過了&#xff0c;還是沒有發現什么 6、回歸到圖片本身&#xff0c;想到的…

Nginx性能調優:深入剖析配置與調優技巧

一、引言 Nginx作為一款高性能的HTTP和反向代理服務器&#xff0c;已經被廣泛應用于各種Web服務中。然而&#xff0c;要想充分發揮Nginx的性能優勢&#xff0c;僅僅安裝和配置默認設置是遠遠不夠的。本文將深入剖析Nginx的配置與調優技巧&#xff0c;幫助讀者打造更加高效、穩…

基于51單片機智能大棚澆花花盆澆水灌溉補光散熱設計

一.硬件方案 本設計通過光敏電阻檢測光照強度&#xff0c;然后A/D模塊PCF8591處理后&#xff0c;將光照強度值實時顯示在液晶上&#xff0c;并且可以按鍵控制光照的強度值&#xff0c;當光照低于設定的閾值&#xff0c;1顆白色高亮LED燈亮進行補光&#xff0c;光照高于設定的閾…

第六節 自動裝配源碼理解

tips&#xff1a;不同版本代碼實現有差異。 前面兩章了解的流程&#xff0c;就是 SpringBoot 自動轉配的核心。 一、自動裝配 1.1 什么是 SpringBoot 自動裝配? 自動裝配是 Spring 框架用來減少配置的顯式需求而引入的一個特性&#xff0c;該特性通過 Autowired或者Resource…