我正在使用SpreadsheetGear 2010绘制柱形图,并希望遍历所有数据点,将负数着色为红色...但是我无法看到一种方法来获得点的“值”,因为我循环通过
以下(将数据标签字符串解释为double值)大部分时间都可以使用:
for (int i = 0; i < chart.SeriesCollection.Count; i++)
{
positiveColor = Color.FromArgb(79, 129, 189); // blue
negativeColor = Color.FromArgb(192, 80, 77); // red
chart.SeriesCollection[i].HasDataLabels = true;
for (int j = 0; j < chart.SeriesCollection[i].Points.Count; j++)
{
double pointValue;
// If the point is -0.004 but the number format is "0.00",
// label will be "0.00"
string label = chart.SeriesCollection[i].Points[j].DataLabel.Text;
chart.SeriesCollection[i].Points[j].Format.Fill.ForeColor.RGB =
(System.Double.TryParse(label, out pointValue) && pointValue >= 0)
? positiveColor
: negativeColor;
}
}
...但是,如果该值略微为负,则数据标签仅显示零,因此pointValue&gt; = 0并且我将该点解释为正数。这导致从我的X轴垂下来的恼人的小蓝点。
SpreadsheetGear.Charts.IPoint
似乎没有任何有用的属性来检索用于绘制点的值。
chart.SeriesCollection[i].Values
看起来很有希望,但会返回object
,其字符串解释为“=数据!$ B $ 25:$ B $ 44”。我似乎无法将其转换为有用的东西,并且无法找到任何相关的SpreadsheetGear文档。
我知道如何获得用于绘制点的值吗?
答案 0 :(得分:1)
这个答案不是很优雅,但它应该能满足你的需要。您已经有了使用chart.SeriesCollection[i].Values
的想法。如果使用chart.SeriesCollection[i].Values
中包含的地址,您可以从图表获取值的相同数据中获取值,以创建列。
替换您定义字符串标签的行代码。
string label = chart.SeriesCollection[i].Points[j].DataLabel.Text;
这条线。
string label = chart.Sheet.Workbook.Worksheets[chart.Sheet.Name].Cells[chart.SeriesCollection[i].Values.ToString().Replace("=" + chart.Sheet.Name + "!", "")][0, j].Value.ToString();
这样,该值不受标签格式化的控制。
如果单元格值为null,则在添加ToString()
时会抛出异常。
这是另一个版本,其中更改的行分开了更多,因此不那么令人困惑。在使用ToString()
之前,还会检查空值。
//if you do not have direct access to the worksheet object.
SpreadsheetGear.IWorksheet worksheet1 = chart.Sheet.Workbook.Worksheets[chart.Sheet.Name];
for (int i = 0; i < chart.SeriesCollection.Count; i++)
{
Color positiveColor = Color.FromArgb(79, 129, 189); // blue
Color negativeColor = Color.FromArgb(192, 80, 77); // red
chart.SeriesCollection[i].HasDataLabels = true;
//Get the address of the series
string address = chart.SeriesCollection[i].Values.ToString().Replace("=" + chart.Sheet.Name + "!", "");
for (int j = 0; j < chart.SeriesCollection[i].Points.Count; j++)
{
double pointValue;
//bool usePositiveValueColor = false;
// If the point is -0.004 but the number format is "0.00",
// label will be "0.00"
//string label = chart.SeriesCollection[i].Points[j].DataLabel.Text;
string label = (worksheet1.Cells[address][0, j].Value != null)
? worksheet1.Cells[address][0, j].Value.ToString() : "0";
chart.SeriesCollection[i].Points[j].Format.Fill.ForeColor.RGB =
(System.Double.TryParse(label, out pointValue) && pointValue >= 0)
? positiveColor
: negativeColor;
}
}