首页 > 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
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

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

  1. 王彬 说:

    主要是Excel文本必须把内容选择为文本格式就没事了。

  2. 青竹浪 说:

    //横向读取,读取1行的ABCD…列,然后再读取2行的ABCD…列,行下标0为ABCD列号,行下标从1开始才有数据,列下标从0开始有数据,
    //列读取到最右边的数据所在的列,行读到最下边数据所在行,如果Excel表行数列数增多,也会读到最下一行最后一列,
    //一下代码中do..while循环检测sheet,while循环检测行数,_lie表示列序号,_lie=0表示A列,_lie=0表示B列…

  3. ren 说:

    导入包失败是怎么回事

  4. cuijian 说:

    您好:为什么打包出windows版,报找不到dll

  5. LBW 说:

    这种方法能不能动态创建一个xlsx表,再去读。应该怎么做

  6. feng 说:

    调用AsDataSet时,出现InvalidCastException: Cannot cast from source type to destination type.错误,是由于Excel的cell中没有内容导致,可以用如下方法绕过这个错误:
    DataSet ds = reader.AsDataSet(new ExcelDataSetConfiguration()
    {
    ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
    {
    UseHeaderRow = true
    },

    UseColumnDataType = false
    });

  7. 鱼肠剑 说:

    我是来为那个错误解决方法点赞的。赞!

  8. 我的人生不可能这么萌 ๑• . •๑ 说:

    报错的那个童鞋,应该是因为Excel格式的问题,DataSet这种方法解析的时候,Excel第一行不能是数字1,2,3这种,必须是字符串:peter,“1”,“2”这种。且第一行的有效列数必须和整个表格其他行列数的最大值保持一致。

  9. 杨逍遥 说:

    我打包成android 读取不到内容啊。。。

  10. 爱人狂 说:

    发布之后读不到没有内容怎么办啊?

  11. nate 说:

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

  12. 大神帮解答一下: 为什么我在mono里添加了system.data referrence后, unity还是报错呢, 根本using不了system.data……

  13. Crazyman 说:

    还有其他办法吗?

  14. Crazyman 说:

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

  15. 多多洛哈 说:

    我用了大神的这个方法 遇到几个问题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给大家分享下

  16. pureyes 说:

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

留下一个回复

你的email不会被公开。