線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4679
推到 Plurk!
推到 Facebook!

ADOQuery匯出Excel如何一次匯出一列

答題得分者是:sryang
allenpower
一般會員


發表:13
回覆:13
積分:5
註冊:2007-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-05-23 18:33:10 IP:59.124.xxx.xxx 訂閱
我是用ADOQuery+DataSource+DBGrid 從MSSQL 抓取資料
但匯出到EXCEL我只能做到一欄一欄匯
1如何做到一次匯一列呢
2另外該如何從ADOQuery抓取欄位名稱呢?
如下是我的程式
i=0;
ADOQuery1->First();
while (i < ADOQuery1->RecordCount){
rSQL0=ADOQuery1->Fields->Fields[0]->AsInteger;
rSQL1=ADOQuery1->Fields->Fields[1]->AsInteger;
rSQL2=ADOQuery1->Fields->Fields[2]->AsInteger;
rSQL3=ADOQuery1->Fields->Fields[3]->AsInteger;
rSQL4=ADOQuery1->Fields->Fields[4]->AsInteger;
rSQL5=ADOQuery1->Fields->Fields[5]->AsInteger;
rSQL6=ADOQuery1->Fields->Fields[6]->AsString;
rSQL7=ADOQuery1->Fields->Fields[7]->AsString;
Range=Worksheet.OlePropertyGet("Cells",i 2,1);
Range.OlePropertySet("Value",rSQL0);
Range=Worksheet.OlePropertyGet("Cells",i 2,2);
Range.OlePropertySet("Value",rSQL1);
Range=Worksheet.OlePropertyGet("Cells",i 2,3);
Range.OlePropertySet("Value",rSQL2);
Range=Worksheet.OlePropertyGet("Cells",i 2,4);
Range.OlePropertySet("Value",rSQL3);
Range=Worksheet.OlePropertyGet("Cells",i 2,5);
Range.OlePropertySet("Value",rSQL4);
Range=Worksheet.OlePropertyGet("Cells",i 2,6);
Range.OlePropertySet("Value",rSQL5);
Range=Worksheet.OlePropertyGet("Cells",i 2,7);
Range.OlePropertySet("Value",StringToOleStr(rSQL6));
Range=Worksheet.OlePropertyGet("Cells",i 2,8);
Range.OlePropertySet("Value",StringToOleStr(rSQL7));
i=i 1;
ADOQuery1->MoveBy(1);
}


------
P
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-05-24 08:23:13 IP:60.248.xxx.xxx 未訂閱
可以用巢狀迴圈來處理
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-24 08:27:01 IP:220.142.xxx.xxx 訂閱
你好~
關於
問題一 我也只能匯一個欄位
問題二 ADOQuery1->Fields...
用[->] DELPHI 可以這樣用嘛?((題外話
ADOQuery1.Fieldbyname('欄位').asstring;

------
======================
昏睡~
不昏睡~
不由昏睡~
allenpower
一般會員


發表:13
回覆:13
積分:5
註冊:2007-01-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-24 09:49:17 IP:59.124.xxx.xxx 訂閱
我是指如果我要抓第一個欄位的欄位名稱[company]到excel
我只要給1 就可以抓到 company
ADOQurey.FiledByName("欄位").AsString =>這是抓某個欄位的值 好像不是我要的 可能我沒有講得很清楚抱歉!!
------
P
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-05-24 10:40:41 IP:59.125.xxx.xxx 訂閱
運用剪貼簿,可以一次匯一堆資料
欄與欄之間,用 tab (#8) 字元隔開,列與列之間,用 cr lf (#13 #10) 分開
純文字欄位用 =T("文字"),這樣可以防止都是數字的文字資料被 Excel 當成是數字資料
準備好剪貼簿之後,再貼到 Excel 中
這樣匯出的速度會加快非常多
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
allenpower
一般會員


發表:13
回覆:13
積分:5
註冊:2007-01-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-05-25 15:20:40 IP:59.124.xxx.xxx 訂閱
請問剪貼簿是txt嗎
可否舉範例說明呢
謝謝!!
------
P
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-05-25 16:23:58 IP:59.125.xxx.xxx 訂閱
用剪貼簿的話,就用 _WorkSheet.Paste 來處理,不過剪貼簿的內容要事先塞好,有些小麻煩
要一次匯整列的話,很簡單,用一個 Variant Array 放整列的值,然後用 _WorkSheet.Range[].value := 這個 Variant Array 就可以了
像這樣:
ExcelApplication1:TExcelApplication
procedure TForm4.Button7Click(Sender: TObject);
var i: integer;
    buffer: Variant;
    worksheet: _Worksheet;
begin
  ExcelApplication1.Connect;
  ExcelApplication1.Workbooks.Add('', $0804);
  worksheet := ExcelApplication1.ActiveSheet as _Worksheet;

  ADOConnection2.Connected := True;
  ADODataSet3.Open;
  i := 1;
  buffer := VarArrayCreate([0, 3], VarVariant);

  // 於第一列放欄位名稱
  buffer[0] := ADODataSet3.FieldByName('FIELD_1').FieldName;
  buffer[1] := ADODataSet3.FieldByName('FIELD_2').FieldName;
  buffer[2] := ADODataSet3.FieldByName('FIELD_3').FieldName;
  buffer[3] := ADODataSet3.FieldByName('FIELD_4').FieldName;
  worksheet.Range[Format('A%d', [i]), Format('D%d', [i])].Value := buffer;
  Inc(i);

  while not ADODataSet3.Eof do
  begin
    // 準備一列的資料
    // 用 =T("") 把文字資料包起來,以免都是數字的文字資料被 Excel 當成數字
    buffer[0] := '=T("'   ADODataSet3.FieldByName('FIELD_1').AsString   '")';
    buffer[1] := '=T("'   ADODataSet3.FieldByName('FIELD_2').AsString   '")';
    buffer[2] := '=T("'   ADODataSet3.FieldByName('FIELD_3').AsString   '")';
    buffer[3] := '=T("'   ADODataSet3.FieldByName('FIELD_4').AsString   '")';
    worksheet.Range[Format('A%d', [i]), Format('D%d', [i])].Value := buffer;
    ADODataSet3.MoveBy(1);
    Inc(i);
  end;
  ADODataSet3.Close;
  ADOConnection2.Connected := False;
  worksheet := nil;
  ExcelApplication1.Visible[$0804] := true;
  ExcelApplication1.Disconnect;
end;
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-05-25 18:06:18 IP:220.142.xxx.xxx 訂閱
偷學到一招~
山不轉..路轉
------
======================
昏睡~
不昏睡~
不由昏睡~
allenpower
一般會員


發表:13
回覆:13
積分:5
註冊:2007-01-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-05-31 14:35:50 IP:59.124.xxx.xxx 訂閱
第二個問題解決
我用如下方法抓到欄位名稱
for(rSQL=0;rSQL<8;rSQL )
{
rSQLTitle=DBGrid1->Columns->Items[rSQL]->Title->Caption;//抓欄位名稱
Range=Worksheet.OlePropertyGet("Cells",1,rSQL 1);//該cell
Range.OlePropertySet("Value",StringToOleStr(rSQLTitle));//丟欄位名
}

我發現我開始PO錯 我應該po在BCB
第一個問題用這方法好像BCB不能用
------
P
系統時間:2024-03-29 6:23:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!