之前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 Tables = new List();
}
而这每一个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方法。
具体代码如下:
///
/// 保存Excel表;
///
///
/// 路径
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) 使用,实在是太方便了。因为你用了这个插件之后,你的二维数组就会变成下面这样:
是不是炫酷了很多?