使用OWC,若柱状图每个显示为一个组,各个组中同类的柱状为一个系列..将他们分到各个数组中,在组长度的循环中,使用Microsoft.Office.Interop.Owc11.ChSeries做一个循环就解决问题了.. protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { string sql = "SELECT ROW_NUMBER() OVER (ORDER BY d.operationname)as id, d.operationname ,SUM(CONVERT(FLOAT,a.totalprice)) AS totalprice,COUNT(a.terminalnum) AS counts FROM bankresinfolog a,terminalinfo b,operationinfo d,areainfo c WHERE a.terminalnum=b.terminalnum AND c.areaid=b.areaid AND a.Serviceid=d.operationcode GROUP BY d.operationname"; DataSet ds = pstnpay.DBOperate.GetDateSet(sql); int m = ds.Tables[0].Rows.Count; string[] categoryArr = new string[m]; string[] valueArr1 = new string[m]; string[] valueArr2 = new string[m]; for (int i = 0; i < m; i++) { categoryArr[i] = ds.Tables[0].Rows[i][1].ToString(); valueArr1[i] = Convert.ToString((Convert.ToInt32(ds.Tables[0].Rows[i][2]))/1000); valueArr2[i] = Convert.ToString((Convert.ToInt32(ds.Tables[0].Rows[i][3]))); }
我前端时间正好做过一个,你可以参考一下,我是横向显示柱形图,
事先准备一个窄点的图,便于动态拉伸冒充柱形图
界面上放Image1--Image6 显示那个图, Label1-label6 对应显示柱形图的数值,label7是他们的和然后我是异步取六个数,分别写到六个lable里,然后执行下面的代码,
下面的代码,大概是对比六个,取出最大的一个来,已柱形图最宽为300为限,
动态的算出各个图的比例并设置,设完图的宽后,再强制设置一下它原来的高,
我这里是30,因为你不设置高的话,图就按比例变了
private void DrawImage()
{
float valM = 0;
float valTemp = 0;
float valSum = 0; if (IsNumeric(Label1.Text))
{
valM = Convert.ToSingle(Label1.Text);
valSum = Convert.ToSingle(Label1.Text );
}
if (IsNumeric(Label2.Text))
{
valSum += Convert.ToSingle(Label2.Text); if (valM < Convert.ToSingle(Label2.Text))
valM = Convert.ToSingle(Label2.Text);
}
if (IsNumeric(Label3.Text))
{
valSum += Convert.ToSingle(Label3.Text); if (valM < Convert.ToSingle(Label3.Text))
valM = Convert.ToSingle(Label3.Text);
}
if (IsNumeric(Label4.Text))
{
valSum += Convert.ToSingle(Label4.Text); if (valM < Convert.ToSingle(Label4.Text))
valM = Convert.ToSingle(Label4.Text);
}
if (IsNumeric(Label5.Text))
{
valSum += Convert.ToSingle(Label5.Text); if (valM < Convert.ToSingle(Label5.Text))
valM = Convert.ToSingle(Label5.Text); }
if (IsNumeric(Label6.Text))
{
valSum += Convert.ToSingle(Label6.Text); if (valM < Convert.ToSingle(Label6.Text))
valM = Convert.ToSingle(Label6.Text);
} Label7.ToolTip = Convert.ToString(valSum);
valSum =(valSum /10000);
Label7.Text = "本年度 至今 征收总额" + valSum.ToString("N0") + "万元";
if (valM > 0)
{
if (IsNumeric(Label1.Text))
{
Image1.Width = Unit.Pixel(Convert.ToInt32(Convert.ToSingle(Label1.Text) / valM * 300));
Image1.Height = 30;
valTemp = Convert.ToSingle(Label1.Text) / 10000;
Label1.Text = valTemp.ToString("N0") + "万元";
} if (IsNumeric(Label2.Text))
{
Image2.Width = Unit.Pixel(Convert.ToInt32(Convert.ToSingle(Label2.Text) / valM * 300));
Image2.Height = 30;
valTemp = Convert.ToSingle(Label2.Text) / 10000;
Label2.Text = valTemp.ToString("N0") + "万元";
} if (IsNumeric(Label3.Text))
{
Image3.Width = Unit.Pixel(Convert.ToInt32(Convert.ToSingle(Label3.Text) / valM * 300));
Image3.Height = 30;
valTemp = Convert.ToSingle(Label3.Text) / 10000;
Label3.Text = valTemp.ToString("N0") + "万元";
} if (IsNumeric(Label4.Text))
{
Image4.Width = Unit.Pixel(Convert.ToInt32(Convert.ToSingle(Label4.Text) / valM * 300));
Image4.Height = 30;
valTemp = Convert.ToSingle(Label4.Text) / 10000;
Label4.Text = valTemp.ToString("N0") + "万元";
} if (IsNumeric(Label5.Text))
{
Image5.Width = Unit.Pixel(Convert.ToInt32(Convert.ToSingle(Label5.Text) / valM * 300));
Image5.Height = 30;
valTemp = Convert.ToSingle(Label5.Text) / 10000;
Label5.Text = valTemp.ToString("N0") + "万元";
} if (IsNumeric(Label6.Text))
{
Image6.Width = Unit.Pixel(Convert.ToInt32(Convert.ToSingle(Label6.Text) / valM * 300));
Image6.Height = 30;
valTemp = Convert.ToSingle(Label6.Text) / 10000;
Label6.Text = valTemp.ToString("N0") + "万元";
} } }
我的代码完全可以现实你的功能但是你现在又加了限制,“统计方式是可以组合选的,横向显示几个分类也不确定..”
那肯定是不适合了,需要动态的进行设置,不过思路差不多的
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
string sql = "SELECT ROW_NUMBER() OVER (ORDER BY d.operationname)as id, d.operationname ,SUM(CONVERT(FLOAT,a.totalprice)) AS totalprice,COUNT(a.terminalnum) AS counts FROM bankresinfolog a,terminalinfo b,operationinfo d,areainfo c WHERE a.terminalnum=b.terminalnum AND c.areaid=b.areaid AND a.Serviceid=d.operationcode GROUP BY d.operationname";
DataSet ds = pstnpay.DBOperate.GetDateSet(sql);
int m = ds.Tables[0].Rows.Count;
string[] categoryArr = new string[m];
string[] valueArr1 = new string[m];
string[] valueArr2 = new string[m];
for (int i = 0; i < m; i++)
{
categoryArr[i] = ds.Tables[0].Rows[i][1].ToString();
valueArr1[i] = Convert.ToString((Convert.ToInt32(ds.Tables[0].Rows[i][2]))/1000);
valueArr2[i] = Convert.ToString((Convert.ToInt32(ds.Tables[0].Rows[i][3])));
}
string categoryStr = string.Join("\t", categoryArr); string valueStr1 = string.Join("\t", valueArr1);
string valueStr2 = string.Join("\t", valueArr2);
string[] valueArr = new string[] { valueStr1, valueStr2 };
string[] titleArr = new string[] { "消耗量m3", "水费(元)" }; string[] colorArr = new string[] { "#9999FF", "#993366" }; ToPrint(categoryStr, valueArr, titleArr, colorArr);
}
} void ToPrint(string categoryStr, string[] valueArr, string[] titleArr, string[] colorArr)
{
// 新建一个绘图空间
ChartSpace objCSpace = new ChartSpace();
// 在绘图空间中新建一个图表
ChChart objChart = objCSpace.Charts.Add(0);
//objChart.Type = ChartChartTypeEnum.chChartTypeColumnClustered3D; // 指定图表的类型为3D柱状
objChart.Type = ChartChartTypeEnum.chChartTypeColumnClustered; // 平面柱状
objChart.HasLegend = true; // 指定图表是否需要图例 // 标题
objChart.HasTitle = true;
objChart.Title.Caption = "年度水量消耗统计";
objChart.Title.Font.Size = 9;
objChart.Title.Font.Name = "宋体";
objChart.Title.Font.Bold = true; objChart.PlotArea.Interior.Color = "#C0C0C0"; // 绘图区的背景颜色
objChart.PlotArea.Floor.Interior.Color = "#888888"; // 绘图区的底色 objChart.Legend.Font.Size = 9; // 图例的字体 for (int i = 0; i < valueArr.Length; i++)
{
// 在图表中添加一个数据系列
ChSeries objSeries = objChart.SeriesCollection.Add(i);
objSeries.SetData(ChartDimensionsEnum.chDimSeriesNames, ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(), titleArr[i]);
objSeries.SetData(ChartDimensionsEnum.chDimCategories, ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(), categoryStr);
objSeries.SetData(ChartDimensionsEnum.chDimValues, ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(), valueArr[i]);
objSeries.Interior.Color = colorArr[i]; // 柱子内部的颜色
objSeries.GapWidth = 300; // 柱子之间的间隙 ChDataLabels objDataLabels = objChart.SeriesCollection[i].DataLabelsCollection.Add();
objDataLabels.HasValue = false; // 柱子上面的数字是否显示
objDataLabels.Font.Color = "Black"; // 柱子上面的数字颜色是黑色的
}
objCSpace.ExportPicture(MapPath(@"img/02.gif"), "gif", 500, 300);
}