栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

unity3D(2020)读写Excel表格(含打包PC注意事项)

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

unity3D(2020)读写Excel表格(含打包PC注意事项)

2020版Unity读写Excel——含打包注意事项
  • 一、 编辑器状态下导入必要的插件包
    • 1.1、需要导入的包(资源在1.3)
    • 1.2、脚本需要引用的命名空间
    • 1.3、相关资源与参考链接
  • 二、打包状态下导入必要的包
  • 三、文件路径的选择与处理(打包后PC)
  • 四、读与写操作
    • 读的案例
    • 写的案例1——覆盖写
    • 写的案例2——续写

说在前面:由于项目需求,需要读写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;
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/900165.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号