瀏覽代碼

修正excel导出字段类型检查的bug

懒得勤快 2 年之前
父節點
當前提交
942a2518f9

+ 29 - 0
Masuit.Tools.Abstractions/Extensions/BaseType/StringExtensions.cs

@@ -496,6 +496,22 @@ namespace Masuit.Tools
             return BitConverter.ToUInt32(bInt, 0);
         }
 
+        /// <summary>
+        /// IP地址转换成数字
+        /// </summary>
+        /// <param name="ip">IP地址</param>
+        /// <returns>数字,输入无效IP地址返回0</returns>
+        public static uint ToUInt32(this IPAddress ip)
+        {
+            byte[] bInt = ip.GetAddressBytes();
+            if (BitConverter.IsLittleEndian)
+            {
+                Array.Reverse(bInt);
+            }
+
+            return BitConverter.ToUInt32(bInt, 0);
+        }
+
         /// <summary>
         /// 判断IP是否是私有地址
         /// </summary>
@@ -520,6 +536,19 @@ namespace Masuit.Tools
             return current >= begin.IPToID() && current <= ends.IPToID();
         }
 
+        /// <summary>
+        /// 判断IP地址在不在某个IP地址段
+        /// </summary>
+        /// <param name="input">需要判断的IP地址</param>
+        /// <param name="begin">起始地址</param>
+        /// <param name="ends">结束地址</param>
+        /// <returns></returns>
+        public static bool IpAddressInRange(this IPAddress input, IPAddress begin, IPAddress ends)
+        {
+            uint current = input.ToUInt32();
+            return current >= begin.ToUInt32() && current <= ends.ToUInt32();
+        }
+
         #endregion IP地址
 
         #region 校验手机号码的正确性

+ 160 - 161
Masuit.Tools.Abstractions/Media/ImageWatermarker.cs

@@ -1,169 +1,168 @@
-using System;
-using SixLabors.Fonts;
+using SixLabors.Fonts;
 using SixLabors.ImageSharp;
 using SixLabors.ImageSharp.Drawing.Processing;
 using SixLabors.ImageSharp.Processing;
-using System.IO;
-using System.Text;
 using SixLabors.ImageSharp.Processing.Processors.Transforms;
