104 lines
3.4 KiB
C#
104 lines
3.4 KiB
C#
using NPOI.SS.UserModel;
|
||
using System;
|
||
using System.Data;
|
||
using System.IO;
|
||
|
||
namespace YiDa_WinForm.Utils
|
||
{
|
||
/// <summary>
|
||
/// Excel 解析工具类
|
||
/// </summary>
|
||
public static class ExcelHelper
|
||
{
|
||
/// <summary>
|
||
/// 读取Excel文件转换为DataTable
|
||
/// </summary>
|
||
/// <param name="filePath">Excel文件路径</param>
|
||
/// <returns>解析后的DataTable</returns>
|
||
public static DataTable GetExcelToDataTable(string filePath)
|
||
{
|
||
if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath))
|
||
{
|
||
throw new FileNotFoundException("Excel文件不存在", filePath);
|
||
}
|
||
|
||
IWorkbook workbook = null;
|
||
FileStream fileStream = null;
|
||
|
||
try
|
||
{
|
||
fileStream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
|
||
workbook = WorkbookFactory.Create(fileStream);
|
||
|
||
DataTable dt = new DataTable();
|
||
// 读取第一个Sheet(适配你的业务场景,如需多Sheet可扩展)
|
||
ISheet sheet = workbook.GetSheetAt(0);
|
||
if (sheet == null) return dt;
|
||
|
||
// 读取表头构建DataTable列
|
||
IRow headerRow = sheet.GetRow(0);
|
||
if (headerRow == null) return dt;
|
||
|
||
for (int i = 0; i < headerRow.LastCellNum; i++)
|
||
{
|
||
string columnName = headerRow.GetCell(i)?.ToString() ?? $"列{i + 1}";
|
||
dt.Columns.Add(columnName);
|
||
}
|
||
|
||
// 读取数据行
|
||
for (int rowIndex = 1; rowIndex <= sheet.LastRowNum; rowIndex++)
|
||
{
|
||
IRow dataRow = sheet.GetRow(rowIndex);
|
||
if (dataRow == null) continue;
|
||
|
||
DataRow dr = dt.NewRow();
|
||
for (int colIndex = 0; colIndex < headerRow.LastCellNum; colIndex++)
|
||
{
|
||
ICell cell = dataRow.GetCell(colIndex);
|
||
dr[colIndex] = GetCellValue(cell);
|
||
}
|
||
dt.Rows.Add(dr);
|
||
}
|
||
|
||
return dt;
|
||
}
|
||
finally
|
||
{
|
||
// 手动释放资源
|
||
if (fileStream != null)
|
||
{
|
||
fileStream.Close();
|
||
fileStream.Dispose();
|
||
}
|
||
workbook = null;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取Excel单元格的值(处理不同单元格类型)
|
||
/// </summary>
|
||
private static string GetCellValue(ICell cell)
|
||
{
|
||
if (cell == null) return string.Empty;
|
||
|
||
switch (cell.CellType)
|
||
{
|
||
case CellType.Numeric:
|
||
if (DateUtil.IsCellDateFormatted(cell))
|
||
{
|
||
return cell.DateCellValue.ToString();
|
||
}
|
||
else
|
||
{
|
||
return cell.NumericCellValue.ToString();
|
||
}
|
||
case CellType.String:
|
||
return cell.StringCellValue;
|
||
case CellType.Boolean:
|
||
return cell.BooleanCellValue.ToString();
|
||
default:
|
||
return cell.ToString();
|
||
}
|
||
}
|
||
}
|
||
} |