IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> unity3D(2020)读写Excel表格(含打包PC注意事项) -> 正文阅读

[游戏开发]unity3D(2020)读写Excel表格(含打包PC注意事项)


说在前面:由于项目需求,需要读写excel文件,不要求转化为csv格式。 参考了许多优秀博主的文章,这里就不一一贴出来了,本章属于技术总结吧,以便后面回顾。

一、 编辑器状态下导入必要的插件包

1.1、需要导入的包(资源在1.3)

  • 读Excel 文件——需要 Excel.DLL
  • 写 Excel 文件——需要 EPPlus.DLL
  • 其它包文件——需要ICSharpCode.SharpZipLib.DLL
  • 还有一个System.Data,以前有博主的文章说要导入,但2020版应该不需要了,因为我无论导入哪个API版本的都给我整报错,所以我没有加这个,并不影响使用。
  • 所有DLL文件都要放在 Plugins 文件夹里面!!!
    在这里插入图片描述在这里插入图片描述
    注意事项:确保这三个DLL文件符合你使用的.NET版本,我的都是 .NET 3.5的,以及是可以正常使用的动态链接库。(我前面用的Excel.Dll就是有问题的,所以一直读不出来,后面才找到对的文件。)

1.2、脚本需要引用的命名空间

  • 这里就直接上代码了,后面讲具体读写操作时就忽略这一块了。
using Excel;    //读excel文件
using System.IO;  //用file 工具读写文件
using System.Data; // 读写数据
using OfficeOpenXml;  // 写excel文件(Epplus)
using System;
  • 有趣的点:我在引用时,有时候会出现引用报错,然后我把DLL文件从Plugins中挪出来到Asset中,代码就没报错了。然后再重新扔进Plugins。应该是自己项目的问题吧。

1.3、相关资源与参考链接

  • 这些资源可以在网上就收到了,其中Excel比较难找,要找个梯子去官网找。不过还是有博主无私贡献出来了,链接如下
    https://blog.csdn.net/wangjiangrong/article/details/79980447

二、打包状态下导入必要的包

  • 如果项目需要打包,那你需要添加更多的DLL文件。这里也是参考了许多博主的文章,这里针对于2020版本做一个小记录。(我的2020不需要加 system.data)
    -找到你unity安装目录,将以下的几个文件扔到Plugins中。
    这里有个坑一开始试了unity中的这些插件,然后报错了,然后又试了不同API版本的,最后在unityjit 中的插件就能用。而且要一个一个DLL拉到Plugins中;如果一次性拉,找个项目就崩了(离谱)。
    在这里插入图片描述在这里插入图片描述

三、文件路径的选择与处理(打包后PC)

  • 网上又很多打包相关的介绍,其中应该最厉害的还是AB打包,这里把一个比较好的博文链接贴给大家:https://blog.csdn.net/linxinfa/article/details/108894280
  • 由于我的项目使用的Excel数据量没有很大,我就直接使用Application.dataPath ,支持可读可写。可以在Asset下建立个文件夹(excels),路径进行适当修改就行(Application.dataPath+“/excels/”+文件名)注意事项 如果使用此路径,要在导出后,自行在 _Data文件夹中添加内容。
    在这里插入图片描述

四、读与写操作

  • 读写操作网上就有太多例子了,这里贴出部分核心代码。推荐使用协程来完成读写功能。
  • 以下链接是我主要参考的: https://www.cnblogs.com/xiaoyulong/p/11026079.html

读的案例

  • 2007以后的版本指后缀为 .xlsx 的。如果读的版本不一致,是读不到东西的。
  IEnumerator  ReadEexcel_cunhuo()
    {
        if (File.Exists(path_cunhuo))
        {
            using (FileStream stream = File.Open(path_cunhuo, FileMode.Open, FileAccess.Read, FileShare.Read))
           {
                IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); ;//读取 2007及以后的版本
                DataSet results = excelReader.AsDataSet();
                culum = results.Tables[0].Columns.Count;
                rows= results.Tables[0].Rows;
                for (int i = 1; i < rows.Count; i++)
                {
                    //利用字典将存货表的内容存储
                    myTable_cunhuo[rows[i][0].ToString()] =new string[] { rows[i][1].ToString(), rows[i][2].ToString(), rows[i][3].ToString() };
                    yield return new WaitForEndOfFrame();
                }
                yield return null;
            }
        }
        
    }

写的案例1——覆盖写

  • 就是删除源文件,从头开始写。
 IEnumerator WriteEexcel_cunhuo()
    {
        string _sheetName = "sheet1";
        FileInfo _excelName = new FileInfo(path_cunhuo);
        if (_excelName.Exists)
        {
            _excelName.Delete(); //删除旧文件,并创建一个新的 excel 文件。
            _excelName = new FileInfo(path_cunhuo);
        }
        using (ExcelPackage package = new ExcelPackage(_excelName))
        {
            //在 excel 空文件添加新 sheet,并设置名称。
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(_sheetName);
            //添加列名,作为第一行  (省略了一些列)
            worksheet.Cells[1, 1].Value = "商品编号";
            worksheet.Cells[1, 2].Value = "存量";
            int ii = 2;   //从第二行开始写
            foreach(var item in myTable_cunhuo.Keys)  //这是我自己弄的一个字典,用来存数据
            {
                worksheet.Cells[ii, 1].Value = item;
                for (int i = 2; i < 5; i++)
                {
                    worksheet.Cells[ii, i].Value =myTable_cunhuo[item][i-2];
                }
                ii++;
                yield return new WaitForEndOfFrame();
            }
            package.Save();  //保存excel
        }

写的案例2——续写

  • 注意事项 写excel文档,是从1 开始书写的,不是从 0 开始,这与读是不同的。
 IEnumerator sell_test()
    {
        FileInfo _excelName = new FileInfo(path_sell);
        if (_excelName.Exists)
        {
            //要自己记住表格的列名,才方便对号入座。
            using (ExcelPackage package = new ExcelPackage(_excelName))
            {
                //得到excel中的第一个文件,这个是自己查EPPlusAPI看到的,要根据具体版本来。
                ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
                //注意,这里写入的时候是按1开始的,不是0 ,这个要和读区别.
                int a = last_row_number;  //自己通过读等方法,找到现有的行数。
                worksheet.Cells[a + 1, 1].Value = productNumber; //这里开始写的操作
                //......省略了其它写
                package.Save();
                last_row_number = (a + 1).ToString();  //根据需要更新行数等。
                yield return null;
            }
          }
         yield return 0;
    }
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章           查看所有文章
加:2021-12-06 15:34:42  更:2021-12-06 15:35:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 7:45:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码