예제 #1
0
        /// <summary>
        /// Création du Handler.
        /// </summary>
        /// <param name="currentPart">OpenXmlPart courant.</param>
        /// <param name="currentXmlElement">XmlElement courant.</param>
        /// <param name="currentDataSource">Source de données courante.</param>
        /// <param name="documentId">Id document en cours.</param>
        /// <param name="isXmlData">Si la source en xml.</param>
        /// <returns>ITagHandler.</returns>
        private static ITagHandler CreateTagHandler(OpenXmlPart currentPart, CustomXmlElement currentXmlElement, object currentDataSource, Guid documentId, bool isXmlData)
        {
            if (currentXmlElement.Element == null)
            {
                throw new NotSupportedException("The property 'Element' of currentXmlElement is null.");
            }

            switch (currentXmlElement.Element.Value)
            {
            case FieldTagName:
                return(new FieldHandler(currentPart, currentXmlElement, currentDataSource, documentId, isXmlData));

            case FieldNewLine:
                return(new FieldNewLineHandler(currentPart, currentXmlElement, currentDataSource, documentId, isXmlData));

            case FieldCurrencyTagName:
                return(new FieldCurrencyHandler(currentPart, currentXmlElement, currentDataSource, documentId, isXmlData));

            case ForTagName:
                return(new ForHandler(currentPart, currentXmlElement, currentDataSource, documentId, isXmlData));

            case ImageTagName:
                return(new ImageHandler(currentPart, currentXmlElement, currentDataSource, documentId, isXmlData));

            case IfTagName:
                return(new IfHandler(currentPart, currentXmlElement, currentDataSource, documentId, isXmlData));

            default:
                throw new ReportException("Tag " + currentXmlElement.Element.Value + " has no defined handler.");
            }
        }
예제 #2
0
 /// <summary>
 /// Constructeur.
 /// </summary>
 /// <param name="currentPart">OpenXmlPart courant.</param>
 /// <param name="currentElement">Element courant.</param>
 /// <param name="currentBean">Source de données du bloc conditionnel.</param>
 /// <param name="documentId">Id document en cours.</param>
 /// <param name="isXmlData">Si la source en xml.</param>
 public IfHandler(OpenXmlPart currentPart, CustomXmlElement currentElement, object currentBean, Guid documentId, bool isXmlData)
     : base(currentPart, currentElement, currentBean, documentId, isXmlData)
 {
     this.Condition    = this["condition"];
     this.Expression   = this["expression"];
     this.OrCondition  = this["orcondition"];
     this.OrExpression = this["orexpression"];
 }
예제 #3
0
        /// <summary>
        /// Remplacer les éléments trouvés.
        /// </summary>
        /// <param name="currentPart">OpenXmlPart courant.</param>
        /// <param name="currentXmlElement">XmlElement courant.</param>
        /// <param name="currentDataSource">Source de données courante.</param>
        /// <param name="documentId">Id document en cours.</param>
        /// <param name="isXmlData">Si la source en xml.</param>
        public static void Process(OpenXmlPart currentPart, CustomXmlElement currentXmlElement, object currentDataSource, Guid documentId, bool isXmlData)
        {
            using (ITagHandler tagHandler = CreateTagHandler(currentPart, currentXmlElement, currentDataSource, documentId, isXmlData)) {
                IEnumerable <OpenXmlElement> newElementList = tagHandler.HandleTag();
                OpenXmlElement parent = currentXmlElement.Parent;
                if (newElementList == null)
                {
                    if (currentXmlElement.Parent.GetType() != typeof(Paragraph) && currentXmlElement.Parent.GetType() != typeof(TableRow) && currentXmlElement.Parent.GetType() != typeof(Table) && currentXmlElement.Parent.GetType() != typeof(Body) && currentXmlElement.Parent.GetType() != typeof(CustomXmlRow))
                    {
                        Paragraph p = new Paragraph();
                        if (currentXmlElement.Parent.GetType() == typeof(TableCell))
                        {
                            if (currentXmlElement.Descendants <ParagraphProperties>() != null)
                            {
                                IEnumerator <ParagraphProperties> ppEnum = currentXmlElement.Descendants <ParagraphProperties>().GetEnumerator();
                                ppEnum.MoveNext();
                                if (ppEnum.Current != null)
                                {
                                    p.AppendChild <OpenXmlElement>(ppEnum.Current.CloneNode(true));
                                }
                            }
                        }

                        parent.InsertBefore(p, currentXmlElement);
                    }
                    else if (parent.GetType() == typeof(TableRow))
                    {
                        Paragraph p2 = new Paragraph();
                        TableCell tc = new TableCell();
                        if (currentXmlElement.Descendants <ParagraphProperties>() != null)
                        {
                            IEnumerator <ParagraphProperties> ppEnum = currentXmlElement.Descendants <ParagraphProperties>().GetEnumerator();
                            ppEnum.MoveNext();
                            p2.AppendChild <OpenXmlElement>(ppEnum.Current.CloneNode(true));
                        }

                        tc.AppendChild <Paragraph>(p2);
                        parent.InsertBefore(tc, currentXmlElement);
                    }
                }
                else
                {
                    OpenXmlElement lastElement = currentXmlElement;
                    foreach (OpenXmlElement currentChild in newElementList)
                    {
                        OpenXmlElement currentChildClone = (OpenXmlElement)currentChild;
                        parent.InsertAfter(currentChildClone, lastElement);
                        lastElement = currentChildClone;
                    }

                    newElementList = null;
                }

                currentXmlElement.Remove();
                currentXmlElement = null;
            }
        }
