找回密码
 注册帐号

扫一扫,访问微社区

自学总结 Unity3D中使用C#完美读取Excel

24
回复
2425
查看
[ 复制链接 ]
7日久生情
2037/5000
排名
1058
昨日变化

13

主题

269

帖子

2037

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
99182
好友
0
蛮牛币
9825
威望
0
注册时间
2015-5-10
在线时间
707 小时
最后登录
2019-4-25
2018-9-12 20:04:27 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 Kasug 于 2018-9-13 11:01 编辑

在开发中存储数据的形式很多,今天我们就来谈一下Excel文件的读取问题,很多开发者按照网上的教程读取Excel,在编辑器下完全没有问题,但是一旦发布成EXE或者到移动端,总是会出现非常奇怪的问题,而相关资料也是比较少。这里我就系统地做一次读取操作。

第一步:Building Setting中API设为NET 2.0
1.png



第二步:找到Unity3D安装目录下 Editor\Data\Mono\lib\mono\unity
将其中所有 I18N开头的文件复制到工程的Plugins中。

3.png

接着导入读取Excel必须的库,文末附上。导入后如下图
2.png



第三步:一定要区分EXCEL版本!!!
1. 读取
('97-2003 format; *.xls)的EXCEL用这个代码
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
2. 读取(2007 format; *.xlsx)的EXCEL用这个代码
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);



好了,完成这三个步骤,就愉快地去读取EXCEL文件吧~注意在移动端的EXCEL读写需要写到沙盒路径哦。

下面附上一个读取.xls后缀的代码。
首先我们在Unity中创建一个Text用来显示读取到的内容。位置大小就随意啦~
4.png

然后在桌面新建一个.xls后缀的Excel文件,命名为XLSTest.xls 5.png


创建ReadExcel.cs脚本。在场景中新建空物体命名为ReadExcel并绑定此脚本
[C#] 纯文本查看 复制代码
using UnityEngine;
using UnityEngine.UI;
using Excel;
using System.Data;
using System.IO;
public class ReadExcel : MonoBehaviour
{

    private Text text;

    void Start()
    {
        text = FindObjectOfType<Text>();
        Read();

    }

    private void Read()
    {
        string path = Application.streamingAssetsPath + "/XLSTest.xls";

        FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read);

        IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
        DataSet result = excelReader.AsDataSet();

        int rows = result.Tables[0].Rows.Count;
        int cols = result.Tables[0].Columns.Count;
        text.text = "";
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                text.text += result.Tables[0].Rows[i][j].ToString() + "|";
            }
            text.text += "\n";
        }

    }
}



这里可能会出现一个错误:错误的原因是由于Excel的某些格子中没有内容导致。那这个时候我们来改动一下Read中的代码。
Error.png


[C#] 纯文本查看 复制代码
    private void Read()
    {
        string path = Application.streamingAssetsPath + "/XLSTest.xls";

        FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read);

        IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
        text.text = "";
        while (excelReader.Read())
        {
            for (int i = 0; i < excelReader.FieldCount; i++)
            {
                string value = excelReader.IsDBNull(i) ? "null" : excelReader.GetString(i);
                text.text += value + "|";
            }
            text.text += "\n";
        }
    }

可以看到此时成功地读取了数据

6.png

特别提醒:在编辑器下运行此代码时,一定不要打开被读取的Excel文件,否则会报一个错:
7.png

这个时候只需要关闭这个excel文件就好啦。读取.xlsx后缀的文件也是一样的操作,只需要替换 IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream)为IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream)就可以完成读取了。

接下来我们打包为EXE测试,非常完美~
End.png


象征性收5个B~~


读取Excel必备库.rar

471.4 KB, 下载次数: 112

售价: 5 蛮牛币  [记录]

回复

使用道具 举报

7日久生情
2200/5000
排名
1823
昨日变化

5

主题

807

帖子

2200

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
239879
好友
1
蛮牛币
17216
威望
0
注册时间
2017-8-26
在线时间
658 小时
最后登录
2019-4-25
2018-9-13 08:42:51 显示全部楼层
回复

使用道具 举报

7日久生情
1581/5000
排名
1199
昨日变化

0

主题

216

帖子

1581

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
137070
好友
0
蛮牛币
3207
威望
0
注册时间
2016-2-20
在线时间
389 小时
最后登录
2019-4-25
2018-9-13 09:55:10 显示全部楼层
66666
一直都读的xml和json,从没读过excel,涨见识了,感谢楼主分享!
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1286/1500
排名
2037
昨日变化

3

主题

166

帖子

1286

积分

Rank: 6Rank: 6Rank: 6

UID
126588
好友
0
蛮牛币
4569
威望
0
注册时间
2015-10-24
在线时间
443 小时
最后登录
2019-4-25
2018-9-13 10:10:40 显示全部楼层
{:104:}{:104:}{:104:}{:104:}
回复 支持 反对

