private static void CopyComment(ExcelWorksheet Copy, ExcelWorksheet added) { //First copy the drawing XML string xml = Copy.Comments.CommentXml.InnerXml; var uriComment = new Uri(string.Format("/xl/comments{0}.xml", added.SheetId), UriKind.Relative); if (added._package.ZipPackage.PartExists(uriComment)) { uriComment = XmlHelper.GetNewUri(added._package.ZipPackage, "/xl/comments{0}.xml"); } var part = added._package.ZipPackage.CreatePart(uriComment, "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml", added._package.Compression); StreamWriter streamDrawing = new StreamWriter(part.GetStream(FileMode.Create, FileAccess.Write)); streamDrawing.Write(xml); streamDrawing.Flush(); //Add the relationship ID to the worksheet xml. var commentRelation = added.Part.CreateRelationship(UriHelper.GetRelativeUri(added.WorksheetUri, uriComment), Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/comments"); xml = Copy.VmlDrawings.VmlDrawingXml.InnerXml; var uriVml = new Uri(string.Format("/xl/drawings/vmldrawing{0}.vml", added.SheetId), UriKind.Relative); if (added._package.ZipPackage.PartExists(uriVml)) { uriVml = XmlHelper.GetNewUri(added._package.ZipPackage, "/xl/drawings/vmldrawing{0}.vml"); } var vmlPart = added._package.ZipPackage.CreatePart(uriVml, "application/vnd.openxmlformats-officedocument.vmlDrawing", added._package.Compression); StreamWriter streamVml = new StreamWriter(vmlPart.GetStream(FileMode.Create, FileAccess.Write)); streamVml.Write(xml); streamVml.Flush(); var newVmlRel = added.Part.CreateRelationship(UriHelper.GetRelativeUri(added.WorksheetUri, uriVml), Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/vmlDrawing"); //Add the relationship ID to the worksheet xml. XmlElement e = added.WorksheetXml.SelectSingleNode("//d:legacyDrawing", added.NameSpaceManager) as XmlElement; if (e == null) { added.CreateNode("d:legacyDrawing"); e = added.WorksheetXml.SelectSingleNode("//d:legacyDrawing", added.NameSpaceManager) as XmlElement; } e.SetAttribute("id", ExcelPackage.schemaRelationships, newVmlRel.Id); }
private static void CopyTable(ExcelWorksheet Copy, ExcelWorksheet added) { string prevName = ""; //First copy the table XML foreach (var tbl in Copy.Tables) { string xml = tbl.TableXml.OuterXml; string name; if (prevName == "") { name = Copy.Tables.GetNewTableName(); } else { int ix = int.Parse(prevName.Substring(5)) + 1; name = string.Format("Table{0}", ix); while (added._package.Workbook.ExistsPivotTableName(name)) { name = string.Format("Table{0}", ++ix); } } //ensure the _nextTableID value has been initialized - Pull request by WillR added.Workbook.ReadAllTables(); int Id = added.Workbook._nextTableID++; prevName = name; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xml); xmlDoc.SelectSingleNode("//d:table/@id", tbl.NameSpaceManager).Value = Id.ToString(); xmlDoc.SelectSingleNode("//d:table/@name", tbl.NameSpaceManager).Value = name; xmlDoc.SelectSingleNode("//d:table/@displayName", tbl.NameSpaceManager).Value = name; xml = xmlDoc.OuterXml; //var uriTbl = new Uri(string.Format("/xl/tables/table{0}.xml", Id), UriKind.Relative); var uriTbl = XmlHelper.GetNewUri(added._package.ZipPackage, "/xl/tables/table{0}.xml", ref Id); if (added.Workbook._nextTableID < Id) { added.Workbook._nextTableID = Id; } var part = added._package.ZipPackage.CreatePart(uriTbl, "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml", added._package.Compression); StreamWriter streamTbl = new StreamWriter(part.GetStream(FileMode.Create, FileAccess.Write)); streamTbl.Write(xml); //streamTbl.Close(); streamTbl.Flush(); //create the relationship and add the ID to the worksheet xml. var rel = added.Part.CreateRelationship(UriHelper.GetRelativeUri(added.WorksheetUri, uriTbl), Packaging.TargetMode.Internal, ExcelPackage.schemaRelationships + "/table"); if (tbl.RelationshipID == null) { var topNode = added.WorksheetXml.SelectSingleNode("//d:tableParts", tbl.NameSpaceManager); if (topNode == null) { added.CreateNode("d:tableParts"); topNode = added.WorksheetXml.SelectSingleNode("//d:tableParts", tbl.NameSpaceManager); } XmlElement elem = added.WorksheetXml.CreateElement("tablePart", ExcelPackage.schemaMain); topNode.AppendChild(elem); elem.SetAttribute("id", ExcelPackage.schemaRelationships, rel.Id); } else { XmlAttribute relAtt; relAtt = added.WorksheetXml.SelectSingleNode(string.Format("//d:tableParts/d:tablePart/@r:id[.='{0}']", tbl.RelationshipID), tbl.NameSpaceManager) as XmlAttribute; relAtt.Value = rel.Id; } //Copy table slicers foreach (var col in tbl.Columns) { if (col.Slicer != null) { var newCol = added.Tables[name].Columns[col.Position]; foreach (var d in added.Drawings) { if (d is ExcelTableSlicer slicer) { if (slicer.TableColumn.Name == col.Name && slicer.TableColumn.Table.Id == col.Table.Id) { slicer.Cache.TableId = newCol.Table.Id; slicer.TableColumn = newCol; break; } } } } } } }