+using System;
+using System.IO;
 
 namespace Masuit.Tools.Media
 {
-    public class ImageWatermarker
-    {
-        /// <summary>
-        /// 是否跳过小缩略图
-        /// </summary>
-        public bool SkipWatermarkForSmallImages { get; set; }
-
-        /// <summary>
-        /// 小图像素大小
-        /// </summary>
-        public int SmallImagePixelsThreshold { get; set; }
-
-        private readonly Stream _stream;
-
-        public ImageWatermarker(Stream originStream)
-        {
-            _stream = originStream;
-        }
-
-        public MemoryStream AddWatermark(string watermarkText, string ttfFontPath, int fontSize, Color color, WatermarkPosition watermarkPosition = WatermarkPosition.BottomRight, int textPadding = 10)
-        {
-            var fonts = new FontCollection();
-            var fontFamily = fonts.Add(ttfFontPath); //字体的路径(电脑自带字体库,去copy出来)
-            var font = new Font(fontFamily, fontSize, FontStyle.Bold);
-            return AddWatermark(watermarkText, font, color, watermarkPosition, textPadding);
-        }
-
-        /// <summary>
-        /// 添加水印
-        /// </summary>
-        /// <param name="watermarkText">水印文字</param>
-        /// <param name="color">水印颜色</param>
-        /// <param name="watermarkPosition">水印位置</param>
-        /// <param name="textPadding">边距</param>
-        /// <param name="font">字体</param>
-        /// <returns></returns>
-        public MemoryStream AddWatermark(string watermarkText, Font font, Color color, WatermarkPosition watermarkPosition = WatermarkPosition.BottomRight, int textPadding = 10)
-        {
-            using var img = Image.Load(_stream);
-            var textMeasure = TextMeasurer.Measure(watermarkText, new TextOptions(font));
-            if (SkipWatermarkForSmallImages && (img.Height < Math.Sqrt(SmallImagePixelsThreshold) || img.Width < Math.Sqrt(SmallImagePixelsThreshold) || img.Width <= textMeasure.Width))
-            {
-                return _stream as MemoryStream ?? _stream.SaveAsMemoryStream();
-            }
-
-            if (img.Width / font.Size > 50)
-            {
-                font = font.Family.CreateFont(img.Width * 1f / 50);
-            }
-
-            float x, y;
-            textPadding += (img.Width - 1000) / 100;
-            switch (watermarkPosition)
-            {
-                case WatermarkPosition.TopRight:
-                    x = img.Width - textMeasure.Width - textPadding;
-                    y = textPadding;
-                    break;
-
-                case WatermarkPosition.BottomLeft:
-                    x = textPadding;
-                    y = img.Height - textMeasure.Height - textPadding;
-                    break;
-
-                case WatermarkPosition.BottomRight:
-                    x = img.Width - textMeasure.Width - textPadding;
-                    y = img.Height - textMeasure.Height - textPadding;
-                    break;
-
-                case WatermarkPosition.Center:
-                    x = (img.Width - textMeasure.Width) / 2;
-                    y = (img.Height - textMeasure.Height) / 2;
-                    break;
-
-                default:
-                    x = textPadding;
-                    y = textPadding;
-                    break;
-            }
-
-            img.Mutate(c => c.DrawText(watermarkText, font, color, new PointF(x, y)));
-            var ms = new MemoryStream();
-            img.SaveAsWebp(ms);
-            ms.Position = 0;
-            return ms;
-        }
-
-        /// <summary>
-        /// 添加水印
-        /// </summary>
-        /// <param name="watermarkImage">水印图片</param>
-        /// <param name="opacity">水印图片</param>
-        /// <param name="watermarkPosition">水印位置</param>
-        /// <param name="padding">水印边距</param>
-        /// <returns></returns>
-        public MemoryStream AddWatermark(Stream watermarkImage, float opacity = 1f, WatermarkPosition watermarkPosition = WatermarkPosition.BottomRight, int padding = 20)
-        {
-            using var img = Image.Load(_stream);
-            var height = img.Height;
-            var width = img.Width;
-            if (SkipWatermarkForSmallImages && (height < Math.Sqrt(SmallImagePixelsThreshold) || width < Math.Sqrt(SmallImagePixelsThreshold)))
-            {
-                return _stream as MemoryStream ?? _stream.SaveAsMemoryStream();
-            }
-
-            var watermark = Image.Load(watermarkImage);
-            watermark.Mutate(c => c.Resize(new ResizeOptions()
-            {
-                Size = new Size
-                {
-                    Width = width / 10,
-                    Height = height / 10,
-                },
-                Mode = ResizeMode.Pad,
-                Sampler = new BicubicResampler()
-            }));
-            int x, y;
-            padding += (width - 1000) / 100;
-            switch (watermarkPosition)
-            {
-                case WatermarkPosition.TopRight:
-                    x = width - watermark.Width - padding;
-                    y = padding;
-                    break;
-
-                case WatermarkPosition.BottomLeft:
-                    x = padding;
-                    y = height - watermark.Height - padding;
-                    break;
-
-                case WatermarkPosition.BottomRight:
-                    x = width - watermark.Width - padding;
-                    y = height - watermark.Height - padding;
-                    break;
-
-                case WatermarkPosition.Center:
-                    x = (img.Width - watermark.Width) / 2;
-                    y = (img.Height - watermark.Height) / 2;
-                    break;
-
-                default:
-                    x = padding;
-                    y = padding;
-                    break;
-            }
-
-            img.Mutate(c =>
-            {
-                c.DrawImage(watermark, new Point(x, y), opacity);
-                watermark.Dispose();
-            });
-            var ms = new MemoryStream();
-            img.SaveAsWebp(ms);
-            ms.Position = 0;
-            return ms;
-        }
-    }
+	public class ImageWatermarker
+	{
+		/// <summary>
+		/// 是否跳过小缩略图
+		/// </summary>
+		public bool SkipWatermarkForSmallImages { get; set; }
+
+		/// <summary>
+		/// 小图像素大小
+		/// </summary>
+		public int SmallImagePixelsThreshold { get; set; }
+
+		private readonly Stream _stream;
+
+		public ImageWatermarker(Stream originStream)
+		{
+			_stream = originStream;
+		}
+
+		public MemoryStream AddWatermark(string watermarkText, string ttfFontPath, int fontSize, Color color, WatermarkPosition watermarkPosition = WatermarkPosition.BottomRight, int textPadding = 10)
+		{
+			var fonts = new FontCollection();
+			var fontFamily = fonts.Add(ttfFontPath); //字体的路径(电脑自带字体库,去copy出来)
+			var font = new Font(fontFamily, fontSize, FontStyle.Bold);
+			return AddWatermark(watermarkText, font, color, watermarkPosition, textPadding);
+		}
+
+		/// <summary>
+		/// 添加水印
+		/// </summary>
+		/// <param name="watermarkText">水印文字</param>
+		/// <param name="color">水印颜色</param>
+		/// <param name="watermarkPosition">水印位置</param>
+		/// <param name="textPadding">边距</param>
+		/// <param name="font">字体</param>
+		/// <returns></returns>
+		public MemoryStream AddWatermark(string watermarkText, Font font, Color color, WatermarkPosition watermarkPosition = WatermarkPosition.BottomRight, int textPadding = 10)
+		{
+			using var img = Image.Load(_stream);
+			var textMeasure = TextMeasurer.Measure(watermarkText, new TextOptions(font));
+			if (SkipWatermarkForSmallImages && (img.Height < Math.Sqrt(SmallImagePixelsThreshold) || img.Width < Math.Sqrt(SmallImagePixelsThreshold) || img.Width <= textMeasure.Width))
+			{
+				return _stream as MemoryStream ?? _stream.SaveAsMemoryStream();
+			}
+
+			if (img.Width / font.Size > 50)
+			{
+				font = font.Family.CreateFont(img.Width * 1f / 50);
+			}
+
+			float x, y;
+			textPadding += (img.Width - 1000) / 100;
+			switch (watermarkPosition)
+			{
+				case WatermarkPosition.TopRight:
+					x = img.Width - textMeasure.Width - textPadding;
+					y = textPadding;
+					break;
+
+				case WatermarkPosition.BottomLeft:
+					x = textPadding;
+					y = img.Height - textMeasure.Height - textPadding;
+					break;
+
+				case WatermarkPosition.BottomRight:
+					x = img.Width - textMeasure.Width - textPadding;
+					y = img.Height - textMeasure.Height - textPadding;
+					break;
+
+				case WatermarkPosition.Center:
+					x = (img.Width - textMeasure.Width) / 2;
+					y = (img.Height - textMeasure.Height) / 2;
+					break;
+
+				default:
+					x = textPadding;
+					y = textPadding;
+					break;
+			}
+
+			img.Mutate(c => c.DrawText(watermarkText, font, color, new PointF(x, y)));
+			var ms = new MemoryStream();
+			img.SaveAsWebp(ms);
+			ms.Position = 0;
+			return ms;
+		}
+
+		/// <summary>
+		/// 添加水印
+		/// </summary>
+		/// <param name="watermarkImage">水印图片</param>
+		/// <param name="opacity">水印图片</param>
+		/// <param name="watermarkPosition">水印位置</param>
+		/// <param name="padding">水印边距</param>
+		/// <returns></returns>
+		public MemoryStream AddWatermark(Stream watermarkImage, float opacity = 1f, WatermarkPosition watermarkPosition = WatermarkPosition.BottomRight, int padding = 20)
+		{
+			using var img = Image.Load(_stream);
+			var height = img.Height;
+			var width = img.Width;
+			if (SkipWatermarkForSmallImages && (height < Math.Sqrt(SmallImagePixelsThreshold) || width < Math.Sqrt(SmallImagePixelsThreshold)))
+			{
+				return _stream as MemoryStream ?? _stream.SaveAsMemoryStream();
+			}
+
+			var watermark = Image.Load(watermarkImage);
+			watermark.Mutate(c => c.Resize(new ResizeOptions()
+			{
+				Size = new Size
+				{
+					Width = width / 10,
+					Height = height / 10,
+				},
+				Mode = ResizeMode.Pad,
+				Sampler = new BicubicResampler()
+			}));
+			int x, y;
+			padding += (width - 1000) / 100;
+			switch (watermarkPosition)
+			{
+				case WatermarkPosition.TopRight:
+					x = width - watermark.Width - padding;
+					y = padding;
+					break;
+
+				case WatermarkPosition.BottomLeft:
+					x = padding;
+					y = height - watermark.Height - padding;
+					break;
+
+				case WatermarkPosition.BottomRight:
+					x = width - watermark.Width - padding;
+					y = height - watermark.Height - padding;
+					break;
+
+				case WatermarkPosition.Center:
+					x = (img.Width - watermark.Width) / 2;
+					y = (img.Height - watermark.Height) / 2;
+					break;
+
+				default:
+					x = padding;
+					y = padding;
+					break;
+			}
+
+			img.Mutate(c =>
+			{
+				c.DrawImage(watermark, new Point(x, y), opacity);
+				watermark.Dispose();
+			});
+			var ms = new MemoryStream();
+			img.SaveAsWebp(ms);
+			ms.Position = 0;
+			return ms;
+		}
+	}
 }

