浏览代码

增加Excel导出库

懒得勤快 4 年之前
父节点
当前提交
00d673d24e

+ 0 - 3
Masuit.Tools.Abstractions/Masuit.Tools.Abstractions.csproj

@@ -1,7 +1,4 @@
 <Project Sdk="Microsoft.NET.Sdk">
-
-  <Import Project="..\SDKPulishNuget.targets" />
-
   <PropertyGroup>
     <TargetFrameworks>netstandard2.0;netstandard2.1;net461;net5</TargetFrameworks>
     <LangVersion>9.0</LangVersion>

+ 0 - 2
Masuit.Tools.Core/Masuit.Tools.Core.csproj

@@ -1,7 +1,5 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
-    <Import Project="..\SDKPulishNuget.targets" />
-
     <PropertyGroup>
         <TargetFrameworks>netstandard2.0;netstandard2.1;net5</TargetFrameworks>
         <Description>            包含一些常用的操作类,大都是静态类,加密解密,反射操作,硬件信息,字符串扩展方法,日期时间扩展操作,大文件拷贝,图像裁剪,html处理,验证码、NoSql等常用封装。

+ 148 - 0
Masuit.Tools.Excel/ExcelExtension.cs

@@ -0,0 +1,148 @@
+using OfficeOpenXml;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Drawing;
+using System.IO;
+using System.Text;
+
+namespace Masuit.Tools.Excel
+{
+    public static class ExcelExtension
+    {
+        static ExcelExtension()
+        {
+            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
+        }
+
+        /// <summary>
+        /// 将内存表自动填充到Excel
+        /// </summary>
+        /// <param name="sheetTables">sheet名和内存表的映射</param>
+        /// <param name="password">密码</param>
+        /// <returns>内存流</returns>
+        public static MemoryStream DataTableToExcel(this Dictionary<string, DataTable> sheetTables, string password = null)
+        {
+            using (var pkg = new ExcelPackage())
+            {
+                foreach (var pair in sheetTables)
+                {
+                    pair.Value.TableName = pair.Key;
+                    CreateWorksheet(pkg, pair.Value);
+                }
+
+                return SaveAsStream(pkg, password);
+            }
+        }
+
+        /// <summary>
+        /// 将内存表自动填充到Excel
+        /// </summary>
+        /// <param name="tables">内存表</param>
+        /// <param name="password">密码</param>
+        /// <returns>内存流</returns>
+        public static MemoryStream DataTableToExcel(this List<DataTable> tables, string password = null)
+        {
+            using var pkg = new ExcelPackage();
+            foreach (var table in tables)
+            {
+                CreateWorksheet(pkg, table);
+            }
+
+            return SaveAsStream(pkg, password);
+        }
+
+        /// <summary>
+        /// 将内存表自动填充到Excel
+        /// </summary>
+        /// <param name="table">内存表</param>
+        /// <param name="password">密码</param>
+        /// <returns>内存流</returns>
+        public static MemoryStream ToExcel(this DataTable table, string password = null)
+        {
+            using var pkg = new ExcelPackage();
+            CreateWorksheet(pkg, table);
+            return SaveAsStream(pkg, password);
+        }
+
+        private static MemoryStream SaveAsStream(ExcelPackage pkg, string password)
+        {
+            var ms = new MemoryStream();
+            if (!string.IsNullOrEmpty(password))
+            {
+                pkg.SaveAs(ms, password);
+            }
+            else
+            {
+                pkg.SaveAs(ms);
+            }
+
+            return ms;
+        }
+
+        public static void CreateWorksheet(this ExcelPackage pkg, DataTable table)
+        {
+            if (string.IsNullOrEmpty(table.TableName))
+            {
+                table.TableName = "Sheet1";
+            }
+
+            pkg.Workbook.Worksheets.Add(table.TableName);
+            var sheet = pkg.Workbook.Worksheets[table.TableName];
+
+            // 填充表头
+            for (var j = 0; j < table.Columns.Count; j++)
+            {
+                sheet.SetValue(1, j + 1, table.Columns[j].ColumnName);
+            }
+
+            sheet.Row(1).Style.Font.Bold = true; // 表头设置为粗体
+            sheet.Row(1).Style.Font.Size = sheet.Row(1).Style.Font.Size * 1.11f; // 表头字号放大1.11倍
+            sheet.Row(1).CustomHeight = true; // 自动调整行高
+            sheet.Cells.AutoFitColumns(); // 表头自适应列宽
+            sheet.Cells.Style.WrapText = true;
+
+            // 填充内容
+            for (var i = 0; i < table.Rows.Count; i++)
+            {
+                sheet.Row(i + 2).CustomHeight = true; // 自动调整行高
+                for (var j = 0; j < table.Columns.Count; j++)
+                {
+                    if (table.Rows[i][j] is Stream s)
+                    {
+                        if (s.Length > 0)
+                        {
+                            using var img = Image.FromStream(s);
+                            using var bmp = new Bitmap(img);
+                            bmp.SetResolution(96, 96);
+                            using var picture = sheet.Drawings.AddPicture(Guid.NewGuid().ToString(), bmp);
+                            picture.SetPosition(i + 1, 3, j, 5); //设置图片显示位置
+                            sheet.Row(i + 2).Height = 90;
+                            sheet.Column(j + 1).Width = 30;
+                        }
+                    }
+                    else
+                    {
+                        sheet.SetValue(i + 2, j + 1, table.Rows[i][j] ?? "");
+
+                        // 根据单元格内容长度来自适应调整列宽
+                        var maxWidth = Encoding.UTF8.GetBytes(table.Rows[i][j].ToString()).Length;
+                        if (sheet.Column(j + 1).Width < maxWidth)
+                        {
+                            sheet.Cells[i + 2, j + 1].AutoFitColumns(18, 110); // 自适应最大列宽,最小18,最大110
+                        }
+                    }
+                }
+            }
+
+            //打印方向:纵向
+            sheet.PrinterSettings.Orientation = eOrientation.Landscape;
+
+            //集中在一页里打印
+            sheet.PrinterSettings.FitToPage = true;
+
+            //使用A4纸
+            sheet.PrinterSettings.PaperSize = ePaperSize.A4;
+        }
+    }
+}

