OWC 如何实现X轴双刻度?

游戏人间 2010-05-11 08:13:31
图1.
图1为Excel表中作成的一个双轴线-柱状堆积图。可以看出X轴上有两个刻度,
一个为使用材料,二个为材料使用日期。
图2.
图2为ASP.NET中利用OWC生成的一个图,大部分效果以达到要求,就是X轴双刻未能实现,
请大家帮忙,如何实现X轴双刻度?

以下为代码。复制到ASP.NET中可运行

请引入此命名空间

using Microsoft.Office.Interop.Owc11;


//创建ChartSpace对象来放置图表
ChartSpace chartSpace = new ChartSpaceClass();

//是否显示图例
chartSpace.HasChartSpaceLegend = true;

//在ChartSpace对象中添加图表,Add方法返回Chart对象
ChChart chChart = chartSpace.Charts.Add(0);


//给定标题
chChart.HasTitle = true;
chChart.Title.Caption = "材料不良率";

//给定x,y轴的图示说明
chChart.Axes[0].HasTitle = true;
chChart.Axes[0].Title.Caption = "X : 日期";


chChart.Axes[1].HasTitle = true;
chChart.Axes[1].Title.Caption = "Y : 不良率";


/*柱状堆积图*/

//添加系列设定图表类型
chChart.SeriesCollection.Add(0);
chChart.SeriesCollection[0].Type = ChartChartTypeEnum.chChartTypeColumnStacked;


//系列PG1
//给定系列的名字

chChart.SeriesCollection[0].SetData(ChartDimensionsEnum.chDimSeriesNames,
+(int)ChartSpecialDataSourcesEnum.chDataLiteral, "PG1");

//给定分类
chChart.SeriesCollection[0].SetData(ChartDimensionsEnum.chDimCategories,
+(int)ChartSpecialDataSourcesEnum.chDataLiteral, "材料A\t材料B\t材料C\t材料D");

//给定系列的值
chChart.SeriesCollection[0].SetData
(ChartDimensionsEnum.chDimValues,
(int)ChartSpecialDataSourcesEnum.chDataLiteral, "0.01\t0\t0.02\t0.02");



//系列PD1
//给定系列的名字
chChart.SeriesCollection.Add(1);
chChart.SeriesCollection[1].SetData(ChartDimensionsEnum.chDimSeriesNames,
+(int)ChartSpecialDataSourcesEnum.chDataLiteral, "PD1");

//给定分类
chChart.SeriesCollection[1].SetData(ChartDimensionsEnum.chDimCategories,
+(int)ChartSpecialDataSourcesEnum.chDataLiteral, "材料A\t材料B\t材料C\t材料D");

//给定系列的值
chChart.SeriesCollection[1].SetData
(ChartDimensionsEnum.chDimValues,
(int)ChartSpecialDataSourcesEnum.chDataLiteral, "0\t0.03\t0.02\t0.03");


//系列PB1
//给定系列的名字
chChart.SeriesCollection.Add(2);
chChart.SeriesCollection[2].SetData(ChartDimensionsEnum.chDimSeriesNames,
+(int)ChartSpecialDataSourcesEnum.chDataLiteral, "PB1");

//给定分类
chChart.SeriesCollection[2].SetData(ChartDimensionsEnum.chDimCategories,
+(int)ChartSpecialDataSourcesEnum.chDataLiteral, "材料A\t材料B\t材料C\t材料D");

//给定系列的值
chChart.SeriesCollection[2].SetData
(ChartDimensionsEnum.chDimValues,
(int)ChartSpecialDataSourcesEnum.chDataLiteral, "0.01\t0.01\t0.01\t0.02");


/*折线图*/
//再增加一个系列
//设定图表类型
chChart.SeriesCollection.Add(3);
chChart.SeriesCollection[3].Type = ChartChartTypeEnum.chChartTypeLineMarkers ;


//主次网格线不显示
chChart.Axes[1].HasMinorGridlines = false;
chChart.Axes[1].HasMajorGridlines = false;

//设定Y轴格式
chChart.Axes[1].NumberFormat = "0%";

//去掉线
chChart.SeriesCollection[3].Line.Color = ChartColorIndexEnum.chColorNone;

//标记形状
chChart.SeriesCollection[3].Marker.Style = ChartMarkerStyleEnum.chMarkerStyleDiamond;

//系列不良合计
//给定系列的名称

chChart.SeriesCollection[3].SetData(ChartDimensionsEnum.chDimSeriesNames,
+(int)ChartSpecialDataSourcesEnum.chDataLiteral, "不良合计");

//给定分类
chChart.SeriesCollection[3].SetData(ChartDimensionsEnum.chDimCategories,
+(int)ChartSpecialDataSourcesEnum.chDataLiteral, "材料A\t材料B\t材料C\t材料D");

//给定系列的值
chChart.SeriesCollection[3].SetData
(ChartDimensionsEnum.chDimValues,
(int)ChartSpecialDataSourcesEnum.chDataLiteral, "0.02\t0.04\t0.05\t0.07");




