读取Excel文件
- 源文件: .xls文件
- 语言:C#
- 插件:CSharpJExcel.Jxl
导出伪代码
StringBuilder sb = new StringBuilder();
sb.Append("local _data = {}");
for (int i = validRowIdx; i < rows; i++)
{
//读取单元格内容
//数组用'|'分隔
}
//设置元表
string str =
"\nlocal mt = {}\n" +
"mt.__index = function(a,b)\n" +
"\tif _fidx[b] then\n" +
"\t\treturn a[_fidx[b]]\n" +
"\tend\n" +
"\treturn nil\n" +
"end\n" +
"mt.__metatable = false\n" +
"for _,v in ipairs(_data) do\n\t" +
"setmetatable(v,mt)\n" +
"end\n" +
"return _data";
sb.Append(str);
return sb.ToString();
生成的lua文件
local config = require 'config' --定义枚举
local head = {} --表头信息
head.id = 1
head.name = 2
head.type = 3
head.array = 4
local data = {}
data[1] = {}
data[1][1] = 1001
data[1][2] = "ares"
data[1][3] = config.EType_None --预定义枚举
data[1][4] = {} --数组
data[1][4][1] = 10 --数组元素
data[1][4][2] = 20 --数组元素
data[2] = {}
data[2][1] = 1002
data[2][2] = "zhang"
data[2][3] = config.EType_None
data[2][4] = {} --数组
local mt = {}
mt.__index = function(a,t)
if head[t] then
return a[head[t]]
end
end
mt.__metatable = false
for i,v in ipairs(data) do
setmetatable(v,mt)
end
return data
说明:
1、需要维护一份枚举文件:config,将枚举文件导出为lua文件,格式如下
源文件:
enum EType = {
EType_None,
...
}
lua文件
def config = {}
config.EType_None = 1
...
return config
2、Excel前五行为表头信息,五行内容如下:
- 字段描述
- 内容描述
- 数据类型(int,string,float,int[],enum)
- 程序访问名称
- 标识符(c:仅客户端使用,s:仅服务器使用,cs:客户端和服务器都使用)
6 行及以下为数据,对于数组,以‘|’隔开
读取lua文件
local ConfigMgr= {}
--缓存表格数据
local _cachedConfig = {}
--具有id的表的快速索引缓存,结构_fastIndexer["SkillsConfig"][1001]
local _fastIndexer = {}
--获取配表的实例方法
--参数name :表格文件名,在目录:data/configbins/lua/ , 不带拓展名
--用例 : local config = (require "ConfigMgr"):GetConfig ( "Achievement" )
-- local name = config.items[1].name
--返回表格table
function ConfigMgr:GetConfig(name)
local temp = _cachedConfig[name]
if nil ~= temp then
return temp
else
local fileName = "data/configbins/lua/" .. name .. ".lua"
local data = dofile(fileName)
_cachedConfig[name] = {}
_cachedConfig[name].items = data
return _cachedConfig[name]
end
warn([[cant't find config : ']] .. name)
return nil
end
--获取配表指定的id项
--参数name :表格文件名,在目录:data/configbins/lua/ , 不带拓展名
--参数id : 需要获取项的id
--用例:local config = (require "ConfigMgr"):GetItem ( "Achievement" , 1001 )
-- print( config.name )
function ConfigMgr:GetItem(name,id)
if nil == _fastIndexer[name] then
local config = self:GetConfig(name)
if config and config.items then
local filed = config.items[1].id
if filed then
_fastIndexer[name] = {}
for i,v in pairs(config.items) do
_fastIndexer[name][v.id] = v
end
else
warn("Config : " .. name .. " doen't exits filed : 'id'" )
end
end
end
if _fastIndexer[name] then
return _fastIndexer[name][id]
end
return nil
end
--获取配表指定的id项
--参数name :表格文件名,在目录:data/configbins/lua/ , 不带拓展名
--参数id : 需要获取项的id
--用例:local config = (require "ConfigMgr"):GetItemById ( "Achievement" ,"id" 1001 )
-- print( config.name )
function ConfigMgr:GetItemById(name,idName,id)
local newStoreName = name .. idName
if nil == _fastIndexer[newStoreName] then
local config = self:GetConfig(name)
if config and config.items and config.items[1] then
local filed = config.items[1][idName]
if filed then
_fastIndexer[newStoreName] = {}
for i,v in pairs(config.items) do
if v and v[idName] then
_fastIndexer[newStoreName][v[idName]] = v
end
end
else
warn("Config : " .. name .. " doen't exits filed : 'id'" )
end
end
end
if _fastIndexer[newStoreName] then
return _fastIndexer[newStoreName][id]
end
return nil
end
--获取配表所有指定的id项(注意:此方法循环遍历并返回)
--参数name :表格文件名,在目录:data/configbins/lua/ , 不带拓展名
--参数id : 需要获取项的id
--用例:local config = (require "ConfigMgr"):GetItem ( "Achievement" , 1001 )
-- print( config[1].name )
function ConfigMgr:GetItems = function (name,id)
local config = self:GetConfig(name)
if config and config.items and config.items[1] then
if nil ~= config.items[1].id then
local toReturn = {}
for _,v in pairs(config.items) do
if nil ~= v and nil ~= v.id and v.id == id then
toReturn[#toReturn+1] = v
end
end
return toReturn
else
warn("Config : " .. name .. " doen't exits filed : 'id'" )
end
end
return nil
end
return ConfigMgr