首页 >Unity3D频道 >【Unity3D研究院之游戏开发】 > Unity3D研究院之MAC&Windows跨平台解析Excel(六十五)
2013
09-07

Unity3D研究院之MAC&Windows跨平台解析Excel(六十五)

           好久木有更新博客了,不知道大家有木有把我忘记。博客中有好多留言,忙了我都没有时间回复,真的是非常抱歉5555555.这几天研究了一个Mac下解析Excel ,这东西在Windows下有N种方法可以解析,但是在MAC上基本上都是不兼容的。。后来我无意间找到了一个神器,它可以跨平台解析Excel 。。。一般 Excel的格式分为两种一种是 .xls 还有一种是.xlsx ,这里我们只说.xlsx 。

          如下图所示,大家看看我的工程文件,Excel 和 ICSharpCode.SharpZipLib 是第三方开发包(后面我会附带下载地址的), 这个两个东西必须存在。这个开发包是跨平台的,并且完全独立不依赖微软的那一套东东。即时你的电脑中没有安装Excel也同样是可以很好的解析。

屏幕快照 2013-09-08 3.03.25 AM

 

那么这里我就是在通过代码来解析UserLevel.xlsx了,代码比较简单我就不注释了。 这个例子我在MAC和Windows下都试验过都能很好的运行。喔对,这里我还引入了System.Data.dll  因为这里我使用了DataSet来遍历数据表。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using Excel;
using System.Data;

public class NewBehaviourScript : MonoBehaviour 
{
	void Start () 
	{		
		XLSX();

	}

	void XLSX()
	{
		FileStream stream = File.Open(Application.dataPath + "/UserLevel.xlsx", FileMode.Open, FileAccess.Read);
		IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);

		DataSet result = excelReader.AsDataSet();

		int columns = result.Tables[0].Columns.Count;
		int rows = result.Tables[0].Rows.Count;

		for(int i = 0;  i< rows; i++)
		{
			for(int j =0; j < columns; j++)
			{
				string  nvalue  = result.Tables[0].Rows[i][j].ToString();
				Debug.Log(nvalue);
			}
		}	
	}

}

result.Tables[0].Rows.Count;

 

这里0表示第一个sheet, 如果你有多个sheet的话,可以写sheet的名子

result.Tables[“mySheet”].Rows.Count;

http://exceldatareader.codeplex.com/ 也可以在这里查阅详细的文档,文档说支持.xls 但是我没能实验成功。如果你只想解析.xls那么可以使用NPOI这个类库来解析.xls,它可以很好的解析。前段时间我实验成功了,但是它不能在mac上解析.xlsx最后作罢。

本文下载地址: http://vdisk.weibo.com/s/qDm4IY-Ht09-  

哎,不知不觉凌晨3点多了 晚安! 

哦对,还有一句话忘说了,最好不要在程序运行时去动态解析这个Excel 。我的做法是把利用这个类库把Excel里面的数据读取出来,然后自己用File在去把数据写在别的文件中,方面以后加密拓展等等。

补充: 请大家切记,在游戏运行时不要去动态解析Excel,因为在手机上解析不了。。而且你需要把这个dll加在工程里面,最好的就是 先把Excel写入文件,。 运行的时候读取这个文件的方式来做。。

今天有朋友给我留言说解析Excel的时候会报错

InvalidCastException: Cannot cast from source type to destination type.
System.Data.Common.DoubleDataContainer.DoCopyValue (System.Data.Common.DataContainer from, Int32 from_index, Int32 to_index)
System.Data.Common.DataContainer.CopyValue (System.Data.Common.DataContainer from, Int32 from_index, Int32 to_index)
System.Data.Common.RecordCache.CopyRecord (System.Data.DataTable fromTable, Int32 fromRecordIndex, Int32 toRecordIndex)

开始我在我的电脑上怎么试验都没这错误,后来把它的ecxel要过来问题出现了。

