diff --git a/src/EPPlus/EPPlus/Compatibility/ImageCompat.cs b/src/EPPlus/EPPlus/Compatibility/ImageCompat.cs index d1051dad..4db24dc6 100644 --- a/src/EPPlus/EPPlus/Compatibility/ImageCompat.cs +++ b/src/EPPlus/EPPlus/Compatibility/ImageCompat.cs @@ -1,36 +1,18 @@ using OfficeOpenXml.Utils; -using System.Drawing; -using System.Drawing.Imaging; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats; namespace OfficeOpenXml.Compatibility { internal class ImageCompat { - internal static byte[] GetImageAsByteArray(Image image) + internal static byte[] GetImageAsByteArray(Image image, IImageFormat format) { - var ms = RecyclableMemoryStream.GetStream(); - if (image.RawFormat.Guid == ImageFormat.Gif.Guid) + using (var ms = RecyclableMemoryStream.GetStream()) { - image.Save(ms, ImageFormat.Gif); + image.Save(ms, format); + return ms.ToArray(); } - 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/src/EPPlus/EPPlus/ConditionalFormatting/Contracts/IExcelConditionalFormattingDataBarGroup.cs b/src/EPPlus/EPPlus/ConditionalFormatting/Contracts/IExcelConditionalFormattingDataBarGroup.cs index fcad7923..ff65f0fc 100644 --- a/src/EPPlus/EPPlus/ConditionalFormatting/Contracts/IExcelConditionalFormattingDataBarGroup.cs +++ b/src/EPPlus/EPPlus/ConditionalFormatting/Contracts/IExcelConditionalFormattingDataBarGroup.cs @@ -28,7 +28,7 @@ * ****************************************************************************** * Eyal Seagull Conditional Formatting Adaption 2012-04-03 *******************************************************************************/ -using System.Drawing; +using SixLabors.ImageSharp; namespace OfficeOpenXml.ConditionalFormatting.Contracts { diff --git a/src/EPPlus/EPPlus/ConditionalFormatting/Contracts/IRangeConditionalFormatting.cs b/src/EPPlus/EPPlus/ConditionalFormatting/Contracts/IRangeConditionalFormatting.cs index be242303..5e90b8c0 100644 --- a/src/EPPlus/EPPlus/ConditionalFormatting/Contracts/IRangeConditionalFormatting.cs +++ b/src/EPPlus/EPPlus/ConditionalFormatting/Contracts/IRangeConditionalFormatting.cs @@ -29,7 +29,7 @@ * Eyal Seagull Conditional Formatting 2012-04-03 *******************************************************************************/ using OfficeOpenXml.ConditionalFormatting.Contracts; -using System.Drawing; +using SixLabors.ImageSharp; namespace OfficeOpenXml.ConditionalFormatting { diff --git a/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingCollection.cs b/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingCollection.cs index 01cfa593..619c275a 100644 --- a/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingCollection.cs +++ b/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingCollection.cs @@ -33,7 +33,7 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Drawing; +using SixLabors.ImageSharp; using System.Xml; namespace OfficeOpenXml.ConditionalFormatting diff --git a/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingColorScaleValue.cs b/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingColorScaleValue.cs index 412ce9f8..0c422ad7 100644 --- a/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingColorScaleValue.cs +++ b/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingColorScaleValue.cs @@ -30,9 +30,10 @@ *******************************************************************************/ using OfficeOpenXml.Utils; using System; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.Xml; +using Magicodes.IE.EPPlus.SixLabors; namespace OfficeOpenXml.ConditionalFormatting { @@ -423,7 +424,7 @@ public Color Color CreateNodeByOrdem( eExcelConditionalFormattingValueObjectNodeType.Color, ExcelConditionalFormattingConstants.Paths.RgbAttribute, - value.ToArgb().ToString("x")); + value.ToArgbHex()); } } diff --git a/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingConstants.cs b/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingConstants.cs index 48e81be7..965376ff 100644 --- a/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingConstants.cs +++ b/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingConstants.cs @@ -28,7 +28,7 @@ * ****************************************************************************** * Eyal Seagull Conditional Formatting Adaption 2012-04-03 *******************************************************************************/ -using System.Drawing; +using SixLabors.ImageSharp; namespace OfficeOpenXml.ConditionalFormatting { @@ -272,9 +272,9 @@ internal class TimePeriods #region Colors internal class Colors { - internal static readonly Color CfvoLowValue = Color.FromArgb(0xFF, 0xF8, 0x69, 0x6B); - internal static readonly Color CfvoMiddleValue = Color.FromArgb(0xFF, 0xFF, 0xEB, 0x84); - internal static readonly Color CfvoHighValue = Color.FromArgb(0xFF, 0x63, 0xBE, 0x7B); + internal static readonly Color CfvoLowValue = Color.FromRgba(0xF8, 0x69, 0x6B, 0xFF); + internal static readonly Color CfvoMiddleValue = Color.FromRgba(0xFF, 0xEB, 0x84, 0xFF); + internal static readonly Color CfvoHighValue = Color.FromRgba(0x63, 0xBE, 0x7B, 0xFF); } #endregion Colors } diff --git a/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingHelper.cs b/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingHelper.cs index 7dab95d5..46433a31 100644 --- a/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingHelper.cs +++ b/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingHelper.cs @@ -30,11 +30,12 @@ *******************************************************************************/ using OfficeOpenXml.Utils; using System; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.Linq; using System.Text.RegularExpressions; using System.Xml; +using SixLabors.ImageSharp.PixelFormats; namespace OfficeOpenXml.ConditionalFormatting { @@ -77,7 +78,8 @@ public static Color ConvertFromColorCode( { try { - return Color.FromArgb(Int32.Parse(colorCode.Replace("#", ""), NumberStyles.HexNumber)); + var rgba32 = new Rgba32(uint.Parse(colorCode.Replace("#", ""), NumberStyles.HexNumber)); + return Color.FromRgba(rgba32.R, rgba32.G, rgba32.B, rgba32.A); } catch { diff --git a/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingIconDatabarValue.cs b/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingIconDatabarValue.cs index 8c4993be..3bc212b0 100644 --- a/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingIconDatabarValue.cs +++ b/src/EPPlus/EPPlus/ConditionalFormatting/ExcelConditionalFormattingIconDatabarValue.cs @@ -30,7 +30,7 @@ *******************************************************************************/ using OfficeOpenXml.Utils; using System; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.Xml; diff --git a/src/EPPlus/EPPlus/ConditionalFormatting/RangeConditionalFormatting.cs b/src/EPPlus/EPPlus/ConditionalFormatting/RangeConditionalFormatting.cs index 2365817d..5e592af6 100644 --- a/src/EPPlus/EPPlus/ConditionalFormatting/RangeConditionalFormatting.cs +++ b/src/EPPlus/EPPlus/ConditionalFormatting/RangeConditionalFormatting.cs @@ -30,6 +30,7 @@ *******************************************************************************/ using OfficeOpenXml.ConditionalFormatting.Contracts; using OfficeOpenXml.Utils; +using SixLabors.ImageSharp; namespace OfficeOpenXml.ConditionalFormatting { @@ -514,7 +515,7 @@ public IExcelConditionalFormattingFiveIconSet AddFiveIconSet(eExcelconditionalFo /// /// The color of the databar /// - public IExcelConditionalFormattingDataBarGroup AddDatabar(System.Drawing.Color Color) + public IExcelConditionalFormattingDataBarGroup AddDatabar(Color Color) { var rule = (IExcelConditionalFormattingDataBarGroup)(_worksheet.ConditionalFormatting.AddRule( eExcelConditionalFormattingRuleType.DataBar, diff --git a/src/EPPlus/EPPlus/ConditionalFormatting/Rules/ExcelConditionalFormattingDataBar.cs b/src/EPPlus/EPPlus/ConditionalFormatting/Rules/ExcelConditionalFormattingDataBar.cs index 59c876e5..c7f617ed 100644 --- a/src/EPPlus/EPPlus/ConditionalFormatting/Rules/ExcelConditionalFormattingDataBar.cs +++ b/src/EPPlus/EPPlus/ConditionalFormatting/Rules/ExcelConditionalFormattingDataBar.cs @@ -30,9 +30,12 @@ *******************************************************************************/ using OfficeOpenXml.ConditionalFormatting.Contracts; using System; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.Xml; +using Magicodes.IE.EPPlus.SixLabors; +using SixLabors.ImageSharp.PixelFormats; + namespace OfficeOpenXml.ConditionalFormatting { /// @@ -222,13 +225,14 @@ public Color Color var rgb = GetXmlNodeString(_colorPath); if (!string.IsNullOrEmpty(rgb)) { - return Color.FromArgb(int.Parse(rgb, NumberStyles.HexNumber)); + var argb32 = new Argb32(Convert.ToUInt32(rgb, 16)); + return Color.FromRgba(argb32.R, argb32.G, argb32.B, argb32.A); } return Color.White; } set { - SetXmlNodeString(_colorPath, value.ToArgb().ToString("X")); + SetXmlNodeString(_colorPath, value.ToArgbHex()); } } } diff --git a/src/EPPlus/EPPlus/Drawing/Chart/ExcelLineChartSerie.cs b/src/EPPlus/EPPlus/Drawing/Chart/ExcelLineChartSerie.cs index 102dbf3a..3da41306 100644 --- a/src/EPPlus/EPPlus/Drawing/Chart/ExcelLineChartSerie.cs +++ b/src/EPPlus/EPPlus/Drawing/Chart/ExcelLineChartSerie.cs @@ -30,9 +30,11 @@ * Jan Källman License changed GPL-->LGPL 2011-12-16 *******************************************************************************/ using System; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.Xml; +using Magicodes.IE.EPPlus.SixLabors; +using SixLabors.ImageSharp.PixelFormats; namespace OfficeOpenXml.Drawing.Chart { @@ -127,12 +129,12 @@ public Color LineColor } else { - return Color.FromArgb(Convert.ToInt32(color, 16)); + return Color.ParseHex(color); } } set { - SetXmlNodeString(LINECOLOR_PATH, value.ToArgb().ToString("X").Substring(2), true); + SetXmlNodeString(LINECOLOR_PATH, value.ToArgbHex().Substring(2), true); } } string MARKERSIZE_PATH = "c:marker/c:size/@val"; @@ -217,12 +219,12 @@ public Color MarkerLineColor } else { - return Color.FromArgb(Convert.ToInt32(color, 16)); + return Color.ParseHex(color); } } set { - SetXmlNodeString(MARKERLINECOLOR_PATH, value.ToArgb().ToString("X").Substring(2), true); + SetXmlNodeString(MARKERLINECOLOR_PATH, value.ToArgbHex()/*.Substring(2)*/, true); } } diff --git a/src/EPPlus/EPPlus/Drawing/Chart/ExcelScatterChartSerie.cs b/src/EPPlus/EPPlus/Drawing/Chart/ExcelScatterChartSerie.cs index 877a40dd..f721e6de 100644 --- a/src/EPPlus/EPPlus/Drawing/Chart/ExcelScatterChartSerie.cs +++ b/src/EPPlus/EPPlus/Drawing/Chart/ExcelScatterChartSerie.cs @@ -31,9 +31,11 @@ *******************************************************************************/ using System; using System.Collections.Generic; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.Xml; +using Magicodes.IE.EPPlus.SixLabors; +using SixLabors.ImageSharp.PixelFormats; namespace OfficeOpenXml.Drawing.Chart { @@ -150,18 +152,18 @@ public Color LineColor } else { - Color c = Color.FromArgb(Convert.ToInt32(color, 16)); + Color c = Color.ParseHex(color); int a = getAlphaChannel(LINECOLOR_PATH); if (a != 255) { - c = Color.FromArgb(a, c); + c = c.WithAlpha(a); } return c; } } set { - SetXmlNodeString(LINECOLOR_PATH, value.ToArgb().ToString("X8").Substring(2), true); + SetXmlNodeString(LINECOLOR_PATH, value.ToArgbHex()/*.Substring(2)*/, true); setAlphaChannel(value, LINECOLOR_PATH); } } @@ -218,18 +220,19 @@ public Color MarkerColor } else { - Color c = Color.FromArgb(Convert.ToInt32(color, 16)); + var argb32 = new Argb32(Convert.ToUInt32(color, 16)); + Color c = Color.FromRgba(argb32.R, argb32.G, argb32.B, argb32.A); int a = getAlphaChannel(MARKERCOLOR_PATH); if (a != 255) { - c = Color.FromArgb(a, c); + c = c.WithAlpha(a); } return c; } } set { - SetXmlNodeString(MARKERCOLOR_PATH, value.ToArgb().ToString("X8").Substring(2), true); //.Substring(2) => cut alpha value + SetXmlNodeString(MARKERCOLOR_PATH, value.ToArgbHex()/*.Substring(2)*/, true); //.Substring(2) => cut alpha value setAlphaChannel(value, MARKERCOLOR_PATH); } } @@ -282,18 +285,19 @@ public Color MarkerLineColor } else { - Color c = Color.FromArgb(Convert.ToInt32(color, 16)); + var argb32 = new Argb32(Convert.ToUInt32(color, 16)); + Color c = Color.FromRgba(argb32.R, argb32.G, argb32.B, argb32.A); int a = getAlphaChannel(MARKERLINECOLOR_PATH); if (a != 255) { - c = Color.FromArgb(a, c); + c = c.WithAlpha(a); } return c; } } set { - SetXmlNodeString(MARKERLINECOLOR_PATH, value.ToArgb().ToString("X8").Substring(2), true); + SetXmlNodeString(MARKERLINECOLOR_PATH, value.ToArgbHex()/*.Substring(2)*/, true); setAlphaChannel(value, MARKERLINECOLOR_PATH); } } @@ -311,14 +315,15 @@ public Color MarkerLineColor /// private void setAlphaChannel(Color c, string xPath) { + var argb32 = c.ToPixel(); //check 4 Alpha-values - if (c.A != 255) + if (argb32.A != 255) { //opaque color => alpha == 255 //source: https://msdn.microsoft.com/en-us/library/1hstcth9%28v=vs.110%29.aspx //check path string s = xPath4Alpha(xPath); if (s.Length > 0) { - string alpha = ((c.A == 0) ? 0 : (100 - c.A) * 1000).ToString(); //note: excel writes 100% transparency (alpha=0) as "0" and not as "100000" + string alpha = ((argb32.A == 0) ? 0 : (100 - argb32.A) * 1000).ToString(); //note: excel writes 100% transparency (alpha=0) as "0" and not as "100000" SetXmlNodeString(s, alpha, true); } } diff --git a/src/EPPlus/EPPlus/Drawing/ExcelDrawingFill.cs b/src/EPPlus/EPPlus/Drawing/ExcelDrawingFill.cs index 7031468c..36a57a75 100644 --- a/src/EPPlus/EPPlus/Drawing/ExcelDrawingFill.cs +++ b/src/EPPlus/EPPlus/Drawing/ExcelDrawingFill.cs @@ -30,8 +30,11 @@ * Jan Källman License changed GPL-->LGPL 2011-12-16 *******************************************************************************/ using System; -using System.Drawing; +using System.Globalization; +using SixLabors.ImageSharp; using System.Xml; +using Magicodes.IE.EPPlus.SixLabors; +using SixLabors.ImageSharp.PixelFormats; namespace OfficeOpenXml.Drawing { @@ -152,11 +155,12 @@ public Color Color string col = GetXmlNodeString(_fillPath + ColorPath); if (col == "") { - return Color.FromArgb(79, 129, 189); + return Color.FromRgb(79, 129, 189); } else { - return Color.FromArgb(int.Parse(col, System.Globalization.NumberStyles.AllowHexSpecifier)); + var argb32 = new Argb32(uint.Parse(col, NumberStyles.AllowHexSpecifier)); + return Color.FromRgba(argb32.R, argb32.G, argb32.B, argb32.A); } } set @@ -171,7 +175,7 @@ public Color Color } CreateNode(_fillPath, false); //fix ArgumentOutOfRangeException for Fill colors for solid fills with an alpha-value from zero (100% transparency) - SetXmlNodeString(_fillPath + ColorPath, value.ToArgb().ToString("X8").Substring(2)); + SetXmlNodeString(_fillPath + ColorPath, value.ToArgbHex()); } } const string alphaPath = "/a:solidFill/a:srgbClr/a:alpha/@val"; @@ -189,7 +193,7 @@ public int Transparancy if (_fillTypeNode == null) { _style = eFillStyle.SolidFill; - Color = Color.FromArgb(79, 129, 189); //Set a Default color + Color = Color.FromRgb(79, 129, 189); //Set a Default color } else if (_style != eFillStyle.SolidFill) { diff --git a/src/EPPlus/EPPlus/Drawing/ExcelDrawings.cs b/src/EPPlus/EPPlus/Drawing/ExcelDrawings.cs index ef7e2eac..096a1f26 100644 --- a/src/EPPlus/EPPlus/Drawing/ExcelDrawings.cs +++ b/src/EPPlus/EPPlus/Drawing/ExcelDrawings.cs @@ -28,15 +28,19 @@ * Jan Källman Initial Release 2009-12-22 * Jan Källman License changed GPL-->LGPL 2011-12-16 *******************************************************************************/ + using OfficeOpenXml.Drawing.Chart; using OfficeOpenXml.Table.PivotTable; using OfficeOpenXml.Utils; using System; using System.Collections; using System.Collections.Generic; -using System.Drawing; +using SixLabors.ImageSharp; using System.IO; using System.Xml; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats; + namespace OfficeOpenXml.Drawing { /// @@ -47,6 +51,7 @@ public class ExcelDrawings : IEnumerable, IDisposable private XmlDocument _drawingsXml = new XmlDocument(); private Dictionary _drawingNames; private List _drawings; + internal class ImageCompare { internal byte[] image { get; set; } @@ -66,13 +71,16 @@ internal bool Comparer(byte[] compareImg) return false; } } + return true; //Equal } } + //internal List _pics = new List(); internal Dictionary _hashes = new Dictionary(); internal ExcelPackage _package; internal Packaging.ZipPackageRelationship _drawingRelation = null; + internal ExcelDrawings(ExcelPackage xlPackage, ExcelWorksheet sheet) { _drawingsXml = new XmlDocument(); @@ -94,17 +102,17 @@ internal ExcelDrawings(ExcelPackage xlPackage, ExcelWorksheet sheet) AddDrawings(); } } + internal ExcelWorksheet Worksheet { get; set; } + /// /// A reference to the drawing xml document /// public XmlDocument DrawingXml { - get - { - return _drawingsXml; - } + get { return _drawingsXml; } } + private void AddDrawings() { // Look inside all children for the drawings because they could be inside @@ -114,11 +122,12 @@ private void AddDrawings() // one Choice node (and no Fallback) underneath the AlternativeContent node. (Excel 2013 that is.) // This change prevents CodePlex issue #15028 from occurring. // (the drawing xml part (that ONLY contained AlternativeContent nodes) was incorrectly being garbage collected when the package was saved) - XmlNodeList list = _drawingsXml.SelectNodes("//*[self::xdr:twoCellAnchor or self::xdr:oneCellAnchor or self::xdr:absoluteAnchor]", NameSpaceManager); + XmlNodeList list = _drawingsXml.SelectNodes( + "//*[self::xdr:twoCellAnchor or self::xdr:oneCellAnchor or self::xdr:absoluteAnchor]", + NameSpaceManager); foreach (XmlNode node in list) { - ExcelDrawing dr; switch (node.LocalName) { @@ -135,6 +144,7 @@ private void AddDrawings() dr = null; break; } + if (dr != null) { _drawings.Add(dr); @@ -148,6 +158,7 @@ private void AddDrawings() #region NamespaceManager + /// /// Creates the NamespaceManager. /// @@ -160,24 +171,26 @@ private void CreateNSM() _nsManager.AddNamespace("c", ExcelPackage.schemaChart); _nsManager.AddNamespace("r", ExcelPackage.schemaRelationships); } + /// /// Provides access to a namespace manager instance to allow XPath searching /// XmlNamespaceManager _nsManager = null; + public XmlNamespaceManager NameSpaceManager { - get - { - return _nsManager; - } + get { return _nsManager; } } + #endregion + #region IEnumerable Members public IEnumerator GetEnumerator() { return (_drawings.GetEnumerator()); } + #region IEnumerable Members IEnumerator IEnumerable.GetEnumerator() @@ -194,10 +207,7 @@ IEnumerator IEnumerable.GetEnumerator() /// public ExcelDrawing this[int PositionID] { - get - { - return (_drawings[PositionID]); - } + get { return (_drawings[PositionID]); } } /// @@ -219,6 +229,7 @@ public ExcelDrawing this[string Name] } } } + public int Count { get @@ -233,24 +244,25 @@ public int Count } } } + Packaging.ZipPackagePart _part = null; + internal Packaging.ZipPackagePart Part { - get - { - return _part; - } + get { return _part; } } + Uri _uriDrawing = null; + public Uri UriDrawing { - get - { - return _uriDrawing; - } + get { return _uriDrawing; } } + #endregion + #region Add functions + /// /// Add a new chart to the worksheet. /// Do not support Bubble-, Radar-, Stock- or Surface charts. @@ -272,10 +284,12 @@ public ExcelChart AddChart(string Name, eChartType ChartType, ExcelPivotTable Pi { throw (new NotImplementedException("Chart type is not supported in the current version")); } + if (Worksheet is ExcelChartsheet && _drawings.Count > 0) { throw new InvalidOperationException("Chart Worksheets can't have more than one chart"); } + XmlElement drawNode = CreateDrawingXml(); ExcelChart chart = ExcelChart.GetNewChart(this, drawNode, ChartType, null, PivotTableSource); @@ -284,6 +298,7 @@ public ExcelChart AddChart(string Name, eChartType ChartType, ExcelPivotTable Pi _drawingNames.Add(Name, _drawings.Count - 1); return chart; } + /// /// Add a new chart to the worksheet. /// Do not support Bubble-, Radar-, Stock- or Surface charts. @@ -295,24 +310,28 @@ public ExcelChart AddChart(string Name, eChartType ChartType) { return AddChart(Name, ChartType, null); } + /// /// Add a picure to the worksheet /// - /// + /// /// An image. Allways saved in then JPeg format + /// Image Format /// - public ExcelPicture AddPicture(string Name, Image image) + public ExcelPicture AddPicture(string name, Image image, IImageFormat format) { - return AddPicture(Name, image, null); + return AddPicture(name, image, format, null); } + /// /// Add a picure to the worksheet /// /// /// An image. Allways saved in then JPeg format - /// Picture Hyperlink + /// Image Format + /// Picture Hyperlink /// - public ExcelPicture AddPicture(string Name, Image image, Uri Hyperlink) + public ExcelPicture AddPicture(string Name, Image image, IImageFormat format, Uri hyperlink) { if (image != null) { @@ -320,16 +339,19 @@ public ExcelPicture AddPicture(string Name, Image image, Uri Hyperlink) { throw new Exception("Name already exists in the drawings collection"); } + XmlElement drawNode = CreateDrawingXml(); drawNode.SetAttribute("editAs", "oneCell"); - ExcelPicture pic = new ExcelPicture(this, drawNode, image, Hyperlink); + ExcelPicture pic = new ExcelPicture(this, drawNode, image, format, hyperlink); pic.Name = Name; _drawings.Add(pic); _drawingNames.Add(Name, _drawings.Count - 1); return pic; } + throw (new Exception("AddPicture: Image can't be null")); } + /// /// Add a picure to the worksheet /// @@ -340,6 +362,7 @@ public ExcelPicture AddPicture(string Name, FileInfo ImageFile) { return AddPicture(Name, ImageFile, null); } + /// /// Add a picure to the worksheet /// @@ -353,12 +376,14 @@ public ExcelPicture AddPicture(string Name, FileInfo ImageFile, Uri Hyperlink) { throw new InvalidOperationException("Chart worksheets can't have more than one drawing"); } + if (ImageFile != null) { if (_drawingNames.ContainsKey(Name)) { throw new Exception("Name already exists in the drawings collection"); } + XmlElement drawNode = CreateDrawingXml(); drawNode.SetAttribute("editAs", "oneCell"); ExcelPicture pic = new ExcelPicture(this, drawNode, ImageFile, Hyperlink); @@ -367,6 +392,7 @@ public ExcelPicture AddPicture(string Name, FileInfo ImageFile, Uri Hyperlink) _drawingNames.Add(Name, _drawings.Count - 1); return pic; } + throw (new Exception("AddPicture: ImageFile can't be null")); } @@ -376,17 +402,18 @@ public ExcelPicture AddPicture(string Name, FileInfo ImageFile, Uri Hyperlink) /// Name /// Shape style /// The shape object - public ExcelShape AddShape(string Name, eShapeStyle Style) { if (Worksheet is ExcelChartsheet && _drawings.Count > 0) { throw new InvalidOperationException("Chart worksheets can't have more than one drawing"); } + if (_drawingNames.ContainsKey(Name)) { throw new Exception("Name already exists in the drawings collection"); } + XmlElement drawNode = CreateDrawingXml(); ExcelShape shape = new ExcelShape(this, drawNode, Style); @@ -396,6 +423,7 @@ public ExcelShape AddShape(string Name, eShapeStyle Style) _drawingNames.Add(Name, _drawings.Count - 1); return shape; } + /// /// Add a new shape to the worksheet /// @@ -408,10 +436,12 @@ public ExcelShape AddShape(string Name, ExcelShape Source) { throw new InvalidOperationException("Chart worksheets can't have more than one drawing"); } + if (_drawingNames.ContainsKey(Name)) { throw new Exception("Name already exists in the drawings collection"); } + XmlElement drawNode = CreateDrawingXml(); drawNode.InnerXml = Source.TopNode.InnerXml; @@ -422,11 +452,14 @@ public ExcelShape AddShape(string Name, ExcelShape Source) _drawingNames.Add(Name, _drawings.Count - 1); return shape; } + private XmlElement CreateDrawingXml() { if (DrawingXml.DocumentElement == null) { - DrawingXml.LoadXml(string.Format("", ExcelPackage.schemaSheetDrawings, ExcelPackage.schemaDrawings)); + DrawingXml.LoadXml(string.Format( + "", + ExcelPackage.schemaSheetDrawings, ExcelPackage.schemaDrawings)); Packaging.ZipPackage package = Worksheet._package.Package; //Check for existing part, issue #100 @@ -434,17 +467,19 @@ private XmlElement CreateDrawingXml() do { _uriDrawing = new Uri(string.Format("/xl/drawings/drawing{0}.xml", id++), UriKind.Relative); - } - while (package.PartExists(_uriDrawing)); + } while (package.PartExists(_uriDrawing)); - _part = package.CreatePart(_uriDrawing, "application/vnd.openxmlformats-officedocument.drawing+xml", _package.Compression); + _part = package.CreatePart(_uriDrawing, "application/vnd.openxmlformats-officedocument.drawing+xml", + _package.Compression); StreamWriter streamChart = new StreamWriter(_part.GetStream(FileMode.Create, FileAccess.Write)); DrawingXml.Save(streamChart); streamChart.Close(); package.Flush(); - _drawingRelation = Worksheet.Part.CreateRelationship(UriHelper.GetRelativeUri(Worksheet.WorksheetUri, _uriDrawing), Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/drawing"); + _drawingRelation = Worksheet.Part.CreateRelationship( + UriHelper.GetRelativeUri(Worksheet.WorksheetUri, _uriDrawing), Packaging.TargetMode.Internal, + ExcelPackage.schemaRelationships + "/drawing"); XmlElement e = (XmlElement)Worksheet.CreateNode("d:drawing"); //XmlElement e = Worksheet.WorksheetXml.SelectSingleNode("d:drawing", ); e.SetAttribute("id", ExcelPackage.schemaRelationships, _drawingRelation.Id); @@ -452,6 +487,7 @@ private XmlElement CreateDrawingXml() //Worksheet.WorksheetXml.DocumentElement.AppendChild(e); package.Flush(); } + XmlNode colNode = _drawingsXml.SelectSingleNode("//xdr:wsDr", NameSpaceManager); XmlElement drawNode; if (this.Worksheet is ExcelChartsheet) @@ -474,18 +510,23 @@ private XmlElement CreateDrawingXml() //Add from position Element; XmlElement fromNode = _drawingsXml.CreateElement("xdr", "from", ExcelPackage.schemaSheetDrawings); drawNode.AppendChild(fromNode); - fromNode.InnerXml = "0000"; + fromNode.InnerXml = + "0000"; //Add to position Element; XmlElement toNode = _drawingsXml.CreateElement("xdr", "to", ExcelPackage.schemaSheetDrawings); drawNode.AppendChild(toNode); - toNode.InnerXml = "100100"; + toNode.InnerXml = + "100100"; } return drawNode; } + #endregion + #region Remove methods + /// /// Removes a drawing. /// @@ -496,6 +537,7 @@ public void Remove(int Index) { throw new InvalidOperationException("Can' remove charts from chart worksheets"); } + RemoveDrawing(Index); } @@ -507,9 +549,11 @@ internal void RemoveDrawing(int Index) { _drawingNames[_drawings[i].Name]--; } + _drawingNames.Remove(draw.Name); _drawings.Remove(draw); } + /// /// Removes a drawing. /// @@ -518,6 +562,7 @@ public void Remove(ExcelDrawing Drawing) { Remove(_drawingNames[Drawing.Name]); } + /// /// Removes a drawing. /// @@ -526,6 +571,7 @@ public void Remove(string Name) { Remove(_drawingNames[Name]); } + /// /// Removes all drawings from the collection /// @@ -535,6 +581,7 @@ public void Clear() { throw new InvalidOperationException("Can' remove charts from chart worksheets"); } + ClearDrawings(); } @@ -545,7 +592,9 @@ internal void ClearDrawings() RemoveDrawing(0); } } + #endregion + internal void AdjustWidth(int[,] pos) { var ix = 0; @@ -558,12 +607,14 @@ internal void AdjustWidth(int[,] pos) { d.SetPixelLeft(pos[ix, 0]); } - d.SetPixelWidth(pos[ix, 1]); + d.SetPixelWidth(pos[ix, 1]); } + ix++; } } + internal void AdjustHeight(int[,] pos) { var ix = 0; @@ -576,12 +627,14 @@ internal void AdjustHeight(int[,] pos) { d.SetPixelTop(pos[ix, 0]); } - d.SetPixelHeight(pos[ix, 1]); + d.SetPixelHeight(pos[ix, 1]); } + ix++; } } + internal int[,] GetDrawingWidths() { int[,] pos = new int[Count, 2]; @@ -592,8 +645,10 @@ internal void AdjustHeight(int[,] pos) pos[ix, 0] = d.GetPixelLeft(); pos[ix++, 1] = d.GetPixelWidth(); } + return pos; } + internal int[,] GetDrawingHeight() { int[,] pos = new int[Count, 2]; @@ -604,6 +659,7 @@ internal void AdjustHeight(int[,] pos) pos[ix, 0] = d.GetPixelTop(); pos[ix++, 1] = d.GetPixelHeight(); } + return pos; } @@ -620,6 +676,7 @@ public void Dispose() { d.Dispose(); } + _drawings.Clear(); _drawings = null; } diff --git a/src/EPPlus/EPPlus/Drawing/ExcelPicture.cs b/src/EPPlus/EPPlus/Drawing/ExcelPicture.cs index c11686c0..e0b4eb3b 100644 --- a/src/EPPlus/EPPlus/Drawing/ExcelPicture.cs +++ b/src/EPPlus/EPPlus/Drawing/ExcelPicture.cs @@ -29,15 +29,16 @@ * Jan Källman Initial Release 2009-10-01 * Jan Källman License changed GPL-->LGPL 2011-12-16 *******************************************************************************/ + using OfficeOpenXml.Compatibility; using OfficeOpenXml.Utils; using System; -using System.Drawing; -using System.Drawing.Imaging; -using System.Globalization; using System.IO; using System.Text; using System.Xml; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.Formats.Jpeg; namespace OfficeOpenXml.Drawing { @@ -47,6 +48,7 @@ namespace OfficeOpenXml.Drawing public sealed class ExcelPicture : ExcelDrawing { #region "Constructors" + internal ExcelPicture(ExcelDrawings drawings, XmlNode node) : base(drawings, node, "xdr:pic/xdr:nvPicPr/xdr:cNvPr/@name") { @@ -57,16 +59,9 @@ internal ExcelPicture(ExcelDrawings drawings, XmlNode node) : UriPic = UriHelper.ResolvePartUri(drawings.UriDrawing, RelPic.TargetUri); Part = drawings.Part.Package.GetPart(UriPic); - 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 + Image = Image.Load(Part.GetStream(), out var format); + ImageFormat = format; + byte[] iby = ImageCompat.GetImageAsByteArray(Image, format); var ii = _drawings._package.LoadImage(iby, UriPic, Part); ImageHash = ii.Hash; @@ -76,19 +71,15 @@ internal ExcelPicture(ExcelDrawings drawings, XmlNode node) : if (!string.IsNullOrEmpty(relID)) { HypRel = drawings.Part.GetRelationship(relID); - if (HypRel.TargetUri.IsAbsoluteUri) - { - _hyperlink = new ExcelHyperLink(HypRel.TargetUri.AbsoluteUri); - } - else - { - _hyperlink = new ExcelHyperLink(HypRel.TargetUri.OriginalString, UriKind.Relative); - } - ((ExcelHyperLink)_hyperlink).ToolTip = GetXmlNodeString("xdr:pic/xdr:nvPicPr/xdr:cNvPr/a:hlinkClick/@tooltip"); + _hyperlink = HypRel.TargetUri.IsAbsoluteUri ? new ExcelHyperLink(HypRel.TargetUri.AbsoluteUri) : new ExcelHyperLink(HypRel.TargetUri.OriginalString, UriKind.Relative); + + ((ExcelHyperLink)_hyperlink).ToolTip = + GetXmlNodeString("xdr:pic/xdr:nvPicPr/xdr:cNvPr/a:hlinkClick/@tooltip"); } } } - internal ExcelPicture(ExcelDrawings drawings, XmlNode node, Image image, Uri hyperlink) : + + internal ExcelPicture(ExcelDrawings drawings, XmlNode node, Image image, IImageFormat format, Uri hyperlink) : base(drawings, node, "xdr:pic/xdr:nvPicPr/xdr:cNvPr/@name") { XmlElement picNode = node.OwnerDocument.CreateElement("xdr", "pic", ExcelPackage.schemaSheetDrawings); @@ -96,12 +87,14 @@ internal ExcelPicture(ExcelDrawings drawings, XmlNode node, Image image, Uri hyp _hyperlink = hyperlink; picNode.InnerXml = PicStartXml(); - node.InsertAfter(node.OwnerDocument.CreateElement("xdr", "clientData", ExcelPackage.schemaSheetDrawings), picNode); + node.InsertAfter(node.OwnerDocument.CreateElement("xdr", "clientData", ExcelPackage.schemaSheetDrawings), + picNode); var package = drawings.Worksheet._package.Package; //Get the picture if it exists or save it if not. - _image = image; - string relID = SavePicture(image); + Image = image; + ImageFormat = format; + string relID = SavePicture(image, format); //Create relationship node.SelectSingleNode("xdr:pic/xdr:blipFill/a:blip/@r:embed", NameSpaceManager).Value = relID; @@ -110,6 +103,7 @@ internal ExcelPicture(ExcelDrawings drawings, XmlNode node, Image image, Uri hyp SetPosDefaults(image); package.Flush(); } + internal ExcelPicture(ExcelDrawings drawings, XmlNode node, FileInfo imageFile, Uri hyperlink) : base(drawings, node, "xdr:pic/xdr:nvPicPr/xdr:cNvPr/@name") { @@ -118,104 +112,47 @@ internal ExcelPicture(ExcelDrawings drawings, XmlNode node, FileInfo imageFile, _hyperlink = hyperlink; picNode.InnerXml = PicStartXml(); - node.InsertAfter(node.OwnerDocument.CreateElement("xdr", "clientData", ExcelPackage.schemaSheetDrawings), picNode); + node.InsertAfter(node.OwnerDocument.CreateElement("xdr", "clientData", ExcelPackage.schemaSheetDrawings), + picNode); //Changed to stream 2/4-13 (issue 14834). Thnx SClause var package = drawings.Worksheet._package.Package; - 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); - var ii = _drawings._package.AddImage(img, UriPic, ContentType); - string relID; - if (!drawings._hashes.ContainsKey(ii.Hash)) + using (var imageStream = new FileStream(imageFile.FullName, FileMode.Open, FileAccess.Read)) { - Part = ii.Part; - RelPic = drawings.Part.CreateRelationship(UriHelper.GetRelativeUri(drawings.UriDrawing, ii.Uri), Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/image"); - relID = RelPic.Id; - _drawings._hashes.Add(ii.Hash, relID); - AddNewPicture(img, relID); - } - else - { - relID = drawings._hashes[ii.Hash]; - var rel = _drawings.Part.GetRelationship(relID); - UriPic = UriHelper.ResolvePartUri(rel.SourceUri, rel.TargetUri); - } - ImageHash = ii.Hash; - _height = Image.Height; - _width = Image.Width; - SetPosDefaults(Image); - //Create relationship - node.SelectSingleNode("xdr:pic/xdr:blipFill/a:blip/@r:embed", NameSpaceManager).Value = relID; - package.Flush(); - } + Image = Image.Load(imageStream, out var format); + ImageFormat = format; - internal static string GetContentType(string extension) - { - switch (extension.ToLower(CultureInfo.InvariantCulture)) - { - case ".bmp": - return "image/bmp"; - case ".jpg": - case ".jpeg": - return "image/jpeg"; - case ".gif": - return "image/gif"; - case ".png": - return "image/png"; - case ".cgm": - return "image/cgm"; - case ".emf": - return "image/x-emf"; - case ".eps": - return "image/x-eps"; - case ".pcx": - return "image/x-pcx"; - case ".tga": - return "image/x-tga"; - case ".tif": - case ".tiff": - return "image/x-tiff"; - case ".wmf": - return "image/x-wmf"; - default: - return "image/jpeg"; + var img = ImageCompat.GetImageAsByteArray(Image, format); + UriPic = GetNewUri(package, "/xl/media/{0}" + imageFile.Name); + var ii = _drawings._package.AddImage(img, UriPic, ContentType); + string relID; + if (!drawings._hashes.ContainsKey(ii.Hash)) + { + Part = ii.Part; + RelPic = drawings.Part.CreateRelationship(UriHelper.GetRelativeUri(drawings.UriDrawing, ii.Uri), + Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/image"); + relID = RelPic.Id; + _drawings._hashes.Add(ii.Hash, relID); + AddNewPicture(img, relID); + } + else + { + relID = drawings._hashes[ii.Hash]; + var rel = _drawings.Part.GetRelationship(relID); + UriPic = UriHelper.ResolvePartUri(rel.SourceUri, rel.TargetUri); + } + ImageHash = ii.Hash; + _height = Image.Height; + _width = Image.Width; + SetPosDefaults(Image); + //Create relationship + node.SelectSingleNode("xdr:pic/xdr:blipFill/a:blip/@r:embed", NameSpaceManager).Value = relID; + package.Flush(); } } - internal static ImageFormat GetImageFormat(string contentType) - { - switch (contentType.ToLower(CultureInfo.InvariantCulture)) - { - case "image/bmp": - return ImageFormat.Bmp; - case "image/jpeg": - return ImageFormat.Jpeg; - case "image/gif": - return ImageFormat.Gif; - case "image/png": - return ImageFormat.Png; - case "image/x-emf": - return ImageFormat.Emf; - case "image/x-tiff": - return ImageFormat.Tiff; - case "image/x-wmf": - return ImageFormat.Wmf; - default: - return ImageFormat.Jpeg; - } - } //Add a new image to the compare collection + //Add a new image to the compare collection private void AddNewPicture(byte[] img, string relID) { var newPic = new ExcelDrawings.ImageCompare(); @@ -223,15 +160,13 @@ private void AddNewPicture(byte[] img, string relID) newPic.relID = relID; //_drawings._pics.Add(newPic); } + #endregion - private string SavePicture(Image image) + + private string SavePicture(Image image, IImageFormat format) { -#if (Core) - byte[] img = ImageCompat.GetImageAsByteArray(image); -#else - ImageConverter ic = new ImageConverter(); - byte[] img = (byte[])ic.ConvertTo(image, typeof(byte[])); -#endif + byte[] img = ImageCompat.GetImageAsByteArray(image, format); + var ii = _drawings._package.AddImage(img); @@ -243,25 +178,24 @@ private string SavePicture(Image image) UriPic = UriHelper.ResolvePartUri(rel.SourceUri, rel.TargetUri); return relID; } - else - { - UriPic = ii.Uri; - ImageHash = ii.Hash; - } + + UriPic = ii.Uri; + ImageHash = ii.Hash; //Set the Image and save it to the package. - RelPic = _drawings.Part.CreateRelationship(UriHelper.GetRelativeUri(_drawings.UriDrawing, UriPic), Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/image"); + 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); - return RelPic.Id; } + private void SetPosDefaults(Image image) { EditAs = eEditAs.OneCell; - SetPixelWidth(image.Width, image.HorizontalResolution); - SetPixelHeight(image.Height, image.VerticalResolution); + SetPixelWidth(image.Width, (float)image.Metadata.HorizontalResolution); + SetPixelHeight(image.Height, (float)image.Metadata.VerticalResolution); } private string PicStartXml() @@ -276,81 +210,49 @@ private string PicStartXml() } else { - HypRel = _drawings.Part.CreateRelationship(_hyperlink, Packaging.TargetMode.External, ExcelPackage.schemaHyperlink); + HypRel = _drawings.Part.CreateRelationship(_hyperlink, Packaging.TargetMode.External, + ExcelPackage.schemaHyperlink); xml.AppendFormat("", _id); if (HypRel != null) { if (_hyperlink is ExcelHyperLink) { - xml.AppendFormat("", - HypRel.Id, ((ExcelHyperLink)_hyperlink).ToolTip); + xml.AppendFormat( + "", + HypRel.Id, ((ExcelHyperLink)_hyperlink).ToolTip); } else { - xml.AppendFormat("", - HypRel.Id); + xml.AppendFormat( + "", + HypRel.Id); } } + xml.Append(""); } - xml.Append(" "); + xml.Append( + " "); return xml.ToString(); } internal string ImageHash { get; set; } - Image _image = null; + /// /// The Image /// - public Image Image - { - get - { - return _image; - } - set - { - if (value != null) - { - _image = value; - try - { - string relID = SavePicture(value); + public Image Image { get; private set; } - //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. - } - catch (Exception ex) - { - throw (new Exception("Can't save image - " + ex.Message, ex)); - } - } - } - } - ImageFormat _imageFormat = ImageFormat.Jpeg; /// /// Image format /// If the picture is created from an Image this type is always Jpeg /// - public ImageFormat ImageFormat - { - get - { - return _imageFormat; - } - internal set - { - _imageFormat = value; - } - } - internal string ContentType - { - get; - set; - } + public IImageFormat ImageFormat { get; private set; } + + internal string ContentType => ImageFormat?.DefaultMimeType; + /// /// Set the size of the image in percent from the orginal size /// Note that resizing columns / rows after using this function will effect the size of the picture @@ -370,10 +272,11 @@ public override void SetSize(int Percent) _width = (int)(_width * ((decimal)Percent / 100)); _height = (int)(_height * ((decimal)Percent / 100)); - SetPixelWidth(_width, Image.HorizontalResolution); - SetPixelHeight(_height, Image.VerticalResolution); + SetPixelWidth(_width, (float) Image.Metadata.HorizontalResolution); + SetPixelHeight(_height, (float) Image.Metadata.VerticalResolution); } } + internal Uri UriPic { get; set; } internal Packaging.ZipPackageRelationship RelPic { get; set; } internal Packaging.ZipPackageRelationship HypRel { get; set; } @@ -383,7 +286,9 @@ public override void SetSize(int Percent) { get { return Name; } } + ExcelDrawingFill _fill = null; + /// /// Fill /// @@ -395,10 +300,13 @@ public ExcelDrawingFill Fill { _fill = new ExcelDrawingFill(NameSpaceManager, TopNode, "xdr:pic/xdr:spPr"); } + return _fill; } } + ExcelDrawingBorder _border = null; + /// /// Border /// @@ -410,32 +318,34 @@ public ExcelDrawingBorder Border { _border = new ExcelDrawingBorder(NameSpaceManager, TopNode, "xdr:pic/xdr:spPr/a:ln"); } + return _border; } } private Uri _hyperlink = null; + /// /// Hyperlink /// public Uri Hyperlink { - get - { - return _hyperlink; - } + get { return _hyperlink; } } + internal override void DeleteMe() { _drawings._package.RemoveImage(ImageHash); base.DeleteMe(); } + public override void Dispose() { base.Dispose(); _hyperlink = null; - _image.Dispose(); - _image = null; + Image.Dispose(); + Image = null; + ImageFormat = JpegFormat.Instance; } } } \ No newline at end of file diff --git a/src/EPPlus/EPPlus/Drawing/Vml/ExcelVmlDrawingComment.cs b/src/EPPlus/EPPlus/Drawing/Vml/ExcelVmlDrawingComment.cs index 6425a4ac..daee629b 100644 --- a/src/EPPlus/EPPlus/Drawing/Vml/ExcelVmlDrawingComment.cs +++ b/src/EPPlus/EPPlus/Drawing/Vml/ExcelVmlDrawingComment.cs @@ -30,9 +30,11 @@ * Jan Källman License changed GPL-->LGPL 2011-12-16 *******************************************************************************/ using System; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.Xml; +using Magicodes.IE.EPPlus.SixLabors; +using SixLabors.ImageSharp.PixelFormats; namespace OfficeOpenXml.Drawing.Vml { @@ -165,25 +167,24 @@ public Color BackgroundColor string col = GetXmlNodeString(BACKGROUNDCOLOR_PATH); if (col == "") { - return Color.FromArgb(0xff, 0xff, 0xe1); + return Color.FromRgb(0xff, 0xff, 0xe1); } else { if (col.StartsWith("#")) col = col.Substring(1, col.Length - 1); - int res; - if (int.TryParse(col, System.Globalization.NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out res)) + if (uint.TryParse(col, System.Globalization.NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out var res)) { - return Color.FromArgb(res); + return Color.ParseHex(col); } else { - return Color.Empty; + return Color.Transparent; } } } set { - string color = "#" + value.ToArgb().ToString("X").Substring(2, 6); + string color = "#" + value.ToArgbHex()/*.Substring(2)*/; SetXmlNodeString(BACKGROUNDCOLOR_PATH, color); //SetXmlNode(BACKGROUNDCOLOR2_PATH, color); } @@ -251,20 +252,19 @@ public Color LineColor else { if (col.StartsWith("#")) col = col.Substring(1, col.Length - 1); - int res; - if (int.TryParse(col, System.Globalization.NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out res)) + if (uint.TryParse(col, NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture, out var res)) { - return Color.FromArgb(res); + return Color.ParseHex(col); } else { - return Color.Empty; + return Color.Transparent; } } } set { - string color = "#" + value.ToArgb().ToString("X").Substring(2, 6); + string color = "#" + value.ToArgbHex()/*.Substring(2)*/; SetXmlNodeString(LINECOLOR_PATH, color); } } diff --git a/src/EPPlus/EPPlus/Drawing/Vml/ExcelVmlDrawingPicture.cs b/src/EPPlus/EPPlus/Drawing/Vml/ExcelVmlDrawingPicture.cs index 2c4faf23..a1acdad9 100644 --- a/src/EPPlus/EPPlus/Drawing/Vml/ExcelVmlDrawingPicture.cs +++ b/src/EPPlus/EPPlus/Drawing/Vml/ExcelVmlDrawingPicture.cs @@ -30,9 +30,10 @@ * Jan Källman License changed GPL-->LGPL 2011-12-16 *******************************************************************************/ using System; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.Xml; +using SixLabors.ImageSharp; namespace OfficeOpenXml.Drawing.Vml @@ -139,12 +140,10 @@ public Image Image if (pck.PartExists(ImageUri)) { var part = pck.GetPart(ImageUri); - return Image.FromStream(part.GetStream()); - } - else - { - return null; + return Image.Load(part.GetStream()); } + + return null; } } internal Uri ImageUri diff --git a/src/EPPlus/EPPlus/ExcelBackgroundImage.cs b/src/EPPlus/EPPlus/ExcelBackgroundImage.cs index 3246f64c..fc56fa5a 100644 --- a/src/EPPlus/EPPlus/ExcelBackgroundImage.cs +++ b/src/EPPlus/EPPlus/ExcelBackgroundImage.cs @@ -29,13 +29,14 @@ * Jan Källman Added 10-SEP-2009 * Jan Källman License changed GPL-->LGPL 2011-12-16 *******************************************************************************/ + using OfficeOpenXml.Compatibility; using OfficeOpenXml.Drawing; -using OfficeOpenXml.Utils; using System; -using System.Drawing; using System.IO; using System.Xml; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats; namespace OfficeOpenXml { @@ -45,6 +46,7 @@ namespace OfficeOpenXml public class ExcelBackgroundImage : XmlHelper { ExcelWorksheet _workSheet; + /// /// /// @@ -58,97 +60,84 @@ internal ExcelBackgroundImage(XmlNamespaceManager nsm, XmlNode topNode, ExcelWor } const string BACKGROUNDPIC_PATH = "d:picture/@r:id"; + /// /// The background image of the worksheet. /// The image will be saved internally as a jpg. /// - public Image Image + public Image Image { get; private set; } + + internal IImageFormat ImageFormat { get; private set; } + + public void SetImage(byte[] imageBytes = null) { - get - { - string relID = GetXmlNodeString(BACKGROUNDPIC_PATH); - if (!string.IsNullOrEmpty(relID)) - { - var rel = _workSheet.Part.GetRelationship(relID); - var imagePart = _workSheet.Part.Package.GetPart(UriHelper.ResolvePartUri(rel.SourceUri, rel.TargetUri)); - return Image.FromStream(imagePart.GetStream()); - } - return null; - } - set + DeletePrevImage(); + if (imageBytes == null) { - DeletePrevImage(); - if (value == null) - { - DeleteAllNode(BACKGROUNDPIC_PATH); - } - 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); - } + DeleteAllNode(BACKGROUNDPIC_PATH); + return; } + + Image = Image.Load(imageBytes, out var imageFormat); + ImageFormat = imageFormat; + var imageInfo = _workSheet.Workbook._package.AddImage(imageBytes); + var rel = _workSheet.Part.CreateRelationship(imageInfo.Uri, Packaging.TargetMode.Internal, + ExcelPackage.schemaRelationships + "/image"); + SetXmlNodeString(BACKGROUNDPIC_PATH, rel.Id); } + /// /// Set the picture from an image file. /// The image file will be saved as a blob, so make sure Excel supports the image format. /// - /// The image file. - public void SetFromFile(FileInfo PictureFile) + /// The image file. + public void SetFromFile(FileInfo pictureFile) { DeletePrevImage(); - Image img; - byte[] fileBytes; try { - fileBytes = File.ReadAllBytes(PictureFile.FullName); - img = Image.FromFile(PictureFile.FullName); - } - catch (Exception ex) - { - throw (new InvalidDataException("File is not a supported image-file or is corrupt", ex)); - } - - 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); + var fileBytes = File.ReadAllBytes(pictureFile.FullName); + Image.Load(fileBytes, out var format); + string contentType = format.DefaultMimeType; + var imageUri = XmlHelper.GetNewUri(_workSheet._package.Package, + "/xl/media/" + + pictureFile.Name.Substring(0, pictureFile.Name.Length - pictureFile.Extension.Length) + "{0}" + + pictureFile.Extension); - var ii = _workSheet.Workbook._package.AddImage(fileBytes, imageURI, contentType); + 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 - _workSheet.Part.Package.DeletePart(imageURI); - } + if (_workSheet.Part.Package.PartExists(imageUri) && + ii.RefCount == 1) //The file exists with another content, overwrite it. + { + //Remove the part if it exists + _workSheet.Part.Package.DeletePart(imageUri); + } - var imagePart = _workSheet.Part.Package.CreatePart(imageURI, contentType, CompressionLevel.None); - //Save the picture to package. + var imagePart = _workSheet.Part.Package.CreatePart(imageUri, contentType, CompressionLevel.None); + //Save the picture to package. - var strm = imagePart.GetStream(FileMode.Create, FileAccess.Write); - strm.Write(fileBytes, 0, fileBytes.Length); + var stream = imagePart.GetStream(FileMode.Create, FileAccess.Write); + stream.Write(fileBytes, 0, fileBytes.Length); - var rel = _workSheet.Part.CreateRelationship(imageURI, Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/image"); - SetXmlNodeString(BACKGROUNDPIC_PATH, rel.Id); + var rel = _workSheet.Part.CreateRelationship(imageUri, Packaging.TargetMode.Internal, + ExcelPackage.schemaRelationships + "/image"); + SetXmlNodeString(BACKGROUNDPIC_PATH, rel.Id); + } + catch (Exception ex) + { + throw (new InvalidDataException("File is not a supported image-file or is corrupt", ex)); + } } + private void DeletePrevImage() { 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 img = ImageCompat.GetImageAsByteArray(Image, ImageFormat); + var ii = _workSheet.Workbook._package.GetImageInfo(img); //Delete the relation @@ -162,8 +151,7 @@ private void DeletePrevImage() _workSheet.Part.Package.DeletePart(ii.Uri); } } - } } } -} +} \ No newline at end of file diff --git a/src/EPPlus/EPPlus/ExcelHeaderFooter.cs b/src/EPPlus/EPPlus/ExcelHeaderFooter.cs index 98b1987e..3401ebdf 100644 --- a/src/EPPlus/EPPlus/ExcelHeaderFooter.cs +++ b/src/EPPlus/EPPlus/ExcelHeaderFooter.cs @@ -35,9 +35,11 @@ using OfficeOpenXml.Drawing.Vml; using OfficeOpenXml.Utils; using System; -using System.Drawing; +using SixLabors.ImageSharp; using System.IO; using System.Xml; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats; namespace OfficeOpenXml { @@ -118,66 +120,56 @@ private void SetText(string code, string text) /// /// Inserts a picture at the end of the text in the header or footer /// - /// The image object containing the Picture + /// The image object containing the Picture + /// The image format /// Alignment. The image object will be inserted at the end of the Text. - public ExcelVmlDrawingPicture InsertPicture(Image Picture, PictureAlignment Alignment) + public ExcelVmlDrawingPicture InsertPicture(Image picture, IImageFormat format, PictureAlignment Alignment) { 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 img = ImageCompat.GetImageAsByteArray(picture, format); var ii = _ws.Workbook._package.AddImage(img); - return AddImage(Picture, id, ii); + return AddImage(picture, format, id, ii); } /// /// Inserts a picture at the end of the text in the header or footer /// - /// The image object containing the Picture - /// Alignment. The image object will be inserted at the end of the Text. - public ExcelVmlDrawingPicture InsertPicture(FileInfo PictureFile, PictureAlignment Alignment) + /// The image object containing the Picture + /// Alignment. The image object will be inserted at the end of the Text. + public ExcelVmlDrawingPicture InsertPicture(FileInfo pictureFile, PictureAlignment alignment) { - string id = ValidateImage(Alignment); + string id = ValidateImage(alignment); Image Picture; try { - if (!PictureFile.Exists) + if (!pictureFile.Exists) { - throw (new FileNotFoundException(string.Format("{0} is missing", PictureFile.FullName))); + throw (new FileNotFoundException(string.Format("{0} is missing", pictureFile.FullName))); } - Picture = Image.FromFile(PictureFile.FullName); + Picture = Image.Load(pictureFile.FullName, out var format); + string contentType = format.DefaultMimeType; + var uriPic = XmlHelper.GetNewUri(_ws._package.Package, "/xl/media/" + pictureFile.Name.Substring(0, pictureFile.Name.Length - pictureFile.Extension.Length) + "{0}" + pictureFile.Extension); + var imgBytes = ImageCompat.GetImageAsByteArray(Picture, format); + + + var ii = _ws.Workbook._package.AddImage(imgBytes, uriPic, contentType); + + return AddImage(Picture, format, id, ii); } catch (Exception ex) { throw (new InvalidDataException("File is not a supported image-file or is corrupt", ex)); } - - 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); } - private ExcelVmlDrawingPicture AddImage(Image Picture, string id, ExcelPackage.ImageInfo ii) + private ExcelVmlDrawingPicture AddImage(Image picture, IImageFormat format, string id, ExcelPackage.ImageInfo ii) { - double width = Picture.Width * 72 / Picture.HorizontalResolution, //Pixel --> Points - height = Picture.Height * 72 / Picture.VerticalResolution; //Pixel --> Points + double width = picture.Width * 72 / picture.Metadata.HorizontalResolution, //Pixel --> Points + height = picture.Height * 72 / picture.Metadata.VerticalResolution; //Pixel --> Points //Add VML-drawing return _ws.HeaderFooter.Pictures.Add(id, ii.Uri, "", width, height); } diff --git a/src/EPPlus/EPPlus/ExcelRangeBase.cs b/src/EPPlus/EPPlus/ExcelRangeBase.cs index e5f23d37..11a6dfb0 100644 --- a/src/EPPlus/EPPlus/ExcelRangeBase.cs +++ b/src/EPPlus/EPPlus/ExcelRangeBase.cs @@ -43,7 +43,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Data; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.IO; using System.Linq; @@ -51,6 +51,7 @@ using System.Text; using System.Text.RegularExpressions; using System.Xml; +using SixLabors.Fonts; namespace OfficeOpenXml { @@ -851,55 +852,42 @@ public void AutoFitColumns(double MinimumWidth, double MaximumWidth) var nf = styles.Fonts[styles.CellXfs[0].FontId]; var fs = FontStyle.Regular; if (nf.Bold) fs |= FontStyle.Bold; - if (nf.UnderLine) fs |= FontStyle.Underline; if (nf.Italic) fs |= FontStyle.Italic; - if (nf.Strike) fs |= FontStyle.Strikeout; - var nfont = new Font(nf.Name, nf.Size, fs); + var td = TextDecorations.None; + if (nf.UnderLine) td |= TextDecorations.Underline; + if (nf.Strike) td |= TextDecorations.Strikeout; var normalSize = Convert.ToSingle(ExcelWorkbook.GetWidthPixels(nf.Name, nf.Size)); - Graphics g; - try - { - //Check for missing GDI+, then use WPF istead. - var b = new Bitmap(1, 1); - g = Graphics.FromImage(b); - g.PageUnit = GraphicsUnit.Pixel; - } - catch - { - return; - } - foreach (var cell in this) { if (_worksheet.Column(cell.Start.Column).Hidden) //Issue 15338 continue; if (cell.Merge == true || cell.Style.WrapText) continue; - var fntID = styles.CellXfs[cell.StyleID].FontId; + var fntId = styles.CellXfs[cell.StyleID].FontId; Font f; - if (fontCache.ContainsKey(fntID)) + if (fontCache.ContainsKey(fntId)) { - f = fontCache[fntID]; + f = fontCache[fntId]; } else { - var fnt = styles.Fonts[fntID]; + var fnt = styles.Fonts[fntId]; fs = FontStyle.Regular; if (fnt.Bold) fs |= FontStyle.Bold; - if (fnt.UnderLine) fs |= FontStyle.Underline; - if (fnt.Italic) fs |= FontStyle.Italic; - if (fnt.Strike) fs |= FontStyle.Strikeout; - f = new Font(fnt.Name, fnt.Size, fs); - - fontCache.Add(fntID, f); + if (fnt.Italic) fs |= FontStyle.Italic; + td = TextDecorations.None; + if (fnt.UnderLine) td |= TextDecorations.Underline; + if (fnt.Strike) td |= TextDecorations.Strikeout; + f = SystemFonts.CreateFont(fnt.Name, CultureInfo.CurrentCulture, fnt.Size, fs); + fontCache.Add(fntId, f); } var ind = styles.CellXfs[cell.StyleID].Indent; var textForWidth = cell.TextForWidth; var t = textForWidth + (ind > 0 && !string.IsNullOrEmpty(textForWidth) ? new string('_', ind) : ""); if (t.Length > 32000) t = t.Substring(0, 32000); //Issue - var size = g.MeasureString(t, f, 10000, StringFormat.GenericDefault); + var size = TextMeasurer.Measure(t, new TextOptions(f)); double width; double r = styles.CellXfs[cell.StyleID].TextRotation; diff --git a/src/EPPlus/EPPlus/ExcelWorksheet.cs b/src/EPPlus/EPPlus/ExcelWorksheet.cs index 36647b83..d1e1ecbf 100644 --- a/src/EPPlus/EPPlus/ExcelWorksheet.cs +++ b/src/EPPlus/EPPlus/ExcelWorksheet.cs @@ -45,7 +45,7 @@ using OfficeOpenXml.Utils; using System; using System.Collections.Generic; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.IO; using System.Linq; @@ -53,6 +53,8 @@ using System.Text; using System.Text.RegularExpressions; using System.Xml; +using Magicodes.IE.EPPlus.SixLabors; +using SixLabors.ImageSharp.PixelFormats; namespace OfficeOpenXml { @@ -755,16 +757,16 @@ public Color TabColor string col = GetXmlNodeString(tabColorPath); if (col == "") { - return Color.Empty; + return Color.Transparent; } else { - return Color.FromArgb(int.Parse(col, System.Globalization.NumberStyles.AllowHexSpecifier)); + return Color.ParseHex(col); } } set { - SetXmlNodeString(tabColorPath, value.ToArgb().ToString("X")); + SetXmlNodeString(tabColorPath, value.ToArgbHex()); } } const string codeModuleNamePath = "d:sheetPr/@codeName"; diff --git a/src/EPPlus/EPPlus/ExcelWorksheets.cs b/src/EPPlus/EPPlus/ExcelWorksheets.cs index f8c3a6ff..0ca7f164 100644 --- a/src/EPPlus/EPPlus/ExcelWorksheets.cs +++ b/src/EPPlus/EPPlus/ExcelWorksheets.cs @@ -35,6 +35,7 @@ using OfficeOpenXml.Table.PivotTable; using OfficeOpenXml.Utils; using OfficeOpenXml.VBA; +using SixLabors.ImageSharp; using System; using System.Collections; using System.Collections.Generic; @@ -700,7 +701,7 @@ private void CopyDrawing(ExcelWorksheet Copy, ExcelWorksheet workSheet/*, Packag if (!workSheet.Workbook._package.Package.PartExists(uri)) { var picPart = workSheet.Workbook._package.Package.CreatePart(uri, pic.ContentType, CompressionLevel.None); - pic.Image.Save(picPart.GetStream(FileMode.Create, FileAccess.Write), ExcelPicture.GetImageFormat(pic.ContentType)); + pic.Image.Save(picPart.GetStream(FileMode.Create, FileAccess.Write), pic.ImageFormat); } var rel = part.CreateRelationship(UriHelper.GetRelativeUri(workSheet.WorksheetUri, uri), Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/image"); diff --git a/src/EPPlus/EPPlus/Magicodes.IE.EPPlus.csproj b/src/EPPlus/EPPlus/Magicodes.IE.EPPlus.csproj index ed572c9f..8fd11ae4 100644 --- a/src/EPPlus/EPPlus/Magicodes.IE.EPPlus.csproj +++ b/src/EPPlus/EPPlus/Magicodes.IE.EPPlus.csproj @@ -1,76 +1,73 @@  - - - netstandard2.1;netstandard2.0; - true - true - OpenOfficeXml.snk - - - - - Core;STANDARD20 - + + + netstandard2.1;netstandard2.0; + true + true + OpenOfficeXml.snk + + - - Core - + + Core;STANDARD20 + - - bin\$(Configuration)\$(TargetFramework)\EPPlus.xml - + + Core + - - 1591 - true - + + bin\$(Configuration)\$(TargetFramework)\EPPlus.xml + - - true - + + 1591 + true + - - true - + + true + - - true - + + true + - - - + + true + - - - - - 4.7.0 - - - - - - - - - - - - - - 5.0.2 - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/EPPlus/EPPlus/SixLabors/ColorExtensions.cs b/src/EPPlus/EPPlus/SixLabors/ColorExtensions.cs new file mode 100644 index 00000000..6e3ea9cc --- /dev/null +++ b/src/EPPlus/EPPlus/SixLabors/ColorExtensions.cs @@ -0,0 +1,14 @@ +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; + +namespace Magicodes.IE.EPPlus.SixLabors +{ + internal static class ColorExtensions + { + public static string ToArgbHex(this Color color) + { + var rgba = color.ToPixel(); + return rgba.A.ToString("X2") + rgba.R.ToString("X2") + rgba.G.ToString("X2") + rgba.B.ToString("X2"); + } + } +} \ No newline at end of file diff --git a/src/EPPlus/EPPlus/Sparkline/ExcelSparklineColor.cs b/src/EPPlus/EPPlus/Sparkline/ExcelSparklineColor.cs index 46c3d8eb..453d72c9 100644 --- a/src/EPPlus/EPPlus/Sparkline/ExcelSparklineColor.cs +++ b/src/EPPlus/EPPlus/Sparkline/ExcelSparklineColor.cs @@ -1,8 +1,9 @@ using OfficeOpenXml.Style; using System; -using System.Drawing; using System.Globalization; using System.Xml; +using Magicodes.IE.EPPlus.SixLabors; +using SixLabors.ImageSharp; namespace OfficeOpenXml.Sparkline { @@ -69,7 +70,7 @@ public decimal Tint /// The color public void SetColor(Color color) { - Rgb = color.ToArgb().ToString("X"); + Rgb = color.ToArgbHex(); } } } diff --git a/src/EPPlus/EPPlus/Style/Dxf/DxfStyleBase.cs b/src/EPPlus/EPPlus/Style/Dxf/DxfStyleBase.cs index d9ae8ce6..6e48d390 100644 --- a/src/EPPlus/EPPlus/Style/Dxf/DxfStyleBase.cs +++ b/src/EPPlus/EPPlus/Style/Dxf/DxfStyleBase.cs @@ -1,5 +1,6 @@ using System; using System.Globalization; +using Magicodes.IE.EPPlus.SixLabors; namespace OfficeOpenXml.Style.Dxf { @@ -21,7 +22,7 @@ protected void SetValueColor(XmlHelper helper, string path, ExcelDxfColor color) { if (color.Color != null) { - SetValue(helper, path + "/@rgb", color.Color.Value.ToArgb().ToString("x")); + SetValue(helper, path + "/@rgb", color.Color.Value.ToArgbHex()); } else if (color.Auto != null) { diff --git a/src/EPPlus/EPPlus/Style/Dxf/ExcelDxfColor.cs b/src/EPPlus/EPPlus/Style/Dxf/ExcelDxfColor.cs index b545ee31..028f8b02 100644 --- a/src/EPPlus/EPPlus/Style/Dxf/ExcelDxfColor.cs +++ b/src/EPPlus/EPPlus/Style/Dxf/ExcelDxfColor.cs @@ -1,5 +1,6 @@ using System; -using System.Drawing; +using Magicodes.IE.EPPlus.SixLabors; +using SixLabors.ImageSharp; namespace OfficeOpenXml.Style.Dxf { @@ -17,7 +18,7 @@ public ExcelDxfColor(ExcelStyles styles) : base(styles) public Color? Color { get; set; } protected internal override string Id { - get { return GetAsString(Theme) + "|" + GetAsString(Index) + "|" + GetAsString(Auto) + "|" + GetAsString(Tint) + "|" + GetAsString(Color == null ? "" : ((Color)Color.Value).ToArgb().ToString("x")); } + get { return GetAsString(Theme) + "|" + GetAsString(Index) + "|" + GetAsString(Auto) + "|" + GetAsString(Tint) + "|" + GetAsString(Color == null ? "" : ((Color)Color.Value).ToArgbHex()); } } protected internal override ExcelDxfColor Clone() { diff --git a/src/EPPlus/EPPlus/Style/Dxf/ExcelDxfStyle.cs b/src/EPPlus/EPPlus/Style/Dxf/ExcelDxfStyle.cs index 0a2c9db0..2e4059a8 100644 --- a/src/EPPlus/EPPlus/Style/Dxf/ExcelDxfStyle.cs +++ b/src/EPPlus/EPPlus/Style/Dxf/ExcelDxfStyle.cs @@ -1,5 +1,5 @@ using System; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.Xml; @@ -87,10 +87,10 @@ private ExcelDxfColor GetColor(XmlHelperInstance helper, string path) string rgb = helper.GetXmlNodeString(path + "/@rgb"); if (rgb != "") { - ret.Color = Color.FromArgb(int.Parse(rgb.Substring(0, 2), System.Globalization.NumberStyles.AllowHexSpecifier), - int.Parse(rgb.Substring(2, 2), System.Globalization.NumberStyles.AllowHexSpecifier), - int.Parse(rgb.Substring(4, 2), System.Globalization.NumberStyles.AllowHexSpecifier), - int.Parse(rgb.Substring(6, 2), System.Globalization.NumberStyles.AllowHexSpecifier)); + ret.Color = Color.FromRgba(byte.Parse(rgb.Substring(0, 2), System.Globalization.NumberStyles.AllowHexSpecifier), + byte.Parse(rgb.Substring(2, 2), System.Globalization.NumberStyles.AllowHexSpecifier), + byte.Parse(rgb.Substring(4, 2), System.Globalization.NumberStyles.AllowHexSpecifier), + byte.Parse(rgb.Substring(6, 2), System.Globalization.NumberStyles.AllowHexSpecifier)); } ret.Auto = helper.GetXmlNodeBoolNullable(path + "/@auto"); ret.Tint = helper.GetXmlNodeDoubleNull(path + "/@tint"); diff --git a/src/EPPlus/EPPlus/Style/ExcelColor.cs b/src/EPPlus/EPPlus/Style/ExcelColor.cs index c2d13f69..f018cd2e 100644 --- a/src/EPPlus/EPPlus/Style/ExcelColor.cs +++ b/src/EPPlus/EPPlus/Style/ExcelColor.cs @@ -31,7 +31,8 @@ *******************************************************************************/ using OfficeOpenXml.Style.XmlAccess; using System; -using System.Drawing; +using Magicodes.IE.EPPlus.SixLabors; +using SixLabors.ImageSharp; namespace OfficeOpenXml.Style { @@ -110,7 +111,7 @@ public int Indexed /// The color public void SetColor(Color color) { - Rgb = color.ToArgb().ToString("X"); + Rgb = color.ToArgbHex(); } /// /// Set the color of the object diff --git a/src/EPPlus/EPPlus/Style/ExcelFont.cs b/src/EPPlus/EPPlus/Style/ExcelFont.cs index f34a7aab..b6e9bdc1 100644 --- a/src/EPPlus/EPPlus/Style/ExcelFont.cs +++ b/src/EPPlus/EPPlus/Style/ExcelFont.cs @@ -29,8 +29,10 @@ * Jan Källman Initial Release 2009-10-01 * Jan Källman License changed GPL-->LGPL 2011-12-16 *******************************************************************************/ + using System; -using System.Drawing; +using SixLabors.ImageSharp; +using SixLabors.Fonts; namespace OfficeOpenXml.Style { @@ -39,129 +41,119 @@ namespace OfficeOpenXml.Style /// public sealed class ExcelFont : StyleBase { - internal ExcelFont(ExcelStyles styles, OfficeOpenXml.XmlHelper.ChangedEventHandler ChangedEvent, int PositionID, string address, int index) : + internal ExcelFont(ExcelStyles styles, OfficeOpenXml.XmlHelper.ChangedEventHandler ChangedEvent, int PositionID, + string address, int index) : base(styles, ChangedEvent, PositionID, address) { Index = index; } + /// /// The name of the font /// public string Name { - get - { - return _styles.Fonts[Index].Name; - } + get { return _styles.Fonts[Index].Name; } set { - _ChangedEvent(this, new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.Name, value, _positionID, _address)); + _ChangedEvent(this, + new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.Name, value, _positionID, _address)); } } + /// /// The Size of the font /// public float Size { - get - { - return _styles.Fonts[Index].Size; - } + get { return _styles.Fonts[Index].Size; } set { - _ChangedEvent(this, new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.Size, value, _positionID, _address)); + _ChangedEvent(this, + new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.Size, value, _positionID, _address)); } } + /// /// Font family /// public int Family { - get - { - return _styles.Fonts[Index].Family; - } + get { return _styles.Fonts[Index].Family; } set { - _ChangedEvent(this, new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.Family, value, _positionID, _address)); + _ChangedEvent(this, + new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.Family, value, _positionID, _address)); } } + /// /// Cell color /// public ExcelColor Color { - get - { - return new ExcelColor(_styles, _ChangedEvent, _positionID, _address, eStyleClass.Font, this); - } + get { return new ExcelColor(_styles, _ChangedEvent, _positionID, _address, eStyleClass.Font, this); } } + /// /// Scheme /// public string Scheme { - get - { - return _styles.Fonts[Index].Scheme; - } + get { return _styles.Fonts[Index].Scheme; } set { - _ChangedEvent(this, new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.Scheme, value, _positionID, _address)); + _ChangedEvent(this, + new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.Scheme, value, _positionID, _address)); } } + /// /// Font-bold /// public bool Bold { - get - { - return _styles.Fonts[Index].Bold; - } + get { return _styles.Fonts[Index].Bold; } set { - _ChangedEvent(this, new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.Bold, value, _positionID, _address)); + _ChangedEvent(this, + new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.Bold, value, _positionID, _address)); } } + /// /// Font-italic /// public bool Italic { - get - { - return _styles.Fonts[Index].Italic; - } + get { return _styles.Fonts[Index].Italic; } set { - _ChangedEvent(this, new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.Italic, value, _positionID, _address)); + _ChangedEvent(this, + new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.Italic, value, _positionID, _address)); } } + /// /// Font-Strikeout /// public bool Strike { - get - { - return _styles.Fonts[Index].Strike; - } + get { return _styles.Fonts[Index].Strike; } set { - _ChangedEvent(this, new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.Strike, value, _positionID, _address)); + _ChangedEvent(this, + new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.Strike, value, _positionID, _address)); } } + /// /// Font-Underline /// public bool UnderLine { - get - { - return _styles.Fonts[Index].UnderLine; - } + get { return _styles.Fonts[Index].UnderLine; } set { if (value) @@ -175,17 +167,18 @@ public bool UnderLine //_ChangedEvent(this, new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.UnderlineType, value, _positionID, _address)); } } + public ExcelUnderLineType UnderLineType { - get - { - return _styles.Fonts[Index].UnderLineType; - } + get { return _styles.Fonts[Index].UnderLineType; } set { - _ChangedEvent(this, new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.UnderlineType, value, _positionID, _address)); + _ChangedEvent(this, + new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.UnderlineType, value, _positionID, + _address)); } } + /// /// Font-Vertical Align /// @@ -199,35 +192,39 @@ public ExcelVerticalAlignmentFont VerticalAlign } else { - return (ExcelVerticalAlignmentFont)Enum.Parse(typeof(ExcelVerticalAlignmentFont), _styles.Fonts[Index].VerticalAlign, true); + return (ExcelVerticalAlignmentFont)Enum.Parse(typeof(ExcelVerticalAlignmentFont), + _styles.Fonts[Index].VerticalAlign, true); } } set { - _ChangedEvent(this, new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.VerticalAlign, value, _positionID, _address)); + _ChangedEvent(this, + new StyleChangeEventArgs(eStyleClass.Font, eStyleProperty.VerticalAlign, value, _positionID, + _address)); } } + /// /// Set the font from a Font object /// - /// - public void SetFromFont(Font Font) + /// + public void SetFromTextRun(TextRun textRun) { - Name = Font.Name; - //Family=fnt.FontFamily.; - Size = (int)Font.Size; - Strike = Font.Strikeout; - Bold = Font.Bold; - UnderLine = Font.Underline; - Italic = Font.Italic; + var font = textRun.Font; + Size = font.Size; + Bold = font.IsBold; + Italic = font.IsItalic; + UnderLine = (textRun.TextDecorations & TextDecorations.Underline) != 0; + Strike = (textRun.TextDecorations & TextDecorations.Strikeout) != 0; } internal override string Id { get { - return Name + Size.ToString() + Family.ToString() + Scheme.ToString() + Bold.ToString()[0] + Italic.ToString()[0] + Strike.ToString()[0] + UnderLine.ToString()[0] + VerticalAlign; + return Name + Size.ToString() + Family.ToString() + Scheme.ToString() + Bold.ToString()[0] + + Italic.ToString()[0] + Strike.ToString()[0] + UnderLine.ToString()[0] + VerticalAlign; } } } -} +} \ No newline at end of file diff --git a/src/EPPlus/EPPlus/Style/ExcelRichText.cs b/src/EPPlus/EPPlus/Style/ExcelRichText.cs index efdb776e..4c2c0469 100644 --- a/src/EPPlus/EPPlus/Style/ExcelRichText.cs +++ b/src/EPPlus/EPPlus/Style/ExcelRichText.cs @@ -32,9 +32,11 @@ * Richard Tallent Remove VertAlign node if no alignment specified 2012-10-31 *******************************************************************************/ using System; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.Xml; +using Magicodes.IE.EPPlus.SixLabors; +using SixLabors.ImageSharp.PixelFormats; namespace OfficeOpenXml.Style { @@ -297,17 +299,18 @@ public Color Color string col = GetXmlNodeString(COLOR_PATH); if (col == "") { - return Color.Empty; + return Color.Transparent; } else { - return Color.FromArgb(int.Parse(col, System.Globalization.NumberStyles.AllowHexSpecifier)); + var argb32 = new Argb32(uint.Parse(col, NumberStyles.AllowHexSpecifier)); + return Color.FromRgba(argb32.R, argb32.G, argb32.B, argb32.A); } } set { _collection.ConvertRichtext(); - SetXmlNodeString(COLOR_PATH, value.ToArgb().ToString("X")/*.Substring(2, 6)*/); + SetXmlNodeString(COLOR_PATH, value.ToArgbHex()/*.Substring(2, 6)*/); if (_callback != null) _callback(); } } diff --git a/src/EPPlus/EPPlus/Style/ExcelRichTextCollection.cs b/src/EPPlus/EPPlus/Style/ExcelRichTextCollection.cs index 12c9d633..34992041 100644 --- a/src/EPPlus/EPPlus/Style/ExcelRichTextCollection.cs +++ b/src/EPPlus/EPPlus/Style/ExcelRichTextCollection.cs @@ -29,12 +29,14 @@ * Jan Källman Initial Release 2009-10-01 * Jan Källman License changed GPL-->LGPL 2011-12-16 *******************************************************************************/ + using System.Collections.Generic; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.Linq; using System.Text; using System.Xml; +using SixLabors.ImageSharp.PixelFormats; namespace OfficeOpenXml.Style { @@ -45,6 +47,7 @@ public class ExcelRichTextCollection : XmlHelper, IEnumerable { List _list = new List(); ExcelRangeBase _cells = null; + internal ExcelRichTextCollection(XmlNamespaceManager ns, XmlNode topNode) : base(ns, topNode) { @@ -57,11 +60,13 @@ internal ExcelRichTextCollection(XmlNamespaceManager ns, XmlNode topNode) : } } } + internal ExcelRichTextCollection(XmlNamespaceManager ns, XmlNode topNode, ExcelRangeBase cells) : this(ns, topNode) { _cells = cells; } + /// /// Collection containing the richtext objects /// @@ -76,16 +81,15 @@ public ExcelRichText this[int Index] return item; } } + /// /// Items in the list /// public int Count { - get - { - return _list.Count; - } + get { return _list.Count; } } + /// /// Add a rich text string /// @@ -114,6 +118,7 @@ public ExcelRichText Insert(int index, string text) { doc = TopNode.OwnerDocument; } + var node = doc.CreateElement("d", "r", ExcelPackage.schemaMain); if (index < _list.Count) { @@ -123,13 +128,14 @@ public ExcelRichText Insert(int index, string text) { TopNode.AppendChild(node); } + var rt = new ExcelRichText(NameSpaceManager, node, this); if (_list.Count > 0) { ExcelRichText prevItem = _list[index < _list.Count ? index : _list.Count - 1]; rt.FontName = prevItem.FontName; rt.Size = prevItem.Size; - if (prevItem.Color.IsEmpty) + if (prevItem.Color.Equals(Color.Transparent)) { rt.Color = Color.Black; } @@ -137,6 +143,7 @@ public ExcelRichText Insert(int index, string text) { rt.Color = prevItem.Color; } + rt.PreserveSpace = rt.PreserveSpace; rt.Bold = prevItem.Bold; rt.Italic = prevItem.Italic; @@ -156,6 +163,7 @@ public ExcelRichText Insert(int index, string text) rt.Italic = style.Font.Italic; _cells.IsRichText = true; } + rt.Text = text; rt.PreserveSpace = true; if (_cells != null) @@ -163,6 +171,7 @@ public ExcelRichText Insert(int index, string text) rt.SetCallback(UpdateCells); UpdateCells(); } + _list.Insert(index, rt); return rt; } @@ -171,12 +180,14 @@ internal void ConvertRichtext() { if (_cells == null) return; var isRt = _cells.Worksheet._flags.GetFlagValue(_cells._fromRow, _cells._fromCol, CellFlags.RichText); + uint hex; if (Count == 1 && isRt == false) { _cells.Worksheet._flags.SetFlagValue(_cells._fromRow, _cells._fromCol, true, CellFlags.RichText); var s = _cells.Worksheet.GetStyleInner(_cells._fromRow, _cells._fromCol); //var fnt = cell.Style.Font; - var fnt = _cells.Worksheet.Workbook.Styles.GetStyleObject(s, _cells.Worksheet.PositionID, ExcelAddressBase.GetAddress(_cells._fromRow, _cells._fromCol)).Font; + var fnt = _cells.Worksheet.Workbook.Styles.GetStyleObject(s, _cells.Worksheet.PositionID, + ExcelAddressBase.GetAddress(_cells._fromRow, _cells._fromCol)).Font; this[0].PreserveSpace = true; this[0].Bold = fnt.Bold; this[0].FontName = fnt.Name; @@ -184,17 +195,19 @@ internal void ConvertRichtext() this[0].Size = fnt.Size; this[0].UnderLine = fnt.UnderLine; - int hex; - if (fnt.Color.Rgb != "" && int.TryParse(fnt.Color.Rgb, NumberStyles.HexNumber, null, out hex)) + if (fnt.Color.Rgb != "" && uint.TryParse(fnt.Color.Rgb, NumberStyles.HexNumber, null, out hex)) { - this[0].Color = Color.FromArgb(hex); + var argb32 = new Argb32(hex); + this[0].Color = Color.FromRgba(argb32.R, argb32.G, argb32.B, argb32.A); } } } + internal void UpdateCells() { _cells.SetValueRichText(TopNode.InnerXml); } + /// /// Clear the collection /// @@ -205,6 +218,7 @@ public void Clear() UpdateCells(); if (_cells != null) _cells.IsRichText = false; } + /// /// Removes an item at the specific index /// @@ -215,6 +229,7 @@ public void RemoveAt(int Index) _list.RemoveAt(Index); if (_cells != null && _list.Count == 0) _cells.IsRichText = false; } + /// /// Removes an item /// @@ -242,6 +257,7 @@ public string Text { sb.Append(item.Text); } + return sb.ToString(); } set @@ -260,11 +276,16 @@ public string Text } } } + #region IEnumerable Members IEnumerator IEnumerable.GetEnumerator() { - return _list.Select(x => { x.SetCallback(UpdateCells); return x; }).GetEnumerator(); + return _list.Select(x => + { + x.SetCallback(UpdateCells); + return x; + }).GetEnumerator(); } #endregion @@ -273,9 +294,13 @@ IEnumerator IEnumerable.GetEnumerator() System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { - return _list.Select(x => { x.SetCallback(UpdateCells); return x; }).GetEnumerator(); + return _list.Select(x => + { + x.SetCallback(UpdateCells); + return x; + }).GetEnumerator(); } #endregion } -} +} \ No newline at end of file diff --git a/src/EPPlus/EPPlus/Style/ExcelTextFont.cs b/src/EPPlus/EPPlus/Style/ExcelTextFont.cs index 5258cf97..c0933ca4 100644 --- a/src/EPPlus/EPPlus/Style/ExcelTextFont.cs +++ b/src/EPPlus/EPPlus/Style/ExcelTextFont.cs @@ -30,9 +30,12 @@ * Jan Källman License changed GPL-->LGPL 2011-12-16 *******************************************************************************/ using System; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.Xml; +using Magicodes.IE.EPPlus.SixLabors; +using SixLabors.Fonts; +using SixLabors.ImageSharp.PixelFormats; namespace OfficeOpenXml.Style { @@ -160,17 +163,18 @@ public Color UnderLineColor string col = GetXmlNodeString(_underLineColorPath); if (col == "") { - return Color.Empty; + return Color.Transparent; } else { - return Color.FromArgb(int.Parse(col, System.Globalization.NumberStyles.AllowHexSpecifier)); + var argb32 = new Argb32(uint.Parse(col, NumberStyles.AllowHexSpecifier)); + return Color.FromRgba(argb32.R, argb32.G, argb32.B, argb32.A); } } set { CreateTopNode(); - SetXmlNodeString(_underLineColorPath, value.ToArgb().ToString("X").Substring(2, 6)); + SetXmlNodeString(_underLineColorPath, value.ToArgbHex()/*.Substring(2)*/); } } string _italicPath = "@i"; @@ -220,17 +224,18 @@ public Color Color string col = GetXmlNodeString(_colorPath); if (col == "") { - return Color.Empty; + return Color.Transparent; } else { - return Color.FromArgb(int.Parse(col, System.Globalization.NumberStyles.AllowHexSpecifier)); + var argb32 = new Argb32(uint.Parse(col, NumberStyles.AllowHexSpecifier)); + return Color.FromRgba(argb32.R, argb32.G, argb32.B, argb32.A); } } set { CreateTopNode(); - SetXmlNodeString(_colorPath, value.ToArgb().ToString("X").Substring(2, 6)); + SetXmlNodeString(_colorPath, value.ToArgbHex()/*.Substring(2)*/); } } #region "Translate methods" @@ -287,18 +292,19 @@ private string TranslateStrikeText(eStrikeType value) } #endregion /// - /// Set the font style from a font object + /// Set the font style from a textRun object /// - /// - public void SetFromFont(Font Font) + /// + public void SetFromTextRun(TextRun textRun) { - LatinFont = Font.Name; - ComplexFont = Font.Name; - Size = Font.Size; - if (Font.Bold) Bold = Font.Bold; - if (Font.Italic) Italic = Font.Italic; - if (Font.Underline) UnderLine = eUnderLineType.Single; - if (Font.Strikeout) Strike = eStrikeType.Single; + var font = textRun.Font; + LatinFont = font.Name; + ComplexFont = font.Name; + Size = font.Size; + if (font.IsBold) Bold = font.IsBold; + if (font.IsItalic) Italic = font.IsItalic; + if ((textRun.TextDecorations & TextDecorations.Underline) != 0) UnderLine = eUnderLineType.Single; + if ((textRun.TextDecorations & TextDecorations.Strikeout) != 0) Strike = eStrikeType.Single; } } } diff --git a/src/EPPlus/EPPlus/Style/IColor.cs b/src/EPPlus/EPPlus/Style/IColor.cs index 68db0afd..b3077e3d 100644 --- a/src/EPPlus/EPPlus/Style/IColor.cs +++ b/src/EPPlus/EPPlus/Style/IColor.cs @@ -1,4 +1,4 @@ -using System.Drawing; +using SixLabors.ImageSharp; namespace OfficeOpenXml.Style { diff --git a/src/EPPlus/EPPlus/Style/XmlAccess/ExcelColorXml.cs b/src/EPPlus/EPPlus/Style/XmlAccess/ExcelColorXml.cs index 4419edfb..65544159 100644 --- a/src/EPPlus/EPPlus/Style/XmlAccess/ExcelColorXml.cs +++ b/src/EPPlus/EPPlus/Style/XmlAccess/ExcelColorXml.cs @@ -32,6 +32,9 @@ using System; using System.Globalization; using System.Xml; +using Magicodes.IE.EPPlus.SixLabors; +using SixLabors.ImageSharp; + namespace OfficeOpenXml.Style.XmlAccess { /// @@ -168,10 +171,10 @@ internal void Clear() _rgb = ""; _auto = false; } - public void SetColor(System.Drawing.Color color) + public void SetColor(Color color) { Clear(); - _rgb = color.ToArgb().ToString("X"); + _rgb = color.ToArgbHex(); } internal ExcelColorXml Copy() diff --git a/src/EPPlus/EPPlus/Style/XmlAccess/ExcelFontXml.cs b/src/EPPlus/EPPlus/Style/XmlAccess/ExcelFontXml.cs index bf9e72a6..f5a03101 100644 --- a/src/EPPlus/EPPlus/Style/XmlAccess/ExcelFontXml.cs +++ b/src/EPPlus/EPPlus/Style/XmlAccess/ExcelFontXml.cs @@ -30,9 +30,11 @@ * Jan Källman License changed GPL-->LGPL 2011-12-16 *******************************************************************************/ using System; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.Xml; +using SixLabors.Fonts; + namespace OfficeOpenXml.Style.XmlAccess { /// @@ -267,15 +269,14 @@ public string VerticalAlign _verticalAlign = value; } } - public void SetFromFont(System.Drawing.Font Font) + public void SetFromTextRun(TextRun textRun) { - Name = Font.Name; - //Family=fnt.FontFamily.; - Size = (int)Font.Size; - Strike = Font.Strikeout; - Bold = Font.Bold; - UnderLine = Font.Underline; - Italic = Font.Italic; + var font = textRun.Font; + Size = font.Size; + Bold = font.IsBold; + Italic = font.IsItalic; + UnderLine = (textRun.TextDecorations & TextDecorations.Underline) != 0; + Strike = (textRun.TextDecorations & TextDecorations.Strikeout) != 0; } public static float GetFontHeight(string name, float size) { diff --git a/src/EPPlus/EPPlus/Style/XmlAccess/ExcelXfsXml.cs b/src/EPPlus/EPPlus/Style/XmlAccess/ExcelXfsXml.cs index e6f3102f..c6f87b26 100644 --- a/src/EPPlus/EPPlus/Style/XmlAccess/ExcelXfsXml.cs +++ b/src/EPPlus/EPPlus/Style/XmlAccess/ExcelXfsXml.cs @@ -30,7 +30,7 @@ * Jan Källman License changed GPL-->LGPL 2011-12-16 *******************************************************************************/ using System; -using System.Drawing; +using SixLabors.ImageSharp; using System.Globalization; using System.Xml; namespace OfficeOpenXml.Style.XmlAccess @@ -690,7 +690,7 @@ private int GetIdGradientFill(eStyleClass styleClass, eStyleProperty styleProper { fill = new ExcelGradientFillXml(Fill.NameSpaceManager); fill.GradientColor1.SetColor(Color.White); - fill.GradientColor2.SetColor(Color.FromArgb(79, 129, 189)); + fill.GradientColor2.SetColor(Color.FromRgb(79, 129, 189)); fill.Type = ExcelFillGradientType.Linear; fill.Degree = 90; fill.Top = double.NaN; diff --git a/src/EPPlus/EPPlusTest/CellStoreTest.cs b/src/EPPlus/EPPlusTest/CellStoreTest.cs index bdccd0e0..4a972d5d 100644 --- a/src/EPPlus/EPPlusTest/CellStoreTest.cs +++ b/src/EPPlus/EPPlusTest/CellStoreTest.cs @@ -1,5 +1,5 @@ using System; -using System.Drawing; +using SixLabors.ImageSharp; using Microsoft.VisualStudio.TestTools.UnitTesting; using OfficeOpenXml; using OfficeOpenXml.Style; @@ -199,7 +199,7 @@ public void Issues351() worksheet.Cells[1026, 2].Value = "B"; var range = worksheet.Row(1026); range.Style.Fill.PatternType = ExcelFillStyle.Solid; - range.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(255, 255, 0)); + range.Style.Fill.BackgroundColor.SetColor(Color.FromRgb(255, 255, 0)); // Act - This should shift the whole row 1026 down 1 worksheet.InsertRow(1024, 1); diff --git a/src/EPPlus/EPPlusTest/CompoundDoc.cs b/src/EPPlus/EPPlusTest/CompoundDoc.cs index c1f5891c..b9f2238c 100644 --- a/src/EPPlus/EPPlusTest/CompoundDoc.cs +++ b/src/EPPlus/EPPlusTest/CompoundDoc.cs @@ -7,7 +7,7 @@ using OfficeOpenXml; using OfficeOpenXml.Utils.CompundDocument; using OfficeOpenXml.Style; -using System.Drawing; +using SixLabors.ImageSharp; using System.Linq; namespace EPPlusTest diff --git a/src/EPPlus/EPPlusTest/ConditionalFormatting/ConditionalFormatting.cs b/src/EPPlus/EPPlusTest/ConditionalFormatting/ConditionalFormatting.cs index 6841cde7..c8eebff9 100644 --- a/src/EPPlus/EPPlusTest/ConditionalFormatting/ConditionalFormatting.cs +++ b/src/EPPlus/EPPlusTest/ConditionalFormatting/ConditionalFormatting.cs @@ -7,7 +7,7 @@ using OfficeOpenXml.ConditionalFormatting; using System.IO; using OfficeOpenXml.ConditionalFormatting.Contracts; -using System.Drawing; +using SixLabors.ImageSharp; namespace EPPlusTest { diff --git a/src/EPPlus/EPPlusTest/DTS_FailingTests.cs b/src/EPPlus/EPPlusTest/DTS_FailingTests.cs index 499b27ba..250837da 100644 --- a/src/EPPlus/EPPlusTest/DTS_FailingTests.cs +++ b/src/EPPlus/EPPlusTest/DTS_FailingTests.cs @@ -1,10 +1,8 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using OfficeOpenXml; -using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; +using System.Reflection; +using SixLabors.ImageSharp; namespace EPPlusTest { @@ -18,8 +16,11 @@ public void DeleteWorksheetWithReferencedImage() var ms = new MemoryStream(); using (var pck = new ExcelPackage()) { + var assembly = Assembly.GetExecutingAssembly(); + var stream = assembly.GetManifestResourceStream(@"Resources\Test1.jpg"); + var image = Image.Load(stream, out var format); var ws = pck.Workbook.Worksheets.Add("original"); - ws.Drawings.AddPicture("Pic1", Properties.Resources.Test1); + ws.Drawings.AddPicture("Pic1", image, format); pck.Workbook.Worksheets.Copy("original", "copy"); pck.SaveAs(ms); } @@ -38,8 +39,11 @@ public void CopyAndDeleteWorksheetWithImage() { using (var pck = new ExcelPackage(new MemoryStream())) { + var assembly = Assembly.GetExecutingAssembly(); + var stream = assembly.GetManifestResourceStream(@"Resources\Test1.jpg"); + var image = Image.Load(stream, out var format); var ws = pck.Workbook.Worksheets.Add("original"); - ws.Drawings.AddPicture("Pic1", Properties.Resources.Test1); + ws.Drawings.AddPicture("Pic1", image, format); pck.Workbook.Worksheets.Copy("original", "copy"); pck.Workbook.Worksheets.Delete(ws); pck.Save(); diff --git a/src/EPPlus/EPPlusTest/DrawingTest.cs b/src/EPPlus/EPPlusTest/DrawingTest.cs index f4108e97..96df9ed6 100644 --- a/src/EPPlus/EPPlusTest/DrawingTest.cs +++ b/src/EPPlus/EPPlusTest/DrawingTest.cs @@ -1,15 +1,15 @@ using System; -using System.Drawing; +using System.Globalization; using System.IO; +using System.Reflection; using System.Xml; -using EPPlusTest.Properties; using Microsoft.VisualStudio.TestTools.UnitTesting; using OfficeOpenXml; using OfficeOpenXml.Drawing; using OfficeOpenXml.Drawing.Chart; using OfficeOpenXml.Style; -using System.Diagnostics; -using System.Reflection; +using SixLabors.Fonts; +using SixLabors.ImageSharp; namespace EPPlusTest { @@ -43,12 +43,13 @@ public void RunDrawingTests() DrawingRowheightDynamic(); DrawingSizingAndPositioning(); DeleteDrawing(); - + SaveWorksheet("Drawing.xlsx"); ReadDocument(); ReadDrawing(); } + //[TestMethod] //[Ignore] public void ReadDrawing() @@ -64,13 +65,16 @@ public void ReadDrawing() Assert.AreEqual(cht.Title.Text, "Test"); } } - + public void Picture() - { + { + var assembly = Assembly.GetExecutingAssembly(); + var stream = assembly.GetManifestResourceStream(@"Resources\Test1.jpg"); + var image = Image.Load(stream, out var format); var ws = _pck.Workbook.Worksheets.Add("Picture"); - var pic = ws.Drawings.AddPicture("Pic1", Resources.Test1); + var pic = ws.Drawings.AddPicture("Pic1", image, format); - pic = ws.Drawings.AddPicture("Pic2", Resources.Test1); + pic = ws.Drawings.AddPicture("Pic2", image, format); pic.SetPosition(150, 200); pic.Border.LineStyle = eLineStyle.Solid; pic.Border.Fill.Color = Color.DarkCyan; @@ -78,12 +82,12 @@ public void Picture() pic.Fill.Color = Color.White; pic.Fill.Transparancy = 50; - pic = ws.Drawings.AddPicture("Pic3", Resources.Test1); + pic = ws.Drawings.AddPicture("Pic3", image, format); pic.SetPosition(400, 200); pic.SetSize(150); //pic = ws.Drawings.AddPicture("Pic4", new FileInfo(Path.Combine(_clipartPath, "Vector Drawing.wmf"))); - pic = ws.Drawings.AddPicture("Pic5", new FileInfo(Path.Combine(_clipartPath,"BitmapImage.gif"))); + pic = ws.Drawings.AddPicture("Pic5", new FileInfo(Path.Combine(_clipartPath, "BitmapImage.gif"))); pic.SetPosition(400, 200); pic.SetSize(150); @@ -94,9 +98,9 @@ public void Picture() pic.SetPosition(400, 400); pic.SetSize(100); - pic = ws.Drawings.AddPicture("PicPixelSized", Resources.Test1); + pic = ws.Drawings.AddPicture("PicPixelSized", image, format); pic.SetPosition(800, 800); - pic.SetSize(568*2, 66*2); + pic.SetSize(568 * 2, 66 * 2); var ws2 = _pck.Workbook.Worksheets.Add("Picture2"); var fi = new FileInfo(Path.Combine(_clipartPath, "BitmapImage.gif")); if (fi.Exists) @@ -112,34 +116,38 @@ public void Picture() var wsCopy = _pck.Workbook.Worksheets.Add("Picture3", ws2); //_pck.Workbook.Worksheets.Delete(ws2); - } - //[TestMethod] - //[Ignore] - public void DrawingSizingAndPositioning() - { - var ws = _pck.Workbook.Worksheets.Add("DrawingPosSize"); + } + + //[TestMethod] + //[Ignore] + public void DrawingSizingAndPositioning() + { + var ws = _pck.Workbook.Worksheets.Add("DrawingPosSize"); + var assembly = Assembly.GetExecutingAssembly(); + var stream = assembly.GetManifestResourceStream(@"Resources\Test1.jpg"); + var image = Image.Load(stream, out var format); - var pic = ws.Drawings.AddPicture("Pic1", Resources.Test1); - pic.SetPosition(1, 0, 1, 0); + var pic = ws.Drawings.AddPicture("Pic1", image, format); + pic.SetPosition(1, 0, 1, 0); - pic = ws.Drawings.AddPicture("Pic2", Resources.Test1); - pic.EditAs = eEditAs.Absolute; - pic.SetPosition(10, 5, 1, 4); + pic = ws.Drawings.AddPicture("Pic2", image, format); + pic.EditAs = eEditAs.Absolute; + pic.SetPosition(10, 5, 1, 4); - pic = ws.Drawings.AddPicture("Pic3", Resources.Test1); - pic.EditAs = eEditAs.TwoCell; - pic.SetPosition(20, 5, 2, 4); + pic = ws.Drawings.AddPicture("Pic3", image, format); + pic.EditAs = eEditAs.TwoCell; + pic.SetPosition(20, 5, 2, 4); - ws.Column(1).Width = 100; - ws.Column(3).Width = 100; - } + ws.Column(1).Width = 100; + ws.Column(3).Width = 100; + } //[TestMethod] // [Ignore] - public void BarChart() + public void BarChart() { - var ws = _pck.Workbook.Worksheets.Add("BarChart"); + var ws = _pck.Workbook.Worksheets.Add("BarChart"); var chrt = ws.Drawings.AddChart("barChart", eChartType.BarClustered) as ExcelBarChart; chrt.SetPosition(50, 50); chrt.SetSize(800, 300); @@ -198,13 +206,14 @@ private static void AddTestData(ExcelWorksheet ws) ws.Cells["X23"].Value = "ÿ"; ws.Cells["X24"].Value = "û"; } + //[TestMethod] //[Ignore] public void PieChart() { var ws = _pck.Workbook.Worksheets.Add("PieChart"); var chrt = ws.Drawings.AddChart("pieChart", eChartType.Pie) as ExcelPieChart; - + AddTestSerie(ws, chrt); chrt.To.Row = 25; @@ -218,6 +227,7 @@ public void PieChart() Assert.IsTrue(chrt.VaryColors); chrt.Title.Text = "Piechart"; } + public void PieOfChart() { var ws = _pck.Workbook.Worksheets.Add("PieOfChart"); @@ -235,6 +245,7 @@ public void PieOfChart() Assert.IsTrue(chrt.ChartType == eChartType.BarOfPie, "Invalid Charttype"); chrt.Title.Text = "Piechart"; } + //[TestMethod] //[Ignore] public void PieChart3D() @@ -253,8 +264,8 @@ public void PieChart3D() chrt.Title.RichText.Add("Pie RT Title add"); Assert.IsTrue(chrt.ChartType == eChartType.Pie3D, "Invalid Charttype"); Assert.IsTrue(chrt.VaryColors); - } + //[TestMethod] //[Ignore] public void Scatter() @@ -262,15 +273,15 @@ public void Scatter() var ws = _pck.Workbook.Worksheets.Add("Scatter"); var chrt = ws.Drawings.AddChart("ScatterChart1", eChartType.XYScatterSmoothNoMarkers) as ExcelScatterChart; AddTestSerie(ws, chrt); - // chrt.Series[0].Marker = eMarkerStyle.Diamond; + // chrt.Series[0].Marker = eMarkerStyle.Diamond; chrt.To.Row = 23; chrt.To.Column = 12; //chrt.Title.Text = "Header Text"; - var r1=chrt.Title.RichText.Add("Header"); + var r1 = chrt.Title.RichText.Add("Header"); r1.Bold = true; - var r2=chrt.Title.RichText.Add(" Text"); + var r2 = chrt.Title.RichText.Add(" Text"); r2.UnderLine = eUnderLineType.WavyHeavy; - + chrt.Title.Fill.Style = eFillStyle.SolidFill; chrt.Title.Fill.Color = Color.LightBlue; chrt.Title.Fill.Transparancy = 50; @@ -282,22 +293,26 @@ public void Scatter() ser.DataLabel.Fill.Color = Color.BlueViolet; ser.DataLabel.Font.Color = Color.White; ser.DataLabel.Font.Italic = true; - ser.DataLabel.Font.SetFromFont(new Font("bookman old style", 8)); + ser.DataLabel.Font.SetFromTextRun( + new TextRun + { + Font = SystemFonts.CreateFont("bookman old style", CultureInfo.CurrentCulture, 8) + }); Assert.IsTrue(chrt.ChartType == eChartType.XYScatterSmoothNoMarkers, "Invalid Charttype"); chrt.Series[0].Header = "Test serie"; chrt = ws.Drawings.AddChart("ScatterChart2", eChartType.XYScatterSmooth) as ExcelScatterChart; chrt.Series.Add("U19:U24", "V19:V24"); - + chrt.From.Column = 0; - chrt.From.Row=25; + chrt.From.Row = 25; chrt.To.Row = 53; chrt.To.Column = 12; chrt.Legend.Position = eLegendPosition.Bottom; - + ////chrt.Series[0].DataLabel.Position = eLabelPosition.Center; //Assert.IsTrue(chrt.ChartType == eChartType.XYScatter, "Invalid Charttype"); - } + //[TestMethod] //[Ignore] public void Bubble() @@ -325,9 +340,8 @@ public void Bubble() chrt.To.Row = 33; chrt.To.Column = 22; chrt.Title.Text = "Header Text"; - - } + //[TestMethod] //[Ignore] public void Radar() @@ -336,7 +350,7 @@ public void Radar() AddTestData(ws); var chrt = ws.Drawings.AddChart("Radar1", eChartType.Radar) as ExcelRadarChart; - var s=chrt.Series.Add("V19:V24", "U19:U24"); + var s = chrt.Series.Add("V19:V24", "U19:U24"); s.Header = "serie1"; // chrt.Series[0].Marker = eMarkerStyle.Diamond; chrt.From.Row = 23; @@ -368,6 +382,7 @@ public void Radar() chrt.To.Column = 22; chrt.Title.Text = "Radar Chart 3"; } + //[TestMethod] //[Ignore] public void Surface() @@ -409,6 +424,7 @@ public void Surface() //chrt.To.Column = 22; //chrt.Title.Text = "Radar Chart 3"; } + //[TestMethod] //[Ignore] public void Pyramid() @@ -421,12 +437,12 @@ public void Pyramid() chrt.To.Row = 23; chrt.To.Column = 12; chrt.Title.Text = "Header Text"; - chrt.Title.Fill.Style= eFillStyle.SolidFill; + chrt.Title.Fill.Style = eFillStyle.SolidFill; chrt.Title.Fill.Color = Color.DarkBlue; chrt.DataLabel.ShowValue = true; //chrt.DataLabel.ShowSeriesName = true; //chrt.DataLabel.Separator = ","; - chrt.Border.LineCap = eLineCap.Round; + chrt.Border.LineCap = eLineCap.Round; chrt.Border.LineStyle = eLineStyle.LongDashDotDot; chrt.Border.Fill.Style = eFillStyle.SolidFill; chrt.Border.Fill.Color = Color.Blue; @@ -449,10 +465,11 @@ public void Pyramid() chrt.DataLabel.Font.Bold = true; chrt.DataLabel.Fill.Color = Color.LightBlue; - chrt.DataLabel.Border.Fill.Style=eFillStyle.SolidFill; - chrt.DataLabel.Border.Fill.Color=Color.Black; + chrt.DataLabel.Border.Fill.Style = eFillStyle.SolidFill; + chrt.DataLabel.Border.Fill.Color = Color.Black; chrt.DataLabel.Border.LineStyle = eLineStyle.Solid; } + //[TestMethod] //[Ignore] public void Cone() @@ -468,6 +485,7 @@ public void Cone() chrt.Axis[1].DisplayUnit = 100000; Assert.AreEqual(chrt.Axis[1].DisplayUnit, 100000); } + //[TestMethod] //[Ignore] public void Column() @@ -489,6 +507,7 @@ public void Column() chrt.Axis[1].DisplayUnit = 10020; Assert.AreEqual(chrt.Axis[1].DisplayUnit, 10020); } + //[TestMethod] //[Ignore] public void Dougnut() @@ -501,6 +520,7 @@ public void Dougnut() chrt.Series[0].Header = "Serie 1"; chrt.EditAs = eEditAs.Absolute; } + //[TestMethod] //[Ignore] public void Line() @@ -525,11 +545,11 @@ public void Line() tl.Intercept = 6; //tl.Period = 12; tl.Order = 5; - + tl = chrt.Series[0].TrendLines.Add(eTrendLine.MovingAvgerage); chrt.Fill.Color = Color.LightSteelBlue; chrt.Border.LineStyle = eLineStyle.Dot; - chrt.Border.Fill.Color=Color.Black; + chrt.Border.Fill.Color = Color.Black; chrt.Legend.Font.Color = Color.Red; chrt.Legend.Font.Strike = eStrikeType.Double; @@ -541,7 +561,7 @@ public void Line() chrt.Title.Border.LineStyle = eLineStyle.LongDashDotDot; chrt.Title.Border.Fill.Color = Color.Tomato; chrt.DataLabel.ShowSeriesName = true; - chrt.DataLabel.ShowLeaderLines=true; + chrt.DataLabel.ShowLeaderLines = true; chrt.EditAs = eEditAs.OneCell; chrt.DisplayBlanksAs = eDisplayBlanksAs.Span; chrt.Axis[0].Title.Text = "Axis 0"; @@ -550,9 +570,9 @@ public void Line() chrt.Axis[1].Title.Text = "Axis 1"; chrt.Axis[1].Title.AnchorCtr = true; chrt.Axis[1].Title.TextVertical = eTextVerticalType.Vertical270; - chrt.Axis[1].Title.Border.LineStyle=eLineStyle.LongDashDotDot; - + chrt.Axis[1].Title.Border.LineStyle = eLineStyle.LongDashDotDot; } + //[TestMethod] //[Ignore] public void LineMarker() @@ -567,22 +587,22 @@ public void LineMarker() var chrt2 = ws.Drawings.AddChart("Line2", eChartType.LineMarkers) as ExcelLineChart; AddTestSerie(ws, chrt2); - chrt2.SetPosition(500,0); + chrt2.SetPosition(500, 0); chrt2.SetSize(150); chrt2.Title.Text = "Line Markers"; var serie = (ExcelLineChartSerie)chrt2.Series[0]; serie.Marker = eMarkerStyle.X; - } + //[TestMethod] //[Ignore] public void Drawings() { var ws = _pck.Workbook.Worksheets.Add("Shapes"); - int y=100, i=1; - foreach(eShapeStyle style in Enum.GetValues(typeof(eShapeStyle))) + int y = 100, i = 1; + foreach (eShapeStyle style in Enum.GetValues(typeof(eShapeStyle))) { - var shape = ws.Drawings.AddShape("shape"+i.ToString(), style); + var shape = ws.Drawings.AddShape("shape" + i.ToString(), style); shape.SetPosition(y, 100); shape.SetSize(300, 300); y += 400; @@ -590,7 +610,7 @@ public void Drawings() i++; } - (ws.Drawings["shape1"] as ExcelShape).TextAnchoring = eTextAnchoringType.Top; + (ws.Drawings["shape1"] as ExcelShape).TextAnchoring = eTextAnchoringType.Top; var rt = (ws.Drawings["shape1"] as ExcelShape).RichText.Add("Added formated richtext"); (ws.Drawings["shape1"] as ExcelShape).LockText = false; rt.Bold = true; @@ -600,19 +620,24 @@ public void Drawings() (ws.Drawings["shape2"] as ExcelShape).TextVertical = eTextVerticalType.Vertical; rt = (ws.Drawings["shape2"] as ExcelShape).RichText.Add("\r\nAdded formated richtext"); rt.Bold = true; - rt.Color = Color.DarkGoldenrod ; - rt.SetFromFont(new Font("Times new roman", 18, FontStyle.Underline)); + rt.Color = Color.DarkGoldenrod; + rt.SetFromTextRun( + new TextRun + { + Font = SystemFonts.CreateFont("Times new roman", CultureInfo.CurrentCulture, 18), + TextDecorations = TextDecorations.Underline + }); rt.UnderLineColor = Color.Green; - (ws.Drawings["shape3"] as ExcelShape).TextAnchoring=eTextAnchoringType.Bottom; - (ws.Drawings["shape3"] as ExcelShape).TextAnchoringControl=true ; + (ws.Drawings["shape3"] as ExcelShape).TextAnchoring = eTextAnchoringType.Bottom; + (ws.Drawings["shape3"] as ExcelShape).TextAnchoringControl = true; (ws.Drawings["shape4"] as ExcelShape).TextVertical = eTextVerticalType.Vertical270; (ws.Drawings["shape4"] as ExcelShape).TextAnchoring = eTextAnchoringType.Top; - (ws.Drawings["shape5"] as ExcelShape).Fill.Style=eFillStyle.SolidFill; - (ws.Drawings["shape5"] as ExcelShape).Fill.Color=Color.Red; + (ws.Drawings["shape5"] as ExcelShape).Fill.Style = eFillStyle.SolidFill; + (ws.Drawings["shape5"] as ExcelShape).Fill.Color = Color.Red; (ws.Drawings["shape5"] as ExcelShape).Fill.Transparancy = 50; (ws.Drawings["shape6"] as ExcelShape).Fill.Style = eFillStyle.NoFill; @@ -620,11 +645,11 @@ public void Drawings() (ws.Drawings["shape6"] as ExcelShape).Border.Fill.Color = Color.Black; (ws.Drawings["shape7"] as ExcelShape).Fill.Style = eFillStyle.SolidFill; - (ws.Drawings["shape7"] as ExcelShape).Fill.Color=Color.Gray; - (ws.Drawings["shape7"] as ExcelShape).Border.Fill.Style=eFillStyle.SolidFill; + (ws.Drawings["shape7"] as ExcelShape).Fill.Color = Color.Gray; + (ws.Drawings["shape7"] as ExcelShape).Border.Fill.Style = eFillStyle.SolidFill; (ws.Drawings["shape7"] as ExcelShape).Border.Fill.Color = Color.Black; - (ws.Drawings["shape7"] as ExcelShape).Border.Fill.Transparancy=43; - (ws.Drawings["shape7"] as ExcelShape).Border.LineCap=eLineCap.Round; + (ws.Drawings["shape7"] as ExcelShape).Border.Fill.Transparancy = 43; + (ws.Drawings["shape7"] as ExcelShape).Border.LineCap = eLineCap.Round; (ws.Drawings["shape7"] as ExcelShape).Border.LineStyle = eLineStyle.LongDash; (ws.Drawings["shape7"] as ExcelShape).Font.UnderLineColor = Color.Blue; (ws.Drawings["shape7"] as ExcelShape).Font.Color = Color.Black; @@ -648,6 +673,7 @@ public void Drawings() (ws.Drawings["shape120"] as ExcelShape).LineEnds.HeadEndSizeHeight = eEndSize.Small; (ws.Drawings["shape120"] as ExcelShape).LineEnds.HeadEndSizeWidth = eEndSize.Small; } + [TestMethod] [Ignore] public void DrawingWorksheetCopy() @@ -655,38 +681,40 @@ public void DrawingWorksheetCopy() var wsShapes = _pck.Workbook.Worksheets.Add("Copy Shapes", _pck.Workbook.Worksheets["Shapes"]); var wsScatterChart = _pck.Workbook.Worksheets.Add("Copy Scatter", _pck.Workbook.Worksheets["Scatter"]); var wsPicture = _pck.Workbook.Worksheets.Add("Copy Picture", _pck.Workbook.Worksheets["Picture"]); - } + } + //[TestMethod] //[Ignore] public void Line2Test() { - ExcelWorksheet worksheet = _pck.Workbook.Worksheets.Add("LineIssue"); + ExcelWorksheet worksheet = _pck.Workbook.Worksheets.Add("LineIssue"); - ExcelChart chart = worksheet.Drawings.AddChart("LineChart", eChartType.Line); - - worksheet.Cells["A1"].Value=1; - worksheet.Cells["A2"].Value=2; - worksheet.Cells["A3"].Value=3; - worksheet.Cells["A4"].Value=4; - worksheet.Cells["A5"].Value=5; - worksheet.Cells["A6"].Value=6; + ExcelChart chart = worksheet.Drawings.AddChart("LineChart", eChartType.Line); - worksheet.Cells["B1"].Value=10000; - worksheet.Cells["B2"].Value=10100; - worksheet.Cells["B3"].Value=10200; - worksheet.Cells["B4"].Value=10150; - worksheet.Cells["B5"].Value=10250; - worksheet.Cells["B6"].Value=10200; + worksheet.Cells["A1"].Value = 1; + worksheet.Cells["A2"].Value = 2; + worksheet.Cells["A3"].Value = 3; + worksheet.Cells["A4"].Value = 4; + worksheet.Cells["A5"].Value = 5; + worksheet.Cells["A6"].Value = 6; - chart.Series.Add(ExcelRange.GetAddress(1, 2, worksheet.Dimension.End.Row, 2), - ExcelRange.GetAddress(1, 1, worksheet.Dimension.End.Row, 1)); + worksheet.Cells["B1"].Value = 10000; + worksheet.Cells["B2"].Value = 10100; + worksheet.Cells["B3"].Value = 10200; + worksheet.Cells["B4"].Value = 10150; + worksheet.Cells["B5"].Value = 10250; + worksheet.Cells["B6"].Value = 10200; - var Series = chart.Series[0]; - chart.Axis[0].MinorGridlines.Fill.Color = Color.Red; - chart.Axis[0].MinorGridlines.LineStyle = eLineStyle.LongDashDot; + chart.Series.Add(ExcelRange.GetAddress(1, 2, worksheet.Dimension.End.Row, 2), + ExcelRange.GetAddress(1, 1, worksheet.Dimension.End.Row, 1)); - chart.Series[0].Header = "Blah"; + var Series = chart.Series[0]; + chart.Axis[0].MinorGridlines.Fill.Color = Color.Red; + chart.Axis[0].MinorGridlines.LineStyle = eLineStyle.LongDashDot; + + chart.Series[0].Header = "Blah"; } + //[TestMethod] //[Ignore] public void MultiChartSeries() @@ -695,7 +723,7 @@ public void MultiChartSeries() ExcelChart chart = worksheet.Drawings.AddChart("chtPie", eChartType.LineMarkers); chart.SetPosition(100, 100); - chart.SetSize(800,600); + chart.SetSize(800, 600); AddTestSerie(worksheet, chart); chart.Series[0].Header = "Serie5"; chart.Style = eChartStyle.Style27; @@ -712,17 +740,17 @@ public void MultiChartSeries() worksheet.Cells["X22"].Value = 75; worksheet.Cells["X23"].Value = 77; worksheet.Cells["X24"].Value = 99; - + var cs2 = chart.PlotArea.ChartTypes.Add(eChartType.ColumnClustered); var s = cs2.Series.Add(worksheet.Cells["W19:W24"], worksheet.Cells["U19:U24"]); s.Header = "Serie4"; cs2.YAxis.MaxValue = 300; cs2.YAxis.MinValue = -5.5; var cs3 = chart.PlotArea.ChartTypes.Add(eChartType.Line); - s=cs3.Series.Add(worksheet.Cells["X19:X24"], worksheet.Cells["U19:U24"]); + s = cs3.Series.Add(worksheet.Cells["X19:X24"], worksheet.Cells["U19:U24"]); s.Header = "Serie1"; cs3.UseSecondaryAxis = true; - + cs3.XAxis.Deleted = false; cs3.XAxis.MajorUnit = 20; cs3.XAxis.MinorUnit = 3; @@ -731,13 +759,13 @@ public void MultiChartSeries() cs3.YAxis.LogBase = 10.2; var chart2 = worksheet.Drawings.AddChart("scatter1", eChartType.XYScatterSmooth); - s=chart2.Series.Add(worksheet.Cells["W19:W24"], worksheet.Cells["U19:U24"]); + s = chart2.Series.Add(worksheet.Cells["W19:W24"], worksheet.Cells["U19:U24"]); s.Header = "Serie2"; var c2ct2 = chart2.PlotArea.ChartTypes.Add(eChartType.XYScatterSmooth); - s=c2ct2.Series.Add(worksheet.Cells["X19:X24"], worksheet.Cells["V19:V24"]); - s.Header="Serie3"; - s=c2ct2.Series.Add(worksheet.Cells["W19:W24"], worksheet.Cells["V19:V24"]); + s = c2ct2.Series.Add(worksheet.Cells["X19:X24"], worksheet.Cells["V19:V24"]); + s.Header = "Serie3"; + s = c2ct2.Series.Add(worksheet.Cells["W19:W24"], worksheet.Cells["V19:V24"]); s.Header = "Serie4"; c2ct2.UseSecondaryAxis = true; @@ -746,28 +774,32 @@ public void MultiChartSeries() ExcelChart chart3 = worksheet.Drawings.AddChart("chart", eChartType.LineMarkers); chart3.SetPosition(300, 1000); - var s31=chart3.Series.Add(worksheet.Cells["W19:W24"], worksheet.Cells["U19:U24"]); + var s31 = chart3.Series.Add(worksheet.Cells["W19:W24"], worksheet.Cells["U19:U24"]); s31.Header = "Serie1"; var c3ct2 = chart3.PlotArea.ChartTypes.Add(eChartType.LineMarkers); var c32 = c3ct2.Series.Add(worksheet.Cells["X19:X24"], worksheet.Cells["V19:V24"]); c3ct2.UseSecondaryAxis = true; c32.Header = "Serie2"; - - XmlNamespaceManager ns=new XmlNamespaceManager(new NameTable()); - ns.AddNamespace("c","http://schemas.openxmlformats.org/drawingml/2006/chart"); + + XmlNamespaceManager ns = new XmlNamespaceManager(new NameTable()); + ns.AddNamespace("c", "http://schemas.openxmlformats.org/drawingml/2006/chart"); var element = chart.ChartXml.SelectSingleNode("//c:plotVisOnly", ns); - if (element!=null) element.ParentNode.RemoveChild(element); + if (element != null) element.ParentNode.RemoveChild(element); } + //[TestMethod] //[Ignore] public void DeleteDrawing() { - var ws=_pck.Workbook.Worksheets.Add("DeleteDrawing1"); + var assembly = Assembly.GetExecutingAssembly(); + var stream = assembly.GetManifestResourceStream(@"Resources\Test1.jpg"); + var image = Image.Load(stream, out var format); + var ws = _pck.Workbook.Worksheets.Add("DeleteDrawing1"); var chart1 = ws.Drawings.AddChart("Chart1", eChartType.Line); var chart2 = ws.Drawings.AddChart("Chart2", eChartType.Line); var shape1 = ws.Drawings.AddShape("Shape1", eShapeStyle.ActionButtonBackPrevious); - var pic1 = ws.Drawings.AddPicture("Pic1", Resources.Test1); + var pic1 = ws.Drawings.AddPicture("Pic1", image, format); ws.Drawings.Remove(2); ws.Drawings.Remove(chart2); ws.Drawings.Remove("Pic1"); @@ -776,7 +808,7 @@ public void DeleteDrawing() chart1 = ws.Drawings.AddChart("Chart1", eChartType.Line); chart2 = ws.Drawings.AddChart("Chart2", eChartType.Line); shape1 = ws.Drawings.AddShape("Shape1", eShapeStyle.ActionButtonBackPrevious); - pic1 = ws.Drawings.AddPicture("Pic1", Resources.Test1); + pic1 = ws.Drawings.AddPicture("Pic1", image, format); ws.Drawings.Remove("chart1"); @@ -784,23 +816,25 @@ public void DeleteDrawing() chart1 = ws.Drawings.AddChart("Chart1", eChartType.Line); chart2 = ws.Drawings.AddChart("Chart2", eChartType.Line); shape1 = ws.Drawings.AddShape("Shape1", eShapeStyle.ActionButtonBackPrevious); - pic1 = ws.Drawings.AddPicture("Pic1", Resources.Test1); + pic1 = ws.Drawings.AddPicture("Pic1", image, format); ws.Drawings.Clear(); } + //[TestMethod] //[Ignore] public void ReadDocument() { - var fi=new FileInfo(_worksheetPath + "drawing.xlsx"); + var fi = new FileInfo(_worksheetPath + "drawing.xlsx"); if (!fi.Exists) { Assert.Inconclusive("Drawing.xlsx is not created. Skippng"); } + var pck = new ExcelPackage(fi, true); - foreach(var ws in pck.Workbook.Worksheets) + foreach (var ws in pck.Workbook.Worksheets) { - foreach(ExcelDrawing d in pck.Workbook.Worksheets[1].Drawings) + foreach (ExcelDrawing d in pck.Workbook.Worksheets[1].Drawings) { if (d is ExcelChart) { @@ -810,8 +844,10 @@ public void ReadDocument() } } } + pck.Dispose(); } + [TestMethod] [Ignore] public void ReadMultiChartSeries() @@ -825,7 +861,7 @@ public void ReadMultiChartSeries() var p = c.PlotArea; p.ChartTypes[1].Series[0].Series = "S7:S15"; - var c2=ws.Drawings.AddChart("NewChart", eChartType.ColumnClustered); + var c2 = ws.Drawings.AddChart("NewChart", eChartType.ColumnClustered); var serie1 = c2.Series.Add("R7:R15", "Q7:Q15"); c2.SetSize(800, 800); serie1.Header = "Column Clustered"; @@ -843,11 +879,12 @@ public void ReadMultiChartSeries() serie4.Header = "Area"; subChart3.UseSecondaryAxis = true; - var serie5 = subChart.Series.Add("R7:R15","Q7:Q15"); + var serie5 = subChart.Series.Add("R7:R15", "Q7:Q15"); serie5.Header = "Line 2"; pck.SaveAs(new FileInfo("c:\\temp\\chartseriesnew.xlsx")); } + [Ignore] [TestMethod] public void ChartWorksheet() @@ -861,6 +898,7 @@ public void ChartWorksheet() wsChart.Chart.Series[0].Header = "Serie"; _pck.SaveAs(new FileInfo(@"c:\temp\chart.xlsx")); } + [Ignore] [TestMethod] public void ReadChartWorksheet() @@ -869,8 +907,8 @@ public void ReadChartWorksheet() var chart = ((ExcelChartsheet)_pck.Workbook.Worksheets[1]).Chart; _pck.SaveAs(new FileInfo(@"c:\temp\chart.xlsx")); - } + [Ignore] [TestMethod] public void ReadWriteSmoothChart() @@ -879,14 +917,14 @@ public void ReadWriteSmoothChart() var chart = _pck.Workbook.Worksheets[1].Drawings[0] as ExcelChart; _pck.Workbook.Worksheets[1].Cells["B2"].Value = 33; _pck.SaveAs(new FileInfo(@"c:\temp\chart.xlsx")); - } + [TestMethod] public void TestHeaderaddress() { _pck = new ExcelPackage(); var ws = _pck.Workbook.Worksheets.Add("Draw"); - var chart = ws.Drawings.AddChart("NewChart1",eChartType.Area) as ExcelChart; + var chart = ws.Drawings.AddChart("NewChart1", eChartType.Area) as ExcelChart; var ser1 = chart.Series.Add("A1:A2", "B1:B2"); ser1.HeaderAddress = new ExcelAddress("A1:A2"); ser1.HeaderAddress = new ExcelAddress("A1:B1"); @@ -894,6 +932,7 @@ public void TestHeaderaddress() _pck.Dispose(); _pck = null; } + [Ignore] [TestMethod] public void AllDrawingsInsideMarkupCompatibility() @@ -929,7 +968,10 @@ public void AllDrawingsInsideMarkupCompatibility() XmlHelper.LoadXmlSafe(drawingsXml, _pck.Package.GetPart(partUri).GetStream()); // Verify that there are the correct # of drawings: - Assert.AreEqual(drawingsXml.SelectNodes("//*[self::xdr:twoCellAnchor or self::xdr:oneCellAnchor or self::xdr:absoluteAnchor]", xmlNsm).Count, 5); + Assert.AreEqual( + drawingsXml.SelectNodes( + "//*[self::xdr:twoCellAnchor or self::xdr:oneCellAnchor or self::xdr:absoluteAnchor]", xmlNsm) + .Count, 5); // Make unrelated change. (in this case a useless additional worksheet) _pck.Workbook.Worksheets.Add("NewWorksheet"); @@ -938,7 +980,7 @@ public void AllDrawingsInsideMarkupCompatibility() string savedPath = Path.Combine(workbooksDir, "AllDrawingsInsideMarkupCompatibility2.xlsm"); _pck.SaveAs(new FileInfo(savedPath)); _pck.Dispose(); - + // Reload the new saved file. _pck = new ExcelPackage(new FileInfo(savedPath)); @@ -950,23 +992,31 @@ public void AllDrawingsInsideMarkupCompatibility() XmlHelper.LoadXmlSafe(drawingsXml, _pck.Package.GetPart(partUri).GetStream()); // Verify that there are the correct # of drawings: - Assert.AreEqual(drawingsXml.SelectNodes("//*[self::xdr:twoCellAnchor or self::xdr:oneCellAnchor or self::xdr:absoluteAnchor]", xmlNsm).Count, 5); + Assert.AreEqual( + drawingsXml.SelectNodes( + "//*[self::xdr:twoCellAnchor or self::xdr:oneCellAnchor or self::xdr:absoluteAnchor]", xmlNsm) + .Count, 5); // Verify that the new worksheet exists: Assert.IsNotNull(_pck.Workbook.Worksheets["NewWorksheet"]); // Cleanup: File.Delete(savedPath); } + public void DrawingRowheightDynamic() { + var assembly = Assembly.GetExecutingAssembly(); + var stream = assembly.GetManifestResourceStream(@"Resources\Test1.jpg"); + var image = Image.Load(stream, out var format); var ws = _pck.Workbook.Worksheets.Add("PicResize"); ws.Cells["A1"].Value = "test"; ws.Cells["A1"].Style.Font.Name = "Symbol"; ws.Cells["A1"].Style.Font.Size = 39; ws.Workbook.Styles.NamedStyles[0].Style.Font.Name = "Symbol"; ws.Workbook.Styles.NamedStyles[0].Style.Font.Size = 16; - var pic = ws.Drawings.AddPicture("Pic1", Resources.Test1); - pic.SetPosition(10,12); + var pic = ws.Drawings.AddPicture("Pic1", image, format); + pic.SetPosition(10, 12); } + [TestMethod] public void DrawingWidthAdjust() { @@ -978,4 +1028,4 @@ public void DrawingWidthAdjust() //} } } -} +} \ No newline at end of file diff --git a/src/EPPlus/EPPlusTest/Issues.cs b/src/EPPlus/EPPlusTest/Issues.cs index 16a4407b..ac204442 100644 --- a/src/EPPlus/EPPlusTest/Issues.cs +++ b/src/EPPlus/EPPlusTest/Issues.cs @@ -1,6 +1,6 @@ using System; using System.Diagnostics; -using System.Drawing; +using SixLabors.ImageSharp; using System.Linq; using System.Reflection; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -1905,8 +1905,8 @@ public void Issue100() { ExcelWorkbook wb = package.Workbook; ExcelWorksheet sh = wb.Worksheets[1]; - System.Drawing.Image img_ = System.Drawing.Image.FromFile(@"C:\temp\img\background.gif"); - ExcelPicture pic = sh.Drawings.AddPicture("logo", img_); + Image img_ = Image.Load(@"C:\temp\img\background.gif", out var format); + ExcelPicture pic = sh.Drawings.AddPicture("logo", img_, format); pic.SetPosition(1, 1); package.SaveAs(outputFile); @@ -2046,8 +2046,8 @@ public void Issue10() int row = 1; foreach (var f in Directory.EnumerateFiles(@"c:\temp\addin_temp\Addin\img\open_icon_library-full\icons\ico\16x16\actions\")) { - var b = new Bitmap(f); - var pic = ws.Drawings.AddPicture($"Image{(row + 1) / 2}", b); + var b = Image.Load(f, out var format); + var pic = ws.Drawings.AddPicture($"Image{(row + 1) / 2}", b, format); pic.SetPosition(row, 0, 0, 0); row += 2; } diff --git a/src/EPPlus/EPPlusTest/Properties/Resources.Designer.cs b/src/EPPlus/EPPlusTest/Properties/Resources.Designer.cs deleted file mode 100644 index 1b970485..00000000 --- a/src/EPPlus/EPPlusTest/Properties/Resources.Designer.cs +++ /dev/null @@ -1,91 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.18444 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace EPPlusTest.Properties { - using System; - using System.Drawing; - using System.IO; - using System.Reflection; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - // [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EPPlusTest.Properties.Resources", -#if Core - typeof(Resources).GetTypeInfo().Assembly); -#else - typeof(Resources).Assembly); -#endif - - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Test1 { - get { -#if (Core) - string path = AppContext.BaseDirectory; - while (!Directory.Exists(path + "\\Resources")) - { - path = new DirectoryInfo(path + "\\..").FullName; - } - object obj = Image.FromFile(path + "\\Resources\\Test1.jpg"); -#else - object obj = ResourceManager.GetObject("Test1", resourceCulture); -#endif - return ((System.Drawing.Bitmap)(obj)); - } - } - } -} diff --git a/src/EPPlus/EPPlusTest/Properties/Resources.resx b/src/EPPlus/EPPlusTest/Properties/Resources.resx deleted file mode 100644 index fb13295a..00000000 --- a/src/EPPlus/EPPlusTest/Properties/Resources.resx +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\Test1.jpg;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/src/EPPlus/EPPlusTest/ReadTemplate.cs b/src/EPPlus/EPPlusTest/ReadTemplate.cs index f014da4e..dc100931 100644 --- a/src/EPPlus/EPPlusTest/ReadTemplate.cs +++ b/src/EPPlus/EPPlusTest/ReadTemplate.cs @@ -10,7 +10,7 @@ using OfficeOpenXml.Drawing; using OfficeOpenXml.ConditionalFormatting; using System.Threading; -using System.Drawing; +using SixLabors.ImageSharp; namespace EPPlusTest { [TestClass] diff --git a/src/EPPlus/EPPlusTest/WorkSheetTests.cs b/src/EPPlus/EPPlusTest/WorkSheetTests.cs index 95af431e..02a20bd6 100644 --- a/src/EPPlus/EPPlusTest/WorkSheetTests.cs +++ b/src/EPPlus/EPPlusTest/WorkSheetTests.cs @@ -5,7 +5,7 @@ using OfficeOpenXml; using System.IO; using OfficeOpenXml.Drawing; -using System.Drawing; +using SixLabors.ImageSharp; using OfficeOpenXml.Drawing.Chart; using OfficeOpenXml.Drawing.Vml; using OfficeOpenXml.Style; @@ -16,6 +16,7 @@ using System.Threading; using System.Globalization; using System.Threading.Tasks; +using SixLabors.Fonts; namespace EPPlusTest { @@ -455,8 +456,11 @@ public void LoadData() ws.Cells["Z24"].Value = "Text6"; // add autofilter + var assembly = Assembly.GetExecutingAssembly(); + var stream = assembly.GetManifestResourceStream(@"Resources\Test1.jpg"); + var image = Image.Load(stream, out var format); ws.Cells["U19:X24"].AutoFilter = true; - ExcelPicture pic = ws.Drawings.AddPicture("Pic1", Properties.Resources.Test1); + ExcelPicture pic = ws.Drawings.AddPicture("Pic1", image, format); pic.SetPosition(150, 140); ws.Cells["A30"].Value = "Text orientation 45"; @@ -1129,8 +1133,10 @@ public void PictureURL() ExcelHyperLink hl = new ExcelHyperLink("http://epplus.codeplex.com"); hl.ToolTip = "Screen Tip"; - - ws.Drawings.AddPicture("Pic URI", Properties.Resources.Test1, hl); + var assembly = Assembly.GetExecutingAssembly(); + var stream = assembly.GetManifestResourceStream(@"Resources\Test1.jpg"); + var image = Image.Load(stream, out var format); + ws.Drawings.AddPicture("Pic URI", image, format, hl); } [TestMethod] public void PivotTableTest() @@ -1884,7 +1890,11 @@ public void CloseProblem() using (ExcelRange r = ws.Cells["A1:F1"]) { r.Merge = true; - r.Style.Font.SetFromFont(new Font("Arial", 18, FontStyle.Italic)); + r.Style.Font.SetFromTextRun( + new TextRun + { + Font = SystemFonts.CreateFont("Arial", CultureInfo.CurrentCulture, 18, FontStyle.Italic) + }); r.Style.Font.Color.SetColor(Color.DarkRed); r.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.CenterContinuous; //r.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid; @@ -2249,10 +2259,16 @@ public void CreatePivotMultData() public void SetBackground() { var ws = _pck.Workbook.Worksheets.Add("backimg"); - - ws.BackgroundImage.Image = Properties.Resources.Test1; - ws = _pck.Workbook.Worksheets.Add("backimg2"); - ws.BackgroundImage.SetFromFile(new FileInfo(Path.Combine(_clipartPath, "Vector Drawing.wmf"))); + var assembly = Assembly.GetExecutingAssembly(); + var stream = assembly.GetManifestResourceStream(@"Resources\Test1.jpg"); + using (var ms = new MemoryStream()) + { + stream.CopyTo(ms); + ws.BackgroundImage.SetImage(ms.ToArray()); + ws = _pck.Workbook.Worksheets.Add("backimg2"); + ws.BackgroundImage.SetFromFile(new FileInfo(Path.Combine(_clipartPath, "Vector Drawing.wmf"))); + } + } //[Ignore] [TestMethod] @@ -2261,7 +2277,10 @@ public void SetHeaderFooterImage() var ws = _pck.Workbook.Worksheets.Add("HeaderImage"); ws.HeaderFooter.OddHeader.CenteredText = "Before "; - var img = ws.HeaderFooter.OddHeader.InsertPicture(Properties.Resources.Test1, PictureAlignment.Centered); + var assembly = Assembly.GetExecutingAssembly(); + var stream = assembly.GetManifestResourceStream(@"Resources\Test1.jpg"); + var image = Image.Load(stream, out var format); + var img = ws.HeaderFooter.OddHeader.InsertPicture(image, format, PictureAlignment.Centered); img.Title = "Renamed Image"; //img.GrayScale = true; //img.BiLevel = true; @@ -2304,7 +2323,11 @@ public void NamedStyles() var secondNamedStyle = _pck.Workbook.Styles.CreateNamedStyle("first", firstNamedStyle.Style).Style; secondNamedStyle.Font.Bold = true; - secondNamedStyle.Font.SetFromFont(new Font("Arial Black", 8)); + secondNamedStyle.Font.SetFromTextRun( + new TextRun + { + Font = SystemFonts.CreateFont("Arial Black", CultureInfo.CurrentCulture, 8) + }); secondNamedStyle.Border.Bottom.Style = ExcelBorderStyle.Medium; secondNamedStyle.Border.Left.Style = ExcelBorderStyle.Medium; diff --git a/src/Magicodes.ExporterAndImporter.Core/ExporterHeaderAttribute.cs b/src/Magicodes.ExporterAndImporter.Core/ExporterHeaderAttribute.cs index a2435c9d..a2b012f6 100644 --- a/src/Magicodes.ExporterAndImporter.Core/ExporterHeaderAttribute.cs +++ b/src/Magicodes.ExporterAndImporter.Core/ExporterHeaderAttribute.cs @@ -12,10 +12,8 @@ // ====================================================================== using System; - -#if !NETSTANDARD2_0 -using System.Drawing; -#endif +using Magicodes.IE.Core; +using SixLabors.ImageSharp; namespace Magicodes.ExporterAndImporter.Core { @@ -96,6 +94,8 @@ public ExporterHeaderAttribute(string displayName = null, float fontSize = 11, s /// /// 字体颜色 + /// No KnownColor Enum in SixLabors + /// This one is diff from System.Drawing /// public KnownColor FontColor { get; set; } } diff --git a/src/Magicodes.ExporterAndImporter.Core/Extension/Extension.cs b/src/Magicodes.ExporterAndImporter.Core/Extension/Extension.cs index 60697270..1bf9f1de 100644 --- a/src/Magicodes.ExporterAndImporter.Core/Extension/Extension.cs +++ b/src/Magicodes.ExporterAndImporter.Core/Extension/Extension.cs @@ -17,12 +17,9 @@ using System.Collections; using System.Collections.Generic; using System.Data; -using System.Drawing; -using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Reflection; -using System.Text.RegularExpressions; #if NETSTANDARD2_1 using System.Reflection.Emit; @@ -302,85 +299,6 @@ public static void CheckCsvFileName(this string fileName) } } - /// - /// - /// - /// - public static Bitmap GetBitmapByUrl(string url) - { - if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) - System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; - using (var wc = new System.Net.WebClient()) - { - wc.Proxy = null; - var image = new Bitmap(wc.OpenRead(url)); - if (image.HorizontalResolution == 0 && image.VerticalResolution == 0) - { - using (var gImage = Graphics.FromImage(image)) - { - image.SetResolution(gImage.DpiX, gImage.DpiY); - } - } - return image; - } - } - - /// - /// 保存图片 - /// - /// - /// path - /// - /// - public static string Save(this Image image, string path, ImageFormat format) - { - using (var img = image) - { - img.Save(path, format); - } - return path; - } - - /// - /// 图片转base64 - /// - /// - /// - /// - public static string ToBase64String(this Image image, ImageFormat format) - { - using (var ms = new MemoryStream()) - { - image.Save(ms, format); - var arr = new byte[ms.Length]; - ms.Position = 0; - ms.Read(arr, 0, (int)ms.Length); - ms.Close(); - return Convert.ToBase64String(arr); - } - } - - /// - /// base64转Bitmap - /// - /// - /// - public static Bitmap Base64StringToBitmap(this string base64String) - { - var bitmapData = Convert.FromBase64String(s: FixBase64ForImage(Image: base64String)); - var streamBitmap = new MemoryStream(buffer: bitmapData); - var bitmap = new Bitmap(original: (Bitmap)Image.FromStream(stream: streamBitmap)); - return bitmap; - } - - private static string FixBase64ForImage(string Image) - { - var sbText = new System.Text.StringBuilder(Image, Image.Length); - sbText.Replace("\r\n", string.Empty); - sbText.Replace(" ", string.Empty); - return sbText.ToString(); - } - /// /// 获取集合连续数据中最大的 /// diff --git a/src/Magicodes.ExporterAndImporter.Core/KnownColor.cs b/src/Magicodes.ExporterAndImporter.Core/KnownColor.cs index 3dc3dcae..26073cc7 100644 --- a/src/Magicodes.ExporterAndImporter.Core/KnownColor.cs +++ b/src/Magicodes.ExporterAndImporter.Core/KnownColor.cs @@ -1,152 +1,156 @@ - -#if NETSTANDARD2_0 -namespace Magicodes.ExporterAndImporter.Core +namespace Magicodes.IE.Core { public enum KnownColor { - FirstColor = 0, - Transparent = 0, - AliceBlue = 1, - AntiqueWhite = 2, - Aqua = 3, - Aquamarine = 4, - Azure = 5, - Beige = 6, - Bisque = 7, - Black = 8, - BlanchedAlmond = 9, - Blue = 10, - BlueViolet = 11, - Brown = 12, - BurlyWood = 13, - CadetBlue = 14, - Chartreuse = 0xF, - Chocolate = 0x10, - Coral = 17, - CornflowerBlue = 18, - Cornsilk = 19, - Crimson = 20, - Cyan = 21, - DarkBlue = 22, - DarkCyan = 23, - DarkGoldenrod = 24, - DarkGray = 25, - DarkGreen = 26, - DarkKhaki = 27, - DarkMagenta = 28, - DarkOliveGreen = 29, - DarkOrange = 30, - DarkOrchid = 0x1F, - DarkRed = 0x20, - DarkSalmon = 33, - DarkSeaGreen = 34, - DarkSlateBlue = 35, - DarkSlateGray = 36, - DarkTurquoise = 37, - DarkViolet = 38, - DeepPink = 39, - DeepSkyBlue = 40, - DimGray = 41, - DodgerBlue = 42, - Firebrick = 43, - FloralWhite = 44, - ForestGreen = 45, - Fuchsia = 46, - Gainsboro = 47, - GhostWhite = 48, - Gold = 49, - Goldenrod = 50, - Gray = 51, - Green = 52, - GreenYellow = 53, - Honeydew = 54, - HotPink = 55, - IndianRed = 56, - Indigo = 57, - Ivory = 58, - Khaki = 59, - Lavender = 60, - LavenderBlush = 61, - LawnGreen = 62, - LemonChiffon = 0x3F, - LightBlue = 0x40, - LightCoral = 65, - LightCyan = 66, - LightGoldenrodYellow = 67, - LightGray = 68, - LightGreen = 69, - LightPink = 70, - LightSalmon = 71, - LightSeaGreen = 72, - LightSkyBlue = 73, - LightSlateGray = 74, - LightSteelBlue = 75, - LightYellow = 76, - Lime = 77, - LimeGreen = 78, - Linen = 79, - Magenta = 80, - Maroon = 81, - MediumAquamarine = 82, - MediumBlue = 83, - MediumOrchid = 84, - MediumPurple = 85, - MediumSeaGreen = 86, - MediumSlateBlue = 87, - MediumSpringGreen = 88, - MediumTurquoise = 89, - MediumVioletRed = 90, - MidnightBlue = 91, - MintCream = 92, - MistyRose = 93, - Moccasin = 94, - NavajoWhite = 95, - Navy = 96, - OldLace = 97, - Olive = 98, - OliveDrab = 99, - Orange = 100, - OrangeRed = 101, - Orchid = 102, - PaleGoldenrod = 103, - PaleGreen = 104, - PaleTurquoise = 105, - PaleVioletRed = 106, - PapayaWhip = 107, - PeachPuff = 108, - Peru = 109, - Pink = 110, - Plum = 111, - PowderBlue = 112, - Purple = 113, - Red = 114, - RosyBrown = 115, - RoyalBlue = 116, - SaddleBrown = 117, - Salmon = 118, - SandyBrown = 119, - SeaGreen = 120, - SeaShell = 121, - Sienna = 122, - Silver = 123, - SkyBlue = 124, - SlateBlue = 125, - SlateGray = 126, - Snow = 0x7F, - SpringGreen = 0x80, - SteelBlue = 129, - Tan = 130, - Teal = 131, - Thistle = 132, - Tomato = 133, - Turquoise = 134, - Violet = 135, - Wheat = 136, - White = 137, - WhiteSmoke = 138, - Yellow = 139, - YellowGreen = 140, - LastColor = 140 + Empty = -1, + AliceBlue, + AntiqueWhite, + Aqua, + Aquamarine, + Azure, + Beige, + Bisque, + Black, + BlanchedAlmond, + Blue, + BlueViolet, + Brown, + BurlyWood, + CadetBlue, + Chartreuse, + Chocolate, + Coral, + CornflowerBlue, + Cornsilk, + Crimson, + Cyan, + DarkBlue, + DarkCyan, + DarkGoldenrod, + DarkGray, + DarkGreen, + DarkGrey, + DarkKhaki, + DarkMagenta, + DarkOliveGreen, + DarkOrange, + DarkOrchid, + DarkRed, + DarkSalmon, + DarkSeaGreen, + DarkSlateBlue, + DarkSlateGray, + DarkSlateGrey, + DarkTurquoise, + DarkViolet, + DeepPink, + DeepSkyBlue, + DimGray, + DimGrey, + DodgerBlue, + Firebrick, + FloralWhite, + ForestGreen, + Fuchsia, + Gainsboro, + GhostWhite, + Gold, + Goldenrod, + Gray, + Green, + GreenYellow, + Grey, + Honeydew, + HotPink, + IndianRed, + Indigo, + Ivory, + Khaki, + Lavender, + LavenderBlush, + LawnGreen, + LemonChiffon, + LightBlue, + LightCoral, + LightCyan, + LightGoldenrodYellow, + LightGray, + LightGreen, + LightGrey, + LightPink, + LightSalmon, + LightSeaGreen, + LightSkyBlue, + LightSlateGray, + LightSlateGrey, + LightSteelBlue, + LightYellow, + Lime, + LimeGreen, + Linen, + Magenta, + Maroon, + MediumAquamarine, + MediumBlue, + MediumOrchid, + MediumPurple, + MediumSeaGreen, + MediumSlateBlue, + MediumSpringGreen, + MediumTurquoise, + MediumVioletRed, + MidnightBlue, + MintCream, + MistyRose, + Moccasin, + NavajoWhite, + Navy, + OldLace, + Olive, + OliveDrab, + Orange, + OrangeRed, + Orchid, + PaleGoldenrod, + PaleGreen, + PaleTurquoise, + PaleVioletRed, + PapayaWhip, + PeachPuff, + Peru, + Pink, + Plum, + PowderBlue, + Purple, + RebeccaPurple, + Red, + RosyBrown, + RoyalBlue, + SaddleBrown, + Salmon, + SandyBrown, + SeaGreen, + SeaShell, + Sienna, + Silver, + SkyBlue, + SlateBlue, + SlateGray, + SlateGrey, + Snow, + SpringGreen, + SteelBlue, + Tan, + Teal, + Thistle, + Tomato, + Transparent, + Turquoise, + Violet, + Wheat, + White, + WhiteSmoke, + Yellow, + YellowGreen } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/Magicodes.ExporterAndImporter.Core/Magicodes.IE.Core.csproj b/src/Magicodes.ExporterAndImporter.Core/Magicodes.IE.Core.csproj index 21b412e0..8f838321 100644 --- a/src/Magicodes.ExporterAndImporter.Core/Magicodes.IE.Core.csproj +++ b/src/Magicodes.ExporterAndImporter.Core/Magicodes.IE.Core.csproj @@ -1,37 +1,34 @@  - - - netstandard2.0;netstandard2.1 - Magicodes.IE.Core - - - - - - - - - - - - - - - - - - - - - True - True - Resource.resx - - - - - PublicResXFileCodeGenerator - Resource.Designer.cs - - - + + + netstandard2.0;netstandard2.1 + Magicodes.IE.Core + + + + + + + + + + + + + + + + + + True + True + Resource.resx + + + + + PublicResXFileCodeGenerator + Resource.Designer.cs + + + \ No newline at end of file diff --git a/src/Magicodes.ExporterAndImporter.Excel/ExcelExporter.cs b/src/Magicodes.ExporterAndImporter.Excel/ExcelExporter.cs index 54e4301f..86d38f5d 100644 --- a/src/Magicodes.ExporterAndImporter.Excel/ExcelExporter.cs +++ b/src/Magicodes.ExporterAndImporter.Excel/ExcelExporter.cs @@ -269,7 +269,8 @@ public async Task ExportAppendData(string fileName) helper.Export(sheetDataItems); } - return Task.FromResult(NPOI.Extension.SaveToExcelWithXSSFWorkbook(helper.CurrentExcelPackage.GetAsByteArray())); + return Task.FromResult(helper.CurrentExcelPackage.GetAsByteArray()); + //return Task.FromResult(NPOI.Extension.SaveToExcelWithXSSFWorkbook(helper.CurrentExcelPackage.GetAsByteArray())); // todo: use interface, not import NPOI directly } } else @@ -306,7 +307,7 @@ public async Task ExportAppendData(string fileName) { fileName.CheckExcelFileName(); var bytes = await ExportAsByteArray(dataItems); - bytes = NPOI.Extension.SaveToExcelWithXSSFWorkbook(bytes); + //bytes = NPOI.Extension.SaveToExcelWithXSSFWorkbook(bytes); // todo: use interface, not import NPOI directly return bytes.ToExcelExportFileInfo(fileName); } @@ -368,7 +369,8 @@ public async Task ExportAppendData(string fileName) helper.AddExcelWorksheet(); helper.Export(sheetDataItems); } - return Task.FromResult(NPOI.Extension.SaveToExcelWithXSSFWorkbook(helper.CurrentExcelPackage.GetAsByteArray())); + return Task.FromResult(helper.CurrentExcelPackage.GetAsByteArray()); + //return Task.FromResult(NPOI.Extension.SaveToExcelWithXSSFWorkbook(helper.CurrentExcelPackage.GetAsByteArray())); // todo: use interface, not import NPOI directly } } else @@ -403,7 +405,8 @@ public Task ExportWithXSSFWorkbookAsByteArray(DataTable dataItems, Type helper.Export(sheetDataItems); } - return Task.FromResult(NPOI.Extension.SaveToExcelWithXSSFWorkbook(helper.CurrentExcelPackage.GetAsByteArray())); + return Task.FromResult(helper.CurrentExcelPackage.GetAsByteArray()); + //return Task.FromResult(NPOI.Extension.SaveToExcelWithXSSFWorkbook(helper.CurrentExcelPackage.GetAsByteArray())); // todo: use interface, not import NPOI directly } } else @@ -479,7 +482,8 @@ public Task ExportWithXSSFWorkbookHeaderAsByteArray(string[] items, stri helper.AddExporterHeaderInfoList(headerList); using (var ep = helper.ExportHeaders()) { - return Task.FromResult(NPOI.Extension.SaveToExcelWithXSSFWorkbook(ep.GetAsByteArray())); + return Task.FromResult(ep.GetAsByteArray()); + //return Task.FromResult(NPOI.Extension.SaveToExcelWithXSSFWorkbook(ep.GetAsByteArray())); // todo: use interface, not import NPOI directly } } @@ -526,7 +530,8 @@ public Task ExportHeaderAsByteArray(string[] items, string sheetName = " var helper = new ExportHelper(); using (var ep = helper.ExportHeaders()) { - return Task.FromResult(NPOI.Extension.SaveToExcelWithXSSFWorkbook(ep.GetAsByteArray())); + return Task.FromResult(ep.GetAsByteArray()); + //return Task.FromResult(NPOI.Extension.SaveToExcelWithXSSFWorkbook(ep.GetAsByteArray())); // } } @@ -606,7 +611,7 @@ public async Task ExportWithXSSFWorkbook(string fileName, DataTa { fileName.CheckExcelFileName(); var bytes = await ExportAsByteArray(dataItems, exporterHeaderFilter, maxRowNumberOnASheet); - bytes = NPOI.Extension.SaveToExcelWithXSSFWorkbook(bytes); + //bytes = NPOI.Extension.SaveToExcelWithXSSFWorkbook(bytes); // todo: use interface, not import NPOI directly return bytes.ToExcelExportFileInfo(fileName); } diff --git a/src/Magicodes.ExporterAndImporter.Excel/Images/ImageExtensions.cs b/src/Magicodes.ExporterAndImporter.Excel/Images/ImageExtensions.cs new file mode 100644 index 00000000..524190d3 --- /dev/null +++ b/src/Magicodes.ExporterAndImporter.Excel/Images/ImageExtensions.cs @@ -0,0 +1,75 @@ +using System.IO; +using System; +using System.Net; +using Magicodes.IE.Core; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats; + +namespace Magicodes.IE.Excel.Images +{ + internal static class ImageExtensions + { + public static Color ToColor(this KnownColor knownColor) + { + if (knownColor != KnownColor.Empty) + { + return Color.Parse(knownColor.ToString("G")); + } + return new Color(); + } + + public static string SaveTo(this Image image, string path) + { + image.Save(path); + return path; + } + + public static string ToBase64String(this Image image, IImageFormat format) + { + using (var ms = new MemoryStream()) + { + image.Save(ms, format); + ms.Position = 0; + var bytes = ms.ToArray(); + return Convert.ToBase64String(bytes); + } + } + + /// + /// + /// + /// + /// + public static Image GetImageByUrl(this string url, out IImageFormat format) + { + if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; + + using (var wc = new WebClient()) + { + wc.Proxy = null; + return Image.Load(wc.OpenRead(url), out format); + } + } + + /// + /// base64转Bitmap + /// + /// + /// + /// + public static Image Base64StringToImage(this string base64String, out IImageFormat format) + { + var bytes = Convert.FromBase64String(FixBase64ForImage(base64String)); + return Image.Load(bytes, out format); + } + + private static string FixBase64ForImage(string image) + { + var sbText = new System.Text.StringBuilder(image, image.Length); + sbText.Replace("\r\n", string.Empty); + sbText.Replace(" ", string.Empty); + return sbText.ToString(); + } + } +} diff --git a/src/Magicodes.ExporterAndImporter.Excel/Magicodes.IE.Excel.csproj b/src/Magicodes.ExporterAndImporter.Excel/Magicodes.IE.Excel.csproj index 6a0fbe7b..85bc80de 100644 --- a/src/Magicodes.ExporterAndImporter.Excel/Magicodes.IE.Excel.csproj +++ b/src/Magicodes.ExporterAndImporter.Excel/Magicodes.IE.Excel.csproj @@ -8,11 +8,10 @@ - - + \ No newline at end of file diff --git a/src/Magicodes.ExporterAndImporter.Excel/Utility/ExportHelper.cs b/src/Magicodes.ExporterAndImporter.Excel/Utility/ExportHelper.cs index af6a2c72..ca4ae3eb 100644 --- a/src/Magicodes.ExporterAndImporter.Excel/Utility/ExportHelper.cs +++ b/src/Magicodes.ExporterAndImporter.Excel/Utility/ExportHelper.cs @@ -10,12 +10,13 @@ using System; using System.Collections.Generic; using System.Data; -using System.Drawing; using System.Dynamic; using System.Globalization; using System.IO; using System.Linq; -using System.Reflection; +using Magicodes.IE.Excel.Images; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Formats; namespace Magicodes.ExporterAndImporter.Excel.Utility { @@ -906,23 +907,24 @@ protected void AddPictures(int rowCount) try { cell.Value = string.Empty; - Bitmap bitmap; + Image image; + IImageFormat format; if (url.IsBase64StringValid()) { - bitmap = url.Base64StringToBitmap(); + image = url.Base64StringToImage(out format); } else { - bitmap = Extension.GetBitmapByUrl(url); + image = url.GetImageByUrl(out format); } - if (bitmap == null) + if (image == null) { cell.Value = ExporterHeaderList[colIndex].ExportImageFieldAttribute.Alt; } else { - using (ExcelPicture pic = CurrentExcelWorksheet.Drawings.AddPicture(Guid.NewGuid().ToString(), bitmap)) + using (ExcelPicture pic = CurrentExcelWorksheet.Drawings.AddPicture(Guid.NewGuid().ToString(), image, format)) { AddImage((rowIndex + (ExcelExporterSettings.HeaderRowIndex > 1 ? ExcelExporterSettings.HeaderRowIndex : 0)), colIndex - ignoreCount, pic, ExporterHeaderList[colIndex].ExportImageFieldAttribute.YOffset, ExporterHeaderList[colIndex].ExportImageFieldAttribute.XOffset); @@ -1117,9 +1119,9 @@ protected virtual void AddStyle() } col.Hidden = exporterHeader.ExporterHeaderAttribute.Hidden; - if (exporterHeader.ExporterHeaderAttribute.FontColor != 0) + if (exporterHeader.ExporterHeaderAttribute.FontColor != KnownColor.Empty) { - col.Style.Font.Color.SetColor(Color.FromName(exporterHeader.ExporterHeaderAttribute.FontColor.ToString())); + col.Style.Font.Color.SetColor(exporterHeader.ExporterHeaderAttribute.FontColor.ToColor()); } } } diff --git a/src/Magicodes.ExporterAndImporter.Excel/Utility/ImportHelper.cs b/src/Magicodes.ExporterAndImporter.Excel/Utility/ImportHelper.cs index 1b572a85..1c62cfaa 100644 --- a/src/Magicodes.ExporterAndImporter.Excel/Utility/ImportHelper.cs +++ b/src/Magicodes.ExporterAndImporter.Excel/Utility/ImportHelper.cs @@ -24,13 +24,14 @@ using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; -using System.Drawing; using System.IO; using System.Linq; using System.Linq.Dynamic.Core; using System.Reflection; using System.Threading.Tasks; -using DateTime = System.DateTime; +using Magicodes.IE.Excel.Images; +using SixLabors.ImageSharp; +using ImageExtensions = Magicodes.IE.Excel.Images.ImageExtensions; namespace Magicodes.ExporterAndImporter.Excel.Utility { @@ -1116,17 +1117,17 @@ protected virtual void ParseData(ExcelPackage excelPackage) { continue; } - var path = Path.Combine(col.ImportImageFieldAttribute.ImageDirectory, Guid.NewGuid() + "." + excelPicture.ImageFormat); + var path = Path.Combine(col.ImportImageFieldAttribute.ImageDirectory, Guid.NewGuid() + "." + excelPicture.ImageFormat.FileExtensions.First()); var value = string.Empty; switch (col.ImportImageFieldAttribute.ImportImageTo) { case ImportImageTo.TempFolder: - value = Extension.Save(excelPicture?.Image, path, excelPicture.ImageFormat); + value = excelPicture.Image.SaveTo(path); break; case ImportImageTo.Base64: - value = excelPicture.Image.ToBase64String(excelPicture.ImageFormat); + value = ImageExtensions.ToBase64String(excelPicture.Image, excelPicture.ImageFormat); break; default: diff --git a/src/Magicodes.ExporterAndImporter.Excel/Utility/ImportMultipleSheetHelper.cs b/src/Magicodes.ExporterAndImporter.Excel/Utility/ImportMultipleSheetHelper.cs index 45343907..2ea8049b 100644 --- a/src/Magicodes.ExporterAndImporter.Excel/Utility/ImportMultipleSheetHelper.cs +++ b/src/Magicodes.ExporterAndImporter.Excel/Utility/ImportMultipleSheetHelper.cs @@ -6,10 +6,9 @@ using OfficeOpenXml.Style; using System; using System.Collections.Generic; -using System.Drawing; +using SixLabors.ImageSharp; using System.IO; using System.Linq; -using System.Linq.Dynamic.Core; using System.Reflection; using System.Threading.Tasks; @@ -294,7 +293,7 @@ protected virtual void LabelingError(ExcelPackage excelPackage, bool isSaveLabel { var col = ImporterHeaderInfos.First(p => p.Header.Name == field.Key); var cell = worksheet.Cells[item.RowIndex, col.Header.ColumnIndex]; - cell.Style.Font.Color.SetColor(Color.Red); + cell.Style.Font.Color.SetColor(SixLabors.ImageSharp.Color.Red); cell.Style.Font.Bold = true; cell.AddComment(string.Join(",", field.Value), col.Header.Author); } @@ -596,7 +595,7 @@ protected virtual void StructureExcel(ExcelPackage excelPackage) ImporterHeaderInfos[i].Header.Author); //如果必填,则列头标红 if (ImporterHeaderInfos[i].IsRequired) - worksheet.Cells[importerAttribute.HeaderRowIndex, i + 1].Style.Font.Color.SetColor(Color.Red); + worksheet.Cells[importerAttribute.HeaderRowIndex, i + 1].Style.Font.Color.SetColor(SixLabors.ImageSharp.Color.Red); if (ImporterHeaderInfos[i].MappingValues.Count > 0) { @@ -619,7 +618,7 @@ protected virtual void StructureExcel(ExcelPackage excelPackage) worksheet.Cells[worksheet.Dimension.Address].Style.Border.Top.Style = ExcelBorderStyle.Thin; worksheet.Cells[worksheet.Dimension.Address].Style.Border.Bottom.Style = ExcelBorderStyle.Thin; worksheet.Cells[worksheet.Dimension.Address].Style.Fill.PatternType = ExcelFillStyle.Solid; - worksheet.Cells[worksheet.Dimension.Address].Style.Fill.BackgroundColor.SetColor(Color.DarkSeaGreen); + worksheet.Cells[worksheet.Dimension.Address].Style.Fill.BackgroundColor.SetColor(SixLabors.ImageSharp.Color.DarkSeaGreen); } } diff --git a/src/Magicodes.ExporterAndImporter.Excel/Utility/TemplateExport/TemplateExportHelper.cs b/src/Magicodes.ExporterAndImporter.Excel/Utility/TemplateExport/TemplateExportHelper.cs index e1f5cab9..412bca2a 100644 --- a/src/Magicodes.ExporterAndImporter.Excel/Utility/TemplateExport/TemplateExportHelper.cs +++ b/src/Magicodes.ExporterAndImporter.Excel/Utility/TemplateExport/TemplateExportHelper.cs @@ -23,6 +23,7 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; +using Magicodes.IE.Excel.Images; namespace Magicodes.ExporterAndImporter.Excel.Utility.TemplateExport { @@ -681,17 +682,17 @@ private bool RenderCellPipeline(Interpreter target, ExcelWorksheet sheet, ref st { try { - var bitmap = Extension.GetBitmapByUrl(imageUrl); - if (bitmap == null) + var image = imageUrl.GetImageByUrl(out var format); + if (image == null) { cell.Value = alt; } else { - if (height == default) height = bitmap.Height; - if (width == default) width = bitmap.Width; + if (height == default) height = image.Height; + if (width == default) width = image.Width; cell.Value = string.Empty; - var excelImage = sheet.Drawings.AddPicture(Guid.NewGuid().ToString(), bitmap); + var excelImage = sheet.Drawings.AddPicture(Guid.NewGuid().ToString(), image, format); var address = new ExcelAddress(cell.Address); ////调整对齐 excelImage.From.ColumnOff = Pixel2MTU(xOffset); diff --git a/src/Magicodes.ExporterAndImporter.Tests/ExcelImporter_Tests.cs b/src/Magicodes.ExporterAndImporter.Tests/ExcelImporter_Tests.cs index 3784c583..f024dc81 100644 --- a/src/Magicodes.ExporterAndImporter.Tests/ExcelImporter_Tests.cs +++ b/src/Magicodes.ExporterAndImporter.Tests/ExcelImporter_Tests.cs @@ -33,8 +33,9 @@ using Xunit.Abstractions; using Magicodes.IE.Tests.Models.Import; using System.Globalization; -using System.Drawing; +using SixLabors.ImageSharp; using System.Runtime.InteropServices; +using Codeuctivity.ImageSharpCompare; namespace Magicodes.ExporterAndImporter.Tests { @@ -858,57 +859,22 @@ public async Task ImportPicture_Test() if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { //添加严格校验,防止图片位置错误等问题 - var png1 = new Bitmap(Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "Images", "1.Jpeg")); - var png2 = new Bitmap(Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "Images", "3.Jpeg")); - var png3 = new Bitmap(Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "Images", "4.Jpeg")); - var png4 = new Bitmap(Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "Images", "2.Jpeg")); + var png1 = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "Images", "1.Jpeg"); + var png2 = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "Images", "3.Jpeg"); + var png3 = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "Images", "4.Jpeg"); + var png4 = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "Images", "2.Jpeg"); - IsSameImg(new Bitmap(import.Data.ElementAt(0).Img1), png1).ShouldBeTrue(); - IsSameImg(new Bitmap(import.Data.ElementAt(0).Img), png2).ShouldBeTrue(); + ImageSharpCompare.ImagesAreEqual(import.Data.ElementAt(0).Img1, png1).ShouldBeTrue(); + ImageSharpCompare.ImagesAreEqual(import.Data.ElementAt(0).Img, png2).ShouldBeTrue(); - IsSameImg(new Bitmap(import.Data.ElementAt(1).Img1), png3).ShouldBeTrue(); - IsSameImg(new Bitmap(import.Data.ElementAt(1).Img), png4).ShouldBeTrue(); + ImageSharpCompare.ImagesAreEqual(import.Data.ElementAt(1).Img1, png3).ShouldBeTrue(); + ImageSharpCompare.ImagesAreEqual(import.Data.ElementAt(1).Img, png4).ShouldBeTrue(); - IsSameImg(new Bitmap(import.Data.ElementAt(2).Img1), png1).ShouldBeTrue(); - IsSameImg(new Bitmap(import.Data.ElementAt(2).Img), png1).ShouldBeTrue(); + ImageSharpCompare.ImagesAreEqual(import.Data.ElementAt(2).Img1, png1).ShouldBeTrue(); + ImageSharpCompare.ImagesAreEqual(import.Data.ElementAt(2).Img, png1).ShouldBeTrue(); } } - /// - /// 判断图片是否一致 - /// - /// 图片一 - /// 图片二 - /// 是否一致 - public static bool IsSameImg(Bitmap bitmapSource, Bitmap bitmapTarget) - { - int countSame = 0; - int countDifferent = 0; - for (int i = 0; i < bitmapTarget.Width; i++) - { - for (int j = 0; j < bitmapTarget.Height; j++) - { - if (bitmapSource.GetPixel(i, j).Equals(bitmapTarget.GetPixel(i, j))) - { - countSame++; - } - else - { - countDifferent++;//不同之处,如果为0 则说明两张图片一样 - } - } - } - if (countDifferent == 0) - { - return true; - } - else - { - return false; - } - } - - [Fact(DisplayName = "导入图片测试头部非第一行")] public async Task ImportPictureHeaderNotFirstRow_Test() { diff --git a/src/Magicodes.ExporterAndImporter.Tests/Magicodes.IE.Tests.csproj b/src/Magicodes.ExporterAndImporter.Tests/Magicodes.IE.Tests.csproj index 17230811..132d27b0 100644 --- a/src/Magicodes.ExporterAndImporter.Tests/Magicodes.IE.Tests.csproj +++ b/src/Magicodes.ExporterAndImporter.Tests/Magicodes.IE.Tests.csproj @@ -16,6 +16,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -121,7 +122,7 @@ PreserveNewest - Always + PreserveNewest Always diff --git a/src/Magicodes.ExporterAndImporter.Tests/Models/Export/ExportTestDataWithColFontColor.cs b/src/Magicodes.ExporterAndImporter.Tests/Models/Export/ExportTestDataWithColFontColor.cs index 43c4dc39..85ed372e 100644 --- a/src/Magicodes.ExporterAndImporter.Tests/Models/Export/ExportTestDataWithColFontColor.cs +++ b/src/Magicodes.ExporterAndImporter.Tests/Models/Export/ExportTestDataWithColFontColor.cs @@ -1,4 +1,6 @@ using Magicodes.ExporterAndImporter.Core; +using Magicodes.IE.Core; +using SixLabors.ImageSharp; namespace Magicodes.ExporterAndImporter.Tests.Models.Export { @@ -7,11 +9,7 @@ public class ExportTestDataWithColFontColor [ExporterHeader(DisplayName = "姓名", IsBold = true, AutoCenterColumn = true)] public string Name { get; set; } -#if !NETCOREAPP2_1 - [ExporterHeader(DisplayName = "年龄", FontColor = System.Drawing.KnownColor.Red)] -#else - [ExporterHeader(DisplayName = "年龄", FontColor = KnownColor.Red)] -#endif + [ExporterHeader(DisplayName = "年龄", FontColor = KnownColor.Red)] public int Age { get; set; } } diff --git a/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/1.Jpeg b/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/1.Jpeg index db83ec57..ea2db9be 100644 Binary files a/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/1.Jpeg and b/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/1.Jpeg differ diff --git a/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/2.Jpeg b/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/2.Jpeg index baaaae5d..d6ebb96e 100644 Binary files a/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/2.Jpeg and b/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/2.Jpeg differ diff --git a/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/3.Jpeg b/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/3.Jpeg index 0862757d..2a3632a2 100644 Binary files a/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/3.Jpeg and b/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/3.Jpeg differ diff --git a/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/4.Jpeg b/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/4.Jpeg index 40a9bfd5..06d35a03 100644 Binary files a/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/4.Jpeg and b/src/Magicodes.ExporterAndImporter.Tests/TestFiles/Images/4.Jpeg differ