【游戏开发】Excel表格批量转换成lua的转表工具

  在上篇博客《【游戏开发】Excel表格批量转换成CSV的小工具》 中,我们介绍了如何将策划提供的Excel表格转换为轻便的CSV文件供开发人员使用。实际在Unity开发中,很多游戏都是使用Lua语言进行开发的。如果要用Lua直接读取CSV文件的话,又要写个对应的CSV解析类,不方便的同时还会影响一些加载速度,牺牲游戏性能。因此我们可以直接将Excel表格转换为lua文件,这样就可以高效、方便地在Lua中使用策划配置的数据了。在本篇博客中,马三将会和大家一起,用C#语言实现一个Excel表格转lua的转表工具——Xls2Lua,并搭配一个通用的ConfigMgr来读取lua配置文件。

二、开发环境准备

  由于要使用C#来读取Excel表格文件,所以我们需要使用一些第三方库。针对C#语言,比较好用的Excel库有NPOI和CSharpJExcel 这两个,其实无论哪个库都是可以用的,我们只是用它来读取Excel表格中的数据罢了。马三在本篇博客中使用的是CSharpJExcel库,因为它相对来说更轻便一些。下面附上NPOI和CSharpJExcel库的下载链接:

CSharpJExcel库下载地址:https://sourceforge.net/projects/jexcelapi/files/CSharpJExcel/ 

NPOI库下载地址:https://archive.codeplex.com/?p=npoi

三、转表工具 1.思路分析

  一切准备就绪,可以开始我们的开发任务了。首先我们来大致地说一下转表工具的思路:

读取Excel表格文件的数据,依次读取配置目录下的Excel文件,然后逐个读取表里面Sheet的内容;

根据Excel表格中配置的字段类型,对数据进行校验,判断数据是否合法;

将通过校验的数据转为lua文件,一个Sheet切页对应一个lua配置文件;

使用通用的ConfigMgr对转出来的lua配置文件进行读取操作;

2.目录结构

  项目整体的目录结构如下图所示:

  

【游戏开发】Excel表格批量转换成lua的转表工具

  图1:转表工具整体目录结构

  ConfigMgr存放我们的ConfigMgr.lua,它是一个工具类,用来读取并管理转出来的Lua配置文件,兼具缓存数据的功能。Excel目录存放我们需要进行转换的Excel表格文件。LuaData目录存放转出来的Lua配置文件。Xls2Lua目录也就是我们的转表工具的目录了,它包含源代码和可直接运行的转表工具。

  转表工具的设计结构如下图所示:

  

【游戏开发】Excel表格批量转换成lua的转表工具

  图2:转表工具设计结构

  FileExporter类专门用来读取Excel文件和导出lua配置文件;GlobalDef类中定义了一些通用的数据结构和枚举等信息;XlsTransfer类即为我们的转表工具核心类,大部分数据都是在这里进行校验处理的。

  下面我们就可以按照之前分析出来的思路编写具体的代码了,首先放上来的是我们主程序的入口,我们有一个名为config.ini的配置文件,程序运行的时候会先去这个配置信息中读取Excel的目录和输出目录,然后调用FileExporter.ExportAllLuaFile函数进行转表操作。

【游戏开发】Excel表格批量转换成lua的转表工具

【游戏开发】Excel表格批量转换成lua的转表工具

1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace Xls2Lua 9 { 10 class Program 11 { 12 private static string inDir; 13 private static string outDir; 14 private static readonly string configPath = "./config.ini"; 15 16 static void Main(string[] args) 17 { 18 ReadConfig(); 19 FileExporter.ExportAllLuaFile(inDir, outDir); 20 } 21 22 private static void ReadConfig() 23 { 24 StreamReader reader = new StreamReader(configPath, Encoding.UTF8); 25 inDir = reader.ReadLine().Split(',')[1]; 26 inDir = Path.GetFullPath(inDir); 27 outDir = reader.ReadLine().Split(',')[1]; 28 outDir = Path.GetFullPath(outDir); 29 reader.Close(); 30 } 31 } 32 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspzpg.html