需求:需要在运行时打开目录选择文件,读取excel数据后缀.xslx
设计:使用window自带的dll,excel,ICSharpCode.SharpZipLib,I18N.*等所有dll放入Plugins目录下
后面我会免费上传dll的超链接
有两种模式
先说第一种:原生的
导入Excel.dll,ICSharpCode.SharpZipLib.dll,I18N.*等所有dll放入Plugins目录里,代码如下
I18N.*.dll 存储在E:\sw\Unity_Engine\2020.3.0f1\Editor\Data\MonoBleedingEdge\lib\mono\unityjit
using System;
using System.Runtime.InteropServices;
//脚本OpenFileName
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class OpenFileName
{
public int structSize = 0;
public IntPtr dlgOwner = IntPtr.Zero;
public IntPtr instance = IntPtr.Zero;
public String filter = null;
public String customFilter = null;
public int maxCustFilter = 0;
public int filterIndex = 0;
public String file = null;
public int maxFile = 0;
public String fileTitle = null;
public int maxFileTitle = 0;
public String initialDir = null;
public String title = null;
public int flags = 0;
public short fileOffset = 0;
public short fileExtension = 0;
public String defExt = null;
public IntPtr custData = IntPtr.Zero;
public IntPtr hook = IntPtr.Zero;
public String templateName = null;
public IntPtr reservedPtr = IntPtr.Zero;
public int reservedInt = 0;
public int flagsEx = 0;
}
public class LocalDialog
{
//链接指定系统函数 打开文件对话框
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
public static extern bool GetOpenFileName([In, Out] OpenFileName ofn);
public static bool GetOFN([In, Out] OpenFileName ofn)
{
return GetOpenFileName(ofn);
}
//链接指定系统函数 另存为对话框
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
public static extern bool GetSaveFileName([In, Out] OpenFileName ofn);
public static bool GetSFN([In, Out] OpenFileName ofn)
{
return GetSaveFileName(ofn);
}
}
using System.Runtime.InteropServices;
//脚本FileManager
public static class FileManager
{
private static OpenFileName OpenFileManager(string str)
{
OpenFileName openFileName = new OpenFileName();
openFileName.structSize = Marshal.SizeOf(openFileName);
//文件类型 config配置文件,"Excel文件(*.xlsx)\0*.xlsx" ,"Txt文件(*.txt)\0*.txt"...
openFileName.filter = "Excel文件(*.xlsx)\0*.xlsx";
openFileName.file = new string(new char[256]);//new一个256字符的string
openFileName.maxFile = openFileName.file.Length;//获取256字符的string的长度作为最大
openFileName.fileTitle = new string(new char[64]);//64字符的string
openFileName.maxFileTitle = openFileName.fileTitle.Length;//文件标题的最大长度
openFileName.initialDir = UnityEngine.Application.dataPath;//默认路径
openFileName.title = str;//文件标题
openFileName.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000008;
return openFileName;
}
public static OpenFileName OpenFile()
{
OpenFileName openFileName = OpenFileManager("OpenFile");
if (LocalDialog.GetOpenFileName(openFileName))
{
return openFileName;
}
return null;
}
public static void SaveFile()
{
OpenFileName openFileName = OpenFileManager("SaveFile");
if (LocalDialog.GetSaveFileName(openFileName))
{
//var nowPath = openFileName.file;
//if (!nowPath.EndsWith(".conf"))//是不是以".conf"结尾
//{
// nowPath = openFileName.file + ".conf";
//}
}
}
}
using System.Data;
using Excel;
void Start(){
public List<TItem> ItemList;
//打开文件夹
//读取excel
//打印信息
var fileName = FileManager.OpenFile();
string url = fileName.file;
int columnNum = 0, rowNum = 0;
DataRowCollection collect = Read(url, ref columnNum, ref rowNum);
ItemList = new List<TItem>();
for (int i = 1; i < rowNum; i++)
{
TItem item = new TItem();
//解析每列的数据
item.Day = uint.Parse(collect[i][0].ToString());
item.T = long.Parse(collect[i][1].ToString());
ItemList.Add(item);
}
foreach (var item in ItemList)
{
Debug.Log(item.Day + "\t" + item.T + "\n");
}
}
DataRowCollection Read(string filePath, ref int columnNum, ref int rowNum)
{
FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
DataSet result = excelReader.AsDataSet();
excelReader.Close();
columnNum = result.Tables[0].Columns.Count;
rowNum = result.Tables[0].Rows.Count;
return result.Tables[0].Rows;
}
public class TItem
{
public uint Day;
public long T;
}
再说第二种是用EPPlus
导入EPPlus.dll,I18N.*等所有dll放入Plugins目录里,代码如下
下标是根据行号和列号来的
string url = fileName.file;
//ItemList = new List<TItem>();
//int columnNum = 0, rowNum = 0;
//using (ExcelPackage excelPackage = new ExcelPackage(new FileInfo(url)))
//{
// ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets[0];
// rowNum = worksheet.Dimension.Rows;
// columnNum = worksheet.Dimension.Columns;
// for (int i = 2; i < rowNum; i++)
// {
// TItem item = new TItem();
// item.Day = uint.Parse(worksheet.GetValue(i, 1).ToString());
// item.T = uint.Parse(worksheet.GetValue(i, 2).ToString());
// ItemList.Add(item);
// //Debug.Log(worksheet.GetValue(i, 1).ToString() + ":" + worksheet.GetValue(i, 2).ToString());
// }
//}
//foreach (var item in ItemList)
//{
// Debug.Log(item.Day + "\t" + item.T + "\n");
//}
<< EPPlus Please set the ExcelPackage.LicenseContext property,
使用EPPlus读取Excel文件 报错
EPPlus 5.0 以后的版本需要指定 商业证书 或者非商业证书。你需要在代码里指定证书或者降低EPPlus版本
//指定EPPlus使用非商业证书
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
<<注意不放I18N.*等所有dll,在build出来读取excel时是会报错的!!