Python实现将xml导入至excel


Posted in Python onNovember 20, 2015

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

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

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

使用版本:

python:2.7.5

xlwt:1.0.0

一、先分析Testlink XML格式:

Python实现将xml导入至excel

这是一个有两级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("<br />"," ")
        col=col+1
        booksheet.write(row,3,preconditions,style)
      steplist=subb.getElementsByTagName('actions')
      #print steplist
      for step in steplist:
        actions=step.firstChild.data.replace("<br />"," ")
        col=col+1
        booksheet.write(row,4,actions,style)
      #print "测试步骤:",steplist[0].firstChild.data.replace("<br />"," ")
      expectlist=subb.getElementsByTagName('expectedresults')
      
      for expect in expectlist:
        result=expect.childNodes[0].nodeValue.replace("<br />","" )
        booksheet.write(row,5,result,style)

      
  row=row+1
        
workbook.save('demo.xls')

写入excel的效果如下:

Python实现将xml导入至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)
Python 相关文章推荐
Django中对通过测试的用户进行限制访问的方法
Jul 23 Python
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
Python编程之序列操作实例详解
Jul 22 Python
Python中的上下文管理器和with语句的使用
Apr 17 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 Python
pycharm通过ssh连接远程服务器教程
Feb 12 Python
python数据分析:关键字提取方式
Feb 24 Python
在 Pycharm 安装使用black的方法详解
Apr 02 Python
解析Tensorflow之MNIST的使用
Jun 30 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
浅析python中的del用法
Sep 02 Python
详解Python中的文件操作
Jan 14 Python
使用PyCharm配合部署Python的Django框架的配置纪实
Nov 19 #Python
详解在Python程序中解析并修改XML内容的方法
Nov 16 #Python
Python通过DOM和SAX方式解析XML的应用实例分享
Nov 16 #Python
Python的Flask开发框架简单上手笔记
Nov 16 #Python
python实现mysql的单引号字符串过滤方法
Nov 14 #Python
浅析Python中signal包的使用
Nov 13 #Python
Python下rrdtool模块的基本使用方法
Nov 13 #Python
You might like
php设计模式 State (状态模式)
2011/06/26 PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
2013/06/20 PHP
PHP利用str_replace防注入的方法
2013/11/10 PHP
php获取twitter最新消息的方法
2015/04/14 PHP
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
PHP实现文件上传功能实例代码
2017/05/18 PHP
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
加载jQuery后$冲突的解决办法
2010/07/09 Javascript
jQuery的slideToggle方法实例
2013/05/07 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
轻松实现JavaScript图片切换
2016/01/12 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
jQuery实现简单的tab标签页效果
2016/09/12 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
JavaScript中匿名函数的递归调用
2017/01/22 Javascript
angularjs中使用ng-bind-html和ng-include的实例
2017/04/28 Javascript
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
vue 本地环境跨域请求proxyTable的方法
2018/09/19 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
原生javascript制作的拼图游戏实现方法详解
2020/02/23 Javascript
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
Python字符串和文件操作常用函数分析
2015/04/08 Python
Python调用C语言程序方法解析
2020/07/07 Python
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
薇诺娜官方网上商城:专注敏感肌肤
2017/05/25 全球购物
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
公务员更新知识培训实施方案
2014/03/31 职场文书
法制宣传月活动方案
2014/05/11 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python
阿里云k8s服务升级时502错误 springboot项目应用
2022/04/09 Servers
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android