c1_unity/Assets/Editor/Utils/BFExcelHelper.cs
2023-04-03 11:04:31 +08:00

563 lines
18 KiB
C#

#if UNITY_EDITOR && UNITY_STANDALONE
using System;
using System.Collections.Generic;
using System.IO;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
namespace BFEditor
{
public static class BFExcelHelper
{
/// <summary>
/// 创建excel xlsx
/// </summary>
/// <param name="sheetName">sheetName</param>
/// <param name="excelFileName">excel路径</param>
/// <returns></returns>
public static XSSFWorkbook CreateExecel(List<string> sheetName, string excelFileName)
{
XSSFWorkbook xSSFWorkbook = new XSSFWorkbook();
foreach (var sheet in sheetName)
{
xSSFWorkbook.CreateSheet(sheet);
}
FileStream fs;
if (!File.Exists(excelFileName))
{
fs = File.Create(excelFileName);
}
else
{
fs = new FileStream(excelFileName, FileMode.Open);
}
xSSFWorkbook.Write(fs);
fs.Close();
return xSSFWorkbook;
}
/// <summary>
/// 获取excel workbook
/// </summary>
/// <param name="excelPath">excel路径</param>
/// <returns></returns>
public static IWorkbook GetWorkbook(string excelPath)
{
var fs = new FileStream(excelPath, FileMode.Open, FileAccess.ReadWrite);
var workbook = WorkbookFactory.Create(fs);
fs.Close();
return workbook;
}
/// <summary>
/// 保存excel
/// </summary>
/// <param name="workbook">IWorkbook</param>
/// <param name="excelPath">excel路径</param>
public static void SaveBFExcel(this IWorkbook workbook, string excelPath)
{
var fs = File.Create(excelPath);
workbook.Write(fs);
fs.Close();
}
/// <summary>
/// 获取项目配置表格sheet
/// </summary>
/// <param name="workbook">IWorkbook</param>
/// <returns></returns>
public static ISheet GetBFSheet(this IWorkbook workbook)
{
return workbook.GetSheetAt(0);
}
/// <summary>
/// 获取表格数据行数
/// </summary>
/// <param name="workbook">IWorkbook</param>
/// <returns></returns>
public static int GetBFConfigDataCount(this IWorkbook workbook)
{
var sheet = workbook.GetBFSheet();
return sheet.GetBFConfigDataCount();
}
/// <summary>
/// 获取项目配置数据
/// </summary>
/// <param name="workbook">IWorkbook</param>
/// <returns></returns>
public static List<IRow> GetBFConfigDataList(this IWorkbook workbook)
{
var sheet = workbook.GetBFSheet();
return sheet.GetBFConfigDataList();
}
/// <summary>
/// 获取项目配置数据
/// </summary>
/// <param name="workbook">IWorkbook</param>
/// <returns></returns>
public static Dictionary<double, IRow> GetBFConfigDataNumberKeyDict(this IWorkbook workbook)
{
var sheet = workbook.GetBFSheet();
return sheet.GetBFConfigDataNumberKeyDict();
}
/// <summary>
/// 获取项目配置数据
/// </summary>
/// <param name="workbook">IWorkbook</param>
/// <returns></returns>
public static Dictionary<string, IRow> GetBFConfigDataStringKeyDict(this IWorkbook workbook)
{
var sheet = workbook.GetBFSheet();
return sheet.GetBFConfigDataStringKeyDict();
}
/// <summary>
/// 获取主键所在列index
/// </summary>
/// <param name="workbook">IWorkbook</param>
/// <returns></returns>
public static int GetBFConfigKeyColumnIndex(this IWorkbook workbook)
{
var sheet = workbook.GetBFSheet();
return sheet.GetBFConfigKeyColumnIndex();
}
/// <summary>
/// 获取字段所在列index
/// </summary>
/// <param name="workbook">IWorkbook</param>
/// <param name="fieldName">字段名</param>
/// <returns></returns>
public static int GetBFConfigfieldColumnIndex(this IWorkbook workbook, string fieldName)
{
var sheet = workbook.GetBFSheet();
return sheet.GetBFConfigfieldColumnIndex(fieldName);
}
/// <summary>
/// 根据key值获取项目配置行数据
/// </summary>
/// <param name="workbook">IWorkbook</param>
/// <param name="keyValue">key值</param>
/// <returns></returns>
public static IRow GetBFConfigRowDataByKey(this IWorkbook workbook, double keyValue)
{
var sheet = workbook.GetBFSheet();
return sheet.GetBFConfigRowDataByKey(keyValue);
}
/// <summary>
/// 根据key值获取项目配置行数据
/// </summary>
/// <param name="workbook">IWorkbook</param>
/// <param name="keyValue">key值</param>
/// <returns></returns>
public static IRow GetBFConfigRowDataByKey(this IWorkbook workbook, string keyValue)
{
var sheet = workbook.GetBFSheet();
return sheet.GetBFConfigRowDataByKey(keyValue);
}
/// <summary>
/// 获取项目配置表格单元格
/// </summary>
/// <param name="workbook">IWorkbook</param>
/// <param name="keyValue">key值</param>
/// <param name="fieldName">字段名</param>
/// <param name="needCreate">如果不存在是否自动创建</param>
/// <returns></returns>
public static ICell GetBFCell(this IWorkbook workbook, string keyValue, string fieldName, bool needCreate = false)
{
var sheet = workbook.GetBFSheet();
return sheet.GetBFCell(keyValue, fieldName, needCreate);
}
/// <summary>
/// 写入项目配置表格单元格
/// </summary>
/// <param name="IWorkbook">workbook</param>
/// <param name="keyValue">key值</param>
/// <param name="fieldName">字段名</param>
/// <param name="fieldValue">写入的字段值</param>
/// <param name="needCreate">如果不存在是否自动创建</param>
public static void WriteBFCell(this IWorkbook workbook, string keyValue, string fieldName, string fieldValue, bool needCreate = false)
{
var sheet = workbook.GetBFSheet();
var cell = GetBFCell(sheet, keyValue, fieldName, needCreate);
if (cell != null)
{
cell.SetCellValue(fieldValue);
}
}
/// <summary>
/// 写入项目配置表格单元格
/// </summary>
/// <param name="IWorkbook">workbook</param>
/// <param name="keyValue">key值</param>
/// <param name="fieldName">字段名</param>
/// <param name="fieldValue">写入的字段值</param>
/// <param name="needCreate">如果不存在是否自动创建</param>
public static void WriteBFCell(this IWorkbook workbook, int keyValue, string fieldName, string fieldValue, bool needCreate = false)
{
var sheet = workbook.GetBFSheet();
var cell = GetBFCell(sheet, keyValue, fieldName, needCreate);
if (cell != null)
{
cell.SetCellValue(fieldValue);
}
}
/// <summary>
/// 是否有配置内容,前四行为表头
/// </summary>
/// <param name="sheet">ISheet</param>
/// <returns></returns>
public static bool BFConfigHasData(this ISheet sheet)
{
return sheet.LastRowNum > 3;
}
/// <summary>
/// 获取表格数据长度
/// </summary>
/// <param name="sheet">ISheet</param>
/// <returns></returns>
public static int GetBFConfigDataCount(this ISheet sheet)
{
return Math.Max(sheet.LastRowNum - 3, 0);
}
/// <summary>
/// 获取主键所在列index
/// </summary>
/// <param name="sheet">ISheet</param>
/// <returns></returns>
public static int GetBFConfigKeyColumnIndex(this ISheet sheet)
{
var fieldNameRow = sheet.GetRow(2);
for (int i = 0; i < fieldNameRow.Cells.Count; i++)
{
if (fieldNameRow.Cells[i].StringCellValue.Replace(" ", "").StartsWith("*"))
{
return i;
}
}
return -1;
}
/// <summary>
/// 获取字段所在列index
/// </summary>
/// <param name="sheet">ISheet</param>
/// <param name="fieldName">字段名</param>
/// <returns></returns>
public static int GetBFConfigfieldColumnIndex(this ISheet sheet, string fieldName)
{
var fieldNameRow = sheet.GetRow(2);
for (int i = 0; i < fieldNameRow.Cells.Count; i++)
{
if (fieldNameRow.Cells[i].StringCellValue == fieldName)
{
return i;
}
}
return -1;
}
/// <summary>
/// 获取项目配置数据
/// </summary>
/// <param name="sheet">ISheet</param>
/// <returns></returns>
public static List<IRow> GetBFConfigDataList(this ISheet sheet)
{
List<IRow> datas = new List<IRow>();
if (sheet.LastRowNum < 4)
{
return datas;
}
var keyIndex = sheet.GetBFConfigKeyColumnIndex();
for (int i = 4; i <= sheet.LastRowNum; i++)
{
var row = sheet.GetRow(i);
var cell = row.GetCell(keyIndex);
if (cell != null)
{
datas.Add(row);
}
}
return datas;
}
/// <summary>
/// 获取项目配置数据
/// </summary>
/// <param name="sheet">ISheet</param>
/// <returns></returns>
public static Dictionary<double, IRow> GetBFConfigDataNumberKeyDict(this ISheet sheet)
{
Dictionary<double, IRow> datas = new Dictionary<double, IRow>();
if (sheet.LastRowNum < 4)
{
return datas;
}
var keyIndex = sheet.GetBFConfigKeyColumnIndex();
for (int i = 4; i <= sheet.LastRowNum; i++)
{
var row = sheet.GetRow(i);
if (row != null)
{
var cell = row.GetCell(keyIndex);
if (cell != null)
{
var keyValue = row.GetCell(keyIndex).NumericCellValue;
if(!datas.ContainsKey(keyValue))
{
datas.Add(keyValue, row);
}
}
}
}
return datas;
}
/// <summary>
/// 获取项目配置数据
/// </summary>
/// <param name="sheet">ISheet</param>
/// <returns></returns>
public static Dictionary<string, IRow> GetBFConfigDataStringKeyDict(this ISheet sheet)
{
Dictionary<string, IRow> datas = new Dictionary<string, IRow>();
if (sheet.LastRowNum < 4)
{
return datas;
}
var keyIndex = sheet.GetBFConfigKeyColumnIndex();
for (int i = 4; i <= sheet.LastRowNum; i++)
{
var row = sheet.GetRow(i);
var cell = row.GetCell(keyIndex);
if (cell != null)
{
var keyValue = row.GetCell(keyIndex).StringCellValue;
datas.Add(keyValue, row);
}
}
return datas;
}
/// <summary>
/// 根据key值获取项目配置行数据
/// </summary>
/// <param name="sheet">ISheet</param>
/// <param name="keyValue">key值</param>
/// <returns></returns>
public static IRow GetBFConfigRowDataByKey(this ISheet sheet, double keyValue)
{
var keyIndex = sheet.GetBFConfigKeyColumnIndex();
if (keyIndex == -1)
{
return null;
}
if (sheet.LastRowNum < 4)
{
return null;
}
for (int i = 4; i <= sheet.LastRowNum; i++)
{
var row = sheet.GetRow(i);
if (row == null)
{
continue;
}
if (row.GetCell(keyIndex) == null)
{
continue;
}
if (row.GetCell(keyIndex).NumericCellValue == keyValue)
{
return row;
}
}
return null;
}
/// <summary>
/// 根据key值获取项目配置行数据
/// </summary>
/// <param name="sheet">ISheet</param>
/// <param name="keyValue">key值</param>
/// <returns></returns>
public static IRow GetBFConfigRowDataByKey(this ISheet sheet, string keyValue)
{
var keyIndex = sheet.GetBFConfigKeyColumnIndex();
if (keyIndex == -1)
{
return null;
}
if (sheet.LastRowNum < 4)
{
return null;
}
for (int i = 4; i <= sheet.LastRowNum; i++)
{
var row = sheet.GetRow(i);
if (row.GetCell(keyIndex).StringCellValue == keyValue)
{
return row;
}
}
return null;
}
/// <summary>
/// 获取项目配置表格单元格
/// </summary>
/// <param name="sheet">ISheet</param>
/// <param name="keyValue">key值</param>
/// <param name="fieldName">字段名</param>
/// <param name="needCreate">如果不存在是否自动创建</param>
/// <returns></returns>
public static ICell GetBFCell(this ISheet sheet, string keyValue, string fieldName, bool needCreate = false)
{
var row = sheet.GetBFConfigRowDataByKey(keyValue);
if (row == null)
{
return null;
}
var fieldIndex = sheet.GetBFConfigfieldColumnIndex(fieldName);
if (fieldIndex == -1)
{
return null;
}
var cell = row.GetCell(fieldIndex);
if (cell == null && needCreate)
cell = row.CreateCell(fieldIndex);
return cell;
}
/// <summary>
/// 获取项目配置表格单元格
/// </summary>
/// <param name="sheet">ISheet</param>
/// <param name="keyValue">key值</param>
/// <param name="fieldName">字段名</param>
/// <param name="needCreate">如果不存在是否自动创建</param>
/// <returns></returns>
public static ICell GetBFCell(this ISheet sheet, int keyValue, string fieldName, bool needCreate = false)
{
var row = sheet.GetBFConfigRowDataByKey(keyValue);
if (row == null)
{
return null;
}
var fieldIndex = sheet.GetBFConfigfieldColumnIndex(fieldName);
if (fieldIndex == -1)
{
return null;
}
var cell = row.GetCell(fieldIndex);
if (cell == null && needCreate)
cell = row.CreateCell(fieldIndex);
return cell;
}
/// <summary>
/// 写入项目配置表格单元格
/// </summary>
/// <param name="sheet">ISheet</param>
/// <param name="keyValue">key值</param>
/// <param name="fieldName">字段名</param>
/// <param name="fieldValue">写入的字段值</param>
/// <param name="needCreate">如果不存在是否自动创建</param>
public static void WriteBFCell(this ISheet sheet, string keyValue, string fieldName, string fieldValue, bool needCreate = false)
{
var cell = GetBFCell(sheet, keyValue, fieldName, needCreate);
if (cell != null)
{
cell.SetCellValue(fieldValue);
}
}
/// <summary>
/// 写入项目配置表格单元格
/// </summary>
/// <param name="sheet">ISheet</param>
/// <param name="keyValue">key值</param>
/// <param name="fieldName">字段名</param>
/// <param name="fieldValue">写入的字段值</param>
/// <param name="needCreate">如果不存在是否自动创建</param>
public static void WriteBFCell(this ISheet sheet, int keyValue, string fieldName, string fieldValue, bool needCreate = false)
{
var cell = GetBFCell(sheet, keyValue, fieldName, needCreate);
if (cell != null)
{
cell.SetCellValue(fieldValue);
}
}
public static ICell GetBFMissingCell(this IRow row, int columnIndex)
{
var cell = row.GetCell(columnIndex);
if (cell == null)
{
cell = row.CreateCell(columnIndex);
}
return cell;
}
/// <summary>
/// 删除空行
/// </summary>
/// <param name="sheet">ISheet</param>
public static void DeleteEmptyRow(this ISheet sheet)
{
var i = sheet.LastRowNum;
while (i > 0)
{
i--;
var tempRow = sheet.GetRow(i);
if (tempRow == null)
{
sheet.ShiftRows(i + 1, sheet.LastRowNum, -1);
}
}
}
/// <summary>
/// 清空配置
/// </summary>
/// <param name="sheet"></param>
public static void ClearBFRow(this ISheet sheet)
{
for (int i = 4; i <= sheet.LastRowNum; i++)
{
var row = sheet.GetRow(i);
if (null != row) sheet.RemoveRow(row);
}
}
}
}
#endif