diff --git a/ClosedXML/ClosedXML.csproj b/ClosedXML/ClosedXML.csproj index 97f6610..12b98f0 100644 --- a/ClosedXML/ClosedXML.csproj +++ b/ClosedXML/ClosedXML.csproj @@ -1,13 +1,12 @@  - netstandard2.0;net452;net461 0.9 Manuel de Leon, Amir Ghezelbash, Francois Botha - ClosedXML makes it easier for developers to create Excel 2007/2010/2013 files. It provides a nice object oriented way to manipulate the files (similar to VBA) without dealing with the hassles of XML Documents. It can be used by any .NET language like C# and Visual Basic (VB). + ClosedXML makes it easier for developers to create Excel 2007+ (.xlsx, .xlsm, etc) files. It provides a nice object oriented way to manipulate the files (similar to VBA) without dealing with the hassles of XML Documents. It can be used by any .NET language like C# and VisualBasic.NET. MIT https://github.com/ClosedXML/ClosedXML/blob/master/LICENSE https://github.com/ClosedXML/ClosedXML @@ -32,7 +31,7 @@ - + @@ -42,11 +41,7 @@ - + - - diff --git a/ClosedXML/Excel/Style/Colors/XLColor_Static.cs b/ClosedXML/Excel/Style/Colors/XLColor_Static.cs index 13ce341..dd0b672 100644 --- a/ClosedXML/Excel/Style/Colors/XLColor_Static.cs +++ b/ClosedXML/Excel/Style/Colors/XLColor_Static.cs @@ -41,12 +41,14 @@ return FromColor(Color.FromArgb(a, r, g, b)); } -#if _NETFRAMEWORK_ public static XLColor FromKnownColor(KnownColor color) { +#if _NETFRAMEWORK_ return FromColor(Color.FromKnownColor(color)); - } +#else + return FromColor(XLColorTranslator.FromKnownColor(color)); #endif + } public static XLColor FromName(String name) { return FromColor(Color.FromName(name)); diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs index a7d1aa5..79d911d 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.cs @@ -365,7 +365,8 @@ // Only delete the VmlDrawingParts for comments. if (vmlDrawingPart != null) { - var xdoc = XDocumentExtensions.Load(vmlDrawingPart.GetStream(FileMode.Open)); + var vmlStream = vmlDrawingPart.GetStream(FileMode.Open); + var xdoc = XDocumentExtensions.Load(vmlStream); //xdoc.Root.Elements().Where(e => e.Name.LocalName == "shapelayout").Remove(); xdoc.Root.Elements().Where( e => e.Name.LocalName == "shapetype" && (string)e.Attribute("id") == @"_x0000_t202").Remove(); @@ -395,6 +396,7 @@ legacyParts.ForEach(p => vmlDrawingPartNew.AddPart(p, vmlDrawingPart.GetIdOfPart(p))); } + vmlStream.Close(); worksheetPart.DeletePart(vmlDrawingPart); if (hasNewPart && rId != worksheetPart.GetIdOfPart(vmlDrawingPartNew)) @@ -2409,9 +2411,10 @@ SaveContext context) { var ms = new MemoryStream(); - CopyStream(vmlDrawingPart.GetStream(FileMode.OpenOrCreate), ms); + var stream = vmlDrawingPart.GetStream(FileMode.OpenOrCreate); + CopyStream(stream, ms); ms.Position = 0; - var writer = new XmlTextWriter(vmlDrawingPart.GetStream(FileMode.Create), Encoding.UTF8); + var writer = new XmlTextWriter(stream, Encoding.UTF8); writer.WriteStartElement("xml"); diff --git a/ClosedXML/Extensions.cs b/ClosedXML/Extensions.cs index 38aafd4..4ae1156 100644 --- a/ClosedXML/Extensions.cs +++ b/ClosedXML/Extensions.cs @@ -212,8 +212,8 @@ #if _NETSTANDARD_ public static Double GetWidth(this IXLFontBase fontBase, String text) { - var textWidth = text.Length * 30; - double width = (((textWidth / (double)7) * 256) - (128 / 7)) / 256; + var textWidth = text.Length * 8.598; + double width = textWidth / 7d - 128d / 7 / 256; width = (double)decimal.Round((decimal)width + 0.2M, 2); return width; diff --git a/ClosedXML/NetStandard/KnownColor.cs b/ClosedXML/NetStandard/KnownColor.cs new file mode 100644 index 0000000..c65973e --- /dev/null +++ b/ClosedXML/NetStandard/KnownColor.cs @@ -0,0 +1,182 @@ +#if _NETSTANDARD_ +namespace ClosedXML.Excel +{ + public enum KnownColor + { + ActiveBorder, + ActiveCaption, + ActiveCaptionText, + AliceBlue, + AntiqueWhite, + AppWorkspace, + Aqua, + Aquamarine, + Azure, + Beige, + Bisque, + Black, + BlanchedAlmond, + Blue, + BlueViolet, + Brown, + BurlyWood, + ButtonFace, + ButtonHighlight, + ButtonShadow, + CadetBlue, + Chartreuse, + Chocolate, + Control, + ControlDark, + ControlDarkDark, + ControlLight, + ControlLightLight, + ControlText, + Coral, + CornflowerBlue, + Cornsilk, + Crimson, + Cyan, + DarkBlue, + DarkCyan, + DarkGoldenrod, + DarkGray, + DarkGreen, + DarkKhaki, + DarkMagenta, + DarkOliveGreen, + DarkOrange, + DarkOrchid, + DarkRed, + DarkSalmon, + DarkSeaGreen, + DarkSlateBlue, + DarkSlateGray, + DarkTurquoise, + DarkViolet, + DeepPink, + DeepSkyBlue, + Desktop, + DimGray, + DodgerBlue, + Firebrick, + FloralWhite, + ForestGreen, + Fuchsia, + Gainsboro, + GhostWhite, + Gold, + Goldenrod, + GradientActiveCaption, + GradientInactiveCaption, + Gray, + GrayText, + Green, + GreenYellow, + Highlight, + HighlightText, + Honeydew, + HotPink, + HotTrack, + InactiveBorder, + InactiveCaption, + InactiveCaptionText, + IndianRed, + Indigo, + Info, + InfoText, + Ivory, + Khaki, + Lavender, + LavenderBlush, + LawnGreen, + LemonChiffon, + LightBlue, + LightCoral, + LightCyan, + LightGoldenrodYellow, + LightGray, + LightGreen, + LightPink, + LightSalmon, + LightSeaGreen, + LightSkyBlue, + LightSlateGray, + LightSteelBlue, + LightYellow, + Lime, + LimeGreen, + Linen, + Magenta, + Maroon, + MediumAquamarine, + MediumBlue, + MediumOrchid, + MediumPurple, + MediumSeaGreen, + MediumSlateBlue, + MediumSpringGreen, + MediumTurquoise, + MediumVioletRed, + Menu, + MenuBar, + MenuHighlight, + MenuText, + MidnightBlue, + MintCream, + MistyRose, + Moccasin, + NavajoWhite, + Navy, + OldLace, + Olive, + OliveDrab, + Orange, + OrangeRed, + Orchid, + PaleGoldenrod, + PaleGreen, + PaleTurquoise, + PaleVioletRed, + PapayaWhip, + PeachPuff, + Peru, + Pink, + Plum, + PowderBlue, + Purple, + Red, + RosyBrown, + RoyalBlue, + SaddleBrown, + Salmon, + SandyBrown, + ScrollBar, + SeaGreen, + SeaShell, + Sienna, + Silver, + SkyBlue, + SlateBlue, + SlateGray, + Snow, + SpringGreen, + SteelBlue, + Tan, + Teal, + Thistle, + Tomato, + Transparent, + Turquoise, + Violet, + Wheat, + White, + WhiteSmoke, + Window, + WindowFrame, + WindowText, + Yellow, + YellowGreen + } +} +#endif \ No newline at end of file diff --git a/ClosedXML/NetStandard/XLColorTranslator.cs b/ClosedXML/NetStandard/XLColorTranslator.cs index fadc5cb..112b978 100644 --- a/ClosedXML/NetStandard/XLColorTranslator.cs +++ b/ClosedXML/NetStandard/XLColorTranslator.cs @@ -1,4 +1,5 @@ -#if !_NETFRAMEWORK_ +#if _NETSTANDARD_ +using ClosedXML.Excel; using System; using System.Collections.Generic; using System.Text.RegularExpressions; @@ -163,8 +164,14 @@ {"black",Color.FromArgb(0, 0, 0)}, }; - private static Regex HexParser = new Regex("^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$"); - private static Regex ShortHexParser = new Regex("^#([0-9a-f]{1})([0-9a-f]{1})([0-9a-f]{1})$"); + private static Regex HexParser = new Regex("^#([0-9a-f]{2})?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$"); + private static Regex ShortHexParser = new Regex("^#([0-9a-f]{1})?([0-9a-f]{1})([0-9a-f]{1})([0-9a-f]{1})$"); + + public static Color FromKnownColor(KnownColor knownColor) + { + var s = knownColor.ToString().ToLowerInvariant(); + return XLColorTranslator.FromHtml(s); + } public static Color FromHtml(string htmlColor) { @@ -181,13 +188,20 @@ m = ShortHexParser.Match(id); if (m.Value == String.Empty) { - throw new ArgumentException("Invalid HTML color"); + throw new ArgumentException("Invalid HTML color: " + htmlColor); } } - return Color.FromArgb( - Convert.ToInt32(m.Groups[1].Value.PadRight(2, m.Groups[1].Value[0]), 16), - Convert.ToInt32(m.Groups[2].Value.PadRight(2, m.Groups[2].Value[0]), 16), - Convert.ToInt32(m.Groups[3].Value.PadRight(2, m.Groups[3].Value[0]), 16)); + if (String.IsNullOrWhiteSpace(m.Groups[1].Value)) + return Color.FromArgb( + Convert.ToInt32(m.Groups[2].Value.PadRight(2, m.Groups[2].Value[0]), 16), + Convert.ToInt32(m.Groups[3].Value.PadRight(2, m.Groups[3].Value[0]), 16), + Convert.ToInt32(m.Groups[4].Value.PadRight(2, m.Groups[4].Value[0]), 16)); + else + return Color.FromArgb( + Convert.ToInt32(m.Groups[1].Value.PadRight(2, m.Groups[1].Value[0]), 16), + Convert.ToInt32(m.Groups[2].Value.PadRight(2, m.Groups[2].Value[0]), 16), + Convert.ToInt32(m.Groups[3].Value.PadRight(2, m.Groups[3].Value[0]), 16), + Convert.ToInt32(m.Groups[4].Value.PadRight(2, m.Groups[4].Value[0]), 16)); } } } diff --git a/ClosedXML_Examples/ClosedXML_Examples.csproj b/ClosedXML_Examples/ClosedXML_Examples.csproj index b125c3f..daae972 100644 --- a/ClosedXML_Examples/ClosedXML_Examples.csproj +++ b/ClosedXML_Examples/ClosedXML_Examples.csproj @@ -1,7 +1,7 @@  - net452;net461 + netcoreapp2.0;net452;net461 @@ -21,25 +21,12 @@ - - - - - - - - - - + + - - - - - diff --git a/ClosedXML_Sandbox/ClosedXML_Sandbox.csproj b/ClosedXML_Sandbox/ClosedXML_Sandbox.csproj index c94f965..35397d6 100644 --- a/ClosedXML_Sandbox/ClosedXML_Sandbox.csproj +++ b/ClosedXML_Sandbox/ClosedXML_Sandbox.csproj @@ -2,7 +2,7 @@ Exe - net452;net461 + netcoreapp2.0;net452;net461 diff --git a/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML_Tests/ClosedXML_Tests.csproj index a3e08fd..94a6b79 100644 --- a/ClosedXML_Tests/ClosedXML_Tests.csproj +++ b/ClosedXML_Tests/ClosedXML_Tests.csproj @@ -1,7 +1,7 @@  - net452;net461 + netcoreapp2.0;net452;net461 false @@ -13,7 +13,7 @@ $(DefineConstants);_NETSTANDARD_;_NETSTANDARD1_6_ - + $(DefineConstants);_NETSTANDARD_;_NETSTANDARD2_0_ @@ -33,11 +33,17 @@ - + - - + + + + + + + + @@ -45,13 +51,12 @@ - + - diff --git a/ClosedXML_Tests/Examples/ImageHandlingTests.cs b/ClosedXML_Tests/Examples/ImageHandlingTests.cs index cbbbd94..02a87dd 100644 --- a/ClosedXML_Tests/Examples/ImageHandlingTests.cs +++ b/ClosedXML_Tests/Examples/ImageHandlingTests.cs @@ -1,3 +1,4 @@ +#if _NETFRAMEWORK_ using ClosedXML_Examples; using NUnit.Framework; @@ -19,3 +20,4 @@ } } } +#endif \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs b/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs index b0ba0d6..6f544fa 100644 --- a/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs +++ b/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Reflection; +#if _NETFRAMEWORK_ namespace ClosedXML_Tests { [TestFixture] @@ -233,3 +234,4 @@ } } } +#endif \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/NetStandard/XLColorTranslatorTests.cs b/ClosedXML_Tests/Excel/NetStandard/XLColorTranslatorTests.cs new file mode 100644 index 0000000..a90b410 --- /dev/null +++ b/ClosedXML_Tests/Excel/NetStandard/XLColorTranslatorTests.cs @@ -0,0 +1,44 @@ +#if _NETSTANDARD_ + +using ClosedXML.Excel; +using ClosedXML.NetStandard; +using NUnit.Framework; +using System.Linq; +using System.Drawing; + +namespace ClosedXML_Tests.Excel.NetStandard +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class XLColorTranslatorTests + { + + + [Test] + public void CanResolveFromHtmlColor() + { + Color color; + color = XLColorTranslator.FromHtml("#FF000000"); + Assert.AreEqual(255, color.A); + Assert.AreEqual(0, color.R); + Assert.AreEqual(0, color.G); + Assert.AreEqual(0, color.B); + + color = XLColorTranslator.FromHtml("#8899AABB"); + Assert.AreEqual(136, color.A); + Assert.AreEqual(153, color.R); + Assert.AreEqual(170, color.G); + Assert.AreEqual(187, color.B); + + color = XLColorTranslator.FromHtml("#99AABB"); + Assert.AreEqual(255, color.A); + Assert.AreEqual(153, color.R); + Assert.AreEqual(170, color.G); + Assert.AreEqual(187, color.B); + } + } +} + +#endif \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Saving/SavingTests.cs b/ClosedXML_Tests/Excel/Saving/SavingTests.cs index ca2fd98..6505f7f 100644 --- a/ClosedXML_Tests/Excel/Saving/SavingTests.cs +++ b/ClosedXML_Tests/Excel/Saving/SavingTests.cs @@ -10,6 +10,17 @@ public class SavingTests { [Test] + public void CanSaveEmptyFile() + { + using (var ms = new MemoryStream()) + using (var wb = new XLWorkbook()) + { + wb.AddWorksheet("Sheet1"); + wb.SaveAs(ms); + } + } + + [Test] public void CanSuccessfullySaveFileMultipleTimes() { using (var wb = new XLWorkbook()) diff --git a/ClosedXML_Tests/ExcelDocsComparerTests.cs b/ClosedXML_Tests/ExcelDocsComparerTests.cs index ac2fa36..13a090f 100644 --- a/ClosedXML_Tests/ExcelDocsComparerTests.cs +++ b/ClosedXML_Tests/ExcelDocsComparerTests.cs @@ -17,7 +17,11 @@ new BasicTable().Create(left); new BasicTable().Create(right); string message; +#if _NETFRAMEWORK_ Assert.IsTrue(ExcelDocsComparer.Compare(left, right, TestHelper.IsRunningOnUnix, out message)); +#else + Assert.IsTrue(ExcelDocsComparer.Compare(left, right, true, out message)); +#endif } finally { @@ -43,7 +47,11 @@ new HelloWorld().Create(right); string message; +#if _NETFRAMEWORK_ Assert.IsFalse(ExcelDocsComparer.Compare(left, right, TestHelper.IsRunningOnUnix, out message)); +#else + Assert.IsFalse(ExcelDocsComparer.Compare(left, right, true, out message)); +#endif } finally { diff --git a/ClosedXML_Tests/OleDb/OleDbTests.cs b/ClosedXML_Tests/OleDb/OleDbTests.cs index e502614..a687b35 100644 --- a/ClosedXML_Tests/OleDb/OleDbTests.cs +++ b/ClosedXML_Tests/OleDb/OleDbTests.cs @@ -12,7 +12,7 @@ [TestFixture] public class OleDbTests { -#if !APPVEYOR +#if !APPVEYOR && _NETFRAMEWORK_ [Test] public void TestOleDbValues() { diff --git a/ClosedXML_Tests/TestHelper.cs b/ClosedXML_Tests/TestHelper.cs index bf85115..7425752 100644 --- a/ClosedXML_Tests/TestHelper.cs +++ b/ClosedXML_Tests/TestHelper.cs @@ -90,7 +90,11 @@ using (var streamActual = File.OpenRead(filePath2)) { string message; +#if _NETFRAMEWORK_ success = ExcelDocsComparer.Compare(streamActual, streamExpected, TestHelper.IsRunningOnUnix, out message); +#else + success = ExcelDocsComparer.Compare(streamActual, streamExpected, true, out message); +#endif var formattedMessage = String.Format( "Actual file '{0}' is different than the expected file '{1}'. The difference is: '{2}'", diff --git a/ClosedXML_Tests/Utils/ExcelDocsComparer.cs b/ClosedXML_Tests/Utils/ExcelDocsComparer.cs index 2ad4ab2..373ba62 100644 --- a/ClosedXML_Tests/Utils/ExcelDocsComparer.cs +++ b/ClosedXML_Tests/Utils/ExcelDocsComparer.cs @@ -19,9 +19,9 @@ public static bool Compare(Stream left, Stream right, bool stripColumnWidths, out string message) { - using (Package leftPackage = Package.Open(left)) + using (Package leftPackage = Package.Open(left, FileMode.Open, FileAccess.Read)) { - using (Package rightPackage = Package.Open(right)) + using (Package rightPackage = Package.Open(right, FileMode.Open, FileAccess.Read)) { return PackageHelper.Compare(leftPackage, rightPackage, false, ExcludeMethod, stripColumnWidths, out message); } diff --git a/nuget.config b/nuget.config new file mode 100644 index 0000000..7a7d936 --- /dev/null +++ b/nuget.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file