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 @@
+
+
+
+
+
+
+
+