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命令行参数解析模块optparse使用实例
Apr 13 Python
Python 专题四 文件基础知识
Mar 20 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
Feb 13 Python
详解Python读取yaml文件多层菜单
Mar 23 Python
python实现计数排序与桶排序实例代码
Mar 28 Python
Python 旋转打印各种矩形的方法
Jul 09 Python
python爬虫之遍历单个域名
Nov 20 Python
python编程进阶之异常处理用法实例分析
Feb 21 Python
Python定时任务APScheduler原理及实例解析
May 30 Python
Python学习之time模块的基本使用
Jan 17 Python
python 基于opencv去除图片阴影
Jan 26 Python
Python中快速掌握Data Frame的常用操作
Mar 31 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
应用开发中涉及到的css和php笔记分享
2011/08/02 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
javascript function、指针及内置对象
2009/02/19 Javascript
xml和web特殊字符
2009/04/28 Javascript
jQuery对表单的操作代码集合
2011/04/06 Javascript
JS左右无缝滚动(一般方法+面向对象方法)
2012/08/17 Javascript
Js中setTimeout()和setInterval() 何时被调用执行的用法
2013/04/12 Javascript
仿百度的关键词匹配搜索示例
2013/09/25 Javascript
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
node.js中的fs.link方法使用说明
2014/12/15 Javascript
NodeJS学习笔记之FS文件模块
2015/01/13 NodeJs
跟我学习javascript的undefined与null
2015/11/17 Javascript
详解JavaScript的流程控制语句
2015/11/30 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
vue购物车插件编写代码
2017/11/27 Javascript
浅谈Angular6的服务和依赖注入
2018/06/27 Javascript
Vue数据双向绑定的深入探究
2018/11/27 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
2019/03/28 Javascript
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
[02:36]DOTA2混沌骑士 英雄基础教程
2013/11/26 DOTA
python爬虫的数据库连接问题【推荐】
2018/06/25 Python
python+splinter自动刷新抢票功能
2018/09/25 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
Lombok插件安装(IDEA)及配置jar包使用详解
2020/11/04 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
韩国CJ食品专卖网:CJonmart
2016/09/11 全球购物
指针和引用有什么区别
2013/01/13 面试题
《藏戏》教学反思
2014/02/11 职场文书
首都博物馆观后感
2015/06/05 职场文书
SQL实现LeetCode(178.分数排行)
2021/08/04 MySQL