Unity 2018 对Excel (xlsx)的读写(EPPlus)

前言

之前5.6.x用过EPPlus的对Excel 的读写,其实也是网上找的一个教程,但是现在又突然找不到了。后来升级到2018.3.5的时候,突然这个插件就凉了。

排查之后发现,之前的EPPlus用的是.Net 3.5 的框架,而Unity2018用的是 .Net 4.x 的框架。所以产生了不兼容的问题,导致插件无法使用。后来一想,干脆就此机会把自己的用的(网上抄来的)插件整理整理,做个记录好了。

 

正文

1、插件本体地址

https://download.csdn.net/download/cyf649669121/10959571

 

2、插件的内容

上面的3.5 和 4.x 对应的.Net版本,这个要根据Unity的设置来选用。一般5.6.x 以下的用3.5,到了2017 往上就可以考虑使用 4.x了。在 PlayerSetting -> OtherSetting -> Configuration 中可以看到当前使用的框架:

之后把框架对应的插件(EPPlus.dll 、EPPlus.XML)在Unity的Plugins里找个文件夹丢进去就可以了。之后在把Sripts\Excel 文件夹中的四个脚本丢到Unity里面去就算插件导入完成了。

 

3、Excel的读写示例

(ExcelPath 为Excel在Unity中的路径 ,如 Asset/StreamingAssets/xxx.xlsx)

//读取:
Excel mExcel = ExcelHelper.LoadExcel(ExcelPath);

//写入:
ExcelHelper.SaveExcel(mExcel, ExcelPath);

读取完之后的Excel类就是对应的一个xlsx文件,一个xlsx可能只有一张表(sheet),也可能有很多张表。每一个表都在一个Excel类中的一个名叫 Tables 的列表中:

public class Excel
{
    public List <ExcelTable> Tables = new List<ExcelTable>();
}

而这每一个ExcelTable就是我们存储各种各样数据的地方,对应xlsx文件中的一个Sheet 表单。之后我们通过ExcelTable.GetValue(int row, int column) 和 ExcelTable. SetValue(int row, int column, string value) 来对每个 sheet 表单进行读取和赋值。

注意:这个GetValue 和 SetValue 的下标是从1开始,而不是C#的数组那样从0开始,也就是在Excel中A1单元格代表的下标不是(0,0)而是(1,1)。

 

4、关于Excel的保存;

不是很建议在编辑器开发的时候把Excel放到Unity里面,因为如果Excel处于打开模式下,编辑器就会报错。

另外,用现有的ExcelHelper进行Excel数据保存的时候,是会覆盖掉原有的格式。比如你设置了表格长宽、字体、背景色这些自然就凉了。究其原因,是因为在保存的时候,Excel的数据都是new一份新的,然后覆盖原文本。如果需要在保存Excel的时候不重置格式,需要改造一下ExcelHelper.SaveExcel方法。

具体代码如下:

    /// <summary>
    ///  保存Excel表;
    /// </summary>
    /// <param name="xls"></param>
    /// <param name="path">路径</param>
    public static void SaveExcel(Excel xls, string path)
    {
        FileInfo output = new FileInfo(path);
        ExcelPackage ep =new ExcelPackage(output);
        int length = ep.Workbook.Worksheets.Count;
        int count = xls.Tables.Count;

        for (int i = 0; i < count; i++)
        {
            ExcelTable table = xls.Tables[i];
            //依次覆盖之前的表格;
            string key = table.TableName;
            ExcelWorksheet sheet = null;
            //如果表中没有数据,则跳过;
            if (table.NumberOfRows + table.NumberOfColumns == 0)
            {
                continue;
            }
            //获取正确的数据表
            if (i >= length)
                sheet = ep.Workbook.Worksheets.Add(table.TableName);
            else
            {
                //鬼鬼,他这个下标从1开始的真的是太秀了!
                sheet = ep.Workbook.Worksheets[i + 1];
                sheet.Name = table.TableName;
            }

            for (int row = 1; row <= table.NumberOfRows; row++)
            {
                for (int column = 1; column <= table.NumberOfColumns; column++)
                {
                    sheet.Cells[row, column].Value = table.GetValue(row, column);
                }
            }
        }
        ep.SaveAs(output);
    }

 

PS:这个EPPlus的数据结构,他的表是从1开始的,而不是0……这个有点秀,有的我发现了,比如行号列号、工作表序号,有的还没有发现。所以遇到读表不全、下标越界的问题,可以考虑下是不是因为你误以为他的下标从0开始导致的。

 

后记

一般来讲,Excel的数据进C#之后就全是string格式的了。其实从某个角度来讲还是很不方便,因为我们写代码最好的方法是序列化成一个一个的类,然后直接在代码中用点运算符就能拿到处理好的数据了。所以一般来讲,Excel的读取之后还要进行二次处理。思路的话可以借鉴一下这两篇:

http://gad.qq.com/article/detail/286171

http://gad.qq.com/article/detail/289271

推荐配合Odin (https://assetstore.unity.com/packages/tools/utilities/odin-inspector-and-serializer-89041) 使用,实在是太方便了。因为你用了这个插件之后,你的二维数组就会变成下面这样:

是不是炫酷了很多?

 

 

 

 

 

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值