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