Skip to content

Breaking Changes in EPPlus 6

Jan Källman edited this page Apr 8, 2022 · 18 revisions

Targeting frameworks

The EPPlus 6 Nuget package will no longer target .NET 4.0 and 4.5, as these versions are no longer supported.
EPPlus 6 will instead target .NET 4.5.2. A target for .NET 6 has also been added.

Removing dependency on System.Drawing.Common

In EPPlus 6 all public interfaces referencing to System.Drawing.Common has been removed. The reason for this is that Microsoft has deprecated System.Drawing.Common on all non-Windows platforms. To replace System.Drawing.Common we have implemented native code to handle the different image formats and text measurings. To handle Colors EPPlus adds a reference to System.Drawing.Primitives. This means that all references to Color will work as before.

The following methods and properties have been removed or changed:

  • ExcelDrawings.AddPicture(string, Image) - Has been removed. Use other overloads.
  • ExcelDrawings.AddPicture(string, Image, Uri) - Has been removed. Use other overloads.
  • ExcelDrawings.AddPictureAsync(string, Image) - Has been removed. Use other overloads.
  • ExcelDrawings.AddPictureAsync(string, Image, Uri) - Has been removed.
  • ExcelPicture.ImageFormat - Has been removed. Use other overloads.
  • ExcelBackgroundImage.Image - Property has changed data type to ExcelImage. See description on ExcelImage below.
    ExcelBackgroundImage.Image can no longer be set to null. Use ExcelBackgroundImage.Remove instead.
  • ExcelDrawingBlipFill.Image - Property has changed data type to ExcelImage. See description on ExcelImage below.
  • ExcelDrawingBlipFill.ImageFormat - Has been removed. Use ExcelImage.Type instead.
  • ExcelVmlDrawingPicture.Image - Property has changed data type to ExcelImage. See description on ExcelImage below.
  • ExcelVmlDrawingPicture.InsertPicture - Has been removed.
  • ExcelVmlDrawingPictureFill.Image - Property has changed data type to ExcelImage. See description on ExcelImage below.
  • ExcelFont.SetFromFont(Font) - Has been replaced with new signature.
  • ExcelTextFont.SetFromFont(Font) - Has been replaced with new signature.
  • ExcelFontXml.SetFromFont(Font) - Has been replaced with new signature.

The ExcelImage class

The ExcelImage class replaces all System.Drawing.Common.Image properties (see list above).

Properties Description
ImageBytes                                          The image as a byte-array
Type The type of image, for example jpg, gif or svg
Bounds The bounds and resolution of the image

Methods Description
SetImage(string) Sets the image from a file path                       
SetImage(FileInfo) Sets the image from a FileInfo object
SetImage(byte[], ePictureType) Sets the image from a byte array
SetImage(Stream, ePictureType) Sets the image from a stream
SetImage(ExcelImage) Sets the image from another image object
SetImageAsync(string) Sets the image from a file path
SetImageAsync(FileInfo) Sets the image from a FileInfo object
SetImageAsync(Stream, ePictureType) Sets the image from a stream

All SetImage and SetImageAsync methods returns the ExcelImage object. This object can be used with SetImage(ExcelImage) overload.

Supported Image Formats.

The internal image handler supports the following image formats:

  • Bmp
  • Jpeg/Exif
  • Gif
  • Png
  • Tif
  • Ico
  • Svg
  • WebP
  • Wmf/Wmz
  • Emf/Wmz

Adding extension methods for removed methods referencing System.Drawing.Common