예제 #4
0
 private void ValidateCustomXmlElement(CustomXmlElement e)
 {
     e.Uri     = uri;
     e.Element = element;
     Assert.NotNull(e.Uri);
     Assert.Equal(typeof(StringValue), e.Uri.GetType());
     Assert.Equal(uri, e.Uri.Value);
     Assert.NotNull(e.Element);
     Assert.Equal(typeof(StringValue), e.Element.GetType());
     Assert.Equal(element, e.Element.Value);
 }
예제 #5
0
        /// <summary>
        /// Prend en charge le tag.
        /// </summary>
        /// <returns>Le contenu en OpenXML.</returns>
        protected override IEnumerable <OpenXmlElement> ProcessTag()
        {
            IEnumerable dataSourceList = GetPropertyValue(this.DataSource, this.CollectionName, this.IsXmlData) as IEnumerable;

            if (dataSourceList == null)
            {
                return(new List <OpenXmlElement>());
            }

            List <OpenXmlElement> list = new List <OpenXmlElement>();

            foreach (object item in dataSourceList)
            {
                OpenXmlElement newElement = (OpenXmlElement)this.CurrentElement.Clone();
                newElement.GetFirstChild <CustomXmlProperties>().Remove();
                CustomXmlElement customElement = null;
                do
                {
                    customElement = null;
                    foreach (CustomXmlElement item2 in newElement.Descendants <CustomXmlElement>())
                    {
                        if (item2 != null)
                        {
                            customElement = item2;
                            break;
                        }
                    }

                    if (customElement != null)
                    {
                        CustomNodeProcessor.Process(this.CurrentPart, customElement, item, this.DocumentId, this.IsXmlData);
                    }
                } while (customElement != null);
                foreach (OpenXmlElement item3 in newElement.ChildElements)
                {
                    list.Add((OpenXmlElement)item3.Clone());
                }

                newElement.RemoveAllChildren();
                newElement = null;
            }

            return(list);
        }
예제 #6
0
        /// <summary>
        /// Constructeur.
        /// </summary>
        /// <param name="currentPart">OpenXmlPart courant.</param>
        /// <param name="currentXmlElement">Element représentant le tag.</param>
        /// <param name="currentDataSource">Source de données courante.</param>
        /// <param name="documentId">Id document en cours.</param>
        /// <param name="isXmlData">Si la source en xml.</param>
        public AbstractTagHandler(OpenXmlPart currentPart, CustomXmlElement currentXmlElement, object currentDataSource, Guid documentId, bool isXmlData)
        {
            if (currentPart == null)
            {
                throw new ArgumentNullException("currentPart");
            }

            if (currentXmlElement == null)
            {
                throw new ArgumentNullException("currentXmlElement");
            }

            if (documentId == null)
            {
                throw new ArgumentNullException("documentId");
            }

            if (currentDataSource == null)
            {
                throw new ArgumentNullException("currentDataSource");
            }

            if (string.IsNullOrEmpty(currentXmlElement.Element.Value))
            {
                throw new NotSupportedException("The CustomXmlElement tag doesn't have a value for the element property.");
            }

            DocumentId     = documentId;
            this.IsXmlData = isXmlData;

            this.CurrentPart    = currentPart;
            this.TagName        = currentXmlElement.Element.Value;
            this.CurrentElement = currentXmlElement;
            this.DataSource     = currentDataSource;
            if (currentXmlElement.CustomXmlProperties != null)
            {
                foreach (CustomXmlAttribute tagAttribute in currentXmlElement.CustomXmlProperties.Elements <CustomXmlAttribute>())
                {
                    _tagAttributes.Add(tagAttribute.Name.Value, tagAttribute.Val.Value);
                }
            }
        }
