563 lines
18 KiB
C#
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 |