龙空技术网

使用python将excel转为lua文件

爱音乐的程序员小新人 112

前言:

如今小伙伴们对“luapython混合编程”都比较珍视,小伙伴们都需要了解一些“luapython混合编程”的相关内容。那么小编在网络上汇集了一些对于“luapython混合编程””的相关内容,希望同学们能喜欢,小伙伴们快快来了解一下吧!

excel表格格式

说明:

1.前三行分别为:字段中文解释、字段名、字段类型

2.程序不用的字段,加”_”前缀,不会生成进lua文件里

3.策划填数值的时候,偶尔会遗漏数据,当存在空值时,依据字段类型,填上默认值。

4.支持一个字段填上多组数据,如”进阶消耗”字段,自定义类型”table”,代表{ {道具1id,道具1数量},{道具2id,道具2数量}}, … }

脚本文件目录结构

windows bat命令,用于快速执行excel2lua.py脚本

excel2lua.py脚本代码

import sys

import os

import xlrd

import re

# 当前脚本路径

curpath = os.path.dirname(os.path.abspath(sys.argv[0]))

# 文件头描述格式化文本

lua_file_head_format_desc = '''--[[

%s

exported by excel2lua.py

from file:%s

--]]\n\n'''

# 将数据导出到tgt_lua_path

def excel2lua(src_excel_path, tgt_lua_path):

print('[file] %s -> %s' % (src_excel_path, tgt_lua_path))

# load excel data

excel_data_src = xlrd.open_workbook(src_excel_path, encoding_override = 'utf-8')

print('[excel] Worksheet name(s):', excel_data_src.sheet_names())

excel_sheet = excel_data_src.sheet_by_index(0)

print('[excel] parse sheet: %s (%d row, %d col)' % (excel_sheet.name, excel_sheet.nrows, excel_sheet.ncols))

# excel data dict

excel_data_dict = {}

# col name list

col_name_list = []

#col val type list

col_val_type_list = []

# ctype: 0 empty, 1 string, 2 number, 3 date, 4 boolean, 5 error

# 遍历第二行的所有列 保存字段名

for col in range(0, excel_sheet.ncols):

cell = excel_sheet.cell(1, col)

col_name_list.append(str(cell.value))

assert cell.ctype == 1, "found a invalid col name in col [%d] !~" % (col)

# 遍历第三行的所有列 保存数据类型

for col in range(0, excel_sheet.ncols):

cell = excel_sheet.cell(2, col)

col_val_type_list.append(str(cell.value))

assert cell.ctype == 1, "found a invalid col val type in col [%d] !~" % (col)

# 剔除表头、字段名和字段类型所在行 从第四行开始遍历 构造行数据

for row in range(3, excel_sheet.nrows):

# 保存数据索引 默认第一列为id

cell_id = excel_sheet.cell(row, 0)

assert cell_id.ctype == 2, "found a invalid id in row [%d] !~" % (row)

# 检查id的唯一性

if cell_id.value in excel_data_dict:

print('[warning] duplicated data id: "%d", all previous value will be ignored!~' % (cell_id.value))

# row data list

row_data_list = []

# 保存每一行的所有数据

for col in range(0, excel_sheet.ncols):

cell = excel_sheet.cell(row, col)

k = col_name_list[col]

cell_val_type = col_val_type_list[col]

# ignored the string that start with '_'

if str(k).startswith('_'):

continue

# 根据字段类型去调整数值 如果为空值 依据字段类型 填上默认值

if cell_val_type == 'string':

if cell.ctype == 0:

v = '\'\''

else:

v = '\'%s\'' % (cell.value)

elif cell_val_type == 'int':

if cell.ctype == 0:

v = -1

else:

v = int(cell.value)

elif cell_val_type == 'float':

if cell.ctype == 0:

v = -1

else:

v = float(cell.value)

elif cell_val_type == 'table':

if cell.ctype == 0:

v = '{}'

else:

v = cell.value

else:

v = cell.value

# 加入列表

row_data_list.append([k, v])

# 保存id 和 row data

excel_data_dict[cell_id.value] = row_data_list

# 正则搜索lua文件名 不带后缀 用作table的名称 练习正则的使用

searchObj = re.search(r'([^\\/:*?"<>|\r\n]+)\.\w+$', tgt_lua_path, re.M|re.I)

lua_table_name = searchObj.group(1)

# print('正则匹配:', lua_table_name, searchObj.group(), searchObj.groups())

# 这个就直接获取文件名了

src_excel_file_name = os.path.basename(src_excel_path)

tgt_lua_file_name = os.path.basename(tgt_lua_path)

# file head desc

lua_file_head_desc = lua_file_head_format_desc % (tgt_lua_file_name, src_excel_file_name)

# export to lua file

lua_export_file = open(tgt_lua_path, 'w')

lua_export_file.write(lua_file_head_desc)

lua_export_file.write('%s = {\n' % lua_table_name)

# 遍历excel数据字典 按格式写入

for k, v in excel_data_dict.items():

lua_export_file.write(' [%d] = {\n' % k)

for row_data in v:

lua_export_file.write(' {0} = {1},\n'.format(row_data[0], row_data[1]))

lua_export_file.write(' },\n')

lua_export_file.write('}\n')

lua_export_file.close()

print('[excel] %d row data exported!~' % (excel_sheet.nrows))

# Make a script both importable and executable (∩_∩)

if __name__ == '__main__':

if len(sys.argv) < 3:

print('python excel2lua.py <excel_input_path> <lua_output_path>')

exit(1)

excel2lua(os.path.join(curpath, sys.argv[1]), os.path.join(curpath, sys.argv[2]))

exit(0)

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142

执行bat命令,结果截图

生成的lua文件截图

检测lua文件数据的有效性

标签: #luapython混合编程