我正在尝试使用EPPlus和C#创建一个excel Graph。我可以成功创建以下图表: 但是,我希望程序在运行时在两个方向上创建主要和次要网格线;这样图表看起来像这样:
我知道我可以在Excel中调整这些设置,但我希望能够使用我的代码设置默认网格线。我在EPPlus中找不到可以处理此设置的设置(如果有,请让我知道)。我试图弄清楚如何直接自定义XML,但我也遇到了麻烦。
有没有办法可以做到这一点?任何帮助表示赞赏。
答案 0 :(得分:1)
有点奇怪没有添加,因为它很容易打开。下面是如何使用XML(如果你想设置颜色和大小,你需要更多地进入XML操作,但这将让你开始):
using (var pck = new ExcelPackage(fileInfo))
{
var workbook = pck.Workbook;
var worksheet = workbook.Worksheets.Add("Sheet1");
worksheet.Cells.LoadFromDataTable(datatable, true);
var chart = worksheet.Drawings.AddChart("chart test", eChartType.XYScatter);
var series = chart.Series.Add(worksheet.Cells["B2:B11"], worksheet.Cells["A2:A11"]);
//Get reference to the worksheet xml for proper namespace
var chartXml = chart.ChartXml;
var nsuri = chartXml.DocumentElement.NamespaceURI;
var nsm = new XmlNamespaceManager(chartXml.NameTable);
nsm.AddNamespace("c", nsuri);
//XY Scatter plots have 2 value axis and no category
var valAxisNodes = chartXml.SelectNodes("c:chartSpace/c:chart/c:plotArea/c:valAx", nsm);
if (valAxisNodes != null && valAxisNodes.Count > 0)
foreach (XmlNode valAxisNode in valAxisNodes)
{
if (valAxisNode.SelectSingleNode("c:majorGridlines", nsm) == null)
valAxisNode.AppendChild(chartXml.CreateNode(XmlNodeType.Element, "c:majorGridlines", nsuri));
if (valAxisNode.SelectSingleNode("c:minorGridlines", nsm) == null)
valAxisNode.AppendChild(chartXml.CreateNode(XmlNodeType.Element, "c:minorGridlines", nsuri));
}
//Other charts can have a category axis
var catAxisNodes = chartXml.SelectNodes("c:chartSpace/c:chart/c:plotArea/c:catAx", nsm);
if (catAxisNodes != null && catAxisNodes.Count > 0)
foreach (XmlNode catAxisNode in catAxisNodes)
{
if (catAxisNode.SelectSingleNode("c:majorGridlines", nsm) == null)
catAxisNode.AppendChild(chartXml.CreateNode(XmlNodeType.Element, "c:majorGridlines", nsuri));
if (catAxisNode.SelectSingleNode("c:minorGridlines", nsm) == null)
catAxisNode.AppendChild(chartXml.CreateNode(XmlNodeType.Element, "c:minorGridlines", nsuri));
}
pck.Save();
}