文章目录

  • 背景
  • EXCEL的用例
  • Word内容
  • Python处理
  • 读取excel的内容
  • 将同模块的用例保存到同一个对象
  • 采用DocxTemplate根据模板生成word文件
  • 生成结果如下
  • 全部代码如下


背景

目前测试用例使用excel整理后,后期需要变成word文件。采用手工粘贴赋值整理费时费力,随采用python程序处理,从工具人解放出来。

EXCEL的用例

excel的用例如下,一般会有很多模块,且至少包含所属模块,用例标题,前置条件,步骤,预期结果等内容 。

python生成word文档的表格 python生成word模板_自动化

Word内容

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

python生成word文档的表格 python生成word模板_pandas_02

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如下

python生成word文档的表格 python生成word模板_python生成word文档的表格_03

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文件,此文章有三个模块,则会生成三个文件。

python生成word文档的表格 python生成word模板_python生成word文档的表格_04

全部代码如下

# -*- 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("&", "&").replace("<", "<").replace(">", ">")


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)