错误的地方在这里。excelReader.AsDataSet(); 但是我们没法改啊。。于是改了改改成这样就可以了。。

		FileStream stream = File.Open(Application.dataPath + "/UserLevel1.xlsx", FileMode.Open, FileAccess.Read);
		IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
		do{
			// sheet name
			Debug.Log(excelReader.Name);
			while (excelReader.Read()) {
				for (int i = 0; i < excelReader.FieldCount; i++) {
					string value = excelReader.IsDBNull(i) ? "" : excelReader.GetString(i);
					Debug.Log(value);
				}
			}
		}while(excelReader.NextResult());
最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院之MAC&Windows跨平台解析Excel(六十五)》有 97 条评论

  1. 哈哈说:

    Error building Player: IOException: Sharing violation on path E:Unity_workspaceTempStagingAreaassetsbinDatasettings.xml请问这个是什么原因啊?生成apk的时候

  2. o月下o说:

    unity项目添加了google的广告,在真机上测试发现广告正常显示但无法点击广告….有没有解决方案呀?

  3. 悟空的毛毛说:

    以前项目有做过word和excel的渲染,出了npoi还有c 库可以支持.xls的

  4. 悟空的毛毛说:

    以前项目有做过word和excel的渲染,出了npoi还有c++库可以支持.xls的

  5. fff说:

    DataSet result = excelReader.AsDataSet();这个DataSet 型的resuit的变量Tables[0]在unity里可以用,打包成exe后出错我也遇到这种情况,很奇怪

  6. 梧桐灬专攻精神说:

    支持啊 大神。我也很久没上你这了。

  7. 松大哥救命!我在用unity做一个win8触摸平台的游戏,但是不知道相关的触屏接口啊~~有什么好的插件或其他解决方法吗??谢啦!

  8. 仗剑走天涯说:

    问个问题,从游戏场景返回主菜单场景,怎么使主菜单的NGUI默认就是某一级菜单。因为返回菜单场景默认是主菜单的话,玩家又要点击再次进入下级菜单再操作开始游戏,无形中玩家需要多按一次操作。怎么改进?因为用的是NGUI的3D Menu,如果是2D的我可以enable,disable来操作

  9. Mr.ider说:

    求教雨凇大哥:最近在做在Unity里用高通插件制作增强现实案例,然后发布成Eclipse工程再与Eclipse里已有的工程进行通讯。问题是在Unity里运用 “AndroidJavaClass jc = new AndroidJavaClass(“com.unity3d.player.UnityPlayer”); activity = jc.GetStatic(“currentActivity”); activity.Call(“HelloWorld”);”来调用Android的方法的时候,HelloWorld所在的类必须是主类,而且是继承了UnityPlayerActivity的;但是高通增强现实插件所在的类“QCARPlayerProxyActivity”也必须作为主类启动才能打开摄像头。这样两个都需要作为主类的情况下,该怎么处理呢??

  10. llw00549说:

    大神终于回归了~

  11. 李善伟说:

    DataSet result = excelReader.AsDataSet();这个DataSet 型的resuit的变量Tables[0]在unity里可以用,打包成exe后出错为什么?

  12. 你的包名是中文的,导入不进来。我便把中文去掉。可以导入了,但是报错啊!IOException: Sharing violation on path D:My DocumentsTestExcelAssetsUserLevel.xlsx

  13. 郭彬说:

    很好。很喜欢。哈哈。你不写文章还真有点把你忘记了。

  14. 转了! 加油!松松大牛!!!

  15. 李善伟说:

    为什么excel表格里面的数据改动一下就出错那

  16. 阿根说:

    为什么不转成csv呢

  17. 延澈左说:

    p.s.想问下momo大神,在游戏设计的时候是怎么划分开发模块方便多人同时进行开发,以及怎么处理项目为了适应不同运营商的要求,而制作多个版本?当游戏有了bug的时候,如果改动的话得在所有的版本都改一下,但是又有可能各个版本的某些要求不一样。肿么办? Unity3D研究院之MAC&#038;Windows跨平台解析Excel(六十五) - 雨松MOMO程序研究院 - 1

  18. 延澈左说:

    非常实用!方便了关卡设计者改变游戏数据,省的他们不懂程序对游戏数据的存储格式。

留下一个回复

你的email不会被公开。 必填项已用 * 标注。