using Newtonsoft.Json;
using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Reflection;
using CompressorXN_Log;
namespace CompressorXN_HelperLib
{
public class ExcelHelper
{
///
/// 读取Excel
///
///
/// Excel文件路径
/// sheet名称
///
///
public static T ReadFromExcel(string filePath, string sheetName = "sheet0", bool hasHeader = true)
{
try
{
//设置许可证上下文为非商业版
ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
using (var excelPack = new ExcelPackage())
{
//Load excel stream
using (var stream = File.OpenRead(filePath))
{
excelPack.Load(stream);
}
//处理第一个工作表。(如果处理多个表格,可以在此用for循环处理)
var ws = excelPack.Workbook.Worksheets[sheetName];
DataTable excelasTable = new DataTable();
foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
{
if (!string.IsNullOrEmpty(firstRowCell.Text))
{
string firstColumn = string.Format("Column {0}", firstRowCell.Start.Column);
excelasTable.Columns.Add(hasHeader ? firstRowCell.Text : firstColumn);
}
}
var startRow = hasHeader ? 2 : 1;
for (int rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
{
var wsRow = ws.Cells[rowNum, 1, rowNum, excelasTable.Columns.Count];
DataRow row = excelasTable.Rows.Add();
foreach (var cell in wsRow)
{
row[cell.Start.Column - 1] = cell.Text;
}
}
if (excelasTable.Rows.Count > 0)
{
//将所有内容作为泛型获取,最终定是否强制转换为所需类型
var generatedType = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(excelasTable));
return (T)Convert.ChangeType(generatedType, typeof(T));
}
else
{
return default;
}
}
}
catch (Exception ex)
{
LogHelper.Error(ex, "解析Excel失败");
return default;
}
}
///
/// 读取Excel为Table
///
///
///
///
///
public static DataTable GetExcel(string strFilePath, string tbName = "dt1", bool hasHeader = true)
{
try
{
FileInfo file = new FileInfo(strFilePath);
//指定EPPlus使用非商业证书
ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
using (ExcelPackage ep = new ExcelPackage(file))
{
ExcelWorksheet ws = ep.Workbook.Worksheets[tbName];
int maxColumnNum = ws.Dimension.End.Column;//最大列
int minColumnNum = ws.Dimension.Start.Column;//最小列
int maxRowNum = ws.Dimension.End.Row;//最小行
int minRowNum = ws.Dimension.Start.Row;//最大行
DataTable vTable = new DataTable();
var rowCells = ws.Cells[1, 1, 1, ws.Dimension.End.Column];
DataColumn vC;
if (hasHeader)
{
foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
{
if (!string.IsNullOrEmpty(firstRowCell.Text))
{
vC = new DataColumn(firstRowCell.Text, typeof(string));
vTable.Columns.Add(vC);
}
}
}
else
{
for (int j = 1; j <= maxColumnNum; j++)
{
vC = new DataColumn("col_" + j, typeof(string));
vTable.Columns.Add(vC);
}
}
for (int n = 2; n <= maxRowNum; n++)
{
DataRow vRow = vTable.NewRow();
for (int m = 1; m <= maxColumnNum; m++)
{
vRow[m - 1] = ws.Cells[n, m].Value;
}
vTable.Rows.Add(vRow);
}
return vTable;
}
}
catch (Exception ex)
{
throw ex;
}
}
///
/// DataTable转list
///
///
///
///
public static List ConvertDataTableToList(DataTable dataTable) where T : new()
{
List list = new List();
bool isEndForeach = false;//是否结束外层循环
foreach (DataRow row in dataTable.Rows)
{
T obj = new T();
int colIndex = 0;//第几列
foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties())
{
string displayName = propertyInfo.GetCustomAttribute()?.DisplayName;
// string propertyName=propertyInfo.Name
if (string.IsNullOrEmpty(displayName))
{
continue;
}
if (dataTable.Columns.Contains(displayName))
{
string cellVal = row[displayName]?.ToString();
//如果第一列值为空则结束循环
if (colIndex == 0 && string.IsNullOrEmpty(cellVal))
{
isEndForeach = true;
break;
}
// 根据需要进行类型转换
propertyInfo.SetValue(obj, Convert.ChangeType(cellVal, propertyInfo.PropertyType), null);
// propertyInfo.SetValue(obj, row[propertyInfo.Name]);
}
colIndex++;
}
//结束外层循环
if (isEndForeach)
{
break;
}
list.Add(obj);
}
return list;
}
}
}