|
@@ -13,7 +13,14 @@ using System.Text;
|
|
|
using System.Xml;
|
|
|
using System.Xml.Linq;
|
|
|
using System.Xml.Xsl;
|
|
|
+using DocumentFormat.OpenXml;
|
|
|
+using DocumentFormat.OpenXml.Drawing;
|
|
|
+using DocumentFormat.OpenXml.Drawing.Charts;
|
|
|
+using DocumentFormat.OpenXml.Office2010.Word.DrawingShape;
|
|
|
using DocumentFormat.OpenXml.Packaging;
|
|
|
+using HTEXLib.DOCX.OpenXmlTool;
|
|
|
+using HTEXLib.Helpers;
|
|
|
+using HTEXLib.Helpers.ShapeHelpers;
|
|
|
using HTEXLib.Models.Inner;
|
|
|
|
|
|
// 200e lrm - LTR
|
|
@@ -564,11 +571,526 @@ namespace OpenXmlPowerTools
|
|
|
|
|
|
return element.Elements().Select(e => ConvertToHtmlTransform(wordDoc, settings, e, false, currentMarginLeft));
|
|
|
}
|
|
|
-
|
|
|
+ //处理形状
|
|
|
+ if (element.Name == MC.AlternateContent)
|
|
|
+ {
|
|
|
+
|
|
|
+ return ProcessAlternateContent(wordDoc, element,settings.ImageHandler);
|
|
|
+ }
|
|
|
+ //if (element.Name == MC.Choice)
|
|
|
+ //{
|
|
|
+
|
|
|
+ // return ProcessOMath(element);
|
|
|
+ //}
|
|
|
+ //if (element.Name == W.drawing &&element.Parent.Name==MC.Choice)
|
|
|
+ //{
|
|
|
+
|
|
|
+ // return ProcessOMath(element);
|
|
|
+ //}
|
|
|
+
|
|
|
+
|
|
|
// Ignore element.
|
|
|
return null;
|
|
|
}
|
|
|
+ public static XElement ProcessAlternateContent(WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> imageHandler) {
|
|
|
+ var drawing = element.Element(MC.Choice).Element(W.drawing).Element(WP.inline);
|
|
|
+ if (drawing == null) {
|
|
|
+ drawing = element.Element(MC.Choice).Element(W.drawing).Element(WP.anchor);
|
|
|
+ }
|
|
|
+ var graphicData = drawing.Element(A.graphic).Element(A.graphicData).Elements() ;
|
|
|
+
|
|
|
+ foreach (var elm in graphicData) {
|
|
|
+ if (elm.Name==WPS.wsp)
|
|
|
+ {
|
|
|
+ return ProcessWps( wordDoc, elm, imageHandler);
|
|
|
+ }
|
|
|
+ else if (elm.Name==WPG.wgp)
|
|
|
+ {
|
|
|
+ return ProcessWgp(wordDoc, elm, imageHandler);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static XElement ProcessWgp(WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> imageHandler) {
|
|
|
+ var extentCx = (int?)element.Elements(WP.extent)
|
|
|
+ .Attributes(NoNamespace.cx).FirstOrDefault();
|
|
|
+ var extentCy = (int?)element.Elements(WP.extent)
|
|
|
+ .Attributes(NoNamespace.cy).FirstOrDefault();
|
|
|
+ var elms= element.Descendants(WPS.wsp);
|
|
|
+ XElement el = new XElement(Xhtml.div);
|
|
|
+ foreach (var elm in elms) {
|
|
|
+ var emlt= ProcessWps(wordDoc, elm, imageHandler);
|
|
|
+ el.Add(emlt);
|
|
|
+ }
|
|
|
+ return el;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static XElement ProcessChart(WordprocessingDocument wordDoc, XElement containerElement, Func<ImageInfo, XElement> imageHandler,
|
|
|
+ int? extentCx, int? extentCy, string altText, XElement element, string hyperlinkUri)
|
|
|
+ {
|
|
|
+ var ird= element.Attribute(R.id);
|
|
|
+ var chartird= wordDoc.MainDocumentPart.Parts.FirstOrDefault(pp => pp.RelationshipId == ird.Value);
|
|
|
+ ChartPart chartPart= wordDoc.MainDocumentPart.ChartParts.Where(x => x.Uri.ToString() == chartird.OpenXmlPart.Uri.ToString()).FirstOrDefault<ChartPart>();
|
|
|
+ if (chartPart != null)
|
|
|
+ {
|
|
|
+ ChartColorStylePart ChartColorStylePart = null;
|
|
|
+ ChartStylePart ChartStylePart = null;
|
|
|
+ foreach (var idp in chartPart.Parts)
|
|
|
+ {
|
|
|
+ if (idp.OpenXmlPart is ChartColorStylePart ChartColorStyleParts)
|
|
|
+ {
|
|
|
+ ChartColorStylePart = ChartColorStyleParts;
|
|
|
+ }
|
|
|
+ if (idp.OpenXmlPart is ChartStylePart ChartStyleParts)
|
|
|
+ {
|
|
|
+ ChartStylePart = ChartStyleParts;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ChartStylePart != null)
|
|
|
+ {
|
|
|
+ var ChartStyleChildren = ChartStylePart.ChartStyle.ChildElements;
|
|
|
+ foreach (var child in ChartStyleChildren)
|
|
|
+ {
|
|
|
+ if (child is DocumentFormat.OpenXml.Office2013.Drawing.ChartStyle.StyleEntry StyleEntry)
|
|
|
+ {
|
|
|
+
|
|
|
+ // DoStyleEntry(StyleEntry);
|
|
|
+ }
|
|
|
+ ///OfficeArtExtensionList cs: extLst
|
|
|
+ // MarkerLayoutProperties cs: dataPointMarkerLayout
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ HTEXLib. Chart charts = DrawChart(wordDoc,chartPart.ChartSpace,element,imageHandler,null);
|
|
|
+ // charts.links = slide.hyperlinks;
|
|
|
+ // return new List<Item> { charts };
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static HTEXLib.Chart DrawChart(WordprocessingDocument wordDoc, DocumentFormat.OpenXml.Drawing.Charts.ChartSpace chartSpace,XElement element, Func<ImageInfo, XElement> ImageHandler, HTEXLib.Position positionc)
|
|
|
+ {
|
|
|
+ var Chart = chartSpace.GetFirstChild<DocumentFormat.OpenXml.Drawing.Charts.Chart>();
|
|
|
+ var ShapeProperties = chartSpace.GetFirstChild<DocumentFormat.OpenXml.Drawing.Charts.ShapeProperties>();
|
|
|
+ HTEXLib.Models.HTEX.ShapeStyle shapeStyleChart = WORDHelper.DoShapeProperties(wordDoc ,ShapeProperties, element, ImageHandler, positionc);
|
|
|
+ var TextProperties = chartSpace.GetFirstChild<TextProperties>();
|
|
|
+ var style = chartSpace.GetFirstChild<DocumentFormat.OpenXml.Drawing.Charts.Style>();
|
|
|
+ var ColorMapOverride = chartSpace.GetFirstChild<DocumentFormat.OpenXml.Drawing.Charts.ColorMapOverride>();
|
|
|
+ var style2010 = chartSpace.GetFirstChild<DocumentFormat.OpenXml.Office2010.Drawing.Charts.Style>();
|
|
|
+ var UserShapesReference = chartSpace.GetFirstChild<UserShapesReference>();
|
|
|
+ var charts = DoPlotArea(Chart.PlotArea,wordDoc,element, ImageHandler,positionc);
|
|
|
+ HTEXLib.Models.HTEX. ShapeStyle shapeStyle = null;
|
|
|
+ if (Chart.Title != null)
|
|
|
+ {
|
|
|
+ var ChartShapeProperties = Chart.Title.ChartShapeProperties;
|
|
|
+ shapeStyle = WORDHelper.DoShapeProperties(wordDoc, ChartShapeProperties, element, ImageHandler, positionc);
|
|
|
+ }
|
|
|
+ // var (PPTParagraphs, tBody) = DoChartTitle(Chart.Title);
|
|
|
+ //TextBody textBody = DrawText(PPTParagraphs, tBody);
|
|
|
+
|
|
|
+ //Shape shape= new Shape { type = "Sp",uid ="Sp-" +ShaHashHelper.GetSHA1(slide.slideIndex + "-" + (Chart.Title.GetType().Name + Chart.Title.OuterXml).Trim().ToLower()), shapeType = "rect",
|
|
|
+ // textBody = textBody , sid = sid + "titel" };
|
|
|
+ HTEXLib. Shape shape = new HTEXLib.Shape
|
|
|
+ {
|
|
|
+ type = "Sp",
|
|
|
+ uid = Guid.NewGuid().ToString(),
|
|
|
+ shapeType = "rect",
|
|
|
+ // textBody = textBody,
|
|
|
+ // sid = sid + "titel"
|
|
|
+ };
|
|
|
+ shape.style.fill = shapeStyle != null ? shapeStyle.fill : null;
|
|
|
+ shape.style.border = shapeStyle != null ? shapeStyle.border : null;
|
|
|
+ //var chart= new Chart {sid=sid,charts =charts,title=shape,type=type,uid = type+"-"+ ShaHashHelper.GetSHA1(slide.slideIndex + "-" + (Chart.GetType().Name + Chart.OuterXml).Trim().ToLower()) };
|
|
|
+ var chart = new HTEXLib.Chart
|
|
|
+ {
|
|
|
+ // sid = sid,
|
|
|
+ charts = charts,
|
|
|
+ title = shape,
|
|
|
+ // type = type,
|
|
|
+ uid = Guid.NewGuid().ToString(),
|
|
|
+ };
|
|
|
+ HTEXLib.Position position = new HTEXLib.Position { /*cx = width, cy = height, x = left, y = top, rot = rot */};
|
|
|
+ chart.style.position = position;
|
|
|
+ chart.style.fill = shapeStyleChart != null ? shapeStyleChart.fill : null;
|
|
|
+ chart.style.border = shapeStyleChart != null ? shapeStyleChart.border : null;
|
|
|
+ chart.style.effect = shapeStyleChart != null ? shapeStyleChart.effect : null;
|
|
|
+ chart.svg = new HTEXLib.Svg
|
|
|
+ {
|
|
|
+ type = "path",
|
|
|
+ d = "M" + 0 + " " + 0 + ",L" + position.cx + " " + 0 + ",L" + position.cx + " " + position.cy + ",L" + 0 + " " + position.cy + " z"
|
|
|
+ //new Rect {
|
|
|
+ // x=position.x,
|
|
|
+ // y = position.y,
|
|
|
+ // width=position.cx,
|
|
|
+ // height=position.cy,
|
|
|
+ // type="rect"
|
|
|
+ // }
|
|
|
+
|
|
|
+ };
|
|
|
+ if (chart.style != null)
|
|
|
+ {
|
|
|
+ if (chart.style.fill.type == -1 || chart.style.fill.type == 0)
|
|
|
+ {
|
|
|
+ chart.style.fill = null;
|
|
|
+ }
|
|
|
+ if (chart.style.border != null && chart.style.border.type == "none")
|
|
|
+ {
|
|
|
+ chart.style.border = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return chart;
|
|
|
+ }
|
|
|
+ public static List<HTEXLib. CommonChart> DoPlotArea(PlotArea plotArea, WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> ImageHandler, HTEXLib.Position positionc)
|
|
|
+ {
|
|
|
+ List<HTEXLib.CommonChart> charts = new List<HTEXLib.CommonChart>();
|
|
|
+ foreach (var child in plotArea.ChildElements)
|
|
|
+ {
|
|
|
+ string key = child.LocalName;
|
|
|
+ IEnumerable<XElement> serNodes = null;
|
|
|
+ switch (key)
|
|
|
+ {
|
|
|
+ //break块中不可以随意更换,此条件用于归类不同从Chart
|
|
|
+ case "pieChart":
|
|
|
+ case "ofPieChart":
|
|
|
+ case "pie3DChart":
|
|
|
+ case "doughnutChart":
|
|
|
+ HTEXLib.PieChart pieChart = new HTEXLib.PieChart { chartType = "pie" };
|
|
|
+ if (key.Equals("pie3DChart"))
|
|
|
+ {
|
|
|
+ pieChart.is3D = true;
|
|
|
+ }
|
|
|
+ pieChart.pieType = key;
|
|
|
+ if (key.Equals("ofPieChart"))
|
|
|
+ {
|
|
|
+ var ofPieType = HTEXLib.ShapeHelper.GetPPTXNodeByPath(child, "c:ofPieType");
|
|
|
+ if (ofPieType != null)
|
|
|
+ {
|
|
|
+ //ofPieChart-pie ofPieChart-bar 子母饼图
|
|
|
+ pieChart.pieType += "-" + ofPieType.Attribute("val").Value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ serNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(child, "c:ser") ;
|
|
|
+ pieChart.datas = ExtractChartData(serNodes,wordDoc,element, ImageHandler, positionc);
|
|
|
+ charts.Add(pieChart);
|
|
|
+ break;
|
|
|
+ case "lineChart":
|
|
|
+ case "line3DChart":
|
|
|
+ HTEXLib.LineChart lineChart = new HTEXLib.LineChart { chartType = "line" };
|
|
|
+ if (key.Equals("line3DChart"))
|
|
|
+ {
|
|
|
+ lineChart.is3D = true;
|
|
|
+ }
|
|
|
+ lineChart.lineType = key;
|
|
|
+ var LineGrouping = HTEXLib.ShapeHelper.GetPPTXNodeByPath(child, "c:grouping");
|
|
|
+ if (LineGrouping != null)
|
|
|
+ {
|
|
|
+ //standard stacked percentStacked
|
|
|
+ lineChart.lineType += "-" + LineGrouping.Attribute("val").Value;
|
|
|
+ }
|
|
|
+ serNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(child, "c:ser");
|
|
|
+ lineChart.datas = ExtractChartData(serNodes, wordDoc, element, ImageHandler, positionc);
|
|
|
+ charts.Add(lineChart);
|
|
|
+ break;
|
|
|
+ case "barChart":
|
|
|
+ case "bar3DChart":
|
|
|
+ var barDir = HTEXLib.ShapeHelper.GetPPTXNodeByPath(child, "c:barDir");
|
|
|
+ if (barDir != null)
|
|
|
+ {
|
|
|
+ if (barDir.Attribute("val").Value.Equals("bar"))
|
|
|
+ {
|
|
|
+ HTEXLib.BarChart barChart = new HTEXLib.BarChart { chartType = "bar" };
|
|
|
+ charts.Add(barChart);
|
|
|
+ if (key.Equals("bar3DChart"))
|
|
|
+ {
|
|
|
+ barChart.is3D = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ barChart.barType = key;
|
|
|
+ var BarGrouping = HTEXLib.ShapeHelper.GetPPTXNodeByPath(child, "c:grouping");
|
|
|
+ if (BarGrouping != null)
|
|
|
+ {
|
|
|
+ //standard stacked percentStacked
|
|
|
+ barChart.barType += "-" + BarGrouping.Attribute("val").Value;
|
|
|
+ }
|
|
|
+ serNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(child, "c:ser");
|
|
|
+ barChart.datas = ExtractChartData(serNodes, wordDoc, element, ImageHandler, positionc);
|
|
|
+ charts.Add(barChart);
|
|
|
+ }
|
|
|
+ else if (barDir.Attribute("val").Value.Equals("col"))
|
|
|
+ {
|
|
|
+ HTEXLib.ColChart colChart = new HTEXLib.ColChart { chartType = "col" };
|
|
|
+ if (key.Equals("bar3DChart"))
|
|
|
+ {
|
|
|
+ colChart.is3D = true;
|
|
|
+ }
|
|
|
+ colChart.colType = key.Replace("bar", "col");
|
|
|
+ var ColGrouping = HTEXLib.ShapeHelper.GetPPTXNodeByPath(child, "c:grouping");
|
|
|
+ if (ColGrouping != null)
|
|
|
+ {
|
|
|
+ //standard stacked percentStacked
|
|
|
+ colChart.colType += "-" + ColGrouping.Attribute("val").Value;
|
|
|
+ }
|
|
|
+ serNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(child, "c:ser");
|
|
|
+ colChart.datas = ExtractChartData(serNodes, wordDoc, element, ImageHandler, positionc);
|
|
|
+ charts.Add(colChart);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "areaChart":
|
|
|
+ case "area3DChart":
|
|
|
+ HTEXLib.AreaChart areaChart = new HTEXLib.AreaChart { chartType = "area" };
|
|
|
+ if (key.Equals("area3DChart"))
|
|
|
+ {
|
|
|
+ areaChart.is3D = true;
|
|
|
+ }
|
|
|
+ areaChart.areaType = key;
|
|
|
+ var AreaGrouping = HTEXLib.ShapeHelper.GetPPTXNodeByPath(child, "c:grouping");
|
|
|
+ if (AreaGrouping != null)
|
|
|
+ {
|
|
|
+ //standard stacked percentStacked
|
|
|
+ areaChart.areaType += "-" + AreaGrouping.Attribute("val").Value;
|
|
|
+ }
|
|
|
+ serNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(child, "c:ser");
|
|
|
+ areaChart.datas = ExtractChartData(serNodes, wordDoc, element, ImageHandler, positionc);
|
|
|
+ charts.Add(areaChart);
|
|
|
+ break;
|
|
|
+ case "scatterChart":
|
|
|
+ case "bubbleChart":
|
|
|
+ HTEXLib.ScatterChart scatterChart = new HTEXLib.ScatterChart { chartType = "scatter" };
|
|
|
+ scatterChart.scatterType = key;
|
|
|
+ if (key.Equals("scatterChart"))
|
|
|
+ {
|
|
|
+ var ScatterStyle = HTEXLib.ShapeHelper.GetPPTXNodeByPath(child, "c:scatterStyle");
|
|
|
+ if (ScatterStyle != null)
|
|
|
+ {
|
|
|
+ scatterChart.scatterType += "-" + ScatterStyle.Attribute("val").Value.Replace("Marker", "");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ serNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(child, "c:ser");
|
|
|
+ scatterChart.datas = ExtractChartData(serNodes, wordDoc, element, ImageHandler, positionc);
|
|
|
+ charts.Add(scatterChart);
|
|
|
+ break;
|
|
|
+ case "radarChart":
|
|
|
+ HTEXLib.RadarChart radarChart = new HTEXLib.RadarChart { chartType = "radar" };
|
|
|
+ radarChart.radarType = key;
|
|
|
+ var RadarStyle = HTEXLib.ShapeHelper.GetPPTXNodeByPath(child, "c:radarStyle");
|
|
|
+ if (RadarStyle != null)
|
|
|
+ {
|
|
|
+ radarChart.radarType += "-" + RadarStyle.Attribute("val").Value;
|
|
|
+ }
|
|
|
+ serNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(child, "c:ser");
|
|
|
+ radarChart.datas = ExtractChartData(serNodes, wordDoc, element, ImageHandler, positionc);
|
|
|
+ charts.Add(radarChart);
|
|
|
+ break;
|
|
|
+ case "plotAreaRegion":
|
|
|
+ HTEXLib.PlotAreaChart plotAreaChart = new HTEXLib.PlotAreaChart { chartType = "plotArea" };
|
|
|
+ plotAreaChart.plotAreaType = key;
|
|
|
+ var PlotSeries = HTEXLib.ShapeHelper.GetPPTXNodeByPath(child, "cx:series");
|
|
|
+ if (PlotSeries != null)
|
|
|
+ {
|
|
|
+ plotAreaChart.plotAreaType += "-" + PlotSeries.Attribute("val").Value;
|
|
|
+ }
|
|
|
+ serNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(child, "c:ser");
|
|
|
+ plotAreaChart.datas = ExtractChartData(serNodes, wordDoc, element, ImageHandler, positionc);
|
|
|
+ charts.Add(plotAreaChart);
|
|
|
+ break;
|
|
|
+ case "stockChart":
|
|
|
+ HTEXLib.StockChart stockChart = new HTEXLib.StockChart { chartType = "stock" };
|
|
|
+ stockChart.stockType = key;
|
|
|
+ serNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(child, "c:ser");
|
|
|
+ stockChart.datas = ExtractChartData(serNodes, wordDoc, element, ImageHandler, positionc);
|
|
|
+ charts.Add(stockChart);
|
|
|
+ break;
|
|
|
+ case "surfaceChart":
|
|
|
+ case "surface3DChart":
|
|
|
+ HTEXLib.SurfaceChart surfaceChart = new HTEXLib.SurfaceChart { chartType = "surface" };
|
|
|
+ if (key.Equals("surface3DChart"))
|
|
|
+ {
|
|
|
+ surfaceChart.is3D = true;
|
|
|
+ }
|
|
|
+ surfaceChart.surfaceType = key;
|
|
|
+ var Wireframe = HTEXLib.ShapeHelper.GetPPTXNodeByPath(child, "c:wireframe");
|
|
|
+ if (Wireframe != null)
|
|
|
+ {
|
|
|
+ surfaceChart.surfaceType += "-" + Wireframe.Attribute("val").Value;
|
|
|
+ }
|
|
|
+ serNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(child, "c:ser");
|
|
|
+ surfaceChart.datas = ExtractChartData(serNodes, wordDoc, element, ImageHandler, positionc);
|
|
|
+ charts.Add(surfaceChart);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return charts;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static List<Dictionary<string, object>> ExtractChartData(IEnumerable<XElement> nodes, WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> ImageHandler, HTEXLib.Position positionc)
|
|
|
+ {
|
|
|
+
|
|
|
+ if (nodes != null)
|
|
|
+ {
|
|
|
+ List<Dictionary<string, object>> listDict = new List<Dictionary<string, object>>();
|
|
|
+ foreach (XElement node in nodes)
|
|
|
+ {
|
|
|
+
|
|
|
+ if (HTEXLib.ShapeHelper.GetPPTXNodeByPath(node, "c:xVal") != null)
|
|
|
+ {
|
|
|
+ Dictionary<string, object> dict = new Dictionary<string, object>();
|
|
|
+ var xCvNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(node, "c:xVal/c:numRef/c:numCache/c:pt/c:v");
|
|
|
+ if (xCvNodes != null)
|
|
|
+ {
|
|
|
+ List<string> list = new List<string>();
|
|
|
+ foreach (XElement cvNode in xCvNodes)
|
|
|
+ {
|
|
|
+ list.Add(cvNode.Value);
|
|
|
+ }
|
|
|
+ dict.Add("xAxis", list);
|
|
|
+ }
|
|
|
+ var yCvNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(node, "c:yVal/c:numRef/c:numCache/c:pt/c:v");
|
|
|
+ if (yCvNodes != null)
|
|
|
+ {
|
|
|
+ List<string> list = new List<string>();
|
|
|
+ foreach (XElement cvNode in yCvNodes)
|
|
|
+ {
|
|
|
+ list.Add(cvNode.Value);
|
|
|
+ }
|
|
|
+ dict.Add("yAxis", list);
|
|
|
+ }
|
|
|
+ dict.Add("colName", "-");
|
|
|
+ listDict.Add(dict);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Dictionary<string, object> dict = new Dictionary<string, object>();
|
|
|
+ var spPr = HTEXLib.ShapeHelper.GetPPTXNodeByPath(node, "c:spPr");
|
|
|
+ if (spPr != null)
|
|
|
+ {
|
|
|
+ var ChartShapeProperties = new ChartShapeProperties(spPr.ToString());
|
|
|
+ HTEXLib.Models.HTEX. ShapeStyle shapeStyle = WORDHelper.DoShapeProperties(wordDoc,ChartShapeProperties,element, ImageHandler, positionc);
|
|
|
+ dict.Add("colStyle", shapeStyle);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dict.Add("colStyle", null);
|
|
|
+ }
|
|
|
+ var colNameNode = HTEXLib.ShapeHelper.GetPPTXNodeByPath(node,"c:tx/c:strRef/c:strCache/c:pt/c:v");
|
|
|
+ if (colNameNode != null)
|
|
|
+ {
|
|
|
+ dict.Add("colName", colNameNode.Value);
|
|
|
+
|
|
|
+ }
|
|
|
+ //name
|
|
|
+ var catNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(node, "c:cat/c:strRef/c:strCache/c:pt/c:v");
|
|
|
+ if (catNodes == null)
|
|
|
+ {
|
|
|
+ catNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(node, "c:cat/c:numRef/c:numCache/c:pt/c:v");
|
|
|
+ }
|
|
|
+ if (catNodes != null)
|
|
|
+ {
|
|
|
+ List<string> list = new List<string>();
|
|
|
+ foreach (XElement cvNode in catNodes)
|
|
|
+ {
|
|
|
+ list.Add(cvNode.Value);
|
|
|
+ }
|
|
|
+ dict.Add("xAxis", list);
|
|
|
+ }
|
|
|
+ //value
|
|
|
+ var valNodes = HTEXLib.ShapeHelper.GetPPTXNodeListByPath(node, "c:val/c:numRef/c:numCache/c:pt/c:v");
|
|
|
+ if (valNodes != null)
|
|
|
+ {
|
|
|
+ List<string> list = new List<string>();
|
|
|
+ foreach (XElement cvNode in valNodes)
|
|
|
+ {
|
|
|
+ list.Add(cvNode.Value);
|
|
|
+ }
|
|
|
+ dict.Add("yAxis", list);
|
|
|
+ }
|
|
|
+ listDict.Add(dict);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return listDict;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ public static XElement ProcessDgm(WordprocessingDocument wordDoc, XElement containerElement, Func<ImageInfo, XElement> imageHandler,
|
|
|
+ int? extentCx, int? extentCy, string altText, XElement element, string hyperlinkUri)
|
|
|
+ {
|
|
|
+ var rdm = element.Attribute(R.dm);
|
|
|
+ var dgm = wordDoc.MainDocumentPart.Parts.FirstOrDefault(pp => pp.RelationshipId == rdm.Value);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ public static XElement ProcessWps(WordprocessingDocument wordDoc, XElement element, Func<ImageInfo, XElement> imageHandler) {
|
|
|
|
|
|
+ // var wps = element.Element(MC.Choice).Element(W.drawing).Element(WP.anchor).Element(A.graphic).Element(A.graphicData).Element(WPS.wsp);
|
|
|
+ WordprocessingShape wsp = new WordprocessingShape(element.ToString());
|
|
|
+ var ext = element.GetWordNodeByPath("wps:spPr/a:xfrm/a:ext");
|
|
|
+ var cx = ext.Attribute("cx").Value;
|
|
|
+ var cy = ext.Attribute("cy").Value;
|
|
|
+ HTEXLib.Shape shape = new HTEXLib.Shape();
|
|
|
+ HTEXLib.Position position = new HTEXLib.Position { x = 0, y = 0, cx = double.Parse(cx) * 96.0 / 914400, cy = double.Parse(cy) * 96.0 / 914400 };
|
|
|
+ var prstGeom = element.GetWordNodeByPath("wps:spPr/a:prstGeom");
|
|
|
+ if (prstGeom != null)
|
|
|
+ {
|
|
|
+ var shapeType = prstGeom.Attribute("prst").Value;
|
|
|
+ var svg = SvgHelper.GenShapeSvg(new PresetGeometry(prstGeom.ToString()), shapeType, position, null);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ var custGeom = element.GetWordNodeByPath("wps:spPr/a:custGeom");
|
|
|
+ if (custGeom != null)
|
|
|
+ {
|
|
|
+ DocumentFormat.OpenXml.Drawing.CustomGeometry shapeTypeCustom = new CustomGeometry(custGeom.ToString());
|
|
|
+ shape = PPTXHelper.DoCustomGeometry(shapeTypeCustom, shape);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ var ShapeStyle = WORDHelper.DoShapeProperties(wordDoc, wsp.GetFirstChild<DocumentFormat.OpenXml.Office2010.Word.DrawingShape.ShapeProperties>(), element, imageHandler, position);
|
|
|
+ SlideColor slideColor = WORDHelper.DoShapeStyle(wsp.GetFirstChild<DocumentFormat.OpenXml.Office2010.Word.DrawingShape.ShapeStyle>(), wordDoc);
|
|
|
+ //从ShapeProperties 获取 p:spPr
|
|
|
+ //再从 ShapeStyle 获取 p:spPr
|
|
|
+ if (ShapeStyle.border == null || ShapeStyle.border.color == null || ShapeStyle.border.color.type == -1)
|
|
|
+ {
|
|
|
+ if (slideColor != null)
|
|
|
+ {
|
|
|
+ shape.style.border.color.solidFill = slideColor.LineColor;
|
|
|
+ shape.style.border.color.type = 2;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ shape.style.border = ShapeStyle.border;
|
|
|
+ }
|
|
|
+ if (ShapeStyle.fill == null || ShapeStyle.fill.type == -1)
|
|
|
+ {
|
|
|
+ if (slideColor != null)
|
|
|
+ {
|
|
|
+ shape.style.fill.solidFill = slideColor.FillColor;
|
|
|
+ shape.style.fill.type = 2;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ shape.style.fill = ShapeStyle.fill;
|
|
|
+ }
|
|
|
+ var wpars = element.GetWordNodeListByPath("wps:txbx/w:txbxContent/w:p");
|
|
|
+ List<string> pars = new List<string>();
|
|
|
+ if (wpars != null)
|
|
|
+ {
|
|
|
+ foreach (var wpar in wpars)
|
|
|
+ {
|
|
|
+ if (wpar.Value != null)
|
|
|
+ {
|
|
|
+ pars.Add(wpar.Value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
public static XElement ProcessOMath(XElement element)
|
|
|
{
|
|
@@ -1494,6 +2016,7 @@ namespace OpenXmlPowerTools
|
|
|
xe.AddAnnotation(style);
|
|
|
content = xe;
|
|
|
}
|
|
|
+
|
|
|
return content;
|
|
|
}
|
|
|
|
|
@@ -3078,7 +3601,7 @@ namespace OpenXmlPowerTools
|
|
|
// Don't process wmf files (with contentType == "image/x-wmf") because GDI consumes huge amounts
|
|
|
// of memory when dealing with wmf perhaps because it loads a DLL to do the rendering?
|
|
|
// It actually works, but is not recommended.
|
|
|
- private static readonly List<string> ImageContentTypes = new List<string>
|
|
|
+ public static readonly List<string> ImageContentTypes = new List<string>
|
|
|
{
|
|
|
"image/png", "image/gif", "image/tiff", "image/jpeg","image/x-wmf","image/x-emf","application/vnd.openxmlformats-officedocument.oleObject"
|
|
|
};
|
|
@@ -3099,6 +3622,7 @@ namespace OpenXmlPowerTools
|
|
|
{
|
|
|
return ProcessPictureOrObject(wordDoc, element , imageHandler);
|
|
|
}
|
|
|
+
|
|
|
return null;
|
|
|
}
|
|
|
|
|
@@ -3133,6 +3657,42 @@ namespace OpenXmlPowerTools
|
|
|
.Attributes(NoNamespace.cy).FirstOrDefault();
|
|
|
var altText = (string)containerElement.Elements(WP.docPr).Attributes(NoNamespace.descr).FirstOrDefault() ??
|
|
|
((string)containerElement.Elements(WP.docPr).Attributes(NoNamespace.name).FirstOrDefault() ?? "");
|
|
|
+
|
|
|
+ if (containerElement.Elements(A.graphic)
|
|
|
+ .Elements(A.graphicData) != null)
|
|
|
+ {
|
|
|
+ XElement rest = null;
|
|
|
+ var elms = containerElement.Elements(A.graphic)
|
|
|
+ .Elements(A.graphicData).Elements();
|
|
|
+ foreach (var elm in elms)
|
|
|
+ {
|
|
|
+ if (elm.Name == Pic._pic)
|
|
|
+ {
|
|
|
+ rest= ProcessPic(wordDoc, containerElement, imageHandler, extentCx, extentCy, altText, elm, hyperlinkUri);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (elm.Name == C.chart)
|
|
|
+ {
|
|
|
+ rest = ProcessChart(wordDoc, containerElement, imageHandler, extentCx, extentCy, altText, elm, hyperlinkUri);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (elm.Name == DGM.relIds)
|
|
|
+ {
|
|
|
+ rest = ProcessDgm(wordDoc, containerElement, imageHandler, extentCx, extentCy, altText, elm, hyperlinkUri);
|
|
|
+ break;
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return rest;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ public static XElement ProcessPic(WordprocessingDocument wordDoc, XElement containerElement, Func<ImageInfo, XElement> imageHandler,
|
|
|
+ int? extentCx,int? extentCy,string altText, XElement element,string hyperlinkUri) {
|
|
|
var blipFill = containerElement.Elements(A.graphic)
|
|
|
.Elements(A.graphicData)
|
|
|
.Elements(Pic._pic).Elements(Pic.blipFill).FirstOrDefault();
|
|
@@ -3205,7 +3765,6 @@ namespace OpenXmlPowerTools
|
|
|
return imgElement;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
private static XElement ProcessPictureOrObject(WordprocessingDocument wordDoc,
|
|
|
XElement element, Func<ImageInfo, XElement> imageHandler)
|
|
|
{
|