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

Excel匯入文字檔之功能

 
firewing
一般會員


發表:23
回覆:47
積分:19
註冊:2002-12-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-07 10:53:11 IP:139.223.xxx.xxx 未訂閱
最近用BCB寫了一個由Excel中執行匯入文字檔, 我先在Excel中執行了  資料->取得外部資料->匯入文字檔案 選擇好檔案後,選擇以分隔符號的方式匯入,分隔的符號是 Tab 和 逗號 ,然後欄位的資料格式為"文字","文字","一般"*6 為我有八個欄位.之後按下完成... 在這之前要先錄製巨集以取得 VB 的程式....如下
 
With ActiveSheet.QueryTables.Add(Connection:= _
  "TEXT;D:\Temp\BCB\Excel\ASIC-IO\test.txt", Destination:=Range("A1"))
        .Name = "test_1"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = xlWindows
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(2, 2, 1, 1, 1, 1, 1, 1)
        .Refresh BackgroundQuery:=False
    End With   
 將以上的程式改為 BCB 語法,如下:  
   Variant iTmp[8]={2,2,1,1,1,1,1,1};
   Variant MSExcel,MSWorkbooks,MSWorkbook;
   Variant MSSheets,MSSheet,vTmp1,vTmp2,vTmp3,vRange;
   Variant vArray(iTmp,7);       MSExcel=CreateOleObject("Excel.Application");
   MSExcel.OlePropertySet("Visible",true);
   MSWorkbooks=MSExcel.OlePropertyGet("Workbooks");
   MSWorkbook=MSWorkbooks.OleFunction("Add");
   MSSheets=MSWorkbook.OlePropertyGet("Worksheets");
   MSSheet=MSSheets.OlePropertyGet("Item",1);
   vTmp1=MSWorkbook.OlePropertyGet("ActiveSheet").OlePropertyGet("QueryTables");
   vRange=MSSheet.OlePropertyGet("Cells",1,1);
   vTmp2=vTmp1.OleFunction("Add","TEXT;D:\\Temp\\BCB\\Excel\\ASIC-IO\\test.txt",vRange);
   vTmp2.OlePropertySet("Name","test");
   vTmp2.OlePropertySet("FieldNames",true);
   vTmp2.OlePropertySet("RowNumbers",false);
   vTmp2.OlePropertySet("FillAdjacentFormulas", false);
   vTmp2.OlePropertySet("PreserveFormatting",true);
   vTmp2.OlePropertySet("RefreshOnFileOpen" , false);
   vTmp2.OlePropertySet("RefreshStyle",xlInsertDeleteCells);
   vTmp2.OlePropertySet("SavePassword",false);
   vTmp2.OlePropertySet("SaveData",true);
   vTmp2.OlePropertySet("AdjustColumnWidth",true);
   vTmp2.OlePropertySet("RefreshPeriod",0);
   vTmp2.OlePropertySet("TextFilePromptOnRefresh",false);
   vTmp2.OlePropertySet("TextFilePlatform",xlWindows);
   vTmp2.OlePropertySet("TextFileStartRow",1);
   vTmp2.OlePropertySet("TextFileParseType",xlDelimited);
   vTmp2.OlePropertySet("TextFileTextQualifier",xlTextQualifierDoubleQuote);
   vTmp2.OlePropertySet("TextFileConsecutiveDelimiter",false);
   vTmp2.OlePropertySet("TextFileTabDelimiter",true);
   vTmp2.OlePropertySet("TextFileSemicolonDelimiter",false);
   vTmp2.OlePropertySet("TextFileCommaDelimiter",true);
   vTmp2.OlePropertySet("TextFileSpaceDelimiter",false);
   vTmp2.OlePropertySet("TextFileColumnDataTypes",vArray);
   vTmp3=vTmp2.OleFunction("Refresh",false);
   MSExcel = Unassigned;      在 *.h 中 include
