/// <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."); } }
/// <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"]; }
/// <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; } }
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); }
/// <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); }
/// <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); } } }
/// <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); }
/// <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"]; }
/// <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); }
/// <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"]; }
/// <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(); } }