从SpreadsheetGear 2010图表系列中获取点值

时间:2014-01-27 16:32:04

标签: c# charts spreadsheetgear

我正在使用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文档。

我知道如何获得用于绘制点的值吗?

1 个答案:

答案 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;
  }
}