Switch EPPlus to .NET Standard 2.0

This change required backporting changes from a newer EPPlus version:

https://github.com/JanKallman/EPPlus/commit/
2a0283ce04fcf9e598711c97efeff9318d7a1156

Specifically, ImageConverter (which is not .NET Standard compatible)
has been replaced with an EPPlus-specific ImageCompat utility.

Change-Id: Ia0a5bda9e93d97f1fad417a3a3889b0f8b69ec2b
diff --git a/EPPlus/Compatibility/ImageCompat.cs b/EPPlus/Compatibility/ImageCompat.cs
new file mode 100644
index 0000000..ec0eef3
--- /dev/null
+++ b/EPPlus/Compatibility/ImageCompat.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Linq;
+using System.Text;
+
+namespace OfficeOpenXml.Compatibility
+{
+    internal class ImageCompat
+    {
+        internal static byte[] GetImageAsByteArray(Image image)
+        {
+            var ms = new MemoryStream();
+            if (image.RawFormat.Guid == ImageFormat.Gif.Guid)
+            {
+                image.Save(ms, ImageFormat.Gif);
+            }
+            else if (image.RawFormat.Guid == ImageFormat.Bmp.Guid)
+            {
+                image.Save(ms, ImageFormat.Bmp);
+            }
+            else if (image.RawFormat.Guid == ImageFormat.Png.Guid)
+            {
+                image.Save(ms, ImageFormat.Png);
+            }
+            else if (image.RawFormat.Guid == ImageFormat.Tiff.Guid)
+            {
+                image.Save(ms, ImageFormat.Tiff);
+            }
+            else
+            {
+                image.Save(ms, ImageFormat.Jpeg);
+            }
+
+            return ms.ToArray();
+        }
+    }
+}
diff --git a/EPPlus/Drawing/ExcelPicture.cs b/EPPlus/Drawing/ExcelPicture.cs
index 368a8b4..59e8cf1 100644
--- a/EPPlus/Drawing/ExcelPicture.cs
+++ b/EPPlus/Drawing/ExcelPicture.cs
@@ -13,17 +13,17 @@
 
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  * See the GNU Lesser General Public License for more details.
  *
  * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php
  * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html
  *
- * All code and executables are provided "as is" with no warranty either express or implied. 
+ * All code and executables are provided "as is" with no warranty either express or implied.
  * The author accepts no liability for any damage or loss of business that this product may cause.
  *
  * Code change notes:
- * 
+ *
  * Author							Change						Date
  * ******************************************************************************
  * Jan Källman		                Initial Release		        2009-10-01
@@ -38,6 +38,7 @@
 using System.Drawing;
 using System.Drawing.Imaging;
 using System.Diagnostics;
+using OfficeOpenXml.Compatibility;
 using OfficeOpenXml.Utils;
 
 namespace OfficeOpenXml.Drawing
@@ -61,8 +62,12 @@
                 FileInfo f = new FileInfo(UriPic.OriginalString);
                 ContentType = GetContentType(f.Extension);
                 _image = Image.FromStream(Part.GetStream());
+#if (Core)
+                byte[] iby = ImageCompat.GetImageAsByteArray(_image);
+#else
                 ImageConverter ic=new ImageConverter();
                 var iby=(byte[])ic.ConvertTo(_image, typeof(byte[]));
+#endif
                 var ii = _drawings._package.LoadImage(iby, UriPic, Part);
                 ImageHash = ii.Hash;
 
@@ -126,8 +131,12 @@
             ContentType = GetContentType(imageFile.Extension);
             var imagestream = new FileStream(imageFile.FullName, FileMode.Open, FileAccess.Read);
             _image = Image.FromStream(imagestream);
+#if (Core)
+            var img=ImageCompat.GetImageAsByteArray(_image);
+#else
             ImageConverter ic = new ImageConverter();
             var img = (byte[])ic.ConvertTo(_image, typeof(byte[]));
