You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

192 lines
7.4 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
{
/// <summary>
/// 读取Excel
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="filePath">Excel文件路径</param>
/// <param name="sheetName">sheet名称</param>
/// <param name="hasHeader"></param>
/// <returns></returns>
public static T ReadFromExcel<T>(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<T>(JsonConvert.SerializeObject(excelasTable));
return (T)Convert.ChangeType(generatedType, typeof(T));
}
else
{
return default;
}
}
}
catch (Exception ex)
{
LogHelper.Error(ex, "解析Excel失败");
return default;
}
}
/// <summary>
/// 读取Excel为Table
/// </summary>
/// <param name="strFilePath"></param>
/// <param name="tbName"></param>
/// <param name="hasHeader"></param>
/// <returns></returns>
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;
}
}
/// <summary>
/// DataTable转list
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dataTable"></param>
/// <returns></returns>
public static List<T> ConvertDataTableToList<T>(DataTable dataTable) where T : new()
{
List<T> list = new List<T>();
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<DisplayNameAttribute>()?.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;
}
}
}