Python实现将xml导入至excel
admin
2023-07-31 02:33:29
0

最近在使用Testlink时,发现导入的用例是xml格式,且没有合适的工具转成excel格式,xml使用excel打开显示的东西也太多,网上也有相关工具转成csv格式的,结果也不合人意。

那求人不如尔己,自己写一个吧

需要用到的模块有:xml.dom.minidom(python自带)、xlwt

使用版本:

python:2.7.5

xlwt:1.0.0

一、先分析Testlink XML格式:

这是一个有两级testusuit的典型的testlink用例结构,我们只需要取testsuite name,testcase name,preconditions,actions,expectedresults

二、程序如下:

#coding:utf-8
\'\'\'
Created on 2015-8-20

@author: Administrator
\'\'\'
\'\'\'
\'\'\'
import xml.etree.cElementTree as ET
import xml.dom.minidom as xx
import os,xlwt,datetime

workbook=xlwt.Workbook(encoding=\"utf-8\")
# 
booksheet=workbook.add_sheet(u\'sheet_1\')
booksheet.col(0).width= 5120
booksheet.col(1).width= 5120
booksheet.col(2).width= 5120
booksheet.col(3).width= 5120
booksheet.col(4).width= 5120
booksheet.col(5).width= 5120

dom=xx.parse(r\'D:\\\\Python27\\test.xml\')
root = dom.documentElement
row=1
col=1

borders=xlwt.Borders()
borders.left=1
borders.right=1
borders.top=1
borders.bottom=1


style = xlwt.easyxf(\'align: wrap on,vert centre, horiz center\') #自动换行、水平居中、垂直居中
#设置标题的格式,字体方宋、加粗、背景色:菊黄
#测试项的标题

title=xlwt.easyxf(u\'font:name 仿宋,height 240 ,colour_index black, bold on, italic off; align: wrap on, vert centre, horiz center;pattern: pattern solid, fore_colour light_orange;\')
item=\'测试项\'
Subitem=\'测试分项\'
CaseTitle=\'测试用例标题\'
Condition=\'预置条件\'
actions=\'操作步骤\'
Result=\'预期结果\'
booksheet.write(0,0,item,title)
booksheet.write(0,1,Subitem,title)
booksheet.write(0,2,CaseTitle,title)
booksheet.write(0,3,Condition,title)
booksheet.write(0,4,actions,title)
booksheet.write(0,5,Result,title)
#冻结首行
booksheet.panes_frozen=True
booksheet.horz_split_pos= 1


#一级目录
for i in root.childNodes:
  testsuite=i.getAttribute(\'name\').strip()
  #print testsuite
  #print testsuite
  \'\'\'
  写测试项
  \'\'\'
  print \"row is :\",row
  booksheet.write(row,col,testsuite,style)
  

  #二级目录
  for dd in i.childNodes:
    print \"    %s\" % dd.getAttribute(\'name\')
    testsuite2=dd.getAttribute(\'name\')
    if not dd.getElementsByTagName(\'testcase\'):
      print \"Testcase is %s\" % testsuite2
      row=row+1
      booksheet.write(row,2,testsuite2,style)  #写测试分项
    
    row=row+1
    
    booksheet.write(row,1,testsuite2,style)
    itemlist=dd.getElementsByTagName(\'testcase\')
    
    for subb in itemlist:
      #print \"         %s\" % subb.getAttribute(\'name\')
      testcase=subb.getAttribute(\'name\')
      
      row=row+1
      booksheet.write(row,2,testcase,style)

      ilist=subb.getElementsByTagName(\'preconditions\')
      for ii in ilist:
        preconditions=ii.firstChild.data.replace(\"
\",\" \") col=col+1 booksheet.write(row,3,preconditions,style) steplist=subb.getElementsByTagName(\'actions\') #print steplist for step in steplist: actions=step.firstChild.data.replace(\"
\",\" \") col=col+1 booksheet.write(row,4,actions,style) #print \"测试步骤:\",steplist[0].firstChild.data.replace(\"
\",\" \") expectlist=subb.getElementsByTagName(\'expectedresults\') for expect in expectlist: result=expect.childNodes[0].nodeValue.replace(\"
\",\"\" ) booksheet.write(row,5,result,style) row=row+1 workbook.save(\'demo.xls\')

写入excel的效果如下:

我们再来看个实例:

需要下载一个module:xlwt,如下是source code

import xml.dom.minidom
import xlwt
import sys

col = 0
row = 0  


def handle_xml_report(xml_report, excel):  
  problems = xml_report.getElementsByTagName(\"problem\")
  handle_problems(problems, excel)
  

def handle_problems(problems, excel):
  for problem in problems:
    handle_problem(problem, excel)


def handle_problem(problem, excel):
  global row
  global col
  code = problem.getElementsByTagName(\"code\")  
  file = problem.getElementsByTagName(\"file\")  
  line = problem.getElementsByTagName(\"line\")  
  message  = problem.getElementsByTagName(\"message\")

  for node in code:  
    excel.write(row, col, node.firstChild.data)
    col = col + 1 
  for node in file:  
    excel.write(row, col, node.firstChild.data) 
    col = col + 1    
  for node in line:  
    excel.write(row, col, node.firstChild.data)     
    col = col + 1    
  for node in message:  
    excel.write(row, col, node.firstChild.data)     
    col = col + 1
  row = row+1
  col = 0

if __name__ == \'__main__\': 
  if(len(sys.argv) <= 1):
    print (\"usage: xml2xls src_file [dst_file]\")
    exit(0)
  #the 1st argument is XML report ; the 2nd is XLS report
  if(len(sys.argv) == 2):
    xls_report = sys.argv[1][:-3] + \'xls\'
  #if there are more than 2 arguments, only the 1st & 2nd make sense
  else:
    xls_report = sys.argv[2]
  xmldoc = xml.dom.minidom.parse(sys.argv[1]) 
  wb = xlwt.Workbook()
  ws = wb.add_sheet(\'MOLint\')
  ws.write(row, col, \'Error Code\')
  col = col + 1
  ws.write(row, col, \'file\')
  col = col + 1  
  ws.write(row, col, \'line\')  
  col = col + 1  
  ws.write(row, col, \'Description\') 
  row = row + 1
  col = 0
  handle_xml_report(xmldoc, ws)
  wb.save(xls_report)

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...