예제 #7
0
        /// <summary>
        /// Processes the document.
        /// </summary>
        public bool ProcessDocument()
        {
            try
            {
                using (WordprocessingDocument document = WordprocessingDocument.Open(view.FileName, true))
                {
                    MainDocumentPart mainPart = document.MainDocumentPart;

                    XmlDocument xmlData   = null;
                    XmlDocument eSodaData = new MSOIntegrationDAO().GetMSOServiceContext(view.DocumentID, EsodaConfigurationParameters.TicketDuration, view.WithSchema);

                    int    index       = -1;
                    string storeItemID = null;
                    Dictionary <string, int> customXmlPartsIndexes;

                    MSOProcessingHelper     processingHelper  = new MSOProcessingHelper();
                    MSOGenerationHelper     generationHelper  = new MSOGenerationHelper();
                    List <CustomXmlElement> customXmlElements = generationHelper.BuildCustomXmlStructure(mainPart);

                    storeItemID = generationHelper.GetStoreItemID(customXmlElements);

                    //customXmlPartsIndexes = processingHelper.GetCustomXmlPartsIndexes(mainPart, storeItemID);
                    customXmlPartsIndexes = processingHelper.GetCustomXmlPartsIndexes(mainPart, storeItemID, processingHelper.GetTargetNamespaces(eSodaData));

                    if (customXmlPartsIndexes.Keys.Contains <string>("xmlData"))
                    {
                        index = customXmlPartsIndexes["xmlData"];
                    }

                    xmlData = processingHelper.SetDocumentData(view.Mode, view.DocumentID, index, out storeItemID, ref mainPart);

                    if (xmlData != null)
                    {
                        XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlData.NameTable);
                        int prefixIndex = 0;

                        generationHelper.SetNamespaces(xmlData.DocumentElement, ref prefixIndex, ref nsManager);

                        if (customXmlElements.Count > 0)
                        {
                            for (int i = 0; i < customXmlElements.Count; ++i)
                            {
                                CustomXmlElement customXmlElement = customXmlElements[i];
                                generationHelper.GenerateAttributes(xmlData.DocumentElement, nsManager, ref customXmlElement);
                                generationHelper.GenerateDataBindings(xmlData.DocumentElement, nsManager, storeItemID, ref customXmlElement);
                                //generationHelper.GenerateCustomControls(xmlData.DocumentElement, nsManager, storeItemID, ref customXmlElement);
                            }
                        }
                        #region For future releases
                        //else
                        //{
                        //    OpenXmlElement customXmlBlock = new CustomXmlBlock();
                        //    ((CustomXmlBlock)customXmlBlock).Element = new StringValue(xmlData.DocumentElement.LocalName);
                        //    if (mainPart.Document.Body.Elements<DocumentFormat.OpenXml.Wordprocessing.Paragraph>().Count() > 0)
                        //    {
                        //        mainPart.Document.Body.Elements<DocumentFormat.OpenXml.Wordprocessing.Paragraph>().Last().AppendChild(customXmlBlock);
                        //    }
                        //    else
                        //    {
                        //        mainPart.Document.Body.PrependChild(customXmlBlock);
                        //    }
                        //    generationHelper.GenerateCustomXmlBlocks(xmlData.DocumentElement, null, nsManager, ref  customXmlBlock);
                        //}
                        #endregion

                        mainPart.Document.Save();
                    }

                    index = -1;

                    if (customXmlPartsIndexes.Keys.Contains <string>("context"))
                    {
                        index = customXmlPartsIndexes["context"];
                    }

                    //processingHelper.SetEsodaData(false, view.WithSchema, view.DocumentID, null, null, index, ref mainPart);
                    processingHelper.SetEsodaData(eSodaData, index, ref mainPart);
                }
            }
            catch (Exception e)
            {
                view.ErrorMessage = "Błąd przetwarzania dokumentu Word: " + e.Message;
                return(false);
            }
            return(true);
        }
