Files
Ramitta-lib/Ramitta/Excel.cs

192 lines
7.1 KiB
C#
Raw Normal View History

2025-09-12 18:34:33 +08:00
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
2025-11-04 11:37:27 +08:00
namespace Ramitta.Excellib
2025-09-12 18:34:33 +08:00
{
public static class Excel
{
public static List<Dictionary<string, string>> ReadExcelAsDictRow(
string filePath,
object sheetName = null,
List<string> headerInit = null)
{
var result = new List<Dictionary<string, string>>();
// 打开 Excel 文件
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
var workbook = new XSSFWorkbook(fs);
ISheet sheet = null;
// 判断 sheetName 类型
if (sheetName is string sheetNameStr)
{
sheet = workbook.GetSheet(sheetNameStr); // 根据工作表名称获取
}
else if (sheetName is int sheetNameInt)
{
sheet = workbook.GetSheetAt(sheetNameInt); // 根据索引获取
}
else
{
sheet = workbook.GetSheetAt(0); // 默认获取第一个工作表
}
// 如果没有提供表头,则默认使用第一行作为表头
List<string> header = null;
if (headerInit != null && headerInit.Count > 0)
{
header = headerInit; // 使用提供的表头
}
else
{
var headerRow = sheet.GetRow(0);
if (headerRow == null)
return result; // 如果第一行为空,直接返回空列表
header = new List<string>();
for (int i = 0; i < headerRow.Cells.Count; i++)
{
var cell = headerRow.GetCell(i);
header.Add(cell?.ToString().Trim() ?? $"Column_{i}"); // 处理空单元格
}
}
// 如果提供了表头数据,则从第二行开始读取数据
int startRowIndex = headerInit != null && headerInit.Count > 0 ? 0 : 1;
// 遍历每一行数据
for (int rowIndex = startRowIndex; rowIndex <= sheet.LastRowNum; rowIndex++) // 从第二行开始
{
var row = sheet.GetRow(rowIndex);
if (row == null || IsRowEmpty(row)) continue; // 跳过空行
var rowDict = new Dictionary<string, string>();
// 遍历每一列
for (int colIndex = 0; colIndex < header.Count; colIndex++)
{
var cell = row.GetCell(colIndex);
rowDict[header[colIndex]] = cell?.ToString().Trim() ?? ""; // 直接转换为字符串
}
result.Add(rowDict);
}
}
return result;
}
public static Dictionary<string, List<string>> ReadExcelAsDictCol(
string filePath,
object sheetName = null,
List<string> headerInit = null)
{
var result = new Dictionary<string, List<string>>();
// 打开 Excel 文件
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
var workbook = new XSSFWorkbook(fs);
ISheet sheet = null;
// 如果 sheetName 不为 null按名字找到对应的工作表
if (sheetName != null && sheetName is string sheetNameStr)
{
sheet = workbook.GetSheet(sheetNameStr); // 根据工作表名称获取
}
else
{
sheet = workbook.GetSheetAt(0); // 默认第一个工作表
}
if (sheet == null)
return result; // 如果没有找到工作表,直接返回空字典
// 如果 headerInit 不为 null使用它来初始化表头否则从 Excel 中的第一行获取
var header = headerInit ?? new List<string>();
if (header.Count == 0)
{
// 获取第一行作为键headers
var headerRow = sheet.GetRow(0);
if (headerRow == null)
return result; // 如果第一行为空,直接返回空字典
for (int i = 0; i < headerRow.Cells.Count; i++)
{
var cell = headerRow.GetCell(i);
string headerText = cell?.ToString().Trim() ?? $"Column_{i}"; // 处理空单元格
header.Add(headerText);
}
}
// 初始化每一列对应的 List<string>
foreach (var headerText in header)
{
result[headerText] = new List<string>();
}
// 从第一行开始遍历数据,而不是从第二行开始
for (int rowIndex = headerInit == null ? 1 : 0; rowIndex <= sheet.LastRowNum; rowIndex++) // 修改这里开始从第0行
{
var row = sheet.GetRow(rowIndex);
if (row == null || IsRowEmpty(row)) continue; // 跳过空行
// 遍历每一列数据并添加到对应的 List<string> 中
for (int colIndex = 0; colIndex < header.Count; colIndex++)
{
var cell = row.GetCell(colIndex);
string cellValue = cell?.ToString().Trim() ?? ""; // 直接转换为字符串
if (!string.IsNullOrEmpty(cellValue))
{
result[header[colIndex]].Add(cellValue);
}
}
}
}
return result;
}
private static bool IsRowEmpty(IRow row)
{
foreach (var cell in row.Cells)
{
if (cell != null && !string.IsNullOrEmpty(cell.ToString().Trim()))
return false;
}
return true;
}
2025-11-04 11:37:27 +08:00
public static ICell? getRowCell(ISheet sheet, int rowIndex, int cellIndex)
{
IRow row = sheet.GetRow(rowIndex);
if (row == null) return null;
ICell cell = row.GetCell(cellIndex);
if (cell == null) return null;
return cell;
}
public static String? getRowCellStr(ISheet sheet, int rowIndex, int cellIndex)
{
var cellValue = getRowCell(sheet, rowIndex, cellIndex)?.ToString();
return string.IsNullOrWhiteSpace(cellValue) ? null : cellValue;
}
// 简短版本
public static int ColToIndex(string col)
{
return col.ToUpper().Aggregate(0, (cur, ch) => cur * 26 + (ch - 'A'));
}
2025-09-12 18:34:33 +08:00
}
}