前言
读写excel是游戏开发中经常用到的技术,程序可以使用策划、文案写好的excel对数据进行修改,达到简易配合的目的。今天记录一下对Excel的读写过程。
准备
下图是所需类库。Excel.dll、EPPlus.dll、ICSharpCode.SharpZLib.dll在网上可以搜到。
备注:
1.你的unity版本是多少,去对应的安装目录中取dll
2.System.Data.dll 在D:\Program Files\Unity2017.2\Editor\Data\Mono\lib\mono\2.0
3.I18N开头的dll 在 D:\Program Files\Unity2017.2\Editor\Data\Mono\lib\mono\unity
1.读取excel
需要注意读取excel默认第一行第一列是索引0开始,写入是索引1开始。另外要using System.Data使用DataSet储存excel数据。这里0表示第一个sheet, 如果你有多个sheet的话,可以写sheet的名字,例如result.Tables[“mySheet”].Rows.Count
代码示例:
FileStream stream = File.Open(Application.dataPath + "/Excels/鬼船新攻略文字.xlsx", FileMode.Open, FileAccess.Read); //读取文件流
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); //读取Excel
DataSet result = excelReader.AsDataSet(); //储存数据
//int columns = result.Tables[0].Columns.Count; //列数 0开始
int rows = result.Tables[0].Rows.Count; //行数
//验证数据长度是否匹配 这个根据具体项目取舍
if(rows != TipsInfoController.instance.allTips.Count)
{
Debug.LogError("数据长度不匹配!加载失败!");
return;
}
for (int i = 0; i < rows; i++)
{
string nvalue = result.Tables[0].Rows[i][1].ToString();
TipsInfoController.instance.allTips[i].text.中文 = nvalue; //写入 根据具体项目自己改动
EditorUtility.SetDirty(TipsInfoController.instance.allTips[i]); //Unity中保存
}
2.写入Excel
需要using OfficeOpenXml
Epplus备注:
教程及常用设置
代码示例:
static readonly string _filePath = Application.dataPath + "/Excels/对话.xlsx"; //存储位置
static readonly string _sheetName = "Sheet1"; //表格名称
public static void ReadTalks()
{
FileInfo _excelName = new FileInfo(_filePath);
if (_excelName.Exists)
{
//删除旧文件,并创建一个新的 excel 文件。
_excelName.Delete();
_excelName = new FileInfo(_filePath);
}
//通过ExcelPackage打开文件
using (ExcelPackage package = new ExcelPackage(_excelName))
{
//在 excel 空文件添加新 sheet,并设置名称。
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(_sheetName);
//添加列名
worksheet.Cells[1, 1].Value = "ID(对话名称)";
worksheet.Cells[1, 2].Value = "立绘(文件名,不显示则不填)";
worksheet.Cells[1, 3].Value = "名字";
worksheet.Cells[1, 4].Value = "对话内容(对话顺序以先后顺序排序)";
int whichRow = 2;//第一行已经写好了,所以从第二行开始
// 读取数据的长度,这个根据自己项目改动
for (int i = 0; i < ScriptData.instance.talkList.Length; i++)
{
for (int j = 0; j < ScriptData.instance.talkList[i].talkList.Count; j++)//写入
{
if(ScriptData.instance.talkList[i].name != null)
worksheet.Cells[whichRow, 1].Value = ScriptData.instance.talkList[i].name;
if (ScriptData.instance.talkList[i].talkList[j].Image != null)
worksheet.Cells[whichRow, 2].Value = ScriptData.instance.talkList[i].talkList[j].Image.name;
if (ScriptData.instance.talkList[i].talkList[j].Name != null)
worksheet.Cells[whichRow, 3].Value = ScriptData.instance.talkList[i].talkList[j].Name.Text;
if (ScriptData.instance.talkList[i].talkList[j].Text != null)
worksheet.Cells[whichRow, 4].Value = ScriptData.instance.talkList[i].talkList[j].Text.Text;
whichRow += 1;
}
whichRow += 1;
}
package.Save(); //储存
}