做项目突然想优化一下数据的输入方式,并不想用代码一行一行的插入,感觉很low。
于是就想到用excel来做,先把数据写好在excel中,然后来个批导入,一个foreach就能把数据读到我们要维护的数据结构里。
废话不多说,来看看怎么做。首先你得去Excel的官网下载他的动态链接库:一个Excel.dll,一个ICSharpCode.SharpZipLib.dll,然后放在项目目录下,最好是在plugins下。
当然,这是你会注意到还有一个叫做system.data的东西,没错这也是需要我们去弄的dll.
不过这个dll不需要下载,这属于.net自带的东西,Unity的源目录就有,这里就不得不吐槽一下Unity,讲道理这个应该直接添加依赖就可以了,但是会出现一个找不到名称空间的bug,anyway,在他的原目录下ctrl+f找一下,把这个dll也要拷到工程目录下。
好的接下来就是上代码了。
首先是名称空间的引用:
using UnityEngine; using System.Collections; using Excel; using System.Data; using System.IO; using System.Collections.Generic;接着你需要定义一个自己的结构,这个取决于你的excel表到底放了些啥,我的excel表每行只有两个属性,所以我定义了:
public struct DepenceTableData { public string word; public string instruct; };接着我们首先读取文件变成一个dataset型的变量:
static DataSet ReadExcel(string path) { FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read); IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); DataSet result = excelReader.AsDataSet(); return result; }接着对于我们比较主要的属性是dataset下的table[0],这里记录着真正的数据,以及一些总行数,总列数的信息:
public static List<DepenceTableData> Load(string path) { List<DepenceTableData> _data = new List<DepenceTableData> (); DataSet resultds = ReadExcel (path); int columns = resultds.Tables[0].Columns.Count; int rows = resultds.Tables[0].Rows.Count; for (int i = 1; i < rows; i++) { DepenceTableData temp_data; temp_data.instruct = resultds.Tables [0].Rows [i] [0].ToString(); temp_data.word = resultds.Tables [0].Rows [i] [1].ToString (); _data.Add (temp_data); } return _data; }
.rows后面这个索引就可以按二维数组来理解了。
效果图:
这是我的excel:
接着是把链表往控台写了写:
没截图完,但可以看出所有信息输出了。