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

ADO元件讀取多sheets之excel(xls)的問題

尚未結案
甘蔗夫
一般會員


發表:76
回覆:19
積分:19
註冊:2004-08-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-12-30 19:38:05 IP:211.77.xxx.xxx 訂閱
Dear 大大,.
我附上我部分程式,我用ADO元件在讀取多sheets之excel(xls),偶爾會發生下列情形:
(1)讀到最大行數與實際最大行數有差異
For example(通常發生在第二個sheet之後):
1 2 3
4 5 6
7 8 9 a = >最大行數應該是4行,但偶爾讀取的最大行數會多於4行
(2)偶爾會在下面函數void __fastcall TForm1::GetColRow(String Path)之程序ADOQ->Open();
發展錯誤,我在程序加了goto repeat;的動作,似乎暫時解決我的困擾,但我覺得不是很好的solution
,請問各位大大,是否有適當的solution




void __fastcall TForm1::GetSheetName(String Path)
{
// Set related parameters in a *.xls file
Variant ExcelApp, ExcelBooks, ExcelBook, ExcelSheets, ExcelSheet, ExcelCell;
Variant SheetCount,CellValue;
try
{
ExcelApp=Variant::CreateObject("Excel.Application");
Application->ProcessMessages();
}
catch(Exception &e)
{
ShowMessage(e.Message);
Application->ProcessMessages();
}
if(ExcelApp.IsEmpty()) return;
ExcelBooks=ExcelApp.OlePropertyGet("Workbooks");
try
{
ExcelBook = ExcelBooks.OleFunction("Open",Path.c_str());
Application->ProcessMessages();
}
catch(Exception &e)
{
ShowMessage(e.Message);
Application->ProcessMessages();
}
if(ExcelBook.IsEmpty()) return;
ExcelSheets=ExcelBook.OlePropertyGet("Sheets");
SheetCount= ExcelSheets.OlePropertyGet("Count");
SheetCNT=SheetCount;
for(int i = 0; i < SheetCount ; i )
{
ExcelSheet = ExcelSheets.OlePropertyGet("Item", i 1);
SheetName->Add(ExcelSheet.OlePropertyGet("Name"));
Application->ProcessMessages();
}
ExcelBook.OleFunction("Close",StringToOleStr(Path));
ExcelApp.OleFunction("Quit");
}

void __fastcall TForm1::GetColRow(String Path)
{
AnsiString S;
if(RowXls)
delete RowXls;
if(ColXls)
delete ColXls;
RowXls = new int[SheetCNT];
ColXls = new int[SheetCNT];
repeat:
for(int i = 0; i < SheetCNT ; i )
{
String a=SheetName->Strings[i];
// Seting ADO Object
ADOQ->Active = false;
ADOC->Connected = false;
// Set Connection Method
S = "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" Path ";\
Extended Properties=Excel 8.0;Persist Security Info=False";
ADOC->Provider = "Microsoft.Jet.OLEDB.4.0";
ADOC->ConnectionString = S;
// Active ADOConnection
ADOC->Connected = true;
// 連結並且Select 的worksheet內所有資料
ADOQ->Connection = ADOC;
ADOQ->Close();
ADOQ->SQL->Clear();
ADOQ->SQL->Add("select * from [" SheetName->Strings[i] "$]");
try
{
ADOQ->Open();
Application->ProcessMessages();
}
catch(...)
{
ADOC->Close();
ADOQ->Close();
Application->ProcessMessages();
goto repeat;
}
try
{
ADOQ->Active = true;
Application->ProcessMessages();
}
catch(...)
{
ADOQ->Active = false;
ADOC->Connected = false;
Application->ProcessMessages();
}
// 取得Record 筆數
RowXls[i] = ADOQ->RecordCount; // 行
// 取得Field 個數
ColXls[i] = ADOQ->FieldCount; // 列(欄位)
ADOC->Close();
ADOQ->Close();
Application->ProcessMessages();
}
}
系統時間:2024-04-27 9:54:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!