diff --git a/ClosedXML.sln b/ClosedXML.sln index b58a074..cd1cd87 100644 --- a/ClosedXML.sln +++ b/ClosedXML.sln @@ -1,9 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +# Visual Studio 15 +VisualStudioVersion = 15.0.26730.3 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClosedXML_Sandbox", "ClosedXML_Sandbox\ClosedXML_Sandbox.csproj", "{38B882F0-E6F2-45C5-9BE9-CDC27FBEB4AB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClosedXML_Sandbox", "ClosedXML_Sandbox\ClosedXML_Sandbox.csproj", "{38B882F0-E6F2-45C5-9BE9-CDC27FBEB4AB}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{5C94E22C-85AA-48FD-B082-CF929FFC6C31}" ProjectSection(SolutionItems) = preProject @@ -11,11 +11,11 @@ ClosedXML.vsmdi = ClosedXML.vsmdi EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClosedXML_Examples", "ClosedXML_Examples\ClosedXML_Examples.csproj", "{03A518D0-1CB7-488E-861C-C4E782B27A46}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClosedXML_Examples", "ClosedXML_Examples\ClosedXML_Examples.csproj", "{03A518D0-1CB7-488E-861C-C4E782B27A46}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClosedXML", "ClosedXML\ClosedXML.csproj", "{BD5E6BFE-E837-4A35-BCA9-39667D873A20}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClosedXML", "ClosedXML\ClosedXML.csproj", "{BD5E6BFE-E837-4A35-BCA9-39667D873A20}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClosedXML_Tests", "ClosedXML_Tests\ClosedXML_Tests.csproj", "{09B066ED-E4A7-4545-A1A4-FF03DD524BDF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClosedXML_Tests", "ClosedXML_Tests\ClosedXML_Tests.csproj", "{09B066ED-E4A7-4545-A1A4-FF03DD524BDF}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{073CFB1C-43DC-4ADC-9D12-BB8D7B10C099}" ProjectSection(SolutionItems) = preProject @@ -49,6 +49,9 @@ GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {2E35B7D8-9690-408F-B52A-F4FC485A6B09} + EndGlobalSection GlobalSection(TestCaseManagementSettings) = postSolution CategoryFile = ClosedXML.vsmdi EndGlobalSection diff --git a/ClosedXML/ClosedXML.csproj b/ClosedXML/ClosedXML.csproj index 32d422a..4c64ff7 100644 --- a/ClosedXML/ClosedXML.csproj +++ b/ClosedXML/ClosedXML.csproj @@ -1,7 +1,8 @@  - net452;net461 + + netstandard2.0;net452;net461 0.9 Manuel de Leon, Amir Ghezelbash, Francois Botha @@ -13,10 +14,6 @@ https://github.com/ClosedXML/ClosedXML - - $(DefineConstants);_NETSTANDARD_;_NETSTANDARD1_6_ - - $(DefineConstants);_NETSTANDARD_;_NETSTANDARD2_0_ @@ -30,20 +27,22 @@ - + + + + + - + - - 4.3.0 - + diff --git a/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/Excel/Cells/XLCell.cs index 73bceb3..af5899e 100644 --- a/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/Excel/Cells/XLCell.cs @@ -686,7 +686,7 @@ { if (data == null) return null; - if (data.Rows.Count > 0) return InsertTable(data.AsEnumerable(), tableName, createTable); + if (data.Rows.Count > 0) return InsertTable(data.Rows.Cast(), tableName, createTable); var ro = Address.RowNumber; var co = Address.ColumnNumber; diff --git a/ClosedXML/Excel/Columns/XLColumn.cs b/ClosedXML/Excel/Columns/XLColumn.cs index 6a266c6..0d37776 100644 --- a/ClosedXML/Excel/Columns/XLColumn.cs +++ b/ClosedXML/Excel/Columns/XLColumn.cs @@ -297,7 +297,10 @@ public IXLColumn AdjustToContents(Int32 startRow, Int32 endRow, Double minWidth, Double maxWidth) { +#if _NETFRAMEWORK_ var fontCache = new Dictionary(); +#endif + Double colMaxWidth = minWidth; List autoFilterRows = new List(); @@ -320,7 +323,7 @@ { var kpList = new List>(); - #region if (c.HasRichText) +#region if (c.HasRichText) if (c.HasRichText) { @@ -352,9 +355,9 @@ } } - #endregion +#endregion - #region foreach (var kp in kpList) +#region foreach (var kp in kpList) Double runningWidth = 0; Boolean rotated = false; @@ -368,41 +371,65 @@ Int32 newLinePosition = formattedString.IndexOf(Environment.NewLine); if (textRotation == 0) { - #region if (newLinePosition >= 0) +#region if (newLinePosition >= 0) if (newLinePosition >= 0) { if (newLinePosition > 0) +#if _NETFRAMEWORK_ runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition), fontCache); +#else + runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition)); +#endif if (runningWidth > thisWidthMax) thisWidthMax = runningWidth; runningWidth = newLinePosition < formattedString.Length - 2 +#if _NETFRAMEWORK_ ? f.GetWidth(formattedString.Substring(newLinePosition + 2), fontCache) +#else + ? f.GetWidth(formattedString.Substring(newLinePosition + 2)) +#endif : 0; } else +#if _NETFRAMEWORK_ runningWidth += f.GetWidth(formattedString, fontCache); +#else + runningWidth += f.GetWidth(formattedString); +#endif - #endregion +#endregion } else { - #region if (textRotation == 255) +#region if (textRotation == 255) if (textRotation == 255) { if (runningWidth <= 0) +#if _NETFRAMEWORK_ runningWidth = f.GetWidth("X", fontCache); +#else + runningWidth = f.GetWidth("X"); +#endif if (newLinePosition >= 0) +#if _NETFRAMEWORK_ runningWidth += f.GetWidth("X", fontCache); +#else + runningWidth += f.GetWidth("X"); +#endif } else { rotated = true; +#if _NETFRAMEWORK_ Double vWidth = f.GetWidth("X", fontCache); +#else + Double vWidth = f.GetWidth("X"); +#endif if (vWidth > maxLineWidth) maxLineWidth = vWidth; @@ -411,29 +438,41 @@ lineCount++; if (newLinePosition > 0) +#if _NETFRAMEWORK_ runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition), fontCache); +#else + runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition)); +#endif if (runningWidth > thisWidthMax) thisWidthMax = runningWidth; runningWidth = newLinePosition < formattedString.Length - 2 +#if _NETFRAMEWORK_ ? f.GetWidth(formattedString.Substring(newLinePosition + 2), fontCache) +#else + ? f.GetWidth(formattedString.Substring(newLinePosition + 2)) +#endif : 0; } else +#if _NETFRAMEWORK_ runningWidth += f.GetWidth(formattedString, fontCache); +#else + runningWidth += f.GetWidth(formattedString); +#endif } - #endregion +#endregion } } - #endregion +#endregion if (runningWidth > thisWidthMax) thisWidthMax = runningWidth; - #region if (rotated) +#region if (rotated) if (rotated) { @@ -448,11 +487,14 @@ thisWidthMax = (thisWidthMax * Math.Cos(r)) + (maxLineWidth * lineCount); } - #endregion +#endregion } else +#if _NETFRAMEWORK_ thisWidthMax = c.Style.Font.GetWidth(c.GetFormattedString(), fontCache); - +#else + thisWidthMax = c.Style.Font.GetWidth(c.GetFormattedString()); +#endif if (autoFilterRows.Contains(c.Address.RowNumber)) thisWidthMax += 2.7148; // Allow room for arrow icon in autofilter @@ -472,10 +514,12 @@ Width = colMaxWidth; +#if _NETFRAMEWORK_ foreach (IDisposable font in fontCache.Values) { font.Dispose(); } +#endif return this; } @@ -658,7 +702,7 @@ return Column(FirstCellUsed(includeFormats), LastCellUsed(includeFormats)); } - #endregion +#endregion public override XLRange AsRange() { @@ -726,7 +770,7 @@ return Worksheet.Column(ColumnNumber() + columnsToShift); } - #region XLColumn Left +#region XLColumn Left IXLColumn IXLColumn.ColumnLeft() { @@ -748,9 +792,9 @@ return ColumnShift(step * -1); } - #endregion +#endregion - #region XLColumn Right +#region XLColumn Right IXLColumn IXLColumn.ColumnRight() { @@ -772,7 +816,7 @@ return ColumnShift(step); } - #endregion +#endregion public new Boolean IsEmpty() { diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs index 6f38667..697e479 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs @@ -5,6 +5,10 @@ using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Spreadsheet; +#if _NETSTANDARD_ +using ClosedXML.NetStandard; +#endif + namespace ClosedXML.Excel { internal class XLCFColorScaleConverter : IXLCFConverter diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs index 1b2f0be..0467e00 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs @@ -5,6 +5,10 @@ using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Spreadsheet; +#if _NETSTANDARD_ +using ClosedXML.NetStandard; +#endif + namespace ClosedXML.Excel { internal class XLCFDataBarConverter:IXLCFConverter diff --git a/ClosedXML/Excel/Drawings/XLPicture.cs b/ClosedXML/Excel/Drawings/XLPicture.cs index 0d54b51..a0f246d 100644 --- a/ClosedXML/Excel/Drawings/XLPicture.cs +++ b/ClosedXML/Excel/Drawings/XLPicture.cs @@ -152,6 +152,7 @@ } set { +#if _NETFRAMEWORK_ if (imgStream == null) { imgStream = new MemoryStream(); @@ -172,6 +173,9 @@ iVerticalResolution = bitmap.VerticalResolution; } imgStream.Seek(0, SeekOrigin.Begin); +#else + throw new NotImplementedException("System.Drawing.Bitmap is not implemented in .NET Standard 2.0"); +#endif } } diff --git a/ClosedXML/Excel/IXLTheme.cs b/ClosedXML/Excel/IXLTheme.cs index b4e1ccb..0255eb1 100644 --- a/ClosedXML/Excel/IXLTheme.cs +++ b/ClosedXML/Excel/IXLTheme.cs @@ -1,7 +1,4 @@ -using ClosedXML.Excel; -using System.Drawing; - -namespace ClosedXML.Excel +namespace ClosedXML.Excel { public interface IXLTheme { diff --git a/ClosedXML/Excel/PageSetup/XLHFText.cs b/ClosedXML/Excel/PageSetup/XLHFText.cs index ea9d5a8..293e7c4 100644 --- a/ClosedXML/Excel/PageSetup/XLHFText.cs +++ b/ClosedXML/Excel/PageSetup/XLHFText.cs @@ -1,6 +1,10 @@ using System; using System.Text; +#if _NETSTANDARD_ +using ClosedXML.NetStandard; +#endif + namespace ClosedXML.Excel { internal class XLHFText diff --git a/ClosedXML/Excel/Rows/XLRow.cs b/ClosedXML/Excel/Rows/XLRow.cs index b5447d5..4d4d6bc 100644 --- a/ClosedXML/Excel/Rows/XLRow.cs +++ b/ClosedXML/Excel/Rows/XLRow.cs @@ -277,7 +277,9 @@ public IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight) { +#if _NETFRAMEWORK_ var fontCache = new Dictionary(); +#endif Double rowMaxHeight = minHeight; foreach (XLCell c in from XLCell c in Row(startColumn, endColumn).CellsUsed() where !c.IsMerged() select c) { @@ -317,7 +319,11 @@ } Double maxLongCol = kpList.Max(kp => kp.Value.Length); +#if _NETFRAMEWORK_ Double maxHeightCol = kpList.Max(kp => kp.Key.GetHeight(fontCache)); +#else + Double maxHeightCol = kpList.Max(kp => kp.Key.GetHeight()); +#endif Int32 lineCount = kpList.Count(kp => kp.Value.Contains(Environment.NewLine)) + 1; if (textRotation == 0) thisHeight = maxHeightCol * lineCount; @@ -338,8 +344,11 @@ } } else - thisHeight = c.Style.Font.GetHeight( fontCache); - +#if _NETFRAMEWORK_ + thisHeight = c.Style.Font.GetHeight(fontCache); +#else + thisHeight = c.Style.Font.GetHeight(); +#endif if (thisHeight >= maxHeight) { rowMaxHeight = maxHeight; @@ -354,10 +363,12 @@ Height = rowMaxHeight; +#if _NETFRAMEWORK_ foreach (IDisposable font in fontCache.Values) { font.Dispose(); } +#endif return this; } @@ -581,7 +592,7 @@ return Row(FirstCellUsed(includeFormats), LastCellUsed(includeFormats)); } - #endregion +#endregion public override XLRange AsRange() { @@ -654,7 +665,7 @@ return Worksheet.Row(RowNumber() + rowsToShift); } - #region XLRow Above +#region XLRow Above IXLRow IXLRow.RowAbove() { @@ -676,9 +687,9 @@ return RowShift(step * -1); } - #endregion +#endregion - #region XLRow Below +#region XLRow Below IXLRow IXLRow.RowBelow() { @@ -700,7 +711,7 @@ return RowShift(step); } - #endregion +#endregion public new Boolean IsEmpty() { diff --git a/ClosedXML/Excel/Style/Colors/XLColor_Public.cs b/ClosedXML/Excel/Style/Colors/XLColor_Public.cs index 7dcd8e4..60a349b 100644 --- a/ClosedXML/Excel/Style/Colors/XLColor_Public.cs +++ b/ClosedXML/Excel/Style/Colors/XLColor_Public.cs @@ -1,6 +1,10 @@ using System; using System.Drawing; +#if _NETSTANDARD_ +using ClosedXML.NetStandard; +#endif + namespace ClosedXML.Excel { public enum XLColorType @@ -170,4 +174,4 @@ return !(left == right); } } -} \ No newline at end of file +} diff --git a/ClosedXML/Excel/Style/Colors/XLColor_Static.cs b/ClosedXML/Excel/Style/Colors/XLColor_Static.cs index d66e191..5798893 100644 --- a/ClosedXML/Excel/Style/Colors/XLColor_Static.cs +++ b/ClosedXML/Excel/Style/Colors/XLColor_Static.cs @@ -3,6 +3,10 @@ using System.Drawing; using DocumentFormat.OpenXml.Presentation; +#if _NETSTANDARD_ +using ClosedXML.NetStandard; +#endif + namespace ClosedXML.Excel { public partial class XLColor @@ -36,17 +40,24 @@ { return FromColor(Color.FromArgb(a, r, g, b)); } + +#if _NETFRAMEWORK_ public static XLColor FromKnownColor(KnownColor color) { return FromColor(Color.FromKnownColor(color)); - } + } +#endif public static XLColor FromName(String name) { return FromColor(Color.FromName(name)); } public static XLColor FromHtml(String htmlColor) { +#if _NETFRAMEWORK_ return FromColor(ColorTranslator.FromHtml(htmlColor)); +#else + return FromColor(XLColorTranslator.FromHtml(htmlColor)); +#endif } private static readonly Dictionary ByIndex = new Dictionary(); diff --git a/ClosedXML/Excel/Style/IXLFontBase.cs b/ClosedXML/Excel/Style/IXLFontBase.cs index 1e5b6cf..61e7254 100644 --- a/ClosedXML/Excel/Style/IXLFontBase.cs +++ b/ClosedXML/Excel/Style/IXLFontBase.cs @@ -2,9 +2,7 @@ namespace ClosedXML.Excel { - - - public interface IXLFontBase + public interface IXLFontBase { Boolean Bold { get; set; } Boolean Italic { get; set; } @@ -16,7 +14,5 @@ XLColor FontColor { get; set; } String FontName { get; set; } XLFontFamilyNumberingValues FontFamilyNumbering { get; set; } - - } } diff --git a/ClosedXML/Excel/XLWorkbook.cs b/ClosedXML/Excel/XLWorkbook.cs index 645d536..8d3a62b 100644 --- a/ClosedXML/Excel/XLWorkbook.cs +++ b/ClosedXML/Excel/XLWorkbook.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Security.AccessControl; using ClosedXML.Excel.CalcEngine; using DocumentFormat.OpenXml; @@ -494,7 +493,6 @@ CopyStream(_originalStream, fileStream); //fileStream.Position = 0; CreatePackage(fileStream, false, _spreadsheetDocumentType, validate); - fileStream.Close(); } } } @@ -571,7 +569,6 @@ using (var fileStream = new FileStream(_originalFile, FileMode.Open, FileAccess.Read)) { CopyStream(fileStream, stream); - fileStream.Close(); } CreatePackage(stream, false, _spreadsheetDocumentType, validate); } diff --git a/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/Excel/XLWorkbook_Load.cs index 76c27ec..4d1afbe 100644 --- a/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/Excel/XLWorkbook_Load.cs @@ -1,6 +1,4 @@ -#region - -using ClosedXML.Utils; +using ClosedXML.Utils; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; @@ -15,18 +13,15 @@ using Ap = DocumentFormat.OpenXml.ExtendedProperties; using Op = DocumentFormat.OpenXml.CustomProperties; -#endregion - +#if _NETSTANDARD_ +using ClosedXML.NetStandard; +#endif namespace ClosedXML.Excel { - #region - using Ap; using Op; using System.Drawing; - #endregion - public partial class XLWorkbook { private readonly Dictionary _colorList = new Dictionary(); @@ -259,7 +254,7 @@ reader.Close(); } - #region LoadTables +#region LoadTables foreach (TableDefinitionPart tablePart in wsPart.TableDefinitionParts) { @@ -335,9 +330,9 @@ xlTable.AutoFilter.Range = xlTable.Worksheet.Range(xlTable.RangeAddress); } - #endregion +#endregion - #region LoadComments +#region LoadComments if (wsPart.WorksheetCommentsPart != null) { @@ -389,7 +384,7 @@ } } - #endregion +#endregion } var workbook = dSpreadsheet.WorkbookPart.Workbook; @@ -412,7 +407,7 @@ } LoadDefinedNames(workbook); - #region Pivot tables +#region Pivot tables // Delay loading of pivot tables until all sheets have been loaded foreach (Sheet dSheet in sheets.OfType()) @@ -613,10 +608,10 @@ } } - #endregion +#endregion } - #region Comment Helpers +#region Comment Helpers private XDocument GetCommentVmlFile(WorksheetPart wsPart) { @@ -653,7 +648,7 @@ return shape; } - #endregion +#endregion private String GetTableColumnName(string name) { @@ -1214,7 +1209,7 @@ if (!hasRuns) xlCell._cellValue = XmlEncoder.DecodeString(element.Text.InnerText); - #region Load PhoneticProperties +#region Load PhoneticProperties var pp = phoneticProperties.FirstOrDefault(); if (pp != null) @@ -1227,9 +1222,9 @@ LoadFont(pp, xlCell.RichText.Phonetics); } - #endregion +#endregion - #region Load Phonetic Runs +#region Load Phonetic Runs foreach (PhoneticRun pr in phoneticRuns) { @@ -1237,7 +1232,7 @@ (Int32)pr.EndingBaseIndex.Value); } - #endregion +#endregion } private void LoadNumberFormat(NumberingFormat nfSource, IXLNumberFormat nf) @@ -1535,7 +1530,7 @@ { case XLFilterOperator.Equal: if (isText) - condition = o => o.ToString().Equals(xlFilter.Value.ToString(), StringComparison.InvariantCultureIgnoreCase); + condition = o => o.ToString().Equals(xlFilter.Value.ToString(), StringComparison.OrdinalIgnoreCase); else condition = o => (o as IComparable).CompareTo(xlFilter.Value) == 0; break; @@ -1546,7 +1541,7 @@ case XLFilterOperator.LessThan: condition = o => (o as IComparable).CompareTo(xlFilter.Value) < 0; break; case XLFilterOperator.NotEqual: if (isText) - condition = o => !o.ToString().Equals(xlFilter.Value.ToString(), StringComparison.InvariantCultureIgnoreCase); + condition = o => !o.ToString().Equals(xlFilter.Value.ToString(), StringComparison.OrdinalIgnoreCase); else condition = o => (o as IComparable).CompareTo(xlFilter.Value) != 0; break; @@ -1582,7 +1577,7 @@ if (isText) { xlFilter.Value = filter.Val.Value; - condition = o => o.ToString().Equals(xlFilter.Value.ToString(), StringComparison.InvariantCultureIgnoreCase); + condition = o => o.ToString().Equals(xlFilter.Value.ToString(), StringComparison.OrdinalIgnoreCase); } else { @@ -2068,7 +2063,11 @@ Color thisColor; if (!_colorList.ContainsKey(htmlColor)) { +#if _NETFRAMEWORK_ thisColor = ColorTranslator.FromHtml(htmlColor); +#else + thisColor = XLColorTranslator.FromHtml(htmlColor); +#endif _colorList.Add(htmlColor, thisColor); } else diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs index 9b099a8..39f2272 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.cs @@ -1,4 +1,7 @@ -using System; +#if _NETSTANDARD_ +using ClosedXML.NetStandard; +#endif +using System; using System.Collections.Generic; using System.Globalization; using System.IO; diff --git a/ClosedXML/Extensions.cs b/ClosedXML/Extensions.cs index b2e1cd0..03a9e97 100644 --- a/ClosedXML/Extensions.cs +++ b/ClosedXML/Extensions.cs @@ -228,48 +228,47 @@ public static class FontBaseExtensions { - private static Font GetCachedFont(IXLFontBase fontBase, Dictionary fontCache) + +#if _NETSTANDARD_ + public static Double GetWidth(this IXLFontBase fontBase, String text) { - Font font; - if (!fontCache.TryGetValue(fontBase, out font)) - { - font = new Font(fontBase.FontName, (float)fontBase.FontSize, GetFontStyle(fontBase)); - fontCache.Add(fontBase, font); - } - return font; + var textWidth = text.Length * 30; + double width = (((textWidth / (double)7) * 256) - (128 / 7)) / 256; + width = (double)decimal.Round((decimal)width + 0.2M, 2); + + return width; } + public static Double GetHeight(this IXLFontBase fontBase) + { + var textHeight = 30; + return (double)textHeight * 0.85; + } +#endif + +#if _NETFRAMEWORK_ public static Double GetWidth(this IXLFontBase fontBase, String text, Dictionary fontCache) { if (XLHelper.IsNullOrWhiteSpace(text)) return 0; var font = GetCachedFont(fontBase, fontCache); + var textWidth = GraphicsUtils.MeasureString(text, font).Width; - var textSize = GraphicsUtils.MeasureString(text, font); - - double width = (((textSize.Width / (double)7) * 256) - (128 / 7)) / 256; + double width = (((textWidth / (double)7) * 256) - (128 / 7)) / 256; width = (double)decimal.Round((decimal)width + 0.2M, 2); return width; } - private static FontStyle GetFontStyle(IXLFontBase font) - { - FontStyle fontStyle = FontStyle.Regular; - if (font.Bold) fontStyle |= FontStyle.Bold; - if (font.Italic) fontStyle |= FontStyle.Italic; - if (font.Strikethrough) fontStyle |= FontStyle.Strikeout; - if (font.Underline != XLFontUnderlineValues.None) fontStyle |= FontStyle.Underline; - return fontStyle; - } public static Double GetHeight(this IXLFontBase fontBase, Dictionary fontCache) { var font = GetCachedFont(fontBase, fontCache); - var textSize = GraphicsUtils.MeasureString("X", font); - return (double)textSize.Height * 0.85; + var textHeight = GraphicsUtils.MeasureString("X", font).Height; + return (double)textHeight * 0.85; } +#endif public static void CopyFont(this IXLFontBase font, IXLFontBase sourceFont) { @@ -284,6 +283,29 @@ font.FontName = sourceFont.FontName; font.FontFamilyNumbering = sourceFont.FontFamilyNumbering; } + +#if _NETFRAMEWORK_ + private static Font GetCachedFont(IXLFontBase fontBase, Dictionary fontCache) + { + Font font; + if (!fontCache.TryGetValue(fontBase, out font)) + { + font = new Font(fontBase.FontName, (float)fontBase.FontSize, GetFontStyle(fontBase)); + fontCache.Add(fontBase, font); + } + return font; + } + + private static FontStyle GetFontStyle(IXLFontBase font) + { + FontStyle fontStyle = FontStyle.Regular; + if (font.Bold) fontStyle |= FontStyle.Bold; + if (font.Italic) fontStyle |= FontStyle.Italic; + if (font.Strikethrough) fontStyle |= FontStyle.Strikeout; + if (font.Underline != XLFontUnderlineValues.None) fontStyle |= FontStyle.Underline; + return fontStyle; + } +#endif } public static class XDocumentExtensions diff --git a/ClosedXML/NetStandard/XLColorTranslator.cs b/ClosedXML/NetStandard/XLColorTranslator.cs new file mode 100644 index 0000000..fadc5cb --- /dev/null +++ b/ClosedXML/NetStandard/XLColorTranslator.cs @@ -0,0 +1,195 @@ +#if !_NETFRAMEWORK_ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Drawing; + +namespace ClosedXML.NetStandard +{ + public class XLColorTranslator + { + private static IDictionary NAMED_COLOR_MAP = new Dictionary{ + + //X11 Color Names (W3C color names) + //Red color names + {"indianred", Color.FromArgb(205, 92, 92)}, + {"lightcoral",Color.FromArgb(240, 128, 128)}, + {"salmon",Color.FromArgb(250, 128, 114)}, + {"darksalmon",Color.FromArgb(233, 150, 122)}, + {"crimson",Color.FromArgb(220, 20, 60)}, + {"red",Color.FromArgb(255, 0, 0)}, + {"firebrick",Color.FromArgb(178, 34, 34)}, + {"darkred",Color.FromArgb(139, 0, 0)}, + //Pink color names + {"pink",Color.FromArgb(255, 192, 203)}, + {"lightpink",Color.FromArgb(255, 182, 193)}, + {"hotpink",Color.FromArgb(255, 105, 180)}, + {"deeppink",Color.FromArgb(255, 20, 147)}, + {"mediumvioletred",Color.FromArgb(199, 21, 133)}, + {"palevioletred",Color.FromArgb(219, 112, 147)}, + //Orange color names + {"lightsalmon",Color.FromArgb(255, 160, 122)}, + {"coral",Color.FromArgb(255, 127, 80)}, + {"tomato",Color.FromArgb(255, 99, 71)}, + {"orangered",Color.FromArgb(255, 69, 0)}, + {"darkorange",Color.FromArgb(255, 140, 0)}, + {"orange",Color.FromArgb(255, 165, 0)}, + //Yellow color names + {"gold",Color.FromArgb(255, 215, 0)}, + {"yellow",Color.FromArgb(255, 255, 0)}, + {"lightyellow",Color.FromArgb(255, 255, 224)}, + {"lemonchiffon",Color.FromArgb(255, 250, 205)}, + {"lightgoldenrodyellow",Color.FromArgb(250, 250, 210)}, + {"papayawhip",Color.FromArgb(255, 239, 213)}, + {"moccasin",Color.FromArgb(255, 228, 181)}, + {"peachpuff",Color.FromArgb(255, 218, 185)}, + {"palegoldenrod",Color.FromArgb(238, 232, 170)}, + {"khaki",Color.FromArgb(240, 230, 140)}, + {"darkkhaki",Color.FromArgb(189, 183, 107)}, + //Purple color names + {"lavender",Color.FromArgb(230, 230, 250)}, + {"thistle",Color.FromArgb(216, 191, 216)}, + {"plum",Color.FromArgb(221, 160, 221)}, + {"violet",Color.FromArgb(238, 130, 238)}, + {"orchid",Color.FromArgb(218, 112, 214)}, + {"fuchsia",Color.FromArgb(255, 0, 255)}, + {"magenta",Color.FromArgb(255, 0, 255)}, + {"mediumorchid",Color.FromArgb(186, 85, 211)}, + {"mediumpurple",Color.FromArgb(147, 112, 219)}, + {"blueviolet",Color.FromArgb(138, 43, 226)}, + {"darkviolet",Color.FromArgb(148, 0, 211)}, + {"darkorchid",Color.FromArgb(153, 50, 204)}, + {"darkmagenta",Color.FromArgb(139, 0, 139)}, + {"purple",Color.FromArgb(128, 0, 128)}, + {"indigo",Color.FromArgb(75, 0, 130)}, + {"slateblue",Color.FromArgb(106, 90, 205)}, + {"darkslateblue",Color.FromArgb(72, 61, 139)}, + //Green color names + {"greenyellow",Color.FromArgb(173, 255, 47)}, + {"chartreuse",Color.FromArgb(127, 255, 0)}, + {"lawngreen",Color.FromArgb(124, 252, 0)}, + {"lime",Color.FromArgb(0, 255, 0)}, + {"limegreen",Color.FromArgb(50, 205, 50)}, + {"palegreen",Color.FromArgb(152, 251, 152)}, + {"lightgreen",Color.FromArgb(144, 238, 144)}, + {"mediumspringgreen",Color.FromArgb(0, 250, 154)}, + {"springgreen",Color.FromArgb(0, 255, 127)}, + {"mediumseagreen",Color.FromArgb(60, 179, 113)}, + {"seagreen",Color.FromArgb(46, 139, 87)}, + {"forestgreen",Color.FromArgb(34, 139, 34)}, + {"green",Color.FromArgb(0, 128, 0)}, + {"darkgreen",Color.FromArgb(0, 100, 0)}, + {"yellowgreen",Color.FromArgb(154, 205, 50)}, + {"olivedrab",Color.FromArgb(107, 142, 35)}, + {"olive",Color.FromArgb(128, 128, 0)}, + {"darkolivegreen",Color.FromArgb(85, 107, 47)}, + {"mediumaquamarine",Color.FromArgb(102, 205, 170)}, + {"darkseagreen",Color.FromArgb(143, 188, 143)}, + {"lightseagreen",Color.FromArgb(32, 178, 170)}, + {"darkcyan",Color.FromArgb(0, 139, 139)}, + {"teal",Color.FromArgb(0, 128, 128)}, + //Blue color names + {"aqua",Color.FromArgb(0, 255, 255)}, + {"cyan",Color.FromArgb(0, 255, 255)}, + {"lightcyan",Color.FromArgb(224, 255, 255)}, + {"paleturquoise",Color.FromArgb(175, 238, 238)}, + {"aquamarine",Color.FromArgb(127, 255, 212)}, + {"turquoise",Color.FromArgb(64, 224, 208)}, + {"mediumturquoise",Color.FromArgb(72, 209, 204)}, + {"darkturquoise",Color.FromArgb(0, 206, 209)}, + {"cadetblue",Color.FromArgb(95, 158, 160)}, + {"steelblue",Color.FromArgb(70, 130, 180)}, + {"lightsteelblue",Color.FromArgb(176, 196, 222)}, + {"powderblue",Color.FromArgb(176, 224, 230)}, + {"lightblue",Color.FromArgb(173, 216, 230)}, + {"skyblue",Color.FromArgb(135, 206, 235)}, + {"lightskyblue",Color.FromArgb(135, 206, 250)}, + {"deepskyblue",Color.FromArgb(0, 191, 255)}, + {"dodgerblue",Color.FromArgb(30, 144, 255)}, + {"cornflowerblue",Color.FromArgb(100, 149, 237)}, + {"mediumslateblue",Color.FromArgb(123, 104, 238)}, + {"royalblue",Color.FromArgb(65, 105, 225)}, + {"blue",Color.FromArgb(0, 0, 255)}, + {"mediumblue",Color.FromArgb(0, 0, 205)}, + {"darkblue",Color.FromArgb(0, 0, 139)}, + {"navy",Color.FromArgb(0, 0, 128)}, + {"midnightblue",Color.FromArgb(25, 25, 112)}, + //Brown color names + {"cornsilk",Color.FromArgb(255, 248, 220)}, + {"blanchedalmond",Color.FromArgb(255, 235, 205)}, + {"bisque",Color.FromArgb(255, 228, 196)}, + {"navajowhite",Color.FromArgb(255, 222, 173)}, + {"wheat",Color.FromArgb(245, 222, 179)}, + {"burlywood",Color.FromArgb(222, 184, 135)}, + {"tan",Color.FromArgb(210, 180, 140)}, + {"rosybrown",Color.FromArgb(188, 143, 143)}, + {"sandybrown",Color.FromArgb(244, 164, 96)}, + {"goldenrod",Color.FromArgb(218, 165, 32)}, + {"darkgoldenrod",Color.FromArgb(184, 134, 11)}, + {"peru",Color.FromArgb(205, 133, 63)}, + {"chocolate",Color.FromArgb(210, 105, 30)}, + {"saddlebrown",Color.FromArgb(139, 69, 19)}, + {"sienna",Color.FromArgb(160, 82, 45)}, + {"brown",Color.FromArgb(165, 42, 42)}, + {"maroon",Color.FromArgb(128, 0, 0)}, + //White color names + {"white",Color.FromArgb(255, 255, 255)}, + {"snow",Color.FromArgb(255, 250, 250)}, + {"honeydew",Color.FromArgb(240, 255, 240)}, + {"mintcream",Color.FromArgb(245, 255, 250)}, + {"azure",Color.FromArgb(240, 255, 255)}, + {"aliceblue",Color.FromArgb(240, 248, 255)}, + {"ghostwhite",Color.FromArgb(248, 248, 255)}, + {"whitesmoke",Color.FromArgb(245, 245, 245)}, + {"seashell",Color.FromArgb(255, 245, 238)}, + {"beige",Color.FromArgb(245, 245, 220)}, + {"oldlace",Color.FromArgb(253, 245, 230)}, + {"floralwhite",Color.FromArgb(255, 250, 240)}, + {"ivory",Color.FromArgb(255, 255, 240)}, + {"antiquewhite",Color.FromArgb(250, 235, 215)}, + {"linen",Color.FromArgb(250, 240, 230)}, + {"lavenderblush",Color.FromArgb(255, 240, 245)}, + {"mistyrose",Color.FromArgb(255, 228, 225)}, + //Grey color names + {"gainsboro",Color.FromArgb(220, 220, 220)}, + {"lightgrey",Color.FromArgb(211, 211, 211)}, + {"silver",Color.FromArgb(192, 192, 192)}, + {"darkgray",Color.FromArgb(169, 169, 169)}, + {"gray",Color.FromArgb(128, 128, 128)}, + {"dimgray",Color.FromArgb(105, 105, 105)}, + {"lightslategray",Color.FromArgb(119, 136, 153)}, + {"slategray",Color.FromArgb(112, 128, 144)}, + {"darkslategray",Color.FromArgb(47, 79, 79)}, + {"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})$"); + + public static Color FromHtml(string htmlColor) + { + string id = htmlColor.Trim().ToLowerInvariant(); + if (NAMED_COLOR_MAP.ContainsKey(id)) + { + return NAMED_COLOR_MAP[id]; + } + else + { + var m = HexParser.Match(id); + if (m.Value == String.Empty) + { + m = ShortHexParser.Match(id); + if (m.Value == String.Empty) + { + throw new ArgumentException("Invalid HTML color"); + } + } + 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)); + } + } + } +} +#endif diff --git a/ClosedXML/Utils/GraphicsUtils.cs b/ClosedXML/Utils/GraphicsUtils.cs index b5e6762..66d6b10 100644 --- a/ClosedXML/Utils/GraphicsUtils.cs +++ b/ClosedXML/Utils/GraphicsUtils.cs @@ -1,4 +1,5 @@ -using System; +#if _NETFRAMEWORK_ +using System; using System.Drawing; namespace ClosedXML.Utils @@ -27,3 +28,4 @@ } } } +#endif \ No newline at end of file diff --git a/ClosedXML/XLHelper.cs b/ClosedXML/XLHelper.cs index 83d2434..c85e60b 100644 --- a/ClosedXML/XLHelper.cs +++ b/ClosedXML/XLHelper.cs @@ -1,14 +1,14 @@ using System; -using System.Collections.Generic; using System.Globalization; -using System.Text; +using System.Linq; +using System.Text.RegularExpressions; + +#if _NETFRAMEWORK_ + using System.Drawing; +#endif namespace ClosedXML.Excel { - using System.Linq; - using System.Text.RegularExpressions; - using System.Drawing; - /// /// Common methods /// @@ -22,8 +22,11 @@ public const Double Epsilon = 1e-10; private const Int32 TwoT26 = 26*26; + +#if _NETFRAMEWORK_ internal static readonly Graphics Graphic = Graphics.FromImage(new Bitmap(200, 200)); internal static readonly Double DpiX = Graphic.DpiX; +#endif internal static readonly NumberStyles NumberStyle = NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite | NumberStyles.AllowExponent; internal static readonly CultureInfo ParseCulture = CultureInfo.InvariantCulture; @@ -186,15 +189,17 @@ return range.Contains('-') ? range.Replace('-', ':').Split(':') : range.Split(':'); } +#if _NETFRAMEWORK_ public static Int32 GetPtFromPx(Double px) { - return Convert.ToInt32(px*72.0/DpiX); + return Convert.ToInt32(px * 72.0 / DpiX); } public static Double GetPxFromPt(Int32 pt) { - return Convert.ToDouble(pt)*DpiX/72.0; + return Convert.ToDouble(pt) * DpiX / 72.0; } +#endif internal static IXLTableRows InsertRowsWithoutEvents(Func insertFunc, XLTableRange tableRange, Int32 numberOfRows, diff --git a/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML_Tests/ClosedXML_Tests.csproj index 24b33fd..da3624c 100644 --- a/ClosedXML_Tests/ClosedXML_Tests.csproj +++ b/ClosedXML_Tests/ClosedXML_Tests.csproj @@ -35,6 +35,14 @@ + + + + + + + +