使用道具 举报

5熟悉之中
746/1000
排名
4111
昨日变化

1

主题

235

帖子

746

积分

Rank: 5Rank: 5

UID
245227
好友
0
蛮牛币
961
威望
0
注册时间
2017-9-21
在线时间
150 小时
最后登录
2019-4-25
2018-9-13 11:01:32 显示全部楼层
API要换回2.0 蛋疼啊
回复 支持 反对

使用道具 举报

7日久生情
2037/5000
排名
1058
昨日变化

13

主题

269

帖子

2037

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
99182
好友
0
蛮牛币
9825
威望
0
注册时间
2015-5-10
在线时间
707 小时
最后登录
2019-4-25
楼主 2018-9-13 11:02:48 显示全部楼层
kckbkckb2 发表于 2018-9-13 09:55
66666
一直都读的xml和json,从没读过excel,涨见识了,感谢楼主分享!
...

谢谢支持
回复 支持 反对

使用道具 举报

7日久生情
2037/5000
排名
1058
昨日变化

13

主题

269

帖子

2037

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
99182
好友
0
蛮牛币
9825
威望
0
注册时间
2015-5-10
在线时间
707 小时
最后登录
2019-4-25
楼主 2018-9-13 11:07:32 显示全部楼层
tiancaiwlk 发表于 2018-9-13 11:01
API要换回2.0 蛋疼啊

哈哈,项目必须读EXCEL那就没办法~没有存储要求还是用json和xml吧
回复 支持 反对

使用道具 举报

4四处流浪
459/500
排名
4772
昨日变化

0

主题

45

帖子

459

积分

Rank: 4

UID
200493
好友
0
蛮牛币
1824
威望
0
注册时间
2017-1-11
在线时间
102 小时
最后登录
2019-4-10
2018-9-17 08:26:20 显示全部楼层
刚好需要的,谢谢!!!
回复

使用道具 举报

7日久生情
1705/5000
排名
19946
昨日变化

12

主题

777

帖子

1705

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
158776
好友
2
蛮牛币
99
威望
0
注册时间
2016-7-26
在线时间
883 小时
最后登录
2019-3-12
2018-9-17 09:12:14 显示全部楼层
楼主如果Excel里面的字体不同能不能读取?
回复 支持 反对

使用道具 举报

7日久生情
2037/5000
排名
1058
昨日变化

13

主题

269

帖子

2037

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
99182
好友
0
蛮牛币
9825
威望
0
注册时间
2015-5-10
在线时间
707 小时
最后登录
2019-4-25
楼主 2018-9-17 09:38:15 显示全部楼层
Hao521314 发表于 2018-9-17 09:12
楼主如果Excel里面的字体不同能不能读取?

这个我没测过哈,按理说字体只是表现形式,读取的都是行列里的字符串,不影响的。
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1035/1500
排名
16954
昨日变化

1

主题

695

帖子

1035

积分

Rank: 6Rank: 6Rank: 6

UID
199204
好友
1
蛮牛币
567
威望
0
注册时间
2017-1-5
在线时间
299 小时
最后登录
2019-4-25
2018-9-17 09:40:07 显示全部楼层
谢谢分享
回复

使用道具 举报

4四处流浪
382/500
排名
8649
昨日变化
1

0

主题

94

帖子

382

积分

Rank: 4

UID
206155
好友
0
蛮牛币
252
威望
0
注册时间
2017-2-12
在线时间
150 小时
最后登录
2019-4-18
2018-9-17 14:53:16 显示全部楼层
很不错!学习一下!感谢楼主分享!
回复 支持 反对

使用道具 举报

7日久生情
1705/5000
排名
19946
昨日变化

12

主题

777

帖子

1705

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
158776
好友
2
蛮牛币
99
威望
0
注册时间
2016-7-26
在线时间
883 小时
最后登录
2019-3-12
2018-9-18 16:12:13 显示全部楼层
Kasug 发表于 2018-9-17 09:38
这个我没测过哈,按理说字体只是表现形式,读取的都是行列里的字符串,不影响的。 ...

有影响的,字体不同读不了。
回复 支持 反对

使用道具 举报

7日久生情
1637/5000
排名
1852
昨日变化

2

主题

425

帖子

1637

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
213483
好友
0
蛮牛币
2593
威望
0
注册时间
2017-3-21
在线时间
488 小时
最后登录
2019-4-25
2018-9-26 15:48:48 显示全部楼层
谢谢楼主分享!!!!!
回复

使用道具 举报

排名
34881
昨日变化

0

主题

1

帖子

11

积分

Rank: 1

UID
293058
好友
0
蛮牛币
24
威望
0
注册时间
2018-8-9
在线时间
2 小时
最后登录
2018-10-20
2018-10-20 22:44:23 显示全部楼层
111111111111111111
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则