项目需要一个从excel导出lua配置表的工具,之前的工具是主程写的,效率极差,i7 CPU 一次全部导出要花掉1个多小时。匪夷所思的是,这么渣的效率,居然用了整整一年。当

然,中途有人反映效率差,主程直接无视了,随着呼声越来越高,主程终于有空行动了。

  一天下来,主程宣布,其工具效率提升了近50%,并且说了很多非专业人士听不懂的话,什么换库了,什么小文件没法提速,什么python效率就是这么差……

当即就有同志体验了改进过的工具,导出某几个文件速度的的确确,确确实实,实实在在提升了50%,于是公司内部群里好几个同志对主程竖起了大拇指,主程表示举手之劳,不足以

挂齿,随即便在公司论坛发帖《转:python之excel哪家强》,内容是介绍python几个常用excel库的优劣,以及自己在考虑众多因素之后果断的抉择。

  在无比佩服的同时,我决定重写这个工具,一接手,深似海,非常不规范的excel表,非常不灵活的格式,还有大堆针对某些表的特殊处理,整个设计用一句话来形容:跪了。

在折腾了一天之后终于搞定了,跟原工具用一样的库openpyxl,兼容99.9%原配置表,而性能却比之前改进过的工具快了230倍左右。

  废话说了一大堆。

支持类型:

int,bool,float,string,

struct<[int,bool,float,string]...>,

list<int>,

list<bool>,

list<float>,

list<string>,

list<struct<[int,bool,float,string]...>>,

填写格式:

line 1: 注释

line 2: 字段类型:字段名字 => int:name | list<int:>:name | struct<int:n1,int:n2>:name

line 3:内容

line N:内容

源码:

 # -*- coding:utf-8 -*- 

 #    excel 导出 lua 表
 #    支持类型,int,bool,float,string,list,struct,list<int>,list<bool>,list<float>,list<string>,list<struct>

 import openpyxl
 import codecs
 import time

 TInt = "int"
 TList = "list"
 TBool = "bool"
 TFloat = "float"
 TString = "string"
 TStruct = "struct"

 def ValToKey(val):
     return val.isdecimal() and "[" + val + "]" or val

 def CheckInt(data, args = None):
     return data

 def CheckBool(data, args = None):
     " == data and "false" or "true"

 def CheckFloat(data, args = None):
     return data

 def CheckString(data, args = None):
     return "\"" + data.replace("\n", "\\n") + "\""

 def CheckList(data, args):
     vals = data.split(";")
     vals.pop()
     if len(vals) == 0:
         return ""
     func = args[0]["func"]
     args = args[0]["args"]
     array = [func(v, args) for k, v in enumerate(vals)]
     return "{ " + ", ".join(array) + " }"

 def CheckStruct(data, args):
     vals = data.split(",")
     vals.pop()
     if len(vals) == 0:
         return ""
     array = []
     for k, v in enumerate(vals):
         val = args[k]["func"](v, args[k]["args"])
         name = args[k]["name"]
         if len(val) != 0:
             array.append(name + " = " + val)
     return "{ " + ", ".join(array) + " }"

 def GetValue(sheet, row, col):
     return unicode(sheet.cell(row = row, column = col).value or "")

 def GetLine(sheet, row):
     return [GetValue(sheet, row, col) for col in xrange(1, sheet.max_column + 1)]

 def CheckParses(fields):
     result = []
     for k, field in enumerate(fields):
         pos = field.rfind(":")
         type = field[0:pos]
         name = field[pos+1:]
         parse = { "args": None }
         if TInt == type[:len(TInt)]:
             parse["func"] = CheckInt
         elif TBool == type[:len(TBool)]:
             parse["func"] = CheckBool
         elif TFloat == type[:len(TFloat)]:
             parse["func"] = CheckFloat
         elif TString == type[:len(TString)]:
             parse["func"] = CheckString
         elif TList == type[:len(TList)]:
             parse["func"] = CheckList
             parse["args"] = CheckParses([type[len(TList)+1:-1]])
         elif TStruct == type[:len(TStruct)]:
             parse["func"] = CheckStruct
             parse["args"] = CheckParses(type[len(TStruct)+1:-1].split(","))
         if len(name) == 0:
             parse["name"] = ValToKey(unicode(k))
         else:
             parse["name"] = ValToKey(name)
         result.append(parse)
     return result

 def CheckChunk(parses, fields):
     chunk = []
     for index, field in enumerate(fields):
         key = parses[index]["name"]
         val = parses[index]["func"](field, parses[index]["args"])
         if len(val) != 0:
             chunk.append(key + " = " + val)
     return "{ " + ", ".join(chunk) + " }"

 def Export(sheet):
     #    第一行注释
     #    第二行类型
     parses = CheckParses(GetLine(sheet, 2))
     #    第三行内容
     chunks, indexs, parse0 = [], [], parses[0]
     for row in xrange(3, sheet.max_row + 1):
         value = GetValue(sheet, row, 1)
         index = parse0["func"](value, parse0["args"])
         indexs.append(index)

         chunk = CheckChunk(parses, GetLine(sheet, row))
         chunks.append("%s = %s" % (ValToKey(index), chunk))
         print row, index

     result = [    "return ", \
                 "{ " + "\n".join(chunks) + " }", \
                 ",", \
                 "{ " + ", ".join(indexs) + " }",]
     return "\n".join(result)

 def Main(opath, ipath):
     xlsx = openpyxl.load_workbook(opath)
     sheet = xlsx.get_sheet_by_name(xlsx.sheetnames[0])
     result = Export(sheet)
     with codecs.open(ipath, "w", "utf-8") as f:
         f.write(result)

 if __name__ == "__main__":
     Main("D:\\MyWork\\py\\a.xlsx", "D:\\MyWork\\py\\a.lua")