/*折线图*/
//再增加一个系列
ChSeries chSeries = chChart.SeriesCollection.Add(0);

//指定图表类型
chSeries.Type = ChartChartTypeEnum.chChartTypeLineMarkers;
chSeries.Ungroup(true);

ChAxis chAxis = chChart.Axes.Add(chSeries.get_Scalings(ChartDimensionsEnum.chDimValues));
chAxis.Position = ChartAxisPositionEnum.chAxisPositionRight;

chSeries.Marker.Style = ChartMarkerStyleEnum.chMarkerStyleSquare;



//主次网格线不显示
chAxis.HasMinorGridlines = false;
chAxis.HasMajorGridlines = false;

chAxis.HasTitle = true;
chAxis.Title.Caption = "使用数量";
//给定系列的名称
chSeries.SetData(ChartDimensionsEnum.chDimSeriesNames,
+(int)ChartSpecialDataSourcesEnum.chDataLiteral, "使用数量");

//给定系列的值
chSeries.SetData
(ChartDimensionsEnum.chDimValues,
(int)ChartSpecialDataSourcesEnum.chDataLiteral, "200\t120\t90\t150");


//输出成GIF文件.
string strAbsolutePath = (Server.MapPath(".")) + "\\Temp\\test.gif";
chartSpace.ExportPicture(strAbsolutePath, "GIF", 600, 350);


//创建GIF文件的相对路径.
string strRelativePath = "./Temp/test.gif";

//显示图片
Image1.ImageUrl = strRelativePath.ToString();

...全文
1177 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
游戏人间 2011-09-05
  • 打赏
  • 举报
回复
要X轴方向的
ozhanjun 2011-08-25
  • 打赏
  • 举报
回复
ozhanjun 2011-08-25
  • 打赏
  • 举报
回复
ozhanjun 2011-08-25
  • 打赏
  • 举报
回复
可以实现!
多添加一个x坐标和y坐标
游戏人间 2011-07-08
  • 打赏
  • 举报
回复
ChartSpace 有DataSource 属性,可以把数据源转换成对应的数据绑定即可。
ghbjimmy 2011-05-17
  • 打赏
  • 举报
回复
好像没有一种比较好的解决方案!
游戏人间 2010-05-27
  • 打赏
  • 举报
回复
用别一种思路已解决。
谢谢各位朋友的持。
guoheng90 2010-05-25
  • 打赏
  • 举报
回复
哇,高难度在东西 学习下
游戏人间 2010-05-25
  • 打赏
  • 举报
回复
看来是没有遇到这种情况了
游戏人间 2010-05-13
  • 打赏
  • 举报
回复
一天不见,贴子沉到那里去了都不知道,顶起来。
qiqishardgel 2010-05-12
  • 打赏
  • 举报
回复
不会,帮顶!
微工程 2010-05-11
  • 打赏
  • 举报
回复
        this.Image1.Visible = true;
this.xydata_Load();
string strCategory = ks[0] + '\t' + ks[1] + '\t' + ks[2] + '\t' + ks[3] + '\t' + ks[4] + '\t' + ks[5] ;
string strValue = jh[0] + '\t' + jh[1] + '\t' + jh[2] + '\t' + jh[3] + '\t' + jh[4] + '\t' + jh[5] ;
string strCategory1 = ks[0] + '\t' + ks[1] + '\t' + ks[2] + '\t' + ks[3] + '\t' + ks[4] + '\t' + ks[5] ;
string strValue1 = wc[0] + '\t' + wc[1] + '\t' + wc[2] + '\t' + wc[3] + '\t' + wc[4] + '\t' + wc[5] ;


//声明对象
Microsoft.Office.Interop.Owc11.ChartSpace ThisChart = new Microsoft.Office.Interop.Owc11.ChartSpaceClass();
Microsoft.Office.Interop.Owc11.ChChart ThisChChart = ThisChart.Charts.Add(0);
Microsoft.Office.Interop.Owc11.ChSeries ThisChSeries = ThisChChart.SeriesCollection.Add(0);
Microsoft.Office.Interop.Owc11.ChSeries ThisChSeries1 = ThisChChart.SeriesCollection.Add(1);

//显示图例
ThisChChart.HasLegend = true;
// ThisChChart.Legend.Border.Color = "red";
//标题
ThisChChart.HasTitle = true;
ThisChChart.Title.Caption = "统计图";

//给定x,y轴图示说明
ThisChChart.Axes[0].HasTitle = true;
ThisChChart.Axes[1].HasTitle = true;
ThisChChart.Axes[0].Title.Caption = "名称";
ThisChChart.Axes[1].Title.Caption = "数量";

//图表类型

ThisChChart.Type = Microsoft.Office.Interop.Owc11.ChartChartTypeEnum.chChartTypeColumnClustered;
ThisChChart.Overlap = 50;
//旋转
ThisChChart.Rotation = 360;
ThisChChart.Inclination = 10;
//背景颜色

