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 正则表达式 概述及常用字符
May 04 Python
python处理文本文件并生成指定格式的文件
Jul 31 Python
python中尾递归用法实例详解
Apr 28 Python
Python随手笔记之标准类型内建函数
Dec 02 Python
深入理解NumPy简明教程---数组2
Dec 17 Python
使用Python制作微信跳一跳辅助
Jan 31 Python
python实现手机通讯录搜索功能
Feb 22 Python
Python依赖包整体迁移方法详解
Aug 15 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
Nov 05 Python
python实现简单图书管理系统
Nov 22 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
Sep 29 Python
Python数据模型与Python对象模型的相关总结
Jan 26 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实现登陆验证码(类似条行码状)
2006/10/09 PHP
php下获取客户端ip地址的函数
2010/03/15 PHP
简单的PHP多图上传小程序代码
2011/07/17 PHP
thinkPHP中U方法加密传递参数功能示例
2018/05/29 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
jquery中this的使用说明
2010/09/06 Javascript
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
javascript 数组操作详解
2015/01/29 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
基于js文件加载优化(详解)
2018/01/03 Javascript
JavaScript中的惰性载入函数及优势
2020/02/18 Javascript
vue如何使用外部特殊字体的操作
2020/07/30 Javascript
Python中的各种装饰器详解
2015/04/11 Python
Python的Flask框架中web表单的教程
2015/04/20 Python
python修改操作系统时间的方法
2015/05/18 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
基于Django框架利用Ajax实现点赞功能实例代码
2018/08/19 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
Python中GeoJson和bokeh-1的使用讲解
2019/01/03 Python
Python制作动态字符图的实例
2019/01/27 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
Python的形参和实参使用方式
2019/12/24 Python
完美解决ARIMA模型中plot_acf画不出图的问题
2020/06/04 Python
工程造价与财务管理专业应届生求职信
2013/10/06 职场文书
创先争优公开承诺书
2014/08/30 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
Python基础之变量的相关知识总结
2021/06/23 Python
Redis的字符串是如何实现的
2021/10/24 Redis
Vue全局事件总线你了解吗
2022/02/24 Vue.js