python execl转xml应用

execl打开一直很卡

所以写个程序直接导出xml

有诸多限制,就当练手

# -*- coding:utf-8 -*
import xlrd
import xml.dom
from Tkinter import *
import os
import tkMessageBox
import xml.dom.minidom

#entry中文不能输出问题
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
# data = xlrd.open_workbook("items.xls")
# table = data.sheets()[0]
# print data.sheet_names()
# # 行数
# nrows = table.nrows
# # 列数
# ncols = table.ncols
# print nrows
# print ncols
# colnames = table.row_values(0)
# for rownum in colnames:
#     print type(rownum)

# print 'asd%s ada%s' % (1, '3')
# print len(data.sheets())
# ui类


class Application(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

    def onSearch(self):
        dress = self.dress.get()
        # root = os.getcwd()

        # root = root + '/' + dress
        # print root
        p = os.path.splitext(dress)
        name = os.path.split(p[0])[1]
        print name
        if not p[1] or (p[1] != '.csv' and p[1] != '.xls' and p[1] != '.xlsx'):
            tkMessageBox.showinfo("", ".csv/.xls/.xlsx")
            return

        if os.path.exists(dress):
            print 'exists'
            self.openFile(dress)
        else:
            tkMessageBox.showinfo("", "file not exist")
    # 点击选中全部无效...
    # def touchEntry(self, evt, entry):
    #     print entry
    #     text = entry.get()
    #     print len(text) 
    #     entry.selection_range(0,10)
    #     pass

    def handleradaptor(self, fun, **kwds):
        return lambda event, fun=fun, kwds=kwds: fun(event, **kwds)

    def createEntry(self, txt):

        entry = Entry(self, textvariable=txt, width=40)
        # entry.bind("<Button-1>", self.handleradaptor(self.touchEntry, entry=entry))
        entry.pack()

    def createWidgets(self):
        self.dress = StringVar()
        self.dress.set('文件名 相对/绝对')
        self.createEntry(self.dress)

        self.sheets = StringVar()
        self.sheets.set('表 格式 0,2(第1,3表)')
        self.createEntry(self.sheets)

        self.ncols = StringVar()
        self.ncols.set('列 格式 1-3:0,4(上面第一个的2-4列,第二个的1,5列)')
        self.createEntry(self.ncols)
# key名称
        self.search = Button(self, text='search', command=self.onSearch)
        self.search.pack()

    # 主要处理
    def openFile(self, file):
        p = os.path.splitext(file)
        name = os.path.split(p[0])[1]
        data = xlrd.open_workbook(file)
        sheets = self.sheets.get()
        sheetslist = sheets.split(',')
        print sheetslist
        ncols = self.ncols.get()
        ncolslist = ncols.split(':')
        print ncolslist
        doc = xml.dom.minidom.Document()
        rootEle = doc.createElement(name)
        doc.appendChild(rootEle)
        # sheet循环
        for i in range(len(sheetslist)):
            ii = sheetslist[i]

            table = data.sheets()[int(ii)]
            if not table:
                tkMessageBox.showinfo("", "sheet %d not exist" % i)
                return
            sheetname = data.sheet_names()[i].encode('utf-8')
            sheetEle = doc.createElement(sheetname)
            rootEle.appendChild(sheetEle)
            print '---------%d' % i
            curcols = ncolslist[i]
            num = []

            # ncols 判断
            if curcols.find('-') != -1:
                arr = curcols.split('-')
                if arr[0] > arr[1]:
                    tkMessageBox.showinfo(
                        "", "sheet %s table %s" % (i, curcols))
                    return
                n1 = int(arr[0])
                n2 = int(arr[1]) + 1
                while n1 < n2:
                    num.append(n1)
                    n1 += 1
            elif curcols.find(','):
                arr = curcols.split(',')
                num = arr
            else:
                num.append(curcols)

            # 记录key名称  在xml中应用
            colnames = table.row_values(0)
            names = []

            for rownum in colnames:
                names.append(rownum)
            # xls to xml
            print '............%d' % table.nrows
            print num
<span style="white-space:pre">	</span>#遍历execl
            for nrow in range(1, table.nrows):
                item1 = doc.createElement("%slist" % sheetname)
                for ncol in num:
                    value = table.cell(nrow, int(ncol)).value
                    if isinstance(value, float):
                        val = '%0d' % value
                    else:
                        val = value.encode('utf-8')

                    item1.setAttribute(names[int(ncol)], val)
                    # print('%s : %s' % (names[int(ncol)], val))

                sheetEle.appendChild(item1)
        # 当前目录创建xml/...
        f = open(name + '.xml', 'w')
        # doc.writexml(f)
        f.write(doc.toprettyxml())
        f.close()
        tkMessageBox.showinfo("", "complete")
        pass

if __name__ == "__main__": 
    app = Application()
    app.master.title('xls/cvs/xlsx2xml')
    app.width = 300
    app.mainloop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值