1

我有一个实现Novacode.LineChart. 默认显示的 LineChart 类型是这样的:

在此处输入图像描述

但我不想要这种类型的图表,我想要它没有积分,像这样:

在此处输入图像描述

这是我创建图表的代码:

   LineChart c = new LineChart();
   c.AddLegend(ChartLegendPosition.Bottom, false);
   c.Grouping = Grouping.Stacked;

任何人都知道我怎样才能隐藏这些点并只显示线条?谢谢大家!!

4

1 回答 1

5

当我搜索完全相同的功能时,您的问题出现了。可能有点晚了,但我希望它对其他需要此功能的人有用。

我所谓的答案只不过是几行肮脏且难以管理的黑客行为,因此除非您不是迫切需要,否则我建议您遵循这种方式。

我也不知道这是否是一种认可的方法,但我更喜欢逐步编写解决方案,这样可以帮助您掌握概念并使用更好的方法。

在我意识到我无法使用 DocX 创建没有标记的折线图之后,使用当前提供的 API,我想知道实际输出和所需输出之间的区别是什么。因此,在手动将图表编辑为预期结果后,我保存了带有折线图的 .docx 文件的副本。

编辑前后

您可能已经知道,.docx 是一种容器格式,本质上由几个不同的文件夹和文件组成。您可以使用 .zip 档案提取器打开它。我为此任务使用了 7-Zip,并在/word/charts/chart1.xml的位置找到了图表文件,但这可能因文件而异,但您可以轻松搞定。

比较两个chart1.xml文件,不同的是,没有标记的文件多了一个带有附加属性的XML标签;

<c:marker>
    <c:symbol val="none" />
</c:marker>

我不得不以某种方式将这段代码添加到图表中。我将这些添加到 DocX 提供的示例代码中。您可以从以下网址跟进:DocX/ChartSample.cs at master

这就是乐趣的开始。先说简单的部分。

using System.Xml;
using System.Xml.Linq;
using Xceed.Words.NET;

// Create a line chart.
var line_chart = new LineChart();

// Create the data.
var PlaceholderData = ChartData.GenerateRandomDataForLinechart();

// Create and add series
var Series_1 = new Series("Your random chart with placeholder data");
Series_1.Bind(PlaceholderData, "X-Axis", "Y-Axis");
line_chart.AddSeries(Series_1);

// Create a new XmlDocument object and clone the actual chart XML
XmlDocument XMLWithNewTags = new XmlDocument();
XMLWithNewTags.LoadXml(line_chart.Xml.ToString());

我已经使用XPath Visualizer Tool确定 XPath 查询,了解这一点很重要,因为您不能只是将标记标记添加到某处并期望它能够工作。我为什么要说这个?因为我在随机线上附加了标记标签并希望它能够工作。幼稚的。

// Set a namespace manager with the proper XPath location and alias
XmlNamespaceManager NSMngr = new XmlNamespaceManager(XMLWithNewTags.NameTable);

string XPathQuery = "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser";
string xmlns = "http://schemas.openxmlformats.org/drawingml/2006/chart";

NSMngr.AddNamespace("c", xmlns);
XmlNode NewNode = XMLWithNewTags.SelectSingleNode(XPathQuery, NSMngr);

现在在具有指定命名空间的新创建的 XML 文档对象上创建必要的标签

XmlElement Symbol = XMLWithNewTags.CreateElement("c", "symbol", xmlns);
Symbol.SetAttribute("val", "none");

XmlElement Marker = XMLWithNewTags.CreateElement("c", "marker", xmlns);
Marker.AppendChild(Symbol);

NewNode.AppendChild(Marker);

我们应该将最新更改的内容复制到实际的XML 对象中。但是哎呀,可以理解的是,它被定义为私有,因此它是一个只读对象。这就是我想“好吧,我已经玩够了。我最好找到另一个图书馆”但后来决定继续,因为原因。

下载 DocX repo,将此行更改为

get; set;

重新编译,将Xceed.Words.NET.dll复制到projectfolder/packagesprojectfolder/projectname/bin/Debug文件夹,最后几行是

// Copy the contents of latest changes to actual XML object
line_chart.Xml = XDocument.Parse(XMLWithNewTags.InnerXml);

// Insert chart into document
document.InsertChart(line_chart);

// Save this document to disk.
document.Save();

这值得么?我不确定,但我在工作的过程中学到了一些东西。这个答案中可能有很多不好的编程实践,所以如果你看到一个,告诉我。对不起我的英语。

于 2017-12-27T22:38:39.583 回答