记录——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 ...
随机推荐
- ASP.NET使用ajax实现分页局部刷新页面
listview列表实现分页是非常容易的.ListView分页是非常简单的,加上一个DataPager控件,把ListView的ID赋予就可以了.最开始我就是这么写的.(网上有人说这样是伪分页?) & ...
- Android开发之AChartEngine的使用
下面附上代码加注解 package com.example.com.my_achartnegine; import android.content.Context; import android.gr ...
- vue组件递归
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Redis应用----消息传递
1.摘要 消息传递这一应用广泛存在于各个网站中,这个功能也是一个网站必不可少的.常见的消息传递应用有,新浪微博中的@我呀.给你评论然后的提示呀.赞赞赞提示.私信呀.甚至是发微博分享的新鲜事:知乎中的私 ...
- Python使用心得之魔法参数**kw
通过设置字典类型参数直接传递给接收魔法参数(**kw)的方法,对应赋值.示例如下: jdbcConnectionDict = {, , 'database': 'test', 'charset': ' ...
- Unity 3D Framework Designing(9)——构建统一的 Repository
谈到 『Repository』 仓储模式,第一映像就是封装了对数据的访问和持久化.Repository 模式的理念核心是定义了一个规范,即接口『Interface』,在这个规范里面定义了访问以及持久化 ...
- 自动化监控利器-Zabbix深入配置和使用
1. 配置流程 Zabbix完整的监控配置流程可以简单描述为: Host groups(主机组)→Hosts(主机)→Applications(监控项组)→Items(监控项)→Triggers(触 ...
- C++实现动态顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构.这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的.只要知道了第一个元素的存 ...
- 老李谈HTTP1.1的长连接 2
HTTP1.1的长连接 但是HTTP1.1开始默认建立的是长连接,即一旦浏览器发起HTTP请求,建立的连接不会请求应答之后立刻断掉. 1. 一个复杂的具备很多HTTP资源的网页会建立多少TCP连接,如 ...
- windows下安装zabbix_agent
Server端在linux系统上,server端版本为2.2.6,是以前就装好的已经跑了很久的稳定版.目前的需求是要将新业务的服务器添加到该监控队列.而这些服务器是windows系统. 第一次下载了最 ...