程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

利用Python根據模板生成Word文檔

編輯:Python

文章目錄

    • 背景
      • EXCEL的用例
      • Word內容
    • Python處理
      • 讀取excel的內容
      • 將同模塊的用例保存到同一個對象
      • 采用DocxTemplate根據模板生成word文件
    • 生成結果如下
    • 全部代碼如下

背景

目前測試用例使用excel整理後,後期需要變成word文件。采用手工粘貼賦值整理費時費力,隨采用python程序處理,從工具人解放出來。

EXCEL的用例

excel的用例如下,一般會有很多模塊,且至少包含所屬模塊,用例標題,前置條件,步驟,預期結果等內容 。

Word內容

需要生成Word的內容如下,就是將excel的內容填充到以下。

Python處理

1.使用pandas讀取excel中列的內容
2.將同模塊的用例保存到同一個對象(用來生成一個word文件)
3.采用DocxTemplate根據模板生成word文件

讀取excel的內容

def creatData(file):
""" :param file: 需要生成數據的excle文件 :return: 序列號數據 """
df = pd.read_excel(file)
test_data = []
for i in df.index.values:
# 根據i來獲取每一行指定的數據 並利用to_dict轉成字典
row_data = df.loc[i, excelCol].to_dict()
test_data.append(row_data)
return test_data

將同模塊的用例保存到同一個對象

excelCol = ['所屬模塊', '用例標題', '步驟', '預期', '前置條件']
# 獲取excel中列的去重內容
data_moudle = pd.read_excel(excelFile)
moudle = pd.DataFrame(data_moudle['所屬模塊']).drop_duplicates(subset=None, keep='first', inplace=False).to_dict('list')[
"所屬模塊"]
allData = []
# 聲明拼接的數組,用來生成文件內容
for i in moudle:
item = {
"SSMK": i, "table": []}
allData.append(item)
for name in test_data:
for index, key in enumerate(moudle):
if name[excelCol[0]] == key:
allData[index]["table"].append(
{
"YLBT": zhaunyi(name[excelCol[1]]), "BZ": zhaunyi(name[excelCol[2]]), "YQ": zhaunyi(name[excelCol[3]]),
"QZTJ": zhaunyi(name[excelCol[4]])})

采用DocxTemplate根據模板生成word文件

模板文件tem.docx如下

def createDoc(contexts):
""" :param contexts: 生成文件的內容 :return: 生成文件 """
for index, context in enumerate(contexts):
doc = DocxTemplate("template/tem.docx")
# 執行替換
doc.render(context)
# #保存新的文檔
doc.save("./case/%s.docx" % (str(index) ))

生成結果如下

會根據excel中的模塊生成對應的docx文件,此文章有三個模塊,則會生成三個文件。

全部代碼如下

# -*- coding:utf-8 -*-
import pandas as pd
from docxtpl import DocxTemplate
import os
import shutil
# 聲明需要生成的所屬模塊
# 讀取excel的文件包括路徑和名稱以及後綴名稱
excelFile = 'excelCase/test.xlsx'
# 讀取excel中的列,順序不能變,列名稱要跟excel的名稱對應
excelCol = ['所屬模塊', '用例標題', '步驟', '預期', '前置條件']
# 獲取excel中列的去重內容
data_moudle = pd.read_excel(excelFile)
moudle = pd.DataFrame(data_moudle['所屬模塊']).drop_duplicates(subset=None, keep='first', inplace=False).to_dict('list')[
"所屬模塊"]
print(moudle)
def zhaunyi(str):
# 由於excel中某些單元格為空,因此處理為無
# AttributeError: 'float' object has no attribute 'replace'
if (type(str) == float):
return '無';
""" :param str: 需要轉義的內容 :return: 將特殊字符轉義 """
return str.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
def createDoc(contexts):
""" :param contexts: 生成文件的內容 :return: 生成文件 """
for index, context in enumerate(contexts):
doc = DocxTemplate("template/tem.docx")
# 執行替換
print(context)
print(index)
doc.render(context)
# #保存新的文檔
# doc.save("./case/%s.docx" % (str(index) + "-" + str(context.get("SSMK")).replace("/", "-")))
doc.save("./case/%s.docx" % (str(index) ))
def cleanDoc(file):
""" :param file: 傳入需要清空的文件目錄 :return: 從新生成文件目錄 """
if os.path.exists(file):
# 刪除case目錄
shutil.rmtree(file)
# 創建目錄
os.mkdir(file)
allData = []
# 聲明拼接的數組,用來生成文件內容
for i in moudle:
item = {
"SSMK": i, "table": []}
allData.append(item)
def creatData(file):
""" :param file: 需要生成數據的excle文件 :return: 序列號數據 """
df = pd.read_excel(file)
test_data = []
for i in df.index.values:
# 根據i來獲取每一行指定的數據 並利用to_dict轉成字典
row_data = df.loc[i, excelCol].to_dict()
test_data.append(row_data)
return test_data
test_data = creatData(excelFile)
for name in test_data:
for index, key in enumerate(moudle):
if name[excelCol[0]] == key:
allData[index]["table"].append(
{
"YLBT": zhaunyi(name[excelCol[1]]), "BZ": zhaunyi(name[excelCol[2]]), "YQ": zhaunyi(name[excelCol[3]]),
"QZTJ": zhaunyi(name[excelCol[4]])})
cleanDoc("./case")
createDoc(allData)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved