专栏首页游戏开发之旅Python将策划表xlsx转为Lua可用文件

Python将策划表xlsx转为Lua可用文件

转换规则

定义xlsx文件的前三行分别为:字段描述(即备注字段代表什么),字段名,字段类型

每一行,每一个sheet都分别代表一张table,每一列代表table中的字段

转换效果

实现方法

定义好模板类型,根据表类型,字段类型得到对应的模板,然后读取Excel的内容填充到模板中,这里记录一下实现的代码,以供需要时拿出来改改用,代码通过变量名应该能读懂,就不写注释了

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @Date    : 2020-03-21 18:06:21
# @Author  : yan nan fei
# @Version : $Id$

import os,sys
import xlrd

template="""local DataTable = \n{\n[]\n}
function GetTable() return DataTable end
function GetContent(SheetName) return DataTable[SheetName].Content end
"""

tableTemplate="""%{tablename}={{\n[]\n%}},\n"""


KeyValueTemp="""%{key}={value},\n"""

StringValTemp="""%{key}=[=[{value}]=],\n"""

BoolValTemp="""%{key}={value},\n"""

FuncValTemp="""%{key}=function() return {value} end,"""

vTypeDic={"Int":KeyValueTemp,"String":StringValTemp,"RawData":KeyValueTemp,"Bool":BoolValTemp,"Func":FuncValTemp}


def TemplateParse(template,reg):
	template=template.replace("%",reg)
	return template


def MakeTable(template,tablename,content,depth):
	template=TemplateParse(template,depth*"\t")
	if content!=None:
		template=template.replace("[]",content)
	if isinstance(tablename,float):#如果表key为数字
		tablename="[{key}]".format(key=int(tablename))
	if "tablename" in template:
		template=template.format(tablename=tablename)
	return template

def MakeSubTable(parent,tble2):
	tble=parent.replace("[]",tble2)
	return tble

def MakeKeyValue(vaType,key,value,depth):#根据类型拿到相应模板
	if len(str(key))==0 or len(str(value))==0 or "//" in str(key):
		return ""
	if vaType in vTypeDic:
		template=vTypeDic[vaType]
		template=TemplateParse(template,depth*"\t")
		template=template.format(key=key,value=value)
		return template

class ReadSheetContent:
	def __init__(self,workbook,sheetName):
		self.workbook=workbook
		self.sheetName=sheetName
	def GetContent(self):
		content=""
		sheetContent=self.workbook.sheet_by_name(self.sheetName)
		for row in range(0,sheetContent.nrows):
			if row<3: #前三行分别为备注,变量,变量类型
				continue
			rowTableName=sheetContent.cell_value(row,0)
			rowTableObject=MakeTable(tableTemplate,rowTableName,"[]",3)
			colContent=""
			for col in range(0,sheetContent.ncols):
				key=sheetContent.cell_value(1,col) #第二行表示变量
				vaType=sheetContent.cell_value(2,col)#第三行表示变量类型
				value=sheetContent.cell_value(row,col)
				keyValueObj=MakeKeyValue(vaType,key,value,5)
				colContent=colContent+keyValueObj
			rowTableObject=rowTableObject.replace("[]",colContent)
			content=content+rowTableObject
		return content



if __name__=="__main__":
	if len(sys.argv)>1:
		targetFileName=sys.argv[1]
		targetDir=os.path.dirname(targetFileName)
		if os.path.isdir(targetDir):
			os.makedirs(targetDir)
		workbook=xlrd.open_workbook(targetFileName)
		allSheetNames = workbook.sheet_names();
		fileNameNoExten=targetFileName.split('.')[0]
		with open(fileNameNoExten+".lua","w") as file:
			luaContent=""
			for sheetName in allSheetNames:
				if sheetName=="main":
					continue
				sheetTable=MakeTable(tableTemplate,sheetName,"[]",1)
				ContentTable=MakeTable(tableTemplate,"Content","[]",2)
				sheetTable=MakeSubTable(sheetTable,ContentTable)
				readSheetContent=ReadSheetContent(workbook,sheetName)
				SheetContent=readSheetContent.GetContent()
				luaContent=luaContent+MakeSubTable(sheetTable,SheetContent)
			template=template.replace("[]",luaContent)
			file.write(template)

后续找到更好的方法再扩展