예제 #8
0
 /// <summary>
 /// Constructeur.
 /// </summary>
 /// <param name="currentPart">OpenXmlPart courant.</param>
 /// <param name="currentXmlElement">Tag Custom OpenXML.</param>
 /// <param name="currentDataSource">Source de données courante.</param>
 /// <param name="documentId">Id document en cours.</param>
 /// <param name="isXmlData">Si la source en xml.</param>
 public FieldHandler(OpenXmlPart currentPart, CustomXmlElement currentXmlElement, object currentDataSource, Guid documentId, bool isXmlData)
     : base(currentPart, currentXmlElement, currentDataSource, documentId, isXmlData)
 {
     this.FieldName = this["name"];
 }
예제 #9
0
 /// <summary>
 /// Constructeur.
 /// </summary>
 /// <param name="currentPart">OpenXmlPart courant.</param>
 /// <param name="currentXmlElement">Tag Custom OpenXML.</param>
 /// <param name="currentDataSource">Source de données courante.</param>
 /// <param name="documentId">Id document en cours.</param>
 /// <param name="isXmlData">Si la source en xml.</param>
 public FieldCurrencyHandler(OpenXmlPart currentPart, CustomXmlElement currentXmlElement, object currentDataSource, Guid documentId, bool isXmlData)
     : base(currentPart, currentXmlElement, currentDataSource, documentId, isXmlData)
 {
     this.Precision = int.Parse(this["precision"], NumberStyles.Integer, CultureInfo.InvariantCulture.NumberFormat);
 }
예제 #10
0
 /// <summary>
 /// Constructeur.
 /// </summary>
 /// <param name="currentPart">OpenXmlPart courant.</param>
 /// <param name="currentXmlElement">Tag Custom OpenXML.</param>
 /// <param name="currentDataSource">Source de données courante.</param>
 /// <param name="documentId">Id document en cours.</param>
 /// <param name="isXmlData">Si la source en xml.</param>
 public ForHandler(OpenXmlPart currentPart, CustomXmlElement currentXmlElement, object currentDataSource, Guid documentId, bool isXmlData)
     : base(currentPart, currentXmlElement, currentDataSource, documentId, isXmlData)
 {
     this.CollectionName = this["collection"];
 }
예제 #11
0
        /// <summary>
        /// Prend en charge la fusion du document.
        /// </summary>
        /// <param name="currentDataSource">Source de données courante.</param>
        /// <param name="isXmlData">Si la source en xml.</param>
        public void Process(object currentDataSource, bool isXmlData)
        {
            KeyValuePair <OpenXmlPart, CustomXmlElement> tagItem = NextElement;
            List <SectionProperties> listSp1 = new List <SectionProperties>();

            foreach (SectionProperties sp in _document.MainDocumentPart.Document.Body.Descendants <SectionProperties>())
            {
                listSp1.Add((SectionProperties)sp.Clone());
            }

            while (tagItem.Value != null)
            {
                OpenXmlPart      currentPart    = tagItem.Key;
                CustomXmlElement currentElement = tagItem.Value;
                CustomNodeProcessor.Process(currentPart, currentElement, currentDataSource, _documentId, isXmlData);
                tagItem = NextElement;
            }

            List <Paragraph> list = new List <Paragraph>();

            foreach (Paragraph paragraph in _document.MainDocumentPart.Document.Body.Elements <Paragraph>())
            {
                if (string.IsNullOrEmpty(paragraph.InnerText))
                {
                    if (paragraph.ParagraphProperties == null)
                    {
                        list.Add(paragraph);
                    }
                }
            }

            foreach (Paragraph item in list)
            {
                item.Remove();
            }

            List <SectionProperties> listSp2 = new List <SectionProperties>();

            foreach (SectionProperties sp in _document.MainDocumentPart.Document.Body.Descendants <SectionProperties>())
            {
                listSp2.Add(sp);
            }

            if (listSp2.Count == 1)
            {
                OpenXmlElement element = (OpenXmlElement)listSp2[0];
                OpenXmlElement parent  = element.Parent;
                parent.InsertBefore(listSp1[0], element);
                element.Remove();
            }

            bool hasError = false;
            IEnumerable <ValidationErrorInfo> validationErrors = _validator.Validate(_document);

            foreach (ValidationErrorInfo error in validationErrors)
            {
                hasError = true;
                _log.ErrorFormat(CultureInfo.InvariantCulture, "Erreur de validation du tag {0} : \r\nErrorType={1}\r\nDescription={2}\r\nPath={3}\r\nUri={4}", error.ToString(), error.ErrorType, error.Description, error.Path, error.Part.Uri);
            }

            if (hasError)
            {
                throw new ReportException("Le document généré n'est pas valide, consultez le log pour plus de détails.");
            }

            lock (_lock) {
                _document.MainDocumentPart.Document.Save();
                _document.Close();
            }
        }