Excel导出Lua文件

读取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前五行为表头信息,五行内容如下:

  1. 字段描述
  2. 内容描述
  3. 数据类型(int,string,float,int[],enum)
  4. 程序访问名称
  5. 标识符(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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值