游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:783

当前位置:游戏蛮牛 技术专区 教程分享

查看: 377|回复: 12

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

[复制链接]  [移动端链接]
7日久生情
1548/5000
排名
1494
昨日变化
4

11

主题

228

帖子

1548

积分

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

UID
99182
好友
0
蛮牛币
2019
威望
0
注册时间
2015-5-10
在线时间
515 小时
最后登录
2018-9-19
发表于 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, 下载次数: 11

售价: 5 蛮牛币  [记录]


回复

使用道具 举报

7日久生情
1739/5000
排名
2406
昨日变化
19

5

主题

709

帖子

1739

积分

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

UID
239879
好友
1
蛮牛币
3668
威望
0
注册时间
2017-8-26
在线时间
473 小时
最后登录
2018-9-19
发表于 7 天前 | 显示全部楼层

回复

使用道具 举报

6蛮牛粉丝
1119/1500
排名
1764
昨日变化
12

0

主题

140

帖子

1119

积分

Rank: 6Rank: 6Rank: 6

UID
137070
好友
0
蛮牛币
2351
威望
0
注册时间
2016-2-20
在线时间
275 小时
最后登录
2018-9-19
发表于 7 天前 | 显示全部楼层
66666
一直都读的xml和json,从没读过excel,涨见识了,感谢楼主分享!
[发帖际遇]: kckbkckb2 在网吧通宵,花了 3 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

5熟悉之中
667/1000
排名
3138
昨日变化
32

1

主题

44

帖子

667

积分

Rank: 5Rank: 5

UID
126588
好友
0
蛮牛币
3045
威望
0
注册时间
2015-10-24
在线时间
184 小时
最后登录
2018-9-19
发表于 7 天前 | 显示全部楼层
{:104:}{:104:}{:104:}{:104:}

回复 支持 反对

使用道具 举报

4四处流浪
374/500
排名
6587
昨日变化
109

0

主题

114

帖子

374

积分

Rank: 4

UID
245227
好友
0
蛮牛币
433
威望
0
注册时间
2017-9-21
在线时间
72 小时
最后登录
2018-9-19
发表于 7 天前 | 显示全部楼层
API要换回2.0 蛋疼啊
[发帖际遇]: tiancaiwlk 被钱袋砸中进医院,看病花了 2 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

7日久生情
1548/5000
排名
1494
昨日变化
4

11

主题

228

帖子

1548

积分

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

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

谢谢支持

回复 支持 反对

使用道具 举报

7日久生情
1548/5000
排名
1494
昨日变化
4

11

主题

228

帖子

1548

积分

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

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

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

回复 支持 反对

使用道具 举报

2初来乍到
107/150
排名
13484
昨日变化
475

0

主题

21

帖子

107

积分

Rank: 2Rank: 2

UID
200493
好友
0
蛮牛币
591
威望
0
注册时间
2017-1-11
在线时间
28 小时
最后登录
2018-9-19
发表于 3 天前 | 显示全部楼层
刚好需要的,谢谢!!!
[发帖际遇]: MengC 捡了钱没交公 蛮牛币 降了 3 . 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
1677/5000
排名
18893
昨日变化
17

12

主题

779

帖子

1677

积分

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

UID
158776
好友
2
蛮牛币
152
威望
0
注册时间
2016-7-26
在线时间
858 小时
最后登录
2018-9-19
发表于 3 天前 | 显示全部楼层
楼主如果Excel里面的字体不同能不能读取?

回复 支持 反对

使用道具 举报

7日久生情
1548/5000
排名
1494
昨日变化
4

11

主题

228

帖子

1548

积分

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

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
630/1000
排名
16060
昨日变化
10

0

主题

395

帖子

630

积分

Rank: 5Rank: 5

UID
199204
好友
0
蛮牛币
345
威望
0
注册时间
2017-1-5
在线时间
195 小时
最后登录
2018-9-18
发表于 3 天前 | 显示全部楼层
谢谢分享

回复

使用道具 举报

3偶尔光临
167/300
排名
14775
昨日变化
589

0

主题

54

帖子

167

积分

Rank: 3Rank: 3Rank: 3

UID
206155
好友
0
蛮牛币
111
威望
0
注册时间
2017-2-12
在线时间
65 小时
最后登录
2018-9-19
发表于 3 天前 | 显示全部楼层
很不错!学习一下!感谢楼主分享!

回复 支持 反对

使用道具 举报

7日久生情
1677/5000
排名
18893
昨日变化
17

12

主题

779

帖子

1677

积分

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

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

有影响的,字体不同读不了。

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐 上一条 /1 下一条

快速回复 返回顶部 返回列表