请问各位高手,在delphi中如何实现数据导入execl然后形成柱状图(最好有源码和注释)

解决方案 »

  1.   

     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());   
      
      

  2.   

    再贴一段代码,基本解释上面有了
    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;