记录——excel导出lua工具(python实现)
项目需要一个从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实现)的更多相关文章
- [tools]excel转lua的python实现
time:2015/04/13 描述:需要将excel表格内容转成lua,并且作为工具使用,能够批量转换 步骤: (1)文章[1]已经做了大部分的内容,而且也已经能够使用了 (2)根据自己新的需求: ...
- 一个把数据转化成Excel导出的程序 python Django
把从数据库查询出来数据导出 源码下载!!!!! 效果图 登入界面 主页面 查询到数据 导出 打开得到文件 项目地址,源码下载
- java excel导出(基于注解)
小白,做日志只是为了方便自己查看,能帮到别人当然更好,不喜勿喷. 上代码 依赖: <dependency> <groupId>org.apache.poi</groupI ...
- Python导出Excel为Lua/Json/Xml实例教程(三):终极需求
相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 Python导出E ...
- Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验
Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...
- Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...
- 偷懒小工具 - Excel导出公共类
说明 最近接了一个任务,就是做一个列表的Excel导出功能.并且有很多页面都会使用这个功能. 导出的Excel大体格式如图 很简单的列表,标题加背景色,然后不同类型,显示方式不一样.对齐方式不一样.不 ...
- 自己写的java excel导出工具类
最近项目要用到excel导出功能,之前也写过类似的代码.因为这次项目中多次用到excel导出.这次长了记性整理了一下 分享给大伙 欢迎一起讨论 生成excel的主工具类: public class E ...
- .NET开发工具之Excel导出公共类
来源:Pino晨 链接:cnblogs.com/chenxygx/p/5954870.html 说明 最近接了一个任务,就是做一个列表的Excel导出功能.并且有很多页面都会使用这个功能. 导出的Ex ...
随机推荐
- Beautils工具类实现的原理
关于内省机制和反射机制请看这一篇博客[还没写完,在草稿中]. 先说一下什么叫做 bean 属性,bean 属性指的是 get / set 方法后的名称,而不是类的属性: 比如: private Str ...
- lsusb命令
运行 yum install libusb usbutils
- MySQL自动化审核平台部署说明
背景: 关于MySQL的审核的重要性就不说明了,本文的自动化审核是通过Inception和SQLAdvisor实现的,具体的使用可以看它们各自的说明文档.这里大致介绍下如何部署和使用它们,其实该文章也 ...
- Frame框架
框架 frameset 框架集 如果使用框架集,当前页面不能有body cols="300,*" :左右拆分,左边宽300,右边宽剩余 rows=" ...
- jenkins+docker+maven+svn
环境介绍 1. 软件需求 Jenkins 本次实验所用版本1.5.1 下载链接:https://jenkins.io/index.html Docker 本次实验所用版本 17.03. ...
- centos下编译phantomjs2.0
phantomjs是一个无头浏览器,可以用来做测试和爬虫,但是因为有一些问题没有解决,所以官网不提供2.0版本的binary包,所以要自己编译. 1.安装需要的依赖: sudo yum -y inst ...
- sublime Text3插件无法安装解决方法(提示There are no packages available installation)
第一步 在sublime Text3界面按"ctrl+."出现一个输入框界面 第二步 在输入框输入: import urllib.request,os,hashlib; h = ' ...
- 1132: 零起点学算法39——多组测试数据(a+b)
1132: 零起点学算法39--多组测试数据(a+b) Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lldSubmitted: ...
- spring mvc mybatis集成踩的坑
开园这么多年了也没写几篇文章,现在想想光看别人的也不行啊,咱也自己写写,就写这天我我在做spring mvc与mybatis的集成时遇到的问题 1 spring与mybatis的集成 这个相信大家都弄 ...
- 手把手视频:万能开源Hawk抓取动态网站
Hawk是沙漠之鹰历时五年开发的开源免费网页抓取工具(爬虫),无需编程,全部可视化. 自从上次发布Hawk 2.0过了小半年,可是还是有不少朋友通过邮件或者微信的方式询问如何使用.看文档还是不如视频教 ...