+#endif
             imagestream.Close();
 
             UriPic = GetNewUri(package, "/xl/media/{0}" + imageFile.Name);
@@ -198,8 +207,12 @@
         #endregion
         private string SavePicture(Image image)
         {
+#if (Core)
+            byte[] img = ImageCompat.GetImageAsByteArray(image);
+#else
             ImageConverter ic = new ImageConverter();
             byte[] img = (byte[])ic.ConvertTo(image, typeof(byte[]));
+#endif
             var ii = _drawings._package.AddImage(img);
 
             ImageHash = ii.Hash;
@@ -218,7 +231,7 @@
 
             //Set the Image and save it to the package.
             RelPic = _drawings.Part.CreateRelationship(UriHelper.GetRelativeUri(_drawings.UriDrawing, UriPic), Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/image");
-            
+
             //AddNewPicture(img, picRelation.Id);
             _drawings._hashes.Add(ii.Hash, RelPic.Id);
 
@@ -234,9 +247,9 @@
         private string PicStartXml()
         {
             StringBuilder xml = new StringBuilder();
-            
+
             xml.Append("<xdr:nvPicPr>");
-            
+
             if (_hyperlink == null)
             {
                 xml.AppendFormat("<xdr:cNvPr id=\"{0}\" descr=\"\" />", _id);
@@ -260,7 +273,7 @@
                }
                xml.Append("</xdr:cNvPr>");
             }
-           
+
             xml.Append("<xdr:cNvPicPr><a:picLocks noChangeAspect=\"1\" /></xdr:cNvPicPr></xdr:nvPicPr><xdr:blipFill><a:blip xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" r:embed=\"\" cstate=\"print\" /><a:stretch><a:fillRect /> </a:stretch> </xdr:blipFill> <xdr:spPr> <a:xfrm> <a:off x=\"0\" y=\"0\" />  <a:ext cx=\"0\" cy=\"0\" /> </a:xfrm> <a:prstGeom prst=\"rect\"> <a:avLst /> </a:prstGeom> </xdr:spPr>");
 
             return xml.ToString();
@@ -271,7 +284,7 @@
         /// <summary>
         /// The Image
         /// </summary>
-        public Image Image 
+        public Image Image
         {
             get
             {
@@ -288,7 +301,7 @@
 
                         //Create relationship
                         TopNode.SelectSingleNode("xdr:pic/xdr:blipFill/a:blip/@r:embed", NameSpaceManager).Value = relID;
-                        //_image.Save(Part.GetStream(FileMode.Create, FileAccess.Write), _imageFormat);   //Always JPEG here at this point. 
+                        //_image.Save(Part.GetStream(FileMode.Create, FileAccess.Write), _imageFormat);   //Always JPEG here at this point.
                     }
                     catch(Exception ex)
                     {
@@ -402,7 +415,7 @@
             base.Dispose();
             _hyperlink = null;
             _image.Dispose();
-            _image = null;            
+            _image = null;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/EPPlus/EPPlusSDK.csproj b/EPPlus/EPPlusSDK.csproj
index b2ec784..42fc4ae 100644
--- a/EPPlus/EPPlusSDK.csproj
+++ b/EPPlus/EPPlusSDK.csproj
@@ -1,6 +1,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
-    <TargetFrameworks>net472;net5.0</TargetFrameworks>
+    <TargetFramework>netstandard2.0</TargetFramework>
     <RootNamespace>OfficeOpenXml</RootNamespace>
     <AssemblyName>EPPlus</AssemblyName>
     <SignAssembly>true</SignAssembly>
@@ -8,6 +8,7 @@
     <PackageId>Appsheet.EPPlus</PackageId>
     <Version>1.0.0</Version>
     <DefaultItemExcludes>$(DefaultItemExcludes);Properties/AssemblyInfo.cs;FormulaParsing/LexicalAnalysis/TokenSeparatorHandlers/**;FormulaParsing/LexicalAnalysis/TokenHandler.cs;FormulaParsing/Excel/Functions/Math/Rank.cs</DefaultItemExcludes>
+    <DefineConstants>Core;STANDARD20</DefineConstants>
   </PropertyGroup>
   <ItemGroup Condition="'$(TargetFramework)' == 'net472'">
     <Reference Include="System.Web" />
diff --git a/EPPlus/ExcelBackgroundImage.cs b/EPPlus/ExcelBackgroundImage.cs
index 8c069f7..601cf09 100644
--- a/EPPlus/ExcelBackgroundImage.cs
+++ b/EPPlus/ExcelBackgroundImage.cs
@@ -13,17 +13,17 @@
 
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  * See the GNU Lesser General Public License for more details.
  *
  * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php
  * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html
  *
- * All code and executables are provided "as is" with no warranty either express or implied. 
+ * All code and executables are provided "as is" with no warranty either express or implied.
  * The author accepts no liability for any damage or loss of business that this product may cause.
  *
  * Code change notes:
- * 
+ *
  * Author							Change						Date
  *******************************************************************************
  * Jan Källman		Added		10-SEP-2009
@@ -36,6 +36,7 @@
 using System.Xml;
 using System.Drawing;
 using System.IO;
+using OfficeOpenXml.Compatibility;
 using OfficeOpenXml.Drawing;
 using OfficeOpenXml.Packaging;
 using OfficeOpenXml.Utils;
@@ -48,7 +49,7 @@
     {
         ExcelWorksheet _workSheet;
         /// <summary>
-        /// 
+        ///
         /// </summary>
         /// <param name="nsm"></param>
         /// <param name="topNode">The topnode of the worksheet</param>
@@ -58,10 +59,10 @@
         {
             _workSheet = workSheet;
         }
-        
+
         const string BACKGROUNDPIC_PATH = "d:picture/@r:id";
         /// <summary>
-        /// The background image of the worksheet. 
+        /// The background image of the worksheet.
         /// The image will be saved internally as a jpg.
         /// </summary>
         public Image Image
@@ -86,8 +87,12 @@
                 }
                 else
                 {
+#if (Core)
+                    var img=ImageCompat.GetImageAsByteArray(value);
+#else
                     ImageConverter ic = new ImageConverter();
                     byte[] img = (byte[])ic.ConvertTo(value, typeof(byte[]));
+#endif
                     var ii = _workSheet.Workbook._package.AddImage(img);
                     var rel = _workSheet.Part.CreateRelationship(ii.Uri, Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/image");
                     SetXmlNodeString(BACKGROUNDPIC_PATH, rel.Id);
@@ -95,7 +100,7 @@
             }
         }
         /// <summary>
-        /// Set the picture from an image file. 
+        /// Set the picture from an image file.
         /// The image file will be saved as a blob, so make sure Excel supports the image format.
         /// </summary>
         /// <param name="PictureFile">The image file.</param>
@@ -113,14 +118,16 @@
                 throw (new InvalidDataException("File is not a supported image-file or is corrupt", ex));
             }
 
-            ImageConverter ic = new ImageConverter();
             string contentType = ExcelPicture.GetContentType(PictureFile.Extension);
             var imageURI = XmlHelper.GetNewUri(_workSheet._package.Package, "/xl/media/" + PictureFile.Name.Substring(0, PictureFile.Name.Length - PictureFile.Extension.Length) + "{0}" + PictureFile.Extension);
-
+#if (Core)
+            var fileBytes=ImageCompat.GetImageAsByteArray(img);
+#else
+            var ic = new ImageConverter();
             byte[] fileBytes = (byte[])ic.ConvertTo(img, typeof(byte[]));
+#endif
             var ii = _workSheet.Workbook._package.AddImage(fileBytes, imageURI, contentType);
 
-
             if (_workSheet.Part.Package.PartExists(imageURI) && ii.RefCount==1) //The file exists with another content, overwrite it.
             {
                 //Remove the part if it exists
@@ -141,13 +148,17 @@
             var relID = GetXmlNodeString(BACKGROUNDPIC_PATH);
             if (relID != "")
             {
+#if (Core)
+                var img=ImageCompat.GetImageAsByteArray(Image);
+#else
                 var ic = new ImageConverter();
                 byte[] img = (byte[])ic.ConvertTo(Image, typeof(byte[]));
+#endif
                 var ii = _workSheet.Workbook._package.GetImageInfo(img);
 
                 //Delete the relation
                 _workSheet.Part.DeleteRelationship(relID);
-                
+
                 //Delete the image if there are no other references.
                 if (ii != null && ii.RefCount == 1)
                 {
@@ -156,7 +167,7 @@
                         _workSheet.Part.Package.DeletePart(ii.Uri);
                     }
                 }
-                
+
             }
         }
     }
diff --git a/EPPlus/ExcelHeaderFooter.cs b/EPPlus/ExcelHeaderFooter.cs
index e756a33..3f978c4 100644
--- a/EPPlus/ExcelHeaderFooter.cs
+++ b/EPPlus/ExcelHeaderFooter.cs
@@ -4,7 +4,7 @@
  * EPPlus provides server-side generation of Excel 2007/2010 spreadsheets.
  * See http://www.codeplex.com/EPPlus for details.
  *
- * Copyright (C) 2011  Jan Källman
+ * Copyright (C) 2011  Jan Källman
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -26,9 +26,9 @@
  * 
  * Author							Change						Date
  *******************************************************************************
- * Jan Källman		                Initial Release		        2009-10-01
- * Jan Källman                      Total rewrite               2010-03-01
- * Jan Källman		License changed GPL-->LGPL 2011-12-27
+ * Jan Källman		                Initial Release		        2009-10-01
+ * Jan Källman                      Total rewrite               2010-03-01
+ * Jan Källman		License changed GPL-->LGPL 2011-12-27
  * *******************************************************************************/
 using System;
 using System.Xml;
@@ -37,6 +37,7 @@
 using System.Collections.Generic;
 using OfficeOpenXml.Drawing.Vml;
 using System.IO;
+using OfficeOpenXml.Compatibility;
 using OfficeOpenXml.Drawing;
 using OfficeOpenXml.Utils;
 namespace OfficeOpenXml
@@ -125,8 +126,12 @@
             string id = ValidateImage(Alignment);
             
             //Add the image
+#if (Core)
+            var img=ImageCompat.GetImageAsByteArray(Picture);
+#else
             ImageConverter ic = new ImageConverter();
             byte[] img = (byte[])ic.ConvertTo(Picture, typeof(byte[]));
+#endif
             var ii = _ws.Workbook._package.AddImage(img);
 
             return AddImage(Picture, id, ii);
@@ -154,10 +159,14 @@
                 throw (new InvalidDataException("File is not a supported image-file or is corrupt", ex));
             }
 
-            ImageConverter ic = new ImageConverter();
             string contentType = ExcelPicture.GetContentType(PictureFile.Extension);
             var uriPic = XmlHelper.GetNewUri(_ws._package.Package, "/xl/media/"+PictureFile.Name.Substring(0, PictureFile.Name.Length-PictureFile.Extension.Length) + "{0}" + PictureFile.Extension);
+#if (Core)
+            var imgBytes=ImageCompat.GetImageAsByteArray(Picture);
+#else
+            var ic = new ImageConverter();
             byte[] imgBytes = (byte[])ic.ConvertTo(Picture, typeof(byte[]));
+#endif
             var ii = _ws.Workbook._package.AddImage(imgBytes, uriPic, contentType);
 
             return AddImage(Picture, id, ii);