2017-02-22 40 views
1

У меня есть код, который реализует Novacode.LineChart. И тип LineChart, который отображается по умолчанию это одна:Novacode LineChart type

enter image description here

Но я не хочу этот тип диаграммы, я хочу это без очков, как это:

enter image description here

Этот это код, в котором я создаю диаграмму:

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

Кто-нибудь знает, как я могу скрыть точки атаки и показать только e строк? Спасибо всем!!

ответ

3

Ваш вопрос отображается, пока я искал ту же самую функцию. Вероятно, немного поздно, но я надеюсь, что это было бы полезно для других людей, нуждающихся в этой функции.

Мой так называемый ответ - это не более нескольких строк грязного и неуправляемого взлома, поэтому, если вы не нуждаетесь в этом, я делаю не рекомендую следовать этому пути.

Я также не знаю, является ли это одобренным подходом здесь, но я предпочитаю писать решение шаг за шагом, чтобы он помог вам понять концепцию и использовать лучшие методы.

После того, как я понял, что не смог использовать DocX для создания линейной диаграммы без маркеров, используя предоставленный API, я хотел бы знать, каковы различия между фактическим и желаемым выходом. Поэтому я сохранил копию файла .docx с линейной диаграммой после того, как я вручную отредактировал график до ожидаемого результата.

Before and after the edit

Как вы уже знаете, .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 для determine the XPath query, что очень важно знать, потому что вы не можете просто добавить маркер метки где-то и ожидать, что она работает. Почему я это говорю? Потому что я добавил маркерный маркер на случайную строку и ожидал, что он сработает. Наивные.

// 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); 

Теперь создать необходимые теги на вновь созданный объект Document 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 репо, изменил this строку

get; set; 

перекомпилированной, скопированный Xceed.Words.NET.dll как к projectfolder/ папки пакеты и projectfolder/имя_проекта/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(); 

Стоило ли? Я не уверен, но я изучил несколько вещей, работая над этим. Вероятно, в этом ответе есть много плохих методов программирования, поэтому , пожалуйста, скажите мне, если вы его увидите. Извините за меня английский.

+1

Это было здорово !! – dbz

 Смежные вопросы

  • Нет связанных вопросов^_^