参考文献: xlrd读表应用举例参照:https://blog.csdn.net/zijikanwa/article/details/89577326 os文件参照:https://www.runoob.com/python/os-file-methods.html

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.csdn.net/CJB_King复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 彻底解决多国语言

    FairyGUI把用到的所有文字导出到一个xml文件中,然后为每个外国语言翻译一个相应的xml文件(字符串表),只要在运行时加载相应的xml文件,就可以将所有U...

    重归混沌
  • Netty游戏服务器实战开发(13):游戏中的配表规则

    参考链接: Java中的决策制定(if,if-else,switch,break,continue,jump)

    用户7886150
  • 【游戏开发】Excel表格批量转换成CSV的小工具

      在工作的过程中,我们有时可能会面临将Excel表格转换成CSV格式文件的需求。这尤其在游戏开发中体现的最为明显,策划的数据文档大多是一些Excel表格,且不...

    马三小伙儿
  • Python办公自动化|批量提取Excel数据

    今天我们来讲解一个比较简单的案例,使用openpyxl从Excel中提取指定的数据并生成新的文件,之后进一步批量自动化实现这个功能,通过本例可以学到的知识点:

    刘早起
  • 后起之秀 | MySQL Binlog增量同步工具go-mysql-transfer实现详解

    工作需要研究了下阿里开源的MySQL Binlog增量订阅消费组件canal,其功能强大、运行稳定,但是有些方面不是太符合需求,主要有如下三点:

    王知无-import_bigdata
  • 【游戏开发】Excel表格批量转换成lua的转表工具

      在上篇博客《【游戏开发】Excel表格批量转换成CSV的小工具》 中,我们介绍了如何将策划提供的Excel表格转换为轻便的CSV文件供开发人员使用。实际在U...

    马三小伙儿
  • Python统计文本词汇出现次数的实例代码

    有时在遇到一个文本需要统计文本内词汇的次数 的时候 ,可以用一个简单的python程序来实现。

    砸漏
  • 手把手教你上手python库pydbgen(附代码、安装地址)

    数据派THU
  • 用原生的方式操作Excel,Python玩转Excel神器xlsxwriter详解!

    在之前的Python办公自动化系列文章中,我们已经介绍了两个Python操作Excel的库openpyxl与xlwings,并且相信大家已经了解这两者之间的异同...

    数据森麟
  • Python实现信息自动配对爬虫排版程序

    在很多的公司项目中,常常有很多对office项目的比较机械化的操作,在这里就可以借助python实现对office的合理排版。而这里我们就将借助海尔公司的出货表...

    AI科技大本营
  • 【好消息】Python和Excel终于可以互通了!!

    今天小编为大家分享一篇使用python将大量数据导出到Excel中的技巧心得,可以让Python和Excel的数据实现互通!具有很好的参考价值,希望对大家有所帮...

    1480
  • 探索CocosH5正确的开发姿势

    回首自己3年多的cocos2d游戏开发经历,从cocos2d到coco2d-x入门,之后机缘巧合辗转到了cocos2d-js阵营。在深入使用cocos2d-js...

    张晓衡
  • 干货:手把手教你用Python读写CSV、JSON、Excel及解析HTML

    导读:本文要介绍的这些技法,会用Python读入各种格式的数据,并存入关系数据库或NoSQL数据库。

    华章科技
  • Python | 使用Python操作Excel文档(一)

    openpyxl操作Excel的第三方库,作者是Eric Gazoni, Charlie Clark。您也可以访问openpyxl的官方网站通过官方手册进行学习...

    LogicPanda
  • python自动化系列之写Excel操作使用模块xlsxwriter

    xlsxwriter是用于创建Excel XLSX文件的Python模块,可用于将文本、数字、公式和超链接写入Excel2007+ 文件中的多个工作表。它支持格...

    JQ实验室
  • 关于python读写excel表格的两三个例子

    关于flask的事情遇到一些麻烦,暂时先搁置几天;最近工作总是在处理数据,出于偷懒的因素,最反感重复性的工作,因此当几十个上百个表哥表姐摆在面前的时候,也不太想...

    python与大数据分析
  • python学习-windows下使用p

    有时候需要处理很多报表,将一个目录下的所有excel格式报表合并,手工操作费事费力如果能使用python,将多个.xlsx同时能够合并多个excel表的话,多么...

    py3study
  • 干货 | Python 爬虫的工具列表大全

    源 / 伯乐头条 这个列表包含与网页抓取和数据处理的Python库。 网络 通用 urllib -网络库(stdlib)。 requests -网络库。 gr...

    顶级程序员

扫码关注腾讯云开发者

领取腾讯云代金券