DeviceManager/DeviceRepairAndOptimization/Common/NpoiExtend/SheetExtend.cs
2024-07-17 10:32:45 +08:00

91 lines
3.0 KiB
C#

using DeviceRepair.Models;
using NPOI.SS.UserModel;
using System;
namespace DeviceRepairAndOptimization.Common.NpoiExtend
{
public static class SheetExtend
{
/// <summary>
/// 自定义方法实现 [A,2] 形式的单元格定位
/// </summary>
/// <param name="sheet"></param>
/// <param name="address"></param>
/// <returns></returns>
public static ICell LocateCellByAddress(this ISheet sheet, string address)
{
// 解析地址,这里简单处理,假设地址格式总是为 "[列字母,行号]"
// 更复杂的Excel地址解析可能需要更详细的逻辑
var parts = address.Trim('[', ']').Split(',');
if (parts.Length != 2)
{
throw new ArgumentException("传入的单元格字符串不正确.");
}
var columnLetter = parts[0];
int rowIndex;
if (!int.TryParse(parts[1], out rowIndex) || rowIndex < 0)
{
throw new ArgumentException("传入的单元格字符串行号不正确.");
}
// 将列字母转换为列索引
int columnIndex = ColumnIndexFromLetter(columnLetter);
// 获取单元格
IRow row = sheet.GetRow(rowIndex - 1);
if (row == null)
{
row = sheet.CreateRow(rowIndex - 1);
}
ICell cell = row.GetCell(columnIndex);
if (cell == null)
{
cell = row.CreateCell(columnIndex);
}
return cell;
}
/// <summary>
/// [A,2] 形式的单元格 转 行号及列号
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public static SheetDataItem AddressToIndex(string address)
{
// 解析地址,这里简单处理,假设地址格式总是为 "[列字母,行号]"
// 更复杂的Excel地址解析可能需要更详细的逻辑
var parts = address.Trim('[', ']').Split(',');
if (parts.Length != 2)
{
throw new ArgumentException("传入的单元格字符串不正确.");
}
var columnLetter = parts[0];
int rowIndex;
if (!int.TryParse(parts[1], out rowIndex) || rowIndex < 0)
{
throw new ArgumentException("传入的单元格字符串行号不正确.");
}
// 将列字母转换为列索引
int columnIndex = ColumnIndexFromLetter(columnLetter);
return new SheetDataItem() { RowIndex = rowIndex - 1, ColumnIndex = columnIndex };
}
public static int ColumnIndexFromLetter(string columnLetter)
{
int result = 0;
foreach (char c in columnLetter)
{
result *= 26;
result += (c - 'A' + 1);
}
return result - 1; // 调整索引从0开始
}
}
}