diff --git a/README.md b/README.md
index 90097c27..87c646ac 100644
--- a/README.md
+++ b/README.md
@@ -74,7 +74,7 @@ WebFirst开发:所有代码生成器已经配置完成,无需任何操作数
**身份验证**:JWT、IdentityServer4
-**组件**:~~EFcore~~SqlSugar、Autofac、Castle、Swagger、Log4Net、Redis、RabbitMq、ES、Quartz.net、~~T4~~
+**组件**:SqlSugar、Autofac、Castle、Swagger、Log4Net、Redis、RabbitMq、ES、Quartz.net、~~T4~~
**分布式**:CAP、Lock
diff --git a/Yi.Framework.Net6/Yi.Framework.Common/Helper/ExcelHelper.cs b/Yi.Framework.Net6/Yi.Framework.Common/Helper/ExcelHelper.cs
index 8d0f808d..f3e31ae0 100644
--- a/Yi.Framework.Net6/Yi.Framework.Common/Helper/ExcelHelper.cs
+++ b/Yi.Framework.Net6/Yi.Framework.Common/Helper/ExcelHelper.cs
@@ -1,60 +1,222 @@
-using System;
+using OfficeOpenXml;
+using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
+using System.Reflection;
using System.Text;
using System.Threading.Tasks;
-using OfficeOpenXml;
namespace Yi.Framework.Common.Helper
{
public class ExcelHelper
{
///
- ///
+ /// 导出Excel
///
///
- /// 数据
- /// 表头
- ///
- public static string CreateExcelFromList(List dataList, List headers,string evn)
+ ///
+ ///
+ ///
+ public static string ExportExcel(List list, string sheetName, string fileName,string path)
{
+ string sFileName = $"{fileName}.xlsx";
+ string newFileName = Path.Combine(path, sFileName);
+ //调试模式需要加上
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
- string sWebRootFolder = Path.Combine($"{evn}", "wwwroot/Excel");//如果用浏览器url下载的方式 存放excel的文件夹一定要建在网站首页的同级目录下!!!
- if (!Directory.Exists(sWebRootFolder))
+ Directory.CreateDirectory(Path.GetDirectoryName(newFileName)!);
+ using (ExcelPackage package = new(new FileInfo(newFileName)))
{
- Directory.CreateDirectory(sWebRootFolder);
- }
- string sFileName = $@"Excel_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx";
- var path = Path.Combine(sWebRootFolder, sFileName);
- FileInfo file = new FileInfo(path);
- if (file.Exists)
- {
- file.Delete();
- file = new FileInfo(path);
- }
- using (ExcelPackage package = new(file))
- {
- //创建sheet
- ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("sheet1");
- worksheet.Cells.LoadFromCollection(dataList, true);
- //表头字段
- for (int i = 0; i < headers.Count; i++)
- {
- worksheet.Cells[1, i + 1].Value = headers[i];
- }
- for (int i = 0; i < headers.Count + 1; i++)
- {//删除不需要的列
- string aa = worksheet.Cells[1, i + 1].Value.ToString();
- if (aa == "总行数")
- {
- worksheet.DeleteColumn(i + 1);
- }
- }
+ // 添加worksheet
+ ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(sheetName);
+ //单元格自动适应大小
+ worksheet.Cells.Style.ShrinkToFit = true;
+ //全部字段导出
+ worksheet.Cells.LoadFromCollection(list, true, OfficeOpenXml.Table.TableStyles.Light13);
package.Save();
}
- //return path;//这是返回文件的方式
- return sFileName; //如果用浏览器url下载的方式 这里直接返回生成的文件名就可以了
+
+ return newFileName;
+ }
+
+ ///
+ /// 下载导入模板
+ ///
+ ///
+ ///
+ ///
+ /// 下载文件名
+ ///
+ protected string DownloadImportTemplate(List list, Stream stream, string fileName,string path)
+ {
+ string sFileName = $"{fileName}.xlsx";
+ string newFileName = Path.Combine(path, sFileName);
+ //调试模式需要加上
+ ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
+ if (!Directory.Exists(newFileName))
+ {
+ Directory.CreateDirectory(Path.GetDirectoryName(newFileName)!);
+ }
+ using (ExcelPackage package = new(new FileInfo(newFileName)))
+ {
+ // 添加worksheet
+ ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(fileName);
+ //单元格自动适应大小
+ worksheet.Cells.Style.ShrinkToFit = true;
+ //全部字段导出
+ worksheet.Cells.LoadFromCollection(list, true, OfficeOpenXml.Table.TableStyles.Light13);
+ package.SaveAs(stream);
+ }
+
+ return sFileName;
+ }
+
+
+
+
+ ///
+ /// 导入数据
+ ///
+ ///
+ ///
+ public static List ImportData(Stream stream) where T : new()
+ {
+ using ExcelPackage package = new(stream);
+ ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
+ ExcelWorksheet worksheet = package.Workbook.Worksheets[0];//读取第1个sheet
+ //获取表格的列数和行数
+
+ int colStart = worksheet.Dimension.Start.Column;
+ int colEnd = worksheet.Dimension.End.Column;
+ int rowStart = worksheet.Dimension.Start.Row;
+ int rowEnd = worksheet.Dimension.End.Row;
+ //int rowCount = worksheet.Dimension.Rows;
+ //int ColCount = worksheet.Dimension.Columns;
+
+ List resultList = new();
+ List propertyInfos = new();// new(typeof(T).GetProperties());
+ Dictionary dictHeader = new();
+ for (int i = colStart; i < colEnd; i++)
+ {
+ var name = worksheet.Cells[rowStart, i].Value.ToString();
+ dictHeader[name!] = i;
+
+ PropertyInfo propertyInfo = MapPropertyInfo(name!);
+ if (propertyInfo != null)
+ {
+ propertyInfos.Add(propertyInfo);
+ }
+ }
+ for (int row = rowStart + 1; row <= rowEnd; row++)
+ {
+ T result = new();
+
+ foreach (PropertyInfo p in propertyInfos)
+ {
+ try
+ {
+ ExcelRange cell = worksheet.Cells[row, dictHeader[p.Name]];
+ if (cell.Value == null)
+ {
+ continue;
+ }
+ switch (p.PropertyType.Name.ToLower())
+ {
+ case "string":
+ p.SetValue(result, cell.GetValue());
+ break;
+ case "int16":
+ p.SetValue(result, cell.GetValue()); break;
+ case "int32":
+ p.SetValue(result, cell.GetValue()); break;
+ case "int64":
+ p.SetValue(result, cell.GetValue()); break;
+ case "decimal":
+ p.SetValue(result, cell.GetValue());
+ break;
+ case "double":
+ p.SetValue(result, cell.GetValue()); break;
+ case "datetime":
+ p.SetValue(result, cell.GetValue()); break;
+ case "boolean":
+ p.SetValue(result, cell.GetValue()); break;
+ case "char":
+ p.SetValue(result, cell.GetValue()); break;
+ default:
+ break;
+ }
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.WriteLine("未找到该列将继续循环," + ex.Message);
+ continue;
+ }
+ }
+ resultList.Add(result);
+ }
+
+ return resultList.ToList();
+ }
+
+ ///
+ /// 查找Excel列名对应的实体属性
+ ///
+ ///
+ ///
+ private static PropertyInfo MapPropertyInfo(string columnName)
+ {
+ PropertyInfo[] propertyList = GetProperties(typeof(T));
+ PropertyInfo propertyInfo = propertyList.Where(p => p.Name == columnName).FirstOrDefault()!;
+ if (propertyInfo != null)
+ {
+ return propertyInfo;
+ }
+ else
+ {
+ foreach (PropertyInfo tempPropertyInfo in propertyList)
+ {
+ System.ComponentModel.DescriptionAttribute[] attributes = (System.ComponentModel.DescriptionAttribute[])tempPropertyInfo.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);
+ if (attributes.Length > 0)
+ {
+ if (attributes[0].Description == columnName)
+ {
+ return tempPropertyInfo;
+ }
+ }
+ }
+ }
+ return null!;
+ }
+
+ ///
+ /// 得到类里面的属性集合
+ ///
+ ///
+ ///
+ ///
+ private static PropertyInfo[] GetProperties(Type type, string[] columns = null!)
+ {
+ PropertyInfo[] properties = null!;
+ properties = type.GetProperties();
+
+ if (columns != null && columns.Length > 0)
+ {
+ // 按columns顺序返回属性
+ var columnPropertyList = new List();
+ foreach (var column in columns)
+ {
+ var columnProperty = properties.Where(p => p.Name == column).FirstOrDefault();
+ if (columnProperty != null)
+ {
+ columnPropertyList.Add(columnProperty);
+ }
+ }
+ return columnPropertyList.ToArray();
+ }
+ else
+ {
+ return properties;
+ }
}
}
}