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 相关文章推荐
Python实现根据指定端口探测服务器/模块部署的方法
Aug 25 Python
python使用arp欺骗伪造网关的方法
Apr 24 Python
Python使用dis模块把Python反编译为字节码的用法详解
Jun 14 Python
Python字符串处理实现单词反转
Jun 14 Python
TensorFlow实现Softmax回归模型
Mar 09 Python
Python3实现的字典遍历操作详解
Apr 18 Python
pandas 按照特定顺序输出的实现代码
Jul 10 Python
利用Python正则表达式过滤敏感词的方法
Jan 21 Python
py-charm延长试用期限实例
Dec 22 Python
Python进行统计建模
Aug 10 Python
python 实现定时任务的四种方式
Apr 01 Python
利用Python判断你的密码难度等级
Jun 02 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批量删除数据
2007/01/18 PHP
php长字符串定义方法
2012/07/12 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
js 调用本地exe的例子(支持IE内核的浏览器)
2012/12/26 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
2015/02/27 Javascript
jQuery使用post方法提交数据实例
2015/03/25 Javascript
AngularJS学习笔记之依赖注入详解
2016/05/16 Javascript
javascript比较语义化版本号的实现代码
2016/09/09 Javascript
js原生实现FastClick事件的实例
2016/11/20 Javascript
简单实现js悬浮导航效果
2017/02/05 Javascript
老生常谈JavaScript获取CSS样式的方法(兼容各浏览器)
2018/09/19 Javascript
webstorm+vue初始化项目的方法
2018/10/18 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
JavaScript判断浏览器运行环境的详细方法
2019/06/30 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
python微信好友数据分析详解
2018/11/19 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
Python 使用list和tuple+条件判断详解
2019/07/30 Python
pytorch的batch normalize使用详解
2020/01/15 Python
Python itertools.product方法代码实例
2020/03/27 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
会计电算化大学生职业规划书
2014/02/05 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
应聘教师求职信范文
2015/03/20 职场文书
同事离别感言
2015/08/04 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
教师师德承诺书2016
2016/03/25 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
2021/04/13 HTML / CSS
聊聊JS ES6中的解构
2021/04/29 Javascript
redis哨兵常用命令和监控示例详解
2021/05/27 Redis
Python可变集合和不可变集合的构造方法大全
2021/12/06 Python
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js