首页 > 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也同样是可以很好的解析。

Unity3D研究院之MAC&Windows跨平台解析Excel(六十五) - 雨松MOMO程序研究院 - 1

 

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

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(); 但是我们没法改啊。。于是改了改改成这样就可以了。。

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

  1. momo,我在编辑器里面解析.xls文件,策划用office填写,我在unity解析中文的时候会显示空的,然后我用wps把其中任意一个不显示的中文重写一次保存以后,再用unity解析就能正常显示了,你有么有遇到这种问题啊?怎么解决的了哦?

  2. 读取excel与很多办法,但是写入excel表 该怎么弄啊 磨蹭了很长时间了 求大神指教一下啊 导入EPPlus后直接报错, 该怎么办呢?

  3. 我用了大神的这个方法 遇到几个问题1 发布的时候报data.dll 找不到 在发布设置里把api改为asp.net2.0就行 2 发布到win平台xlsx 应该放到_Data文件夹里3. 设置完xml还是会报空 那么 ICSharpCode.SharpZipLib.Zip.ZipConstants.DefaultCodePage默认为437(美国/加拿大英语),如果被解压的文件不是437编码将报CodePage 437 not supported错误。解决方案://根据项目中使用的编码,重设ZipConstants.DefaultCodePage的值。例如我的项目使用的是UTF8编码。ICSharpCode.SharpZipLib.Zip.ZipConstants.DefaultCodePage = System.Text.Encoding.UTF8.CodePage给大家分享下

  4. 我想问您个问题就是如果发布到Web,因为这里引用dll会报错,所以只能换种方法读取了,就是讲Excel文件转换成.txt文件,可是如果操作频繁,每次这样转换很麻烦,有没有更好的办法呢?

  5. //读取.xls 文件用ExcelReaderFactory.CreateBinaryReader()
    IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(my_Stream))
    //读取xlsx文件用ExcelReaderFactory.CreateOpenXmlReader()
    IExcelDataReader mExcelReader = ExcelReaderFactory.CreateOpenXmlReader(my_Stream);

  6. 请问一下 与Mysql相连打包到android是必须用android pro吗?..一直显示 Error building Player: SystemException: ‘System.Net.Sockets’ are supported only with Unity Android Pro. Referenced from assembly ‘Mono.Data.Tds’.
    求解QAQ

  7. 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)

    出现这个错误,是因为数据表里面,有中文或者其他奇怪字符,把那些字符删掉就好了,即使是在其他sheet里面有中文字符也是不可以的。我这边试验过读取xls是没问题的

    • 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)

  8. 大神你好呀,我使用你这个方式在编辑器内没问题,但是发布Windows版本后就出问题了呢,DebugEx.Info(“错误消息:”, mExcelReader.ExceptionMessage);Message: 错误消息:, CodePage 437 not supported.

    • 以下是百度到的答案http://www.66acg.com/?post=174//根据项目中使用的编码,重设ZipConstants.DefaultCodePage的值。例如我的项目使用的是UTF8编码。ICSharpCode.SharpZipLib.Zip.ZipConstants.DefaultCodePage = System.Text.Encoding.UTF8.CodePage;

  9. 有个蛋疼的问题是,excel在打开的情况下,不能读取,包异常。必须关闭excel才能读取。这个由办法解决吗?

      • 是啊。你这个项目就是这样的啊,不信你试试。策划调数值平衡的的时候,老师要打开关闭的话,就很蛋疼啦。能解决这个问题吗?

          • 不是,我直接下的你的项目,发现excel在手动打开后,不能读取的。必须在excel没有手动打开的情况下才能读取的。感觉这样不方便策划频繁的改数据还有现在各种渠道的sdk很多,还有android、ios、wp的支付sdk,统计sdk等等,感觉这块好乱,有没有什么比较好的方案呢?还有关于剧情、过场动画、任务等的编辑器脚本系统,有没有好的思路呢。谢谢大神了。

  10. //1. Reading from a binary Excel file (’97-2003 format; *.xls)IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);//…//2. Reading from a OpenXml Excel file (2007 format; *.xlsx)IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);//…这样就可以读xls了那么问题就来了, int columns = result.Tables[0].Columns.Count; 得到是这一行的字符总数,不是列数

  11. 雨大 我下载你的包导入一个新工程 发布的时候会报错是怎么回事 ArgumentException: The Assembly System.Configuration is referenced by System.Data. But the dll is not allowed to be included or could not be found.

  12. 雨凇 读取excel之类的有很多种方式 写入已经存在的excel(如:昨天写的excel,今天要往里面添加数据,或者要往里新建sheet) 真的把我难倒了 找了多种 包括npoi 还问了npoi的老大tony tony的回复是在mono里面写入已经存在的excel是有问题的 目前没有解决方案 myxls之流也报错了 epplus导入其dll直接报错 导入微软的excel的相关类库也直接丝毫不给面子 报错了 退而求其次找到odbc操作excel 但是这玩意儿是用sql语句的 我用的时候虽然可以插入跟新建sheet 但是 没法往指定单元格插入数据 我实在没法了 求雨凇帮忙查看下 在此先感谢了

  13. 雨松老师,我请教您一下,资源中用到excel表格,做完后发布成exe怎么读取不到excel中的数据呢,自已在发布的资源文件夹中也找不到excel表格,求指教!

  14. 雨松 老师,我想点击按钮切换 控制人物的移动方式,一种是遥感控制,一种是点击地面控制,但是没思路,我想点击一下 按钮关闭例外一个脚本,但是不能实现,

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

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

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

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

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

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