#include 
#include 
以上是我改的BCB code,若有錯誤的地方,請不吝指教, 謝謝 發表人 - firewing 於 2003/08/07 10:58:48 發表人 - firewing 於 2003/08/07 11:04:33 發表人 - firewing 於 2003/08/07 11:33:53
kenlee1109
初階會員


發表:20
回覆:40
積分:27
註冊:2006-08-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-10-30 03:41:43 IP:118.160.xxx.xxx 訂閱
看到這篇好文忍不住玩了一下,但編譯不過,

像 xlTextQualifierDoubleQuote 這個好像沒有定義.

另請問是否可以改為匯入 excel 檔? 用 excel 匯入 excel, 原因是被匯入的 excel 檔是很舊的版本,每次開啟時總出現工作表名稱錯誤,然用 C 開啟就是當給我看,害我連轉的機會都沒有,然而用匯入的就沒有錯誤訊息,樓主可以改寫一下嗎?
kenlee1109
初階會員


發表:20
回覆:40
積分:27
註冊:2006-08-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-10-30 05:26:46 IP:118.160.xxx.xxx 訂閱
已經找到 Excel 匯入舊版 Excel  的方法了(依樓主的程式改寫一些)

xlCmdTable 的代碼是 3,
可參考

http://topic.csdn.net/t/20030522/13/1818670.html

Excel 常用代碼表

//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton2Click(TObject *Sender){
Variant MSExcel,MSWorkbooks,MSWorkbook;
Variant MSSheets,MSSheet,vTmp1,vTmp2,vTmp3,vRange;
MSExcel=CreateOleObject("Excel.Application");
MSExcel.OlePropertySet("Visible",true);
MSWorkbooks=MSExcel.OlePropertyGet("Workbooks");
MSWorkbook=MSWorkbooks.OleFunction("Add");
MSSheets=MSWorkbook.OlePropertyGet("Worksheets");
MSSheet=MSSheets.OlePropertyGet("Item",1);
vTmp1=MSWorkbook.OlePropertyGet("ActiveSheet").OlePropertyGet("QueryTables");
vRange=MSSheet.OlePropertyGet("Cells",1,1);
//只要四行就行,缺一不可
vTmp2=vTmp1.OleFunction("Add", "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\1.xls;Jet OLEDB:Engine Type=34;", vRange);
vTmp2.OlePropertySet("CommandType", 3);
vTmp2.OlePropertySet("CommandText", "\'$\'");
vTmp3 = vTmp2.OleFunction("Refresh", false);


MSExcel = Unassigned;
}


//---------------------------------------------------------------------------

編輯記錄
kenlee1109 重新編輯於 2009-10-30 05:27:37, 註解 無‧
tkulimi
一般會員


發表:2
回覆:4
積分:1
註冊:2004-11-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-03-18 18:14:22 IP:60.248.xxx.xxx 訂閱
Load外部的圖檔,貼入Execl。

Variant Excel = CreateOleObject("Excel.Application");
Excel.OlePropertySet("Visible",true);
Variant Workbooks = Excel.OlePropertyGet("Workbooks");
Variant Workbook = Workbooks.OleFunction("Add");
Variant Worksheets = Workbook.OlePropertyGet("Worksheets");
Variant Worksheet = Worksheets.OlePropertyGet( "Item", 1 );
Worksheet.OlePropertySet( "Name", "Report" );
Variant Shapes = Worksheet.OlePropertyGet("Shapes");
AnsiString strFileName = "C:\\1.bmp";
Shapes.OleFunction(
"AddPicture",
strFileName.c_str(),
1,
1,
0,
0,
184,
44);
strFileName = "C:\\2.xls";
Workbook.OleProcedure("SaveAs", strFileName.c_str());
Workbook.OleProcedure("Close");
Excel.OleProcedure("Quit");
Excel = Unassigned;
系統時間:2024-04-23 20:22:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!