1. 程式人生 > >[Unity對Excel的讀取]

[Unity對Excel的讀取]

     做專案突然想優化一下資料的輸入方式,並不想用程式碼一行一行的插入,感覺很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:




接著是把連結串列往控臺寫了寫:


沒截圖完,但可以看出所有資訊輸出了。