Python excel转xml

来源:互联网 发布:vr眼镜评测 知乎 编辑:程序博客网 时间:2024/06/07 20:21
#! encoding=utf-8import xlrdimport xml.dom.minidomimport osdef open_excel(file):    try:        data = xlrd.open_workbook(file)        return data    except Exception, e:        print str(e)def translate_excel_to_xml(excel_absolute_path, name, generate_xml_dir, parent_list, parent_list_names, parent_list_name, child_list_names="" , child_list_name="", colnnameindex=0, by_index=0, child_index=1):    #解析excel文件    data = open_excel(excel_absolute_path)    #获取需要的工作表    table = data.sheets()[by_index]            #行数    nrows = table.nrows    #列数    ncols = table.ncols    if(child_list_names):        childtable = data.sheets()[child_index]        child_nrows = childtable.nrows        child_ncols = childtable.ncols    #创建dom文档对象    doc = xml.dom.minidom.Document()    # 顶级元素创建    parent = doc.createElement(parent_list)    #创建根元素    doc.appendChild(parent)    info = doc.createElement(parent_list_names)    #将根元素添加到文档中区    parent.appendChild(info)    for nrow in range(1, nrows):        #创建元素        item = doc.createElement(parent_list_name)        for ncol in range(0, ncols):            #colnames = table.col_values(ncol)            #print colnames #            print table.cell(nrow, ncol).value            key = u"%s" % table.cell(0, ncol).value            value = table.cell(nrow, ncol).value            if isinstance(value, float):                value = '%0d' % value            value = '%s' % value#            print type(key), type(value)            #将数据都作为xml中元素的属性,属性名就是第一行的值,属性值就是某一行某一列的值            # item.setAttribute(key.encode('utf-8'), value.encode('utf-8'))            # tmp = key.encode('utf-8')            tmp = doc.createElement(key.encode('utf-8'))            tmp.appendChild(doc.createTextNode(value.encode('utf-8')))            item.appendChild(tmp)        # 请求子表        # 子表list名称作为参数传进来        if(child_list_names):            childlistnames = doc.createElement(child_list_names)            for crow in range(1,child_nrows):                p_value = table.cell(nrow,0).value                c_value = childtable.cell(crow,0).value                if(p_value == c_value):                    # print c_value,p_value                    list = doc.createElement(child_list_name)                    for cls in range(0,child_ncols):                        ckey = u"%s" % childtable.cell(0, cls).value                        cvalue = childtable.cell(crow, cls).value                        if isinstance(cvalue, float):                            cvalue = '%0d' % cvalue                        cvalue = '%s' % cvalue                        # ctmp = ckey.encode('utf-8')                        ctmp = doc.createElement(ckey.encode('utf-8'))                        ctmp.appendChild(doc.createTextNode(cvalue.encode('utf-8')))                        list.appendChild(ctmp)                    #将此元素作为根元素的子节点                    childlistnames.appendChild(list)            item.appendChild(childlistnames)        info.appendChild(item)    #要生成的xml文件名    generate_xml_name = name.strip().split('.')[0] + '.xml'    #要生成的xml文件到某个目录的绝对路径    geneate_xml_dir = os.path.join(generate_xml_dir, generate_xml_name)    f = open(geneate_xml_dir, 'w')    Indent(doc,parent)    # f.write(doc.toprettyxml())          #可以使生成xml有好看的格式,要是不需要,注释上一行,采用此行作为输出    doc.writexml(f)  # 已经用indent函数美化过了    f.close()def find_assign_xlsx(xlsx_path, generate_xml_dir,parent_list,parent_list_names,parent_list_name,child_list_names="",child_list_name=""):    for name in os.listdir(xlsx_path):        if (name.endswith('.xls') or name.endswith('.xlsx')):            #生成excel文件的绝对路径            excel_absolute_path = os.path.join(xlsx_path, name)            #解析excel并转成xml            translate_excel_to_xml(excel_absolute_path, name,generate_xml_dir, parent_list,parent_list_names,parent_list_name,child_list_names,child_list_name)def Indent(dom, node, indent = 0):    children = node.childNodes[:]    if indent:        text = dom.createTextNode('\n' + '\t' * indent)        node.parentNode.insertBefore(text, node)    if children:      if children[-1].nodeType == node.ELEMENT_NODE:          text = dom.createTextNode('\n' + '\t' * indent)          node.appendChild(text)          for n in children:              if n.nodeType == node.ELEMENT_NODE:                  Indent(dom, n, indent + 1)def run_excel_to_xml(type=1):    #车辆计划type=1    if type == 1:        #excel文件路径,xml生成的文件路径        excel_src_path   = r'D:\Python\excel\1'        generate_xml_dir = r'D:\Python\data\1'        # 子表在excel中不存在的节点        child_list_names = "transportPlanDetails"        child_list_name  = "transportPlanDetail"        #父表在excel中不存在的节点        parent_list       = "transportPlanRequest"        parent_list_names = "transportPlans"        parent_list_name  = "transportPlan"        find_assign_xlsx(excel_src_path.decode('utf-8'), generate_xml_dir,parent_list,parent_list_names,parent_list_name,child_list_names,child_list_name)    elif type == 2:        excel_src_path   = r'D:\Python\excel\2'        generate_xml_dir = r'D:\Python\data\2'        parent_list       = "vehicleTrackRequest"        parent_list_names = "vehicleTrackList"        parent_list_name  = "vehicleTrack"        find_assign_xlsx(excel_src_path.decode('utf-8'), generate_xml_dir,parent_list,parent_list_names,parent_list_name)    else:        excel_src_path   = r'D:\Python\excel\3'        generate_xml_dir = r'D:\Python\data\3'        parent_list       = "transportPaidRequest"        parent_list_names = "transportPaidList"        parent_list_name  = "transportPaid"        find_assign_xlsx(excel_src_path.decode('utf-8'), generate_xml_dir,parent_list,parent_list_names,parent_list_name)if __name__ == "__main__":     #车辆计划type=1,车辆轨迹2,实收实发3     run_excel_to_xml(1)     run_excel_to_xml(2)     run_excel_to_xml(3)
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 注册支付宝的手机号成空号了怎么办 银行保本理财回执单丢了怎么办 电脑连不上网ip地址错误怎么办 邮箱填错了没收到面试通知怎么办 电信烽火网络机顶盒零配置中怎么办 专技天下学错科目了怎么办 注册公司行业大类选错了怎么办 私营企业开的车比领导好怎么办 有公司有商标无生产资质怎么办 天猫店铺使用商标被注销怎么办 入仓件快递员搞错入仓号怎么办 商标注册证盖了自己公司的章怎么办 普通机打发票作废票丢了怎么办 淘宝店铺被买家投诉工商介入怎么办 淘宝退货运单号填错了怎么办 微信没有绑手机号密码忘了怎么办 淘宝联盟账号和密码忘记了怎么办 社保用户名和密码都忘记了怎么办 江西银行网银用户名忘了怎么办 邮政银行网银登录密码忘了怎么办 建行网银支付密码忘了怎么办 建行手机网银登录密码忘了怎么办 特岗教师忘记用户名和密码怎么办 特岗教师用户名和密码忘了怎么办 电信登录用户名和密码忘记了怎么办 电脑登录用户名和密码忘了怎么办 电脑网络用户名忘了连不上网怎么办 微博忘记登录名怎么办只记得昵称 买房子付了首付现在要退房怎么办 玩lol延迟高怎么办但网速没问题 中维世纪监控密码忘记了怎么办 原店主营业执照不注销怎么办新的 苹果手机铃声调到最大还小怎么办 投标时措施费忘记套价了怎么办 美团商家更改手机号和银行卡怎么办 淘宝买的衣服颜色发错了怎么办 在淘宝买的衣服颜色不一样怎么办 新买的木柜气味好重怎么办 淘宝店铺动态评分一直很低怎么办? 刚生下来的宝宝睡觉不吃奶怎么办 宝宝吐奶咳嗽了可能被呛到怎么办