前言
前端时间遇到一个功能,需要在WebGL上读取一个Excel表格的数据,起初我还并不在意,以为只是一个简单的读取功能而已,没想到这个简单功能给我挖了个大坑。
刚开始我直接试了Excel.dll库方法,本地是完全没问题,WebGL平台惨遭滑铁卢。刚开始提示我IL2CPP构建不支持,我还以为只是IL2CPP打包方式把一些脚本剔除了,于是乎,我关掉脚本剔除,结果还是失败了。
之后我尝试了EPPlus库方法,NPIO库方法,不出意外地在WebGL上全部失败了。
最后,就在我焦头烂额的时候,我看到了这篇文章http://t.csdnimg.cn/NvJ1yUnity WebGL下读取Excel,这里这位大哥直截了当的用了FlexReader插件,完美的解决了问题(话说我为什么没有第一时间去找插件)。
这里给大家分享一下踩过的坑!
前期准备
StreamingAssets文件夹下创建一个excel文件,取名看个人,表格数据看个人。
创建Plugins文件,分别存储EPPlus、Excel、NPIO库文件(我这举了三个例子)
本地读取方法
Excel库方法
void GetDataExcel()
{
path = Application.streamingAssetsPath + "/Data.xlsx";
FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
DataSet result = excelReader.AsDataSet();
int[] counts = GetCount(result.Tables[0]);
int rows = counts[0];
int columns = counts[1];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
if (!string.IsNullOrEmpty(result.Tables[0].Rows[i][j].ToString()))
{
Debug.Log("读取到表格信息方法一:"+result.Tables[0].Rows[i][j].ToString());
}
}
}
}
EPPlus库方法
void GetDataExcel2()
{
path = Application.streamingAssetsPath + "/Data.xlsx";
FileStream fileStream = File.Open(path, FileMode.Open, FileAccess.Read);
MemoryStream stream = new MemoryStream();
fileStream.CopyTo(stream);
fileStream.Close();
using (ExcelPackage package = new ExcelPackage(stream))
{
ExcelWorksheet sheet = package.Workbook.Worksheets[1];
int rows = sheet.Dimension.Rows;
int columns = sheet.Dimension.Columns;
for (int i = 1; i <= rows; i++)
{
for (int j = 1; j <= columns; j++)
{
if (!string.IsNullOrEmpty(sheet.Cells[i, j].Value?.ToString()))
{
Debug.Log("读取到表格信息方法二:"+ sheet.Cells[i, j].Value);
}
}
}
}
}
NPIO库方法
void GetDataExcel3()
{
path = Application.streamingAssetsPath + "/Data.xlsx";
FileStream fileStream = File.Open(path, FileMode.Open, FileAccess.Read);
MemoryStream stream = new MemoryStream();
fileStream.CopyTo(stream);
fileStream.Close();
IWorkbook workbook;
stream.Position = 0;// 重置流位置
workbook = new XSSFWorkbook(stream);
ISheet sheet = workbook.GetSheetAt(0);
int rows = sheet.PhysicalNumberOfRows;
for (int i = 0; i < rows; i++)
{
IRow row = sheet.GetRow(i);
if (row != null)
{
int cells = row.PhysicalNumberOfCells;
for (int j = 0; j < cells; j++)
{
ICell cell = row.GetCell(j);
if (cell != null && !string.IsNullOrEmpty(cell.ToString()))
{
Debug.Log("读取到表格信息方法三:" + cell.ToString());
}
}
}
}
}
WebGL读取方法
WebGL上读取文件要使用协程。在WebGL上读取的时候要加上这两个语言库文件I18N.Other.dll和I18N.West.dll库文件,不然编码格式会不支持
IEnumerator GetDataExcel4()
{
string path = Application.streamingAssetsPath + "/Data.xlsx";
using (UnityWebRequest webRequest = UnityWebRequest.Get(path))
{
yield return webRequest.SendWebRequest();
if (webRequest.responseCode == 200)
{
WorkBook book = new WorkBook(webRequest.downloadHandler.data);
for (int i = 0; i < book[0].Rows.Count; i++)
{
for (int j = 0; j < book[0].Rows[i].Cells.Count; j++)
{
if (!string.IsNullOrEmpty(book[0].Rows[i].Cells[j].Text))
{
Debug.Log("读取到表格信息方法四:" + book[0].Rows[i].Cells[j].Text);
}
}
}
}
}
yield return null;
}
总结
还是插件好!遇事不决找插件!
注:
严谨一点讲的话NPIO库方法我并没有确认是不是在WebGL上完全不可行,当时我使用的是WPS,用NPIO方法的时候会提示编码格式错误,但是WPS改不了编码格式,我就没有往下尝试。所以还不能确认NPIO库是不是完全不支持。