好久木有更新博客了,不知道大家有木有把我忘记。博客中有好多留言,忙了我都没有时间回复,真的是非常抱歉5555555.这几天研究了一个Mac下解析Excel ,这东西在Windows下有N种方法可以解析,但是在MAC上基本上都是不兼容的。。后来我无意间找到了一个神器,它可以跨平台解析Excel 。。。一般 Excel的格式分为两种一种是 .xls 还有一种是.xlsx ,这里我们只说.xlsx 。
如下图所示,大家看看我的工程文件,Excel 和 ICSharpCode.SharpZipLib 是第三方开发包(后面我会附带下载地址的), 这个两个东西必须存在。这个开发包是跨平台的,并且完全独立不依赖微软的那一套东东。即时你的电脑中没有安装Excel也同样是可以很好的解析。
那么这里我就是在通过代码来解析UserLevel.xlsx了,代码比较简单我就不注释了。 这个例子我在MAC和Windows下都试验过都能很好的运行。喔对,这里我还引入了System.Data.dll 因为这里我使用了DataSet来遍历数据表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
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(); 但是我们没法改啊。。于是改了改改成这样就可以了。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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()); |
- 本文固定链接: https://www.xuanyusong.com/archives/2429
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
请问,怎么获得Excel.dll文件?我从网上百度Excel.dll下载,下载的Excel.dll放到Plugins文件夹下后,引用不了,添加引用会提示“未能添加对XXX\Plugins\Excel.dll的引用”,using Excel;的代码会报错
主要是Excel文本必须把内容选择为文本格式就没事了。
//横向读取,读取1行的ABCD…列,然后再读取2行的ABCD…列,行下标0为ABCD列号,行下标从1开始才有数据,列下标从0开始有数据,
//列读取到最右边的数据所在的列,行读到最下边数据所在行,如果Excel表行数列数增多,也会读到最下一行最后一列,
//一下代码中do..while循环检测sheet,while循环检测行数,_lie表示列序号,_lie=0表示A列,_lie=0表示B列…
导入包失败是怎么回事
您好:为什么打包出windows版,报找不到dll
这种方法能不能动态创建一个xlsx表,再去读。应该怎么做
调用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
});
ExcelDataSetConfiguration 这个类是哪个类库里面的?
我是来为那个错误解决方法点赞的。赞!
报错的那个童鞋,应该是因为Excel格式的问题,DataSet这种方法解析的时候,Excel第一行不能是数字1,2,3这种,必须是字符串:peter,“1”,“2”这种。且第一行的有效列数必须和整个表格其他行列数的最大值保持一致。
第一行有些格子里是数字却不报错,有些格子里是数字就报错
mark 谢谢
我打包成android 读取不到内容啊。。。
发布之后读不到没有内容怎么办啊?
momo,我在编辑器里面解析.xls文件,策划用office填写,我在unity解析中文的时候会显示空的,然后我用wps把其中任意一个不显示的中文重写一次保存以后,再用unity解析就能正常显示了,你有么有遇到这种问题啊?怎么解决的了哦?
这个没遇到过。
不过我们现在用EPLUS这个工具来解析, 因为它不仅可以读 还可以写。
EPlus我之前用过,只能读xlsx格式的,我再去试试你说的NPOI
NPOI可以的,.xls和.xlsx都可以,读写也都比较简单
大神帮解答一下: 为什么我在mono里添加了system.data referrence后, unity还是报错呢, 根本using不了system.data……
还有其他办法吗?
读取excel与很多办法,但是写入excel表 该怎么弄啊 磨蹭了很长时间了 求大神指教一下啊 导入EPPlus后直接报错, 该怎么办呢?
EEPLUS
导入EPPlus后直接报错了
我用了大神的这个方法 遇到几个问题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给大家分享下
这个要赞的
你好,我把api改成2.0,把excel放到Data文件夹,可是pc打包出来还是不行啊,请问你是怎么做的啊
我想问您个问题就是如果发布到Web,因为这里引用dll会报错,所以只能换种方法读取了,就是讲Excel文件转换成.txt文件,可是如果操作频繁,每次这样转换很麻烦,有没有更好的办法呢?
脚本自动转,不是很麻烦