Ваш вопрос отображается, пока я искал ту же самую функцию. Вероятно, немного поздно, но я надеюсь, что это было бы полезно для других людей, нуждающихся в этой функции.
Мой так называемый ответ - это не более нескольких строк грязного и неуправляемого взлома, поэтому, если вы не нуждаетесь в этом, я делаю не рекомендую следовать этому пути.
Я также не знаю, является ли это одобренным подходом здесь, но я предпочитаю писать решение шаг за шагом, чтобы он помог вам понять концепцию и использовать лучшие методы.
После того, как я понял, что не смог использовать 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();
Стоило ли? Я не уверен, но я изучил несколько вещей, работая над этим. Вероятно, в этом ответе есть много плохих методов программирования, поэтому , пожалуйста, скажите мне, если вы его увидите. Извините за меня английский.
Это было здорово !! – dbz