diff --git a/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj b/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj index d998123..3e55efc 100644 --- a/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj +++ b/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj @@ -137,6 +137,7 @@ + diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLConstants.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLConstants.cs new file mode 100644 index 0000000..f01f06e --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLConstants.cs @@ -0,0 +1,13 @@ + +namespace ClosedXML.Excel +{ + //Use the class to store magic strings or variables. + internal static class XLConstants + { + internal static class Comment + { + internal const string ShapeTypeId = "#_x0000_t202"; + internal const string AlternateShapeTypeId = "#_xssf_cell_comment"; + } + } +} diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs index 44b94d1..2625812 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs @@ -309,8 +309,7 @@ var comments = root.GetFirstChild().ChildElements; // **** MAYBE FUTURE SHAPE SIZE SUPPORT - // var shapes = wsPart.VmlDrawingParts.SelectMany(p => new System.Xml.XmlTextReader(p.GetStream()).Read() - XDocument xdoc = XDocumentExtensions.Load(wsPart.VmlDrawingParts.First().GetStream(FileMode.Open)); + XDocument xdoc = GetCommentVmlFile(wsPart); foreach (Comment c in comments) { // find cell by reference @@ -329,13 +328,9 @@ LoadFont(runProperties, rt); } - var xml = xdoc.Root.Element("xml"); - XElement shape; - if (xml != null) - shape = xml.Elements().First(e => (string)e.Attribute("type") == "#_x0000_t202"); - else - shape = xdoc.Root.Elements().First(e => (string)e.Attribute("type") == "#_x0000_t202" || (string)e.Attribute("type") == "#_xssf_cell_comment"); - + + XElement shape = GetCommentShape(xdoc); + LoadShapeProperties(xlComment, shape); var clientData = shape.Elements().First(e => e.Name.LocalName == "ClientData"); @@ -380,6 +375,46 @@ LoadDefinedNames(workbook); } + #region Comment Helpers + + private XDocument GetCommentVmlFile(WorksheetPart wsPart) + { + XDocument xdoc = null; + + foreach (var vmlPart in wsPart.VmlDrawingParts) + { + xdoc = XDocumentExtensions.Load(vmlPart.GetStream(FileMode.Open)); + + //Probe for comments + if (xdoc.Root == null) continue; + var shape = GetCommentShape(xdoc); + if (shape != null) break; + } + + if (xdoc == null) throw new Exception("Could not load comments file"); + return xdoc; + } + + private static XElement GetCommentShape(XDocument xdoc) + { + var xml = xdoc.Root.Element("xml"); + + XElement shape; + if (xml != null) + shape = + xml.Elements().FirstOrDefault(e => (string) e.Attribute("type") == XLConstants.Comment.ShapeTypeId); + else + shape = xdoc.Root.Elements().FirstOrDefault(e => + (string) e.Attribute("type") == + XLConstants.Comment.ShapeTypeId || + (string) e.Attribute("type") == + XLConstants.Comment.AlternateShapeTypeId); + return shape; + } + + #endregion + + private String GetTableColumnName(string name) { return name.Replace("_x000a_", Environment.NewLine).Replace("_x005f_x000a_", "_x000a_"); diff --git a/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj b/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj index 0b605cb..b73f954 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj +++ b/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj @@ -828,6 +828,9 @@ Excel\Tables\XLTables.cs + + Excel\XLConstants.cs + Excel\XLOutline.cs