+ 1 - 1
Masuit.Tools.Excel/ExcelExtension.cs

@@ -376,7 +376,7 @@ public static class ExcelExtension
 
 		if (table.Any())
 		{
-			if (properties.Any(t => t.PropertyType.IsSubclassOf(typeof(Stream)) || typeof(IEnumerable).IsAssignableFrom(t.PropertyType) || typeof(IDictionary).IsAssignableFrom(t.PropertyType)))
+			if (properties.Any(t => t.PropertyType.IsSubclassOf(typeof(Stream)) || typeof(IEnumerable<Stream>).IsAssignableFrom(t.PropertyType) || (typeof(IDictionary).IsAssignableFrom(t.PropertyType) && t.PropertyType.GenericTypeArguments[1].IsSubclassOf(typeof(Stream)))))
 			{
 				hasPicColumn = true;
 			}

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

@@ -3,7 +3,7 @@
         <TargetFramework>netstandard2.0</TargetFramework>
         <LangVersion>latest</LangVersion>
         <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-        <Version>1.2.4.2</Version>
+        <Version>1.2.4.3</Version>
         <Authors>懒得勤快</Authors>
         <Description>Masuit.Tools.Excel导出库,支持一些简单数据的导出,支持图片列</Description>
         <Copyright>懒得勤快</Copyright>

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

@@ -310,7 +310,7 @@
       <Version>5.2.9</Version>
     </PackageReference>
     <PackageReference Include="Newtonsoft.Json">
-      <Version>13.0.1</Version>
+      <Version>13.0.2</Version>
     </PackageReference>
     <PackageReference Include="System.ValueTuple">
       <Version>4.5.0</Version>

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

@@ -183,7 +183,7 @@
       <Version>5.2.9</Version>
     </PackageReference>
     <PackageReference Include="Newtonsoft.Json">
-      <Version>13.0.1</Version>
+      <Version>13.0.2</Version>
     </PackageReference>
     <PackageReference Include="SharpCompress">
       <Version>0.32.2</Version>

+ 2 - 2
Test/Masuit.Tools.Test/Masuit.Tools.Test.csproj

@@ -94,7 +94,7 @@
       <Version>2.0.0</Version>
     </PackageReference>
     <PackageReference Include="Moq">
-      <Version>4.18.2</Version>
+      <Version>4.18.3</Version>
     </PackageReference>
     <PackageReference Include="MSTest.TestAdapter">
       <Version>2.2.10</Version>
@@ -121,7 +121,7 @@
       <Version>2.0.3</Version>
     </PackageReference>
     <PackageReference Include="xunit.analyzers">
-      <Version>1.0.0</Version>
+      <Version>1.1.0</Version>
     </PackageReference>
     <PackageReference Include="xunit.assert">
       <Version>2.4.2</Version>