因为公司项目配置表格式很烂,所以这一份是另外写的,方便以后我自己用的,未经测试!!!

下载

记录——excel导出lua工具(python实现)的更多相关文章

  1. [tools]excel转lua的python实现

    time:2015/04/13 描述:需要将excel表格内容转成lua,并且作为工具使用,能够批量转换 步骤: (1)文章[1]已经做了大部分的内容,而且也已经能够使用了 (2)根据自己新的需求: ...

  2. 一个把数据转化成Excel导出的程序 python Django

    把从数据库查询出来数据导出 源码下载!!!!! 效果图 登入界面 主页面 查询到数据 导出 打开得到文件 项目地址,源码下载

  3. java excel导出(基于注解)

    小白,做日志只是为了方便自己查看,能帮到别人当然更好,不喜勿喷. 上代码 依赖: <dependency> <groupId>org.apache.poi</groupI ...

  4. Python导出Excel为Lua/Json/Xml实例教程(三):终极需求

    相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 Python导出E ...

  5. Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验

    Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...

  6. Python导出Excel为Lua/Json/Xml实例教程(一):初识Python

    Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...

  7. 偷懒小工具 - Excel导出公共类

    说明 最近接了一个任务,就是做一个列表的Excel导出功能.并且有很多页面都会使用这个功能. 导出的Excel大体格式如图 很简单的列表,标题加背景色,然后不同类型,显示方式不一样.对齐方式不一样.不 ...

  8. 自己写的java excel导出工具类

    最近项目要用到excel导出功能,之前也写过类似的代码.因为这次项目中多次用到excel导出.这次长了记性整理了一下 分享给大伙 欢迎一起讨论 生成excel的主工具类: public class E ...

  9. .NET开发工具之Excel导出公共类

    来源:Pino晨 链接:cnblogs.com/chenxygx/p/5954870.html 说明 最近接了一个任务,就是做一个列表的Excel导出功能.并且有很多页面都会使用这个功能. 导出的Ex ...

随机推荐

  1. 集合框架(HashSet存储自定义对象保证元素唯一性)

    HashSet如何保证元素唯一性的原理 1.HashSet原理 a. 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降 ...

  2. ie旋转滤镜Matrix

    旋转一个元素算是一个比较常见的需求了吧,在支持CSS3的浏览器中可以使用transform很容易地实现,这里有介绍:http://www.css88.com/archives/2168,这里有演示ht ...

  3. 从编译安装Keepalived 到 配置 负载均衡(LVS-DR)

    最近在研究服务器高可用集群 (HA)…… Keepalived 是用C写的软路由.提供负载均衡与高可用特性. 负载均衡利用IPVS技术 高可用通过VRRP协议实现 更难能的贵的是,一直到最近还在更新 ...

  4. JDBC连接Oracle数据库代码

    import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.S ...

  5. 将一个对象push到数组之中的几点问题

    在项目开发中我们需要向意数组中添加对象:首先想到的是利用数组的api,----push demo: var ar = [1,2,3] var ar2 = [11,22,33] var obj = { ...

  6. POPTEST老李谈JVM、JRE、JDK、java ee sdk with jdk区别

    POPTEST老李谈JVM.JRE.JDK.java ee sdk with jdk区别   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等 ...

  7. Java反射理解

    序言 一般而言,动态语言是指程序运行时,允许改变程序结构或变量类型的语言. 从这个观点来看,Perl.Python.Ruby是动态语言,C++.Java.C#不是动态语言. 但是Java有动态相关机制 ...

  8. 【Spring】详解Spring中Bean的加载

    之前写过bean的解析,这篇来讲讲bean的加载,加载要比bean的解析复杂些,该文之前在小编原文中有发表过,要看原文的可以直接点击原文查看,从之前的例子开始,Spring中加载一个bean的方式: ...

  9. 安卓 ADB常见问题整理

    以下都是ADB连接问题,可以通过尝试如下步骤,由简单度排序 1. 插拔下USB连接线 2. 关闭USB模式再打开 3. 执行以下命令 adb kill-server adb start-server ...

  10. oracle备份与还原(导入导出)

    Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp相当于oracle数据还原与备份.说明:大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成数据的 ...