Switching to overloads supported natively by EPPlus 6 is recommended, but if you have a lot of references to System.Drawing.Common, adding extension methods for images and fonts might simplify...

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using OfficeOpenXml.Drawing;
using OfficeOpenXml.Style;
namespace OfficeOpenXml.Drawing.Extensions
{
    public static class EPPlusDrawingExtensions
    {
        /// <summary>
        /// Adds a picture to the drawings 
        /// </summary>
        /// <param name="drawings">The collection </param>
        /// <param name="name">The name of the drawing</param>
        /// <param name="image">The image object to add</param>
        /// <returns>A picture added to the drawings collection.</returns>
        public static ExcelPicture AddPicture(this ExcelDrawings drawings, string name, Image image)
        {
            var ms = new MemoryStream();
            image.Save(ms, image.RawFormat);
            return drawings.AddPicture(name, ms, GetPictuteType(image));
        }
        /// <summary>
        /// Adds a picture to the drawings 
        /// </summary>
        /// <param name="drawings">The collection </param>
        /// <param name="name">The name of the drawing</param>
        /// <param name="image">The image object to add</param>
        /// <param name="uri">An hyperlink reference used when clicking the drawing object.</param>
        /// <returns>A picture added to the drawings collection.</returns>
        public static ExcelPicture AddPicture(this ExcelDrawings drawings, string name, Image image, Uri uri)
        {
            var ms = new MemoryStream();
            image.Save(ms, image.RawFormat);
            return drawings.AddPicture(name, ms, GetPictuteType(image), uri);
        }
        /// <summary>
        /// Sets the image
        /// </summary>
        /// <param name="xlImage">The image object </param>
        /// <param name="image">The image to set</param>
        public static void SetImage(this ExcelImage xlImage, Image image)
        {
            var ms = new MemoryStream();
            image.Save(ms, image.RawFormat);
            xlImage.SetImage(ms, GetPictuteType(image));
        }
        /// <summary>
        /// Sets the font from a font object 
        /// </summary>
        /// <param name="xlFont">The EPPlus Text Font object</param>
        /// <param name="font">The font object.</param>
        public static void SetFromFont(this ExcelTextFont xlFont, Font font)
        {
            xlFont.SetFromFont(font.Name, font.SizeInPoints, font.Bold, font.Italic, font.Underline, font.Strikeout);
        }
        /// <summary>
        /// Sets the font from a font object 
        /// </summary>
        /// <param name="xlFont">The EPPlus Text Font object</param>
        /// <param name="font">The font object.</param>
        public static void SetFromFont(this OfficeOpenXml.Style.ExcelFont xlFont, Font font)
        {
            xlFont.SetFromFont(font.Name, font.SizeInPoints, font.Bold, font.Italic, font.Underline, font.Strikeout);
        }
        private static ePictureType GetPictuteType(Image image)
        {
            if (image.RawFormat.Equals(ImageFormat.Jpeg) || image.RawFormat.Equals(ImageFormat.Exif))
            {
                return ePictureType.Jpg;
            }
            else if (image.RawFormat.Equals(ImageFormat.Gif))
            {
                return ePictureType.Gif;
            }
            else if(image.RawFormat.Equals(ImageFormat.Png))
            {
                return ePictureType.Png;
            }
            else if (image.RawFormat.Equals(ImageFormat.Emf))
            {
                return ePictureType.Emf;
            }
            else if (image.RawFormat.Equals(ImageFormat.Wmf))
            {
                return ePictureType.Wmf;
            }
            else if (image.RawFormat.Equals(ImageFormat.Tiff))
            {
                return ePictureType.Tif;
            }
            else if (image.RawFormat.Equals(ImageFormat.Icon))
            {
                return ePictureType.Ico;
            }
            else
            { 
                return ePictureType.Bmp;
            }
        }
    }
}

Remember to add the name space where you want to use the methods, so they are accessible.

using OfficeOpenXml.Drawing.Extensions;

FontSize class

Static class 'FontSize' has splitted width and heights into two dictionaries. FontSizes are lazy-loaded when needed.

Removed method

Misspelled method ExcelNamedRangeCollection.AddFormla has been removed. Please use ExcelNamedRangeCollection.AddFormula

EPPlus wiki

Versions

Worksheet & Ranges

Styling

Import/Export data

Formulas and filters

Charts & Drawing objects

Tables & Pivot Tables

VBA & Protection

Clone this wiki locally