From 5ecdb1d029861d457a81cbb3ecd0212ca06fb9f1 Mon Sep 17 00:00:00 2001 From: xiaochanghai Date: Wed, 26 Jun 2024 11:21:11 +0800 Subject: [PATCH] ExportExcel --- .../Controllers/Base/BaseController.cs | 4 +- Tiobon.Core.Api/Tiobon.Core.xml | 2 +- Tiobon.Core.IServices/BASE/IBaseServices.cs | 2 +- Tiobon.Core.Services/BASE/BaseServices.cs | 175 +++++++++++++++--- Tiobon.Core.Services/CommonServices.cs | 2 +- 5 files changed, 156 insertions(+), 29 deletions(-) diff --git a/Tiobon.Core.Api/Controllers/Base/BaseController.cs b/Tiobon.Core.Api/Controllers/Base/BaseController.cs index f45cad9a..d881be0d 100644 --- a/Tiobon.Core.Api/Controllers/Base/BaseController.cs +++ b/Tiobon.Core.Api/Controllers/Base/BaseController.cs @@ -211,9 +211,9 @@ public class BaseController /// [HttpPost, Route("ExportExcel")] - public async Task> ExportExcel([FromBody] QueryBody body) + public async Task> ExportExcel([FromBody] QueryExport body) { - var data = (await InvokeServiceAsync("ExportExcel", [body])) as ServiceResult; + var data = (await InvokeServiceAsync("ExportExcel", [body])) as ServiceResult; return data; } #endregion diff --git a/Tiobon.Core.Api/Tiobon.Core.xml b/Tiobon.Core.Api/Tiobon.Core.xml index c25704dc..9c0893bf 100644 --- a/Tiobon.Core.Api/Tiobon.Core.xml +++ b/Tiobon.Core.Api/Tiobon.Core.xml @@ -141,7 +141,7 @@ 主键IDs - + Excel导出 diff --git a/Tiobon.Core.IServices/BASE/IBaseServices.cs b/Tiobon.Core.IServices/BASE/IBaseServices.cs index 6c59c0e1..35cee951 100644 --- a/Tiobon.Core.IServices/BASE/IBaseServices.cs +++ b/Tiobon.Core.IServices/BASE/IBaseServices.cs @@ -151,7 +151,7 @@ namespace Tiobon.Core.IServices.BASE Task> QueryPage(Expression> whereExpression, int pageIndex = 1, int pageSize = 20, string orderByFields = null); Task> QueryFilterPage([FromBody] QueryBody body); Task> QueryFilterPage(QueryBody filter, string condition); - Task> ExportExcel([FromBody] QueryBody body); + Task> ExportExcel([FromBody] QueryExport body); Task> ImportExcel(IFormFile file); diff --git a/Tiobon.Core.Services/BASE/BaseServices.cs b/Tiobon.Core.Services/BASE/BaseServices.cs index 1590f641..638ce7f4 100644 --- a/Tiobon.Core.Services/BASE/BaseServices.cs +++ b/Tiobon.Core.Services/BASE/BaseServices.cs @@ -5,6 +5,8 @@ using AgileObjects.AgileMapper; using Microsoft.AspNetCore.Http; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using OfficeOpenXml.Style; +using OfficeOpenXml; using SqlSugar; using Tiobon.Core.Common; using Tiobon.Core.Common.Caches; @@ -19,6 +21,12 @@ using Tiobon.Core.IRepository.Base; using Tiobon.Core.IServices.BASE; using Tiobon.Core.Model; using Tiobon.Core.Model.Models; +using SixLabors.ImageSharp; +using System.Reflection; +using Microsoft.EntityFrameworkCore.Metadata.Internal; +using System.Collections.Generic; +using System.Collections; +using Amazon.Runtime.Internal.Transform; namespace Tiobon.Core.Services.BASE; @@ -788,34 +796,153 @@ public class BaseServices : IBaseServ return new ServicePageResult(filter.pageNum, total, filter.pageSize, entitys); } - public async Task> ExportExcel(QueryBody body) + public async Task> ExportExcel(QueryExport body) { - //sql = @$"SELECT field, - // [dbo].[FLangKeyToValue] (mkey, {body.langId}, label) - // label, - // required, - // editable, - // rowNum, - // colNum, - // elementType, - // dbo.FS_GetdataSourceBySet - // (dataSource, APIDataSourceType, Ghrs_PageSettingEdit.APIDataSourceID) - // dataSource, - // defaultHidden, - // isPrimaryKey, - // isSingleColumn - // FROM Ghrs_PageSettingEdit - // WHERE IsEnable = 1 - // AND pageNo = '{body.menuName}' - // AND elementType NOT IN ('FnKey', 'PageGroup');"; - //dt = await Db.Ado.GetDataTableAsync(sql); - - var data = await BaseDal.QueryFilterPage(body); - var fileId = await ReportHelper.SendFile(data.result.DT_TableDataT1.AsQueryable(), $"测试测试", null, null, null, null); - return ServiceResult.OprateSuccess("导出成功", fileId); + QueryBody filter = new QueryBody(); + filter.pageNum = 1; + filter.pageSize = 1000000; + filter.langId = body.langId; + var data = await QueryFilterPage(filter); + + string sql = $@"SELECT * + FROM Ghrs_PageSettingQuery + WHERE IsEnable = 1 + AND PageNo = '{body.menuName}' + AND defaultHidden = 'false' + ORDER BY SortNo ASC"; + + var columns = await Db.Ado.SqlQueryAsync(sql); + + var fieldDescs = new Dictionary(); + if (body.exportSet.ExFields.Any()) + body.exportSet.ExFields.ForEach(x => + { + if (columns.Any(o => o.field == x)) + fieldDescs.Add(x, columns.FirstOrDefault(o => o.field == x)?.label); + + + }); + else + fieldDescs = columns.ToDictionary(item => item.field, item => item.label); + var dt = ToDataTable(data.result.DT_TableDataT1, fieldDescs, null); + // 获取所有列名 + var dtColumns = dt.Columns; + + var id = SnowFlakeSingle.instance.getID(); + var physicsPath = $"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}wwwroot"; + var path = $"{$"{Path.DirectorySeparatorChar}files{Path.DirectorySeparatorChar}export{Path.DirectorySeparatorChar}{id}{Path.DirectorySeparatorChar}"}"; + if (!Directory.Exists(physicsPath + path)) + Directory.CreateDirectory(physicsPath + path); + + path = path + body.exportSet.TitleName + ".xlsx"; + NPOIHelper.ExportExcel(dt, null, "sheet1", physicsPath + path); + return ServiceResult.OprateSuccess("导出成功", path); } + /// + /// 列名按照前端显示顺序导出 + /// + /// + /// + /// + public static (List, List) Sort(Dictionary columns, List ExportFields) + { + List fields = new List(); + List colunms = new List(); + if (ExportFields == null || ExportFields.Count == 0) + { + return (columns.Keys.ToList(), columns.Values.ToList()); + } + foreach (var field in ExportFields) + { + foreach (var item in columns) + { + if (item.Key == field) + { + fields.Add(item.Key); + colunms.Add(item.Value); + } + } + } + + return (fields, colunms); + } + public static DataTable ToDataTable(List list, Dictionary fieldDescs = null, params string[] propertyName) + { + var (fields, colunms) = Sort(fieldDescs, null); + + List propertyNameList = new List(); + if (propertyName != null) + { + propertyNameList.AddRange(propertyName); + } + DataTable result = new DataTable(); + if (list.Count > 0) + { + PropertyInfo[] propertys = list[0].GetType().GetProperties(); + for (int i = 0; i < fields.Count; i++) + { + foreach (PropertyInfo pi in propertys) + { + if (propertyNameList.Count == 0) + { + //if (DBNull.Value.Equals(pi.PropertyType)) + //{ + // // pi.PropertyType = DateTime; + //} + Type colType = pi.PropertyType; + if (colType.IsGenericType && colType.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + colType = colType.GetGenericArguments()[0]; + } + if (fields[i] == pi.Name) + { + result.Columns.Add(colunms[i], colType); + } + //result.Columns.Add(pi.Name, pi.PropertyType); + } + else + { + if (propertyNameList.Contains(pi.Name)) + { + if (fields[i] == pi.Name) + result.Columns.Add(fields[i], pi.PropertyType); + } + } + } + } + for (int i = 0; i < list.Count; i++) + { + ArrayList tempList = new ArrayList(); + for (int j = 0; j < fields.Count; j++) + { + foreach (PropertyInfo pi in propertys) + { + if (fields[j] == pi.Name) + { + if (propertyNameList.Count == 0) + { + object obj = pi.GetValue(list[i], null); + tempList.Add(obj); + } + else + { + if (propertyNameList.Contains(pi.Name)) + { + object obj = pi.GetValue(list[i], null); + tempList.Add(obj); + } + } + } + } + } + object[] array = tempList.ToArray(); + result.LoadDataRow(array, true); + } + } + return result; + } public async virtual Task> ImportExcel(IFormFile file) { //long id = SnowFlakeSingle.instance.getID(); diff --git a/Tiobon.Core.Services/CommonServices.cs b/Tiobon.Core.Services/CommonServices.cs index 8656e4a8..c580b694 100644 --- a/Tiobon.Core.Services/CommonServices.cs +++ b/Tiobon.Core.Services/CommonServices.cs @@ -1347,7 +1347,7 @@ public partial class CommonServices : BaseServices>, ICommon var fieldDescs = columns.ToDictionary(item => item.label, item => convertColumns.Any(x => x.field == item.field) ? item.field + "1" : item.field); - var fileId = await ReportHelper.SendFile(dt, param.exportSet.TitleName, fieldDescs, null, null, null); + //var fileId = await ReportHelper.SendFile(dt, param.exportSet.TitleName, fieldDescs, null, null, null); return new ServiceResult() { Success = true, Message = "查询成功", Data = result, }; }