2020版Unity读写Excel——含打包注意事项
说在前面:由于项目需求,需要读写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;
using System.IO;
using System.Data;
using OfficeOpenXml;
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); ;
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();
_excelName = new FileInfo(path_cunhuo);
}
using (ExcelPackage package = new ExcelPackage(_excelName))
{
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();
}
写的案例2——续写
- 注意事项 写excel文档,是从1 开始书写的,不是从 0 开始,这与读是不同的。
IEnumerator sell_test()
{
FileInfo _excelName = new FileInfo(path_sell);
if (_excelName.Exists)
{
using (ExcelPackage package = new ExcelPackage(_excelName))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
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;
}
|