ThisChChart.PlotArea.Interior.Color = "#DDE3F5";
//底色
ThisChChart.PlotArea.Floor.Interior.Color = "#f0835c";
// ThisChChart.SeriesCollection[0].Thickness = true;
// ThisChChart.PlotArea = "#DDE3F5";
// ThisChChart.SeriesCollection.= "true";
// ThisChChart.SeriesCollection.PivotAxis.Label.= "true";
//Set Series0=ThisChChart.SeriesCollection.Add();
//Set dl = Series0.DataLabelsCollection.Add();
//dl.HasValue = True;
//
ThisChChart.SeriesCollection[0].DataLabelsCollection.Add();
ThisChChart.SeriesCollection[1].DataLabelsCollection.Add();
//样式
ThisChChart.SeriesCollection[0].DataLabelsCollection[0].Font.Color = "red";
ThisChChart.SeriesCollection[0].DataLabelsCollection[0].Font.Size = 11;
ThisChChart.SeriesCollection[0].DataLabelsCollection[0].Font.Bold = true;
ThisChChart.SeriesCollection[0].DataLabelsCollection[0].HasValue = true;
ThisChChart.SeriesCollection[1].DataLabelsCollection[0].Font.Color = "blue";
ThisChChart.SeriesCollection[1].DataLabelsCollection[0].Font.Size = 11;
ThisChChart.SeriesCollection[1].DataLabelsCollection[0].Font.Bold = true;
ThisChChart.SeriesCollection[1].DataLabelsCollection[0].HasValue = true;
//ThisChChart.SeriesCollection[0].Points[1].Interior.Color = "red";

//
/**/
////给定series的名字
ThisChSeries.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimSeriesNames,

Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(), "计划");
ThisChSeries.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimSeriesNames,

Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(), "完成");

//给定分类
ThisChSeries.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimCategories,

Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(), strCategory);
//给定值
ThisChSeries.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimValues,

Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(), strValue);

ThisChSeries1.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimCategories,

Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(), strCategory1);
//给定值
ThisChSeries1.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimValues,

Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(), strValue1);
//导出图像文件

for (int n = 0; n < ThisChChart.SeriesCollection[0].Points.Count; n++)
{
// ThisChChart.Charts[0].SeriesCollection[0].Points[n].Border.Color = "black"; //模块线条颜色
ThisChChart.SeriesCollection[0].Points[n].Interior.Color = "red";
ThisChChart.SeriesCollection[1].Points[n].Interior.Color = "blue";
}


String[] fileEntries = System.IO.Directory.GetFiles(MapPath("chart"));
foreach (string sFile in fileEntries)
{
if (DateTime.Compare(System.IO.File.GetCreationTime(sFile).AddDays(1), DateTime.Now) < 0)
{

System.IO.File.Delete(sFile);

}
}
try
{
//Random ;
int nFileNameSuffix;
String sFileNameSuffix;
System.Random rnd = new System.Random();
nFileNameSuffix = rnd.Next(10000);
sFileNameSuffix = System.Convert.ToString(nFileNameSuffix);

ThisChart.ExportPicture(Server.MapPath("chart/PolyesterPrice_") + sFileNameSuffix + ".gif", "gif", 710, 500);
this.Image1.ImageUrl = "chart/PolyesterPrice_" + sFileNameSuffix + ".gif";
this.Image1.NavigateUrl = "mudh.aspx?yjlmdm=05&ejlmdm=01&mulb=sstab&nf=" + this.DropDownList1.SelectedValue;
}
catch (Exception ee)
{ }


我写的贴出来,实现的是双柱重叠对比,那些能用,请参考
wl_ldy 2010-05-11
  • 打赏
  • 举报
回复
不会,顶了。。。
微工程 2010-05-11
  • 打赏
  • 举报
回复
ThisChSeries.SetData(Microsoft.Office.Interop.Owc11.ChartDimensionsEnum.chDimValues, Microsoft.Office.Interop.Owc11.ChartSpecialDataSourcesEnum.chDataLiteral.GetHashCode(), strValue);

这里研究一下
zhouzangood 2010-05-11
  • 打赏
  • 举报
回复
mark
微工程 2010-05-11
  • 打赏
  • 举报
回复
给一个思路
excel的不是一个刻度,应该是另外加了一个标注
可以试着给其再加个标注
游戏人间 2010-05-11
  • 打赏
  • 举报
回复
但是图1在Excel中就有日期的呀?

应该是可以实现的,等待高手。
皇城龙三 2010-05-11
  • 打赏
  • 举报
回复
帮忙顶一下,网上查了很多资料

很多说是双刻度的实现,但是实际实现不了

实在不行应急的话,楼主可以这么做:

在材料A字符串后面多加几个空格,然后加上时间

例如:“材料A 2010-5-11”

让时间正好对到那个刻度线

游戏人间 2010-05-11
  • 打赏
  • 举报
回复
顶起来。

高手在那里????
加载更多回复(3)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