Esempio n. 1
0
        internal static ExcelWorksheet Copy(ExcelWorksheets worksheets, string name, ExcelWorksheet copy)
        {
            int sheetID;
            Uri uriWorksheet;

            if (copy is ExcelChartsheet)
            {
                throw (new ArgumentException("Can not copy a chartsheet"));
            }
            if (worksheets.GetByName(name) != null)
            {
                throw (new InvalidOperationException(ExcelWorksheets.ERR_DUP_WORKSHEET));
            }
            var pck = worksheets._pck;
            var nsm = worksheets.NameSpaceManager;

            worksheets.GetSheetURI(ref name, out sheetID, out uriWorksheet, false);

            //Create a copy of the worksheet XML
            ZipPackagePart worksheetPart   = pck.ZipPackage.CreatePart(uriWorksheet, ExcelWorksheets.WORKSHEET_CONTENTTYPE, pck.Compression);
            StreamWriter   streamWorksheet = new StreamWriter(worksheetPart.GetStream(FileMode.Create, FileAccess.Write));

            XmlDocument worksheetXml = new XmlDocument();

            worksheetXml.LoadXml(copy.WorksheetXml.OuterXml);
            worksheetXml.Save(streamWorksheet);
            pck.ZipPackage.Flush();

            //Create a relation to the workbook
            string relID = worksheets.CreateWorkbookRel(name, sheetID, uriWorksheet, false);

            ExcelWorksheet added = new ExcelWorksheet(nsm, pck, relID, uriWorksheet, name, sheetID, worksheets.Count + pck._worksheetAdd, eWorkSheetHidden.Visible);

            //Copy comments
            if (copy.ThreadedComments.Count > 0)
            {
                CopyThreadedComments(copy, added);
            }
            else if (copy.Comments.Count > 0)
            {
                CopyComment(copy, added);
            }
            else if (copy.VmlDrawings.Count > 0)        //Vml drawings are copied as part of the comments.
            {
                CopyVmlDrawing(copy, added);
            }

            //Copy HeaderFooter
            CopyHeaderFooterPictures(copy, added);

            //Copy all relationships
            if (copy.HasDrawingRelationship)
            {
                CopySlicers(copy, added);
                CopyDrawing(pck, nsm, copy, added);
            }
            if (copy.Tables.Count > 0)
            {
                CopyTable(copy, added);
            }
            if (copy.PivotTables.Count > 0)
            {
                CopyPivotTable(copy, added);
            }
            if (copy.Names.Count > 0)
            {
                CopySheetNames(copy, added);
            }

            //Copy all cells and styles if the worksheet is from another workbook.
            CloneCellsAndStyles(copy, added);

            //Copy the VBA code
            if (pck.Workbook.VbaProject != null && copy.CodeModule != null)
            {
                var wsName = pck.Workbook.VbaProject.GetModuleNameFromWorksheet(added);
                pck.Workbook.VbaProject.Modules.Add(new ExcelVBAModule(added.CodeNameChange)
                {
                    Name = wsName, Code = copy.CodeModule.Code, Attributes = pck.Workbook.VbaProject.GetDocumentAttributes(name, "0{00020820-0000-0000-C000-000000000046}"), Type = eModuleType.Document, HelpContext = 0
                });
                copy.CodeModuleName = wsName;
            }

            worksheets._worksheets.Add(worksheets.Count, added);

            //Remove any relation to printersettings.
            XmlNode pageSetup = added.WorksheetXml.SelectSingleNode("//d:pageSetup", nsm);

            if (pageSetup != null)
            {
                XmlAttribute attr = (XmlAttribute)pageSetup.Attributes.GetNamedItem("id", ExcelPackage.schemaRelationships);
                if (attr != null)
                {
                    relID = attr.Value;
                    // first delete the attribute from the XML
                    pageSetup.Attributes.Remove(attr);
                }
            }

            return(added);
        }