+ 36 - 0
Masuit.Tools.Excel/Masuit.Tools.Excel.csproj

@@ -0,0 +1,36 @@
+<Project Sdk="Microsoft.NET.Sdk">
+    <PropertyGroup>
+        <TargetFrameworks>netstandard2.0;netstandard2.1;net461;net5</TargetFrameworks>
+        <LangVersion>9.0</LangVersion>
+        <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+        <CodeAnalysisRuleSet />
+        <Version>1.0.0</Version>
+        <Authors>懒得勤快</Authors>
+        <Description>Masuit.Tools.Excel导出库</Description>
+        <Copyright>懒得勤快</Copyright>
+        <RepositoryUrl>https://github.com/ldqk/Masuit.Tools</RepositoryUrl>
+        <PackageProjectUrl>https://github.com/ldqk/Masuit.Tools</PackageProjectUrl>
+        <PackageTags>Masuit.Tools,工具库,Utility,Excel,Extensions</PackageTags>
+        <PackageReleaseNotes>Masuit.Tools.Excel导出库</PackageReleaseNotes>
+        <Product>Masuit.Tools.Excel</Product>
+        <PackageId>Masuit.Tools.Excel</PackageId>
+        <RepositoryType>Github</RepositoryType>
+        <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
+        <PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>
+        <FileVersion>1.0</FileVersion>
+        <Company>ldqk.org</Company>
+        <AssemblyVersion>1.0</AssemblyVersion>
+        <PackageLicenseUrl>https://github.com/ldqk/Masuit.Tools/blob/master/LICENSE</PackageLicenseUrl>
+        <EmbedUntrackedSources>true</EmbedUntrackedSources>
+        <IncludeSymbols>true</IncludeSymbols>
+        <SymbolPackageFormat>snupkg</SymbolPackageFormat>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|AnyCPU'">
+        <DocumentationFile>.\Masuit.Tools.Excel.xml</DocumentationFile>
+    </PropertyGroup>
+    <ItemGroup>
+        <PackageReference Include="EPPlus" Version="5.6.3" />
+        <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
+    </ItemGroup>
+
+</Project>

+ 6 - 0
Masuit.Tools.sln

@@ -23,6 +23,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masuit.Tools.AspNetCore.Res
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Masuit.Tools.Test", "Test\Masuit.Tools.Test\Masuit.Tools.Test.csproj", "{AB9F4635-0ACB-4E5E-8E1B-431E0818CF60}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Masuit.Tools.Excel", "Masuit.Tools.Excel\Masuit.Tools.Excel.csproj", "{47DF4A43-9C19-4572-B025-876A7710C1CF}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -65,6 +67,10 @@ Global
 		{AB9F4635-0ACB-4E5E-8E1B-431E0818CF60}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{AB9F4635-0ACB-4E5E-8E1B-431E0818CF60}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{AB9F4635-0ACB-4E5E-8E1B-431E0818CF60}.Release|Any CPU.Build.0 = Release|Any CPU
+		{47DF4A43-9C19-4572-B025-876A7710C1CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{47DF4A43-9C19-4572-B025-876A7710C1CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{47DF4A43-9C19-4572-B025-876A7710C1CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{47DF4A43-9C19-4572-B025-876A7710C1CF}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 0 - 1
Masuit.Tools/Masuit.Tools.csproj

@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
-  <Import Project="..\SDKPulishNuget.targets" />
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>

+ 1 - 0
NetCoreTest/NetCoreTest.csproj

@@ -21,6 +21,7 @@
 
   <ItemGroup>
     <ProjectReference Include="..\Masuit.Tools.Core\Masuit.Tools.Core.csproj" />
+    <ProjectReference Include="..\Masuit.Tools.Excel\Masuit.Tools.Excel.csproj" />
   </ItemGroup>
 
 </Project>

+ 4 - 12
NetCoreTest/Program.cs

@@ -1,5 +1,7 @@
 using Masuit.Tools;
-using Masuit.Tools.Core.Validator;
+using Masuit.Tools.Database;
+using Masuit.Tools.Excel;
+using Masuit.Tools.Files;
 using Masuit.Tools.Models;
 using Masuit.Tools.Reflection;
 using Masuit.Tools.Security;
@@ -17,17 +19,6 @@ namespace NetCoreTest
     {
         public static void Main(string[] args)
         {
-            var cpa = new ComplexPasswordAttribute(6, 30)
-            {
-                MustNumber = false,
-                MustSymbol = true,
-                MustLetter = false
-            };
-            var valid = cpa.IsValid("000000a");
-            Console.WriteLine(cpa.ErrorMessage);
-
-
-            Console.ReadKey();
             var myClass = new MyClass()
             {
                 MyProperty1 = 1,
@@ -45,6 +36,7 @@ namespace NetCoreTest
             };
             var allParent = myClass.AllParent().Append(myClass);
             var tree = allParent.ToTreeGeneral(c => c.Id, c => c.Pid);
+            tree.ToDataTable().ToExcel().SaveFile(@"Y:\1.xlsx");
             Console.WriteLine(tree.ToJsonString(new JsonSerializerSettings()
             {
                 ReferenceLoopHandling = ReferenceLoopHandling.Ignore,