全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1347
推到 Plurk!
推到 Facebook!

實驗數據

尚未結案
left
一般會員


發表:8
回覆:10
積分:3
註冊:2004-01-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-12 16:21:52 IP:61.58.xxx.xxx 未訂閱
請問一下 就是說 我現在有一個array int exp[100];裡面分別有一些數據 我怎麼把他存進excel? 還有就是 我怎麼把這些數據弄成曲線圖 show在程式的介面上呢? 小弟對bcb環境不是很熟,希望好心人士給我一個範例吧!! ^^"
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-12 16:36:16 IP:140.135.xxx.xxx 未訂閱
發表人 -
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-12 20:09:32 IP:61.218.xxx.xxx 未訂閱
left您好:
1.此範例存入Excel File的方法是參考ccchen與dllee版主的XLSFile.pas
  http://delphi.ktop.com.tw/topic.php?TOPIC_ID=22993
2.此範例是在Windows XP + BCB6 SP4下測試無誤..    3.範例檔下載:http://delphi.ktop.com.tw/loadfile.php?TOPICID=14526343&CC=324877            unit1.H    //---------------------------------------------------------------------------    #ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include <Forms.hpp>
#include 
#include 
#include 
#include 
#include 
#include 
#include 
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:        // IDE-managed Components
        TChart *Chart1;
        TStringGrid *StringGrid1;
        TButton *Button2;
        TSaveDialog *SaveDialog1;
        TLineSeries *Series1;
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
private:        // User declarations
public:                // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif    Unit1.cpp
/---------------------------------------------------------------------------    #include 
#pragma hdrstop
#include "XLSfile.hpp"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::FormCreate(TObject *Sender)
{
  int i;
  int exp[100];      for (i=0 ; i<=100 ; i++)
   {           exp[i]=i;        StringGrid1->Cells[0][i+1]=i;
    StringGrid1->Cells[1][i+1]=exp[i];        Series1->AddXY(i,exp[i],"",clGreen);
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 if(SaveDialog1->Execute());
    StringGridToXLS(StringGrid1,SaveDialog1->FileName);
}
//---------------------------------------------------------------------------        
/*生活是一種藝術,用心生活才能享受生活*/
發表人 - axsoft 於 2004/03/12 20:12:10
left
一般會員


發表:8
回覆:10
積分:3
註冊:2004-01-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-13 23:18:56 IP:61.58.xxx.xxx 未訂閱
33QQQ~~ ^^
left
一般會員


發表:8
回覆:10
積分:3
註冊:2004-01-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-15 21:41:13 IP:61.58.xxx.xxx 未訂閱
可以在問一下 要怎樣不經過StringGrid 就直接存進excel檔裡呢?
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-16 10:10:57 IP:61.218.xxx.xxx 未訂閱
引言: 可以在問一下 要怎樣不經過StringGrid 就直接存進excel檔裡呢?
    left:
XLSfiles中還有其他Function可以用呀,自己動動腦.
還有一件事提醒您別人回答您的問題記得把問題結案...
您之前問的問題好像都沒去結案喔!...        XLSfils.pas 原始碼:
 
//-------------------------------------------------------------------------------------------
// 程式來源 http://delphi.ktop.com.tw
// 原作者:Yudi Wibisono XLSFILE元件
// CCCHEN:改為Function版
// 領航天使:除錯
// dllee: 加入 StringGridToXLS(), 修正一些小 BUG, 指定此格式最大 Rows 數,以免爆了產生出的檔案不能用
//-------------------------------------------------------------------------------------------    unit XLSFile;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Grids, Forms, Dialogs,db,dbctrls,comctrls;
 
const
{BOF}
  CBOF      = $0009;
  BIT_BIFF5 = $0800;
  BOF_BIFF5 = CBOF or BIT_BIFF5;
{EOF}
  BIFF_EOF = $000a;
{Document types}
  DOCTYPE_XLS = $0010;
{Dimensions}
  DIMENSIONS = $0000;
 
type
  TAtributCell = (acHidden,acLocked,acShaded,acBottomBorder,acTopBorder,
                acRightBorder,acLeftBorder,acLeft,acCenter,acRight,acFill);
 
  TSetOfAtribut = set of TatributCell;
 
  TXLSWriter = class(Tobject)
  private
    fstream:TFileStream;
    procedure WriteWord(w:word);
  protected
    procedure WriteBOF;
    procedure WriteEOF;
    procedure WriteDimension;
  public
    maxCols,maxRows:Word;
    procedure CellWord(vCol,vRow:word;aValue:word;vAtribut:TSetOfAtribut=[]);
    procedure CellDouble(vCol,vRow:word;aValue:double;vAtribut:TSetOfAtribut=[]);
    procedure CellStr(vCol,vRow:word;aValue:String;vAtribut:TSetOfAtribut=[]);
    procedure WriteField(vCol,vRow:word;Field:TField);
    constructor create(vFileName:string);
    destructor destroy;override;
  end;
 
procedure SetCellAtribut(value:TSetOfAtribut;var FAtribut:array of byte);
procedure DataSetToXLS(ds:TDataSet;fname:String);
procedure StringGridToXLS(grid:TStringGrid;fname:String);
 
implementation
 
procedure DataSetToXLS(ds:TDataSet;fname:String);
var c,r:Integer;
  xls:TXLSWriter;
begin
  xls:=TXLSWriter.create(fname);
  if ds.FieldCount > xls.maxcols then
    xls.maxcols:=ds.fieldcount 1;
  try
    xls.writeBOF;
    xls.WriteDimension;
    for c:=0 to ds.FieldCount-1 do
      xls.Cellstr(0,c,ds.Fields[c].FieldName);
    r:=1;
    ds.first;
    while (not ds.eof) and (r <= xls.maxrows) do begin
      for c:=0 to ds.FieldCount-1 do
        xls.WriteField(r,c,ds.Fields[c]);
      inc(r);
      ds.next;
    end;
    xls.writeEOF;
 
    // <2002-11-17> dllee
    // 更新 Dimension 應在 wirteEOF 之後,因為在此 if 內用了 Seek 改變 position
    // if r > xls.maxrows then begin
    //   xls.maxrows:=r 1;
    //   xls.fstream.Seek(10,soFromBeginning);
    //   xls.WriteDimension;
    // end;
    // 但因為已將 maxrows 設為最大值,而且此格式就只能有 65535,所以,不再判斷。
  finally
    xls.free;
  end;
end;
 
procedure StringGridToXLS(grid:TStringGrid;fname:String);
var c,r,rMax:Integer;
  xls:TXLSWriter;
begin
  xls:=TXLSWriter.create(fname);
  rMax:=grid.RowCount;
  if grid.ColCount > xls.maxcols then
    xls.maxcols:=grid.ColCount 1;
  if rMax > xls.maxrows then          // 此格式最多只能存 65535 Rows
    rMax:=xls.maxrows;
  try
    xls.writeBOF;
    xls.WriteDimension;
    for c:=0 to grid.ColCount-1 do
      for r:=0 to rMax-1 do
        xls.Cellstr(r,c,grid.Cells[c,r]);
    xls.writeEOF;
  finally
    xls.free;
  end;
end;
 
{ TXLSWriter }
 
constructor TXLSWriter.create(vFileName:string);
begin
  inherited create;
  if FileExists(vFilename) then
    fStream:=TFileStream.Create(vFilename,fmOpenWrite)
  else
    fStream:=TFileStream.Create(vFilename,fmCreate);
 
  maxCols:=100;   // <2002-11-17> dllee Column 應該是不可能大於 65535, 所以不再處理
  maxRows:=65535; // <2002-11-17> dllee 這個格式最大只能這麼大,請注意大的資料庫很容易就大於這個值
end;
 
destructor TXLSWriter.destroy;
begin
  if fStream <> nil then
    fStream.free;
  inherited;
end;
 
procedure TXLSWriter.WriteBOF;
begin
  Writeword(BOF_BIFF5);
  Writeword(6);           // count of bytes
  Writeword(0);
  Writeword(DOCTYPE_XLS);
  Writeword(0);
end;
 
procedure TXLSWriter.WriteDimension;
begin
  Writeword(DIMENSIONS);  // dimension OP Code
  Writeword(8);           // count of bytes
  Writeword(0);           // min cols
  Writeword(maxRows);     // max rows
  Writeword(0);           // min rowss
  Writeword(maxcols);     // max cols
end;
 
procedure TXLSWriter.CellDouble(vCol, vRow: word; aValue: double;
  vAtribut: TSetOfAtribut);
var  FAtribut:array [0..2] of byte;
begin
  Writeword(3);           // opcode for double
  Writeword(15);          // count of byte
  Writeword(vCol);
  Writeword(vRow);
  SetCellAtribut(vAtribut,fAtribut);
  fStream.Write(fAtribut,3);
  fStream.Write(aValue,8);
end;
 
procedure TXLSWriter.CellWord(vCol,vRow:word;aValue:word;vAtribut:TSetOfAtribut=[]);
var  FAtribut:array [0..2] of byte;
begin
  Writeword(2);           // opcode for word
  Writeword(9);           // count of byte
  Writeword(vCol);
  Writeword(vRow);
  SetCellAtribut(vAtribut,fAtribut);
  fStream.Write(fAtribut,3);
  Writeword(aValue);
end;
 
procedure TXLSWriter.CellStr(vCol, vRow: word; aValue: String;
  vAtribut: TSetOfAtribut);
var  FAtribut:array [0..2] of byte;
  slen:byte;
begin
  Writeword(4);           // opcode for string
  slen:=length(avalue);
  Writeword(slen 8);      // count of byte
  Writeword(vCol);
  Writeword(vRow);
  SetCellAtribut(vAtribut,fAtribut);
  fStream.Write(fAtribut,3);
  fStream.Write(slen,1);
  fStream.Write(aValue[1],slen);
end;
 
procedure SetCellAtribut(value:TSetOfAtribut;var FAtribut:array of byte);
var
   i:integer;
begin
 //reset
  for i:=0 to High(FAtribut) do
    FAtribut[i]:=0;
 
     {Byte Offset     Bit   Description                     Contents
     0          7     Cell is not hidden              0b
                      Cell is hidden                  1b
                6     Cell is not locked              0b
                      Cell is locked                  1b
                5-0   Reserved, must be 0             000000b
     1          7-6   Font number (4 possible)
                5-0   Cell format code
     2          7     Cell is not shaded              0b
                      Cell is shaded                  1b
                6     Cell has no bottom border       0b
                      Cell has a bottom border        1b
                5     Cell has no top border          0b
                      Cell has a top border           1b
                4     Cell has no right border        0b
                      Cell has a right border         1b
                3     Cell has no left border         0b
                      Cell has a left border          1b
                2-0   Cell alignment code
                           general                    000b
                           left                       001b
                           center                     010b
                           right                      011b
                           fill                       100b
                           Multiplan default align.   111b
     }
 
     //  bit sequence 76543210
 
     if  acHidden in value then       //byte 0 bit 7:
         FAtribut[0] := FAtribut[0]   128;
 
     if  acLocked in value then       //byte 0 bit 6:
         FAtribut[0] := FAtribut[0]   64 ;
 
     if  acShaded in value then       //byte 2 bit 7:
         FAtribut[2] := FAtribut[2]   128;
 
     if  acBottomBorder in value then //byte 2 bit 6
         FAtribut[2] := FAtribut[2]   64 ;
 
     if  acTopBorder in value then    //byte 2 bit 5
         FAtribut[2] := FAtribut[2]   32;
 
     if  acRightBorder in value then  //byte 2 bit 4
         FAtribut[2] := FAtribut[2]   16;
 
     if  acLeftBorder in value then   //byte 2 bit 3
         FAtribut[2] := FAtribut[2]   8;
 
     // <2002-11-17> dllee 最後 3 bit 應只有 1 種選擇
     if  acLeft in value then         //byte 2 bit 1
         FAtribut[2] := FAtribut[2]   1
     else if  acCenter in value then  //byte 2 bit 1
         FAtribut[2] := FAtribut[2]   2
     else if acRight in value then    //byte 2, bit 0 dan bit 1
         FAtribut[2] := FAtribut[2]   3
     else if acFill in value then     //byte 2, bit 0
         FAtribut[2] := FAtribut[2]   4;
end;
 
procedure TXLSWriter.WriteWord(w: word);
begin
  fstream.Write(w,2);
end;
 
procedure TXLSWriter.WriteEOF;
begin
  Writeword(BIFF_EOF);
  Writeword(0);
end;
 
procedure TXLSWriter.WriteField(vCol, vRow: word; Field: TField);
begin
  case field.DataType of
     ftString,ftWideString,ftBoolean,ftDate,ftDateTime,ftTime:
       Cellstr(vcol,vrow,field.asstring);
     ftAutoInc,ftSmallint,ftInteger,ftWord:
       CellWord(vcol,vRow,field.AsInteger);
     ftFloat, ftBCD:
       CellDouble(vcol,vrow,field.AsFloat);
  else
       Cellstr(vcol,vrow,EmptyStr);   // <2002-11-17> dllee 其他型態寫入空白字串
  end;
end;
     end.
 
/*生活是一種藝術,用心生活才能享受生活*/
發表人 - axsoft 於 2004/03/16 10:18:08
系統時間:2024-06-28 18:09:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!