NLDClient-yudde/ProjectNLD/Assets/Editor/Story/Utils/ExcelReader.cs

275 lines
9.0 KiB
C#

#if UNITY_EDITOR
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using Gameplay.Story.Cmp.Data;
using Gameplay.Story.I18N;
using UnityEngine;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
namespace Gameplay.Story.Cmp.Utils
{
public static class ExcelReader
{
public static List<StoryI18NItemDataWrapper> ReadI18NData(string excelPath)
{
var result = new List<StoryI18NItemDataWrapper>();
if (string.IsNullOrEmpty(excelPath))
{
return result;
}
var workbook = _GetSheet(excelPath);
if (workbook == null) return result;
// 读取sheetcount
var sheetCount = workbook.NumberOfSheets;
for (int i = 0; i < sheetCount; i++)
{
var readSheet = workbook.GetSheetAt(i);
var sheetName = readSheet.SheetName;
var i18NData = _Readi18NData(readSheet);
i18NData.languageName = sheetName;
result.Add(i18NData);
}
workbook.Close();
return result;
}
private static StoryI18NItemDataWrapper _Readi18NData(ISheet sheet)
{
// 第一行不读
var currentRowIndex = 1;
var row = sheet.GetRow(currentRowIndex);
var result = new StoryI18NItemDataWrapper();
var data = new List<StoryI18NItemData>();
while (row != null)
{
var cellIndex = 0;
var cellHashCode = row.GetCell(cellIndex++);
var cellValue = row.GetCell(cellIndex++);
var hashCode = _TryReadMsg(cellHashCode);
var value = _TryReadMsg(cellValue);
var item = new StoryI18NItemData
{
hashCode = hashCode,
value = value
};
data.Add(item);
currentRowIndex++;
row = sheet.GetRow(currentRowIndex);
}
result.data = data.ToArray();
return result;
}
public static StoryExcelData TryReadExcelData(string excelPath)
{
if (string.IsNullOrEmpty(excelPath))
{
return null;
}
var storyExcelData = new StoryExcelData();
_TryReadExcelData(excelPath, storyExcelData);
return storyExcelData;
}
private static void _TryReadExcelData(string excelPath,
StoryExcelData storyExcelData)
{
var workbook = _GetSheet(excelPath);
if (workbook == null) return;
var readSheet = workbook.GetSheetAt(0);
var currentRowIndex = 2;
var row = readSheet.GetRow(currentRowIndex);
var name2Id = new Dictionary<string, int>();
while (row != null)
{
// 读取一行的所有信息
// 0 无用
// 1 blockid
// 2 characterName
// 3 playerId
// 4 isTalk 0 1
// 5 modelId
// 6 对话信息
// 7 动作信息
// 8 表情信息
// 9 blocktime
var cellIndex = 1;
var cellBlockId = row.GetCell(cellIndex++);
var cellCharacterName = row.GetCell(cellIndex++);
var cellPlayerId = row.GetCell(cellIndex++);
var cellIsTalk = row.GetCell(cellIndex++);
var cellModelId = row.GetCell(cellIndex++);
var cellDialog = row.GetCell(cellIndex++);
var cellMotionName = row.GetCell(cellIndex++);
var cellFaceName = row.GetCell(cellIndex++);
var cellBlockTime = row.GetCell(cellIndex++);
var msgBlockId = _TryReadMsg(cellBlockId);
var msgCharacterName = _TryReadMsg(cellCharacterName);
var msgPlayerId = _TryReadMsg(cellPlayerId);
var msgIsTalk = _TryReadMsg(cellIsTalk);
var msgModelId = _TryReadMsg(cellModelId);
var msgDialog = _TryReadMsg(cellDialog);
var msgMotionName = _TryReadMsg(cellMotionName);
var msgFaceName = _TryReadMsg(cellFaceName);
var msgBlockTime = _TryReadMsg(cellBlockTime);
var blockId = _TryGetId(msgBlockId, -1);
if (blockId == -1)
{
currentRowIndex++;
row = readSheet.GetRow(currentRowIndex);
continue;
}
var getBlockData = storyExcelData.TryGetExcelBlockData(blockId);
if (getBlockData == null)
{
getBlockData = new StoryExcelBlockData(blockId);
storyExcelData.AddBlockData(getBlockData);
}
// 如果有对话内容,则进行覆盖
if (!string.IsNullOrEmpty(msgDialog))
{
getBlockData.TrySetMsg(msgDialog);
}
var isTalk = _TryGetId(msgIsTalk, 0) == 1;
var modelId = _TryGetId(msgModelId);
var playerId = _TryGetId(msgPlayerId);
if (name2Id.TryGetValue(msgCharacterName, out var cachePlayerId))
{
playerId = cachePlayerId;
}
else
{
name2Id.Add(msgCharacterName, playerId);
}
var newPlayerData = new StoryExcelPlayerData
{
playerName = msgCharacterName,
playerId = playerId,
configId = modelId,
isTalk = isTalk
};
if (!string.IsNullOrEmpty(msgMotionName))
{
newPlayerData.motionName = msgMotionName;
}
if (!string.IsNullOrEmpty(msgFaceName))
{
var splitFaceNames = msgFaceName.Split('|');
foreach (string splitFaceName in splitFaceNames)
{
newPlayerData.faceNames.Add(splitFaceName);
}
}
getBlockData.TryAddPlayerData(newPlayerData);
if (string.IsNullOrEmpty(msgBlockTime))
{
getBlockData.blockTime = 0f;
}
else
{
getBlockData.blockTime = _TryGetFloat(msgBlockTime);
}
currentRowIndex++;
row = readSheet.GetRow(currentRowIndex);
}
}
private static float _TryGetFloat(string msg,
float defaultValue = 0)
{
if (float.TryParse(msg, out var result))
{
return result;
}
return defaultValue;
}
private static int _TryGetId(string msg,
int defaultValue = 0)
{
if (int.TryParse(msg, out var result))
{
return result;
}
return defaultValue;
}
private static string _TryReadMsg(ICell cell)
{
if (cell == null)
{
return "";
}
if (cell.CellType == CellType.String)
{
return cell.StringCellValue;
}
if (cell.CellType == CellType.Numeric)
{
return cell.NumericCellValue.ToString(CultureInfo.InvariantCulture);
}
if (cell.CellType == CellType.Boolean)
{
return cell.BooleanCellValue.ToString();
}
if (cell.CellType == CellType.Blank)
{
return "";
}
Debug.LogError("暂不支持的单元格类型:" + cell.CellType + "");
return "";
}
private static IWorkbook _GetSheet(string excelPath)
{
Debug.Log("处理文件:" + excelPath);
FileStream fs = null;
try
{
fs = new FileStream(excelPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
}
catch (Exception e)
{
Debug.LogException(e);
}
if (fs == null)
{
Debug.LogError("无法打开文件{0},跳过处理:" + excelPath);
return null;
}
var isXlsx = excelPath.EndsWith(".xlsx", System.StringComparison.CurrentCultureIgnoreCase);
IWorkbook workbook = null;
if (isXlsx)
{
workbook = new XSSFWorkbook(fs);
}
else
{
workbook = new HSSFWorkbook(fs);
}
return workbook;
}
}
}
#endif