From 5881422a881f6ccefce2b9801b5dc6a753670d6e Mon Sep 17 00:00:00 2001 From: Tom Jebo Date: Mon, 4 Feb 2019 22:15:28 -0800 Subject: [PATCH 1/2] Archive message add archive message point to ericwhitedev/open-xml-powertools --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 18830867..1071bc3d 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -[![Build status](https://ci.appveyor.com/api/projects/status/au9umdxcu7pnnacm?svg=true)](https://ci.appveyor.com/project/openxmlsdk/open-xml-powertools) +[ARCHIVED] Open-XML-PowerTools +=================== +This repository is no longer maintained by Microsoft. It has been archived and can still be forked and cloned for use and continued developement. -NuGet Feed for CI build: https://ci.appveyor.com/nuget/open-xml-powertools +If you're looking for a fork of this project that is actively maintained, try the following: -No NuGet.org feed at this time. We are working on it. +[https://github.com/EricWhiteDev/Open-Xml-PowerTools](https://github.com/EricWhiteDev/Open-Xml-PowerTools) -Open-XML-PowerTools -=================== The Open XML PowerTools provides guidance and example code for programming with Open XML Documents (DOCX, XLSX, and PPTX). It is based on, and extends the functionality of the [Open XML SDK](https://github.com/OfficeDev/Open-XML-SDK). From 9328a34a18245bb86ef477c4afa48dad088de3f9 Mon Sep 17 00:00:00 2001 From: "kevin@lyons.id.au" Date: Fri, 17 May 2019 16:17:12 +1000 Subject: [PATCH 2/2] allows optional tabel cell content --- .../DocumentAssemblerTests.cs | 3 +- OpenXmlPowerTools/DocumentAssembler.cs | 37 +++++++++++++++++- TestFiles/DA300-TableWithContentInCells.docx | Bin 0 -> 26466 bytes 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 TestFiles/DA300-TableWithContentInCells.docx diff --git a/OpenXmlPowerTools.Tests/DocumentAssemblerTests.cs b/OpenXmlPowerTools.Tests/DocumentAssemblerTests.cs index cf62d2f0..075ee13e 100644 --- a/OpenXmlPowerTools.Tests/DocumentAssemblerTests.cs +++ b/OpenXmlPowerTools.Tests/DocumentAssemblerTests.cs @@ -116,7 +116,8 @@ public class DaTests [InlineData("DA264-InvalidRunLevelRepeat.docx", "DA-Data.xml", true)] [InlineData("DA265-RunLevelRepeatWithWhiteSpaceBefore.docx", "DA-Data.xml", false)] [InlineData("DA266-RunLevelRepeat-NoData.docx", "DA-Data.xml", true)] - + [InlineData("DA300-TableWithContentInCells.docx", "DA-Data.xml", false)] + public void DA101(string name, string data, bool err) { DirectoryInfo sourceDir = new DirectoryInfo("../../../../TestFiles/"); diff --git a/OpenXmlPowerTools/DocumentAssembler.cs b/OpenXmlPowerTools/DocumentAssembler.cs index f4d9673e..7f94a948 100644 --- a/OpenXmlPowerTools/DocumentAssembler.cs +++ b/OpenXmlPowerTools/DocumentAssembler.cs @@ -717,10 +717,18 @@ static object ContentReplacementTransform(XNode node, XElement data, TemplateErr XElement paragraph = tc.Elements(W.p).FirstOrDefault(); XElement cellRun = paragraph.Elements(W.r).FirstOrDefault(); string xPath = paragraph.Value; + bool cellIsOptional = false; + + // There is probably a much better way of doing this, + // similar to the ContentReplacementTransform used for the footer + // but it means you probably couldn't use the simple xpath text + // and you would need to always use tag in each cell! + TableCellContent(paragraph.Value, out xPath, out cellIsOptional); + string newValue = null; try { - newValue = EvaluateXPathToString(d, xPath, false); + newValue = EvaluateXPathToString(d, xPath, cellIsOptional); } catch (XPathException e) { @@ -781,6 +789,33 @@ static object ContentReplacementTransform(XNode node, XElement data, TemplateErr return node; } + /// + /// Convert the cell content to data using 2 different formats + /// 1. the text is xpath + /// 2. the text has the format + /// + /// Paragraph text + /// The resulting xpath of paragraph or Select attribute value + /// Incase 2 the value of the Optional attribute if it exists otherwise false + private static void TableCellContent(string para, out string xpath, out bool optional) + { + XElement element; + try + { + element = XElement.Parse(para); + //the next few lines are used a couple of time in the ContentReplacementTransform method + xpath = (string)element.Attribute(PA.Select); + var optionalString = (string)element.Attribute(PA.Optional); + optional = (optionalString != null && optionalString.ToLower() == "true"); + } + catch (Exception) + { + //can't be processed as Content so just assume xpath + xpath = para; + optional = false; + } + } + private static object CreateContextErrorMessage(XElement element, string errorMessage, TemplateError templateError) { XElement para = element.Descendants(W.p).FirstOrDefault(); diff --git a/TestFiles/DA300-TableWithContentInCells.docx b/TestFiles/DA300-TableWithContentInCells.docx new file mode 100644 index 0000000000000000000000000000000000000000..75cc9bc6b7e7ada56662ef074718d290aed511ee GIT binary patch literal 26466 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 Z#M$2|z|Rx}{9`=}GCTzWZCf4x^e;k*ng{>@ literal 0 HcmV?d00001