- 一、 编辑器状态下导入必要的插件包
- 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就是有问题的,所以一直读不出来,后面才找到对的文件。)
- 这里就直接上代码了,后面讲具体读写操作时就忽略这一块了。
using Excel; //读excel文件 using System.IO; //用file 工具读写文件 using System.Data; // 读写数据 using OfficeOpenXml; // 写excel文件(Epplus) using System;
- 有趣的点:我在引用时,有时候会出现引用报错,然后我把DLL文件从Plugins中挪出来到Asset中,代码就没报错了。然后再重新扔进Plugins。应该是自己项目的问题吧。
- 这些资源可以在网上就收到了,其中Excel比较难找,要找个梯子去官网找。不过还是有博主无私贡献出来了,链接如下:
https://blog.csdn.net/wangjiangrong/article/details/79980447
- 如果项目需要打包,那你需要添加更多的DLL文件。这里也是参考了许多博主的文章,这里针对于2020版本做一个小记录。(我的2020不需要加 system.data)
-找到你unity安装目录,将以下的几个文件扔到Plugins中。
这里有个坑一开始试了unity中的这些插件,然后报错了,然后又试了不同API版本的,最后在unityjit 中的插件就能用。而且要一个一个DLL拉到Plugins中;如果一次性拉,找个项目就崩了(离谱)。
- 网上又很多打包相关的介绍,其中应该最厉害的还是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;
}



