delphi中如何实现柱状图 请问各位高手,在delphi中如何实现数据导入execl然后形成柱状图(最好有源码和注释) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://delphi.ktop.com.tw/topic.asp?TOPIC_ID=41363 之前在站上看了許多 使用 OLE 來制作 Excel的文章,大部份都是在講如何填入資料,如何設定欄位的格式等, 小弟因工作需要,必須在excel中產生圖表,在網路上找了許多資料,也有了一些心得, 就在此拋磚引玉,提供一些小弟個人的心得, 因為站上很多如何填資料的文章,所以小弟就省略這一部份, 假設網友們已經填好資料,直接進入要產生圖表的部份, //一開始先定義OLE會用到的變數,建立excel的物件 Variant Excel,Workbooks,Workbook,Charts,Chart,Range; Excel=CreateOleObject("Excel.Application"); Excel.OlePropertySet("Visible",true); //秀出Excel的畫面 Workbooks=Excel.OlePropertyGet("Workbooks"); Workbook=Workbooks.OleFunction("Add"); Worksheets=Workbook.OlePropertyGet("Worksheets"); Worksheet=Worksheets.OleFunction("Add"); // 新增一worksheet Worksheet.OlePropertySet("Name","test") ;// 設定worksheet 的名稱 //取得Charts的物件 Charts=Workbook.OlePropertyGet("Charts"); . . . 先把所需資料填入cell中 . . //建立一個新的圖表,這時圖表會開在一個新的sheet裡,而整個sheet就是一個圖表 //之後會把圖表放在其他的sheet裡 Chart=Charts.OleFunction("Add"); //設定圖表的格式,65是表示含有資料標記的折線圖,後面會有圖表格式的說明 Chart.OlePropertySet("ChartType",65); //選定要製作圖表的資料來源,這個例子我是要選擇excel中從cell(1,1)到cell(10,5)的資料, //此動作就好像用滑鼠把這一部份的欄位選起來一樣 Range=Worksheet.OlePropertyGet("Range", Worksheet.OlePropertyGet("Cells",1,1), Worksheet.OlePropertyGet("Cells",10,5)); //設定圖表的資料來源,xlRows表示資料是以列來做排列,如果資料是用行來排列,就用xlColumns, //如果是用xlRows,選取範圍的第一列就是x軸每一筆資料的名稱, //第一行是y軸資料的名稱,其餘的就是圖表裡的數值 Chart.OleProcedure("SetSourceData",Range,xlRows); //設定圖表的title Chart.OlePropertySet("HasTitle",(Variant)true); //先設定圖表有title String Charttitle="test chart!!"; Chart.OlePropertyGet("ChartTitle").OlePropertySet("Text",Charttitle.c_str()); //設定圖表x軸和y軸是否要秀出title和資料名稱 Chart.OlePropertyGet("Axes",1).OlePropertySet("HasTitle",(Variant)true); //設定x軸是否要顯示資料名稱 Chart.OlePropertyGet("Axes",1).OlePropertyGet("AxisTitle").OlePropertySet("Text","時間");//設定x軸的title Chart.OlePropertyGet("Axes",2).OlePropertySet("HasTitle",(Variant)true); //設定y軸是否要顯示資料名稱 Chart.OlePropertyGet("Axes",2).OlePropertyGet("AxisTitle").OlePropertySet("Text","次數");//設定y軸的title //設定圖表要放在哪一個sheet裡 Chart.OleProcedure("Location",2,Worksheet.OlePropertyGet("Name")); //設定圖表的位置與長寬, //Worksheet.OlePropertyGet("ChartObjects",1)表示是要設定這個sheet中第一個圖表, //如要設定第二個圖表就用Worksheet.OlePropertyGet("ChartObjects",2), //圖表的順序依在sheet中產生或放置的先後排列 Worksheet.OlePropertyGet("ChartObjects",1).OlePropertySet("Top",15); Worksheet.OlePropertyGet("ChartObjects",1).OlePropertySet("Left",20); Worksheet.OlePropertyGet("ChartObjects",1).OlePropertyGet("Width",50); Worksheet.OlePropertyGet("ChartObjects",1).OlePropertyGet("Height",30); //此時圖表已經漂漂亮亮的在sheet中囉! 底下列出圖表格式常數的定義: typedef enum XlChartType { xlColumnClustered = 51, xlColumnStacked = 52, xlColumnStacked100 = 53, xl3DColumnClustered = 54, xl3DColumnStacked = 55, xl3DColumnStacked100 = 56, xlBarClustered = 57, xlBarStacked = 58, xlBarStacked100 = 59, xl3DBarClustered = 60, xl3DBarStacked = 61, xl3DBarStacked100 = 62, xlLineStacked = 63, xlLineStacked100 = 64, xlLineMarkers = 65, xlLineMarkersStacked = 66, xlLineMarkersStacked100 = 67, xlPieOfPie = 68, xlPieExploded = 69, xl3DPieExploded = 70, xlBarOfPie = 71, xlXYScatterSmooth = 72, xlXYScatterSmoothNoMarkers = 73, xlXYScatterLines = 74, xlXYScatterLinesNoMarkers = 75, xlAreaStacked = 76, xlAreaStacked100 = 77, xl3DAreaStacked = 78, xl3DAreaStacked100 = 79, xlDoughnutExploded = 80, xlRadarMarkers = 81, xlRadarFilled = 82, xlSurface = 83, xlSurfaceWireframe = 84, xlSurfaceTopView = 85, xlSurfaceTopViewWireframe = 86, xlBubble = 15, xlBubble3DEffect = 87, xlStockHLC = 88, xlStockOHLC = 89, xlStockVHLC = 90, xlStockVOHLC = 91, xlCylinderColClustered = 92, xlCylinderColStacked = 93, xlCylinderColStacked100 = 94, xlCylinderBarClustered = 95, xlCylinderBarStacked = 96, xlCylinderBarStacked100 = 97, xlCylinderCol = 98, xlConeColClustered = 99, xlConeColStacked = 100, xlConeColStacked100 = 101, xlConeBarClustered = 102, xlConeBarStacked = 103, xlConeBarStacked100 = 104, xlConeCol = 105, xlPyramidColClustered = 106, xlPyramidColStacked = 107, xlPyramidColStacked100 = 108, xlPyramidBarClustered = 109, xlPyramidBarStacked = 110, xlPyramidBarStacked100 = 111, xlPyramidCol = 112, xl3DColumn = 0xFFFFEFFC, xlLine = 4, xl3DLine = 0xFFFFEFFB, xl3DPie = 0xFFFFEFFA, xlPie = 5, xlXYScatter = 0xFFFFEFB7, xl3DArea = 0xFFFFEFFE, xlArea = 1, xlDoughnut = 0xFFFFEFE8, xlRadar = 0xFFFFEFC9 } XlChartType; 小弟嘗試的結果,列出部份常數的意思,其餘的就看有沒有人補充囉! 5:2D的圓形圖(Pie圖) 16:泡泡圖 51:2D的直條圖 52:2D的堆疊直條圖 53:2D的100%堆疊直條圖 54:3D的直條圖 55:3D的堆疊直條圖 56:3D的100%堆疊直條圖 57:2D的橫條圖 58:2D的堆疊橫條圖 59:2D的100%堆疊橫條圖 60:3D的橫條圖 61:3D的堆疊橫條圖 62:3D的100%堆疊橫條圖 63:折線圖 65:含有資料標誌的折線圖 接下來設定EXCEL的背景圖案 String BmpPath; BmpPath="C:\\background.bmp"; if(FileExists(BmpPath)) Worksheet.OleFunction("SetBackgroundPicture",BmpPath.c_str()); 再贴一段代码,基本解释上面有了procedure TForm1.ChartData; var ARange: Variant; Sheets: Variant; begin XLApp.Workbooks[1].Sheets.Add(,,1,xlChart); Sheets := XLApp.Sheets; ARange := Sheets.Item['Delphi Data'].Range['A1:A10']; Sheets.Item['Chart1'].SeriesCollection.Item[1].Values := ARange; Sheets.Item['Chart1'].ChartType := xl3DPie; Sheets.Item['Chart1'].SeriesCollection.Item[1].HasDataLabels := True; XLApp.Workbooks[1].Sheets.Add(,,1,xlChart); Sheets.Item['Chart2'].SeriesCollection.Item[1].Values := ARange; Sheets.Item['Chart2'].SeriesCollection.Add(ARange); Sheets.Item['Chart2'].SeriesCollection.NewSeries; Sheets.Item['Chart2'].SeriesCollection.Item[3].Values := VarArrayOf([1,2,3,4,5, 6,7,8,9,10]); Sheets.Item['Chart2'].ChartType := xl3DColumn; end; 改變這個就行 Sheets.Item['Chart1'].ChartType := xl3DPie; 怎么保存坐标数据值() 余切函数有没?在线等?ctan() 请问大家,如何在TDBGrid后面增画一行! 怎么样制作如同瑞星的“精灵”一样的程序? 入门问题? 采用C/S结构开发,使用Sql Server 还是Access(请从成本与技术双重考虑)的比较,来着有份!!! 运行时的问题 大家谁知道delphi利用用什么控件可以模拟甘特图(类似project中相关功能)? 在Delphi中如何是实现对内存的优化,请给出代码和思想 假设我做了一部分窗口,然后将它作成Dll文件,在别的应用程序里如何调用? 热烈庆祝第一个DELPHI节!(散分) 一个console如何播放网上的mp3歌曲
之前在站上看了許多 使用 OLE 來制作 Excel的文章,大部份都是在講如何填入資料,如何設定欄位的格式等,
小弟因工作需要,必須在excel中產生圖表,在網路上找了許多資料,也有了一些心得,
就在此拋磚引玉,提供一些小弟個人的心得,
因為站上很多如何填資料的文章,所以小弟就省略這一部份,
假設網友們已經填好資料,直接進入要產生圖表的部份,
//一開始先定義OLE會用到的變數,建立excel的物件
Variant Excel,Workbooks,Workbook,Charts,Chart,Range;
Excel=CreateOleObject("Excel.Application");
Excel.OlePropertySet("Visible",true); //秀出Excel的畫面
Workbooks=Excel.OlePropertyGet("Workbooks");
Workbook=Workbooks.OleFunction("Add");
Worksheets=Workbook.OlePropertyGet("Worksheets");
Worksheet=Worksheets.OleFunction("Add"); // 新增一worksheet
Worksheet.OlePropertySet("Name","test") ;// 設定worksheet 的名稱
//取得Charts的物件
Charts=Workbook.OlePropertyGet("Charts");
.
.
. 先把所需資料填入cell中
.
.
//建立一個新的圖表,這時圖表會開在一個新的sheet裡,而整個sheet就是一個圖表
//之後會把圖表放在其他的sheet裡
Chart=Charts.OleFunction("Add");
//設定圖表的格式,65是表示含有資料標記的折線圖,後面會有圖表格式的說明
Chart.OlePropertySet("ChartType",65);
//選定要製作圖表的資料來源,這個例子我是要選擇excel中從cell(1,1)到cell(10,5)的資料,
//此動作就好像用滑鼠把這一部份的欄位選起來一樣
Range=Worksheet.OlePropertyGet("Range",
Worksheet.OlePropertyGet("Cells",1,1),
Worksheet.OlePropertyGet("Cells",10,5));
//設定圖表的資料來源,xlRows表示資料是以列來做排列,如果資料是用行來排列,就用xlColumns,
//如果是用xlRows,選取範圍的第一列就是x軸每一筆資料的名稱,
//第一行是y軸資料的名稱,其餘的就是圖表裡的數值
Chart.OleProcedure("SetSourceData",Range,xlRows);
//設定圖表的title
Chart.OlePropertySet("HasTitle",(Variant)true); //先設定圖表有title
String Charttitle="test chart!!";
Chart.OlePropertyGet("ChartTitle").OlePropertySet("Text",Charttitle.c_str());
//設定圖表x軸和y軸是否要秀出title和資料名稱
Chart.OlePropertyGet("Axes",1).OlePropertySet("HasTitle",(Variant)true); //設定x軸是否要顯示資料名稱
Chart.OlePropertyGet("Axes",1).OlePropertyGet("AxisTitle").OlePropertySet("Text","時間");//設定x軸的title
Chart.OlePropertyGet("Axes",2).OlePropertySet("HasTitle",(Variant)true); //設定y軸是否要顯示資料名稱
Chart.OlePropertyGet("Axes",2).OlePropertyGet("AxisTitle").OlePropertySet("Text","次數");//設定y軸的title
//設定圖表要放在哪一個sheet裡
Chart.OleProcedure("Location",2,Worksheet.OlePropertyGet("Name"));
//設定圖表的位置與長寬,
//Worksheet.OlePropertyGet("ChartObjects",1)表示是要設定這個sheet中第一個圖表,
//如要設定第二個圖表就用Worksheet.OlePropertyGet("ChartObjects",2),
//圖表的順序依在sheet中產生或放置的先後排列
Worksheet.OlePropertyGet("ChartObjects",1).OlePropertySet("Top",15);
Worksheet.OlePropertyGet("ChartObjects",1).OlePropertySet("Left",20);
Worksheet.OlePropertyGet("ChartObjects",1).OlePropertyGet("Width",50);
Worksheet.OlePropertyGet("ChartObjects",1).OlePropertyGet("Height",30);
//此時圖表已經漂漂亮亮的在sheet中囉!
底下列出圖表格式常數的定義:
typedef enum XlChartType
{
xlColumnClustered = 51,
xlColumnStacked = 52,
xlColumnStacked100 = 53,
xl3DColumnClustered = 54,
xl3DColumnStacked = 55,
xl3DColumnStacked100 = 56,
xlBarClustered = 57,
xlBarStacked = 58,
xlBarStacked100 = 59,
xl3DBarClustered = 60,
xl3DBarStacked = 61,
xl3DBarStacked100 = 62,
xlLineStacked = 63,
xlLineStacked100 = 64,
xlLineMarkers = 65,
xlLineMarkersStacked = 66,
xlLineMarkersStacked100 = 67,
xlPieOfPie = 68,
xlPieExploded = 69,
xl3DPieExploded = 70,
xlBarOfPie = 71,
xlXYScatterSmooth = 72,
xlXYScatterSmoothNoMarkers = 73,
xlXYScatterLines = 74,
xlXYScatterLinesNoMarkers = 75,
xlAreaStacked = 76,
xlAreaStacked100 = 77,
xl3DAreaStacked = 78,
xl3DAreaStacked100 = 79,
xlDoughnutExploded = 80,
xlRadarMarkers = 81,
xlRadarFilled = 82,
xlSurface = 83,
xlSurfaceWireframe = 84,
xlSurfaceTopView = 85,
xlSurfaceTopViewWireframe = 86,
xlBubble = 15,
xlBubble3DEffect = 87,
xlStockHLC = 88,
xlStockOHLC = 89,
xlStockVHLC = 90,
xlStockVOHLC = 91,
xlCylinderColClustered = 92,
xlCylinderColStacked = 93,
xlCylinderColStacked100 = 94,
xlCylinderBarClustered = 95,
xlCylinderBarStacked = 96,
xlCylinderBarStacked100 = 97,
xlCylinderCol = 98,
xlConeColClustered = 99,
xlConeColStacked = 100,
xlConeColStacked100 = 101,
xlConeBarClustered = 102,
xlConeBarStacked = 103,
xlConeBarStacked100 = 104,
xlConeCol = 105,
xlPyramidColClustered = 106,
xlPyramidColStacked = 107,
xlPyramidColStacked100 = 108,
xlPyramidBarClustered = 109,
xlPyramidBarStacked = 110,
xlPyramidBarStacked100 = 111,
xlPyramidCol = 112,
xl3DColumn = 0xFFFFEFFC,
xlLine = 4,
xl3DLine = 0xFFFFEFFB,
xl3DPie = 0xFFFFEFFA,
xlPie = 5,
xlXYScatter = 0xFFFFEFB7,
xl3DArea = 0xFFFFEFFE,
xlArea = 1,
xlDoughnut = 0xFFFFEFE8,
xlRadar = 0xFFFFEFC9
} XlChartType;
小弟嘗試的結果,列出部份常數的意思,其餘的就看有沒有人補充囉!
5:2D的圓形圖(Pie圖)
16:泡泡圖
51:2D的直條圖
52:2D的堆疊直條圖
53:2D的100%堆疊直條圖
54:3D的直條圖
55:3D的堆疊直條圖
56:3D的100%堆疊直條圖
57:2D的橫條圖
58:2D的堆疊橫條圖
59:2D的100%堆疊橫條圖
60:3D的橫條圖
61:3D的堆疊橫條圖
62:3D的100%堆疊橫條圖
63:折線圖
65:含有資料標誌的折線圖
接下來設定EXCEL的背景圖案
String BmpPath;
BmpPath="C:\\background.bmp";
if(FileExists(BmpPath))
Worksheet.OleFunction("SetBackgroundPicture",BmpPath.c_str());
procedure TForm1.ChartData;
var
ARange: Variant;
Sheets: Variant;
begin
XLApp.Workbooks[1].Sheets.Add(,,1,xlChart);
Sheets := XLApp.Sheets;
ARange := Sheets.Item['Delphi Data'].Range['A1:A10'];
Sheets.Item['Chart1'].SeriesCollection.Item[1].Values := ARange;
Sheets.Item['Chart1'].ChartType := xl3DPie;
Sheets.Item['Chart1'].SeriesCollection.Item[1].HasDataLabels := True;
XLApp.Workbooks[1].Sheets.Add(,,1,xlChart);
Sheets.Item['Chart2'].SeriesCollection.Item[1].Values := ARange;
Sheets.Item['Chart2'].SeriesCollection.Add(ARange);
Sheets.Item['Chart2'].SeriesCollection.NewSeries;
Sheets.Item['Chart2'].SeriesCollection.Item[3].Values :=
VarArrayOf([1,2,3,4,5, 6,7,8,9,10]);
Sheets.Item['Chart2'].ChartType := xl3DColumn;
end;
改變這個就行
Sheets.Item['Chart1'].ChartType := xl3DPie;