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获取Linux系统的各种信息
Jul 10 Python
Python装饰器入门学习教程(九步学习)
Jan 28 Python
Python实现中文数字转换为阿拉伯数字的方法示例
May 26 Python
python单例模式获取IP代理的方法详解
Sep 13 Python
Linux CentOS Python开发环境搭建教程
Nov 28 Python
python命令行工具Click快速掌握
Jul 04 Python
python实现微信小程序用户登录、模板推送
Aug 28 Python
详解Python IO编程
Jul 24 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
让文件路径提取变得更简单的Python Path库
May 27 Python
pytorch 梯度NAN异常值的解决方案
Jun 05 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
Mar 03 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 字符串正则替换函数preg_replace使用说明
2011/07/15 PHP
PHP在线调试执行的实现方法(附demo源码)
2016/04/28 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
20条学习javascript的编程规范的建议
2014/11/28 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
2018/05/17 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
Vue实现移动端左右滑动效果的方法
2018/11/27 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
jQuery表单校验插件validator使用方法详解
2020/02/18 jQuery
[03:28]2014DOTA2国际邀请赛 EG战队官方纪录片
2014/07/21 DOTA
Python中实现远程调用(RPC、RMI)简单例子
2014/04/28 Python
python下10个简单实例代码
2017/11/15 Python
python爬取淘宝商品详情页数据
2018/02/23 Python
PyCharm代码格式调整方法
2018/05/23 Python
Python 面试中 8 个必考问题
2018/11/16 Python
对Django外键关系的描述
2019/07/26 Python
在vscode中启动conda虚拟环境的思路详解
2020/12/25 Python
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
日本最大级玩偶手办购物:あみあみ Amiami
2018/04/23 全球购物
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
少先队学雷锋活动月总结
2014/03/09 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
远程培训的心得体会
2014/09/01 职场文书
2015年农村党员干部主题教育活动总结
2015/03/25 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书
Python实现制作销售数据可视化看板详解
2021/11/27 Python
十大经典日本动漫排行榜 海贼王第三,犬夜叉仅第八
2022/03/18 日漫
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL