全く同じ機能を検索している間にあなたの質問が表示されます。おそらくのビットが遅れていますが、この機能が必要な他の人にとっては便利だと思います。あなたが緊急に必要ではない場合を除き、私ははないはこのように従うことをお勧めしますので、
マイいわゆる答えは汚いと手に負えないハックの数行以上ではありません。
ここに承認されたアプローチがあるかどうかもわかりませんが、私はソリューションを段階的に記述することをお勧めしますので、コンセプトを把握してより良い方法を使用するのに役立ちます。
現在提供されているAPIを使用してDocXを使用してマーカーなしの折れ線グラフを作成できなかったことを知り、実際の出力と希望する出力の違いを知りたいと思っていました。そこで、グラフを手動で期待した結果に編集した後、.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());
私はあなただけのどこかに、マーカータグを追加して、それが動作するように期待することはできませんので、知っておくことが重要である、determine the XPath queryへXPath Visualizer Toolを使用しました。なぜ私はこれを言うのですか?ランダムな行にマーカータグを追加して、それが動作することを期待していたからです。 Naive。
// 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);
は今
指定された名前空間で
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ドキュメントオブジェクト上に必要なタグを作成し、我々は実際 XMLオブジェクトへの最新の変更の内容をコピーする必要があります。しかし、あいにく、それはプライベートと定義されているため、読み取り専用のオブジェクトです。これは私がのように思ったところです。「これで十分に手抜きしました。別の図書館を見つけたほうがいいですよ。」しかし、それは理由があるからです。
ダウンロードDOCXレポ、再コンパイル
get; set;
にthisラインを変更し、両方のprojectfolder /パッケージとprojectfolder /プロジェクト名/ binに/デバッグフォルダにXceed.Words.NET.dllをコピーして、最後に最後の数行は
// 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