C++ builder想利用ole操作將excel的內容匯入資料庫
已經可以實作一個單元格一個單元格取值然后寫入資料庫
可是如果大資料的話這樣效率很低
所以就想利用range操作將區域內的值讀取入二維陣列
可是不知道怎樣代碼實作
range需要一個variant的二維陣列去取值
可是菜鳥對variant型二維陣列一臉懵逼
忘各位老師解答
求妖哥賜教
亂七八糟 大概按照意思打了幾行代碼 忘各位指點迷津
Variant excelApp = CreateOleObject("Excel.Application");
String xlsFile = L"E:\\ha.xlsx";
excelApp.OlePropertyGet("Workbooks").OleFunction("open", WideString(xlsFile));
excelApp.OlePropertySet("Visible", True);
Variant workbook = excelApp.OlePropertyGet("ActiveWorkBook");
Variant sheet = workbook.OlePropertyGet("ActiveSheet");
String rangeText = L"A1:E17";
Variant range = sheet.OlePropertyGet("Range", WideString(rangeText));
//range.PG("Rows",1).PG("Value", 1234);
int col = range.OlePropertyGet("Columns").OlePropertyGet("Count");//獲取所選range的列數
int row = range.OlePropertyGet("Rows").OlePropertyGet("Count"); //獲得所選range的行數
SAFEARRAYBOUND sab[2]; //定義一個二維陣列
sab[0].cElements = col;
sab[0].lLbound = 0;
sab[1].cElements = row;
sab[1].lLbound = 0;
SAFEARRAY* psa = SafeArrayCreate( VT_UI1, sizeof(sab)/sizeof(SAFEARRAYBOUND), sab);
Variant varChunk;
varChunk.vt = VT_ARRAY|VT_UI1; //陣列型別
varChunk.parray = psa;
varChunk=range.PG("Value");
psa=varChunk.parray;
BYTE *buf;
SafeArrayAccessData(psa, (void **)&buf);//安全指標
SafeArrayUnaccessData(psa);
workbook.PR("Close");
excelApp.FN("Quit");
varinat型二維陣列怎么定義 怎么把range的值賦給該陣列 賦完該如何取值??
uj5u.com熱心網友回復:
用python寫以, 用這個xlrd,速度很快。uj5u.com熱心網友回復:
OLE讀取速度很慢很慢的,當EXCEL超過6000行的時候,基本上就掛了。提高速度3種方法:
1、OLE打開EXCEL,然后呼叫COPY復制資料至記憶體,之后另存為TXT檔案,然后ADO連接這個TXT檔案,直接資料庫模式操作,相當于資料庫操作了
2、OLE打開EXCEL,插入表,OLE保存,然后ADO連接修改后EXCEL檔案,也是資料庫直接操作,這種方法對EXCEL檔案格式要求很高,必須規范
3、檔案流打開EXCEL檔案,直接讀取EXCEL檔案流,識別XLS各種識別符號,就是寫個簡單的EXCEL,僅有打開功能,這個速度最快,當然,難度也最高,需要你分析EXCEL的檔案格式,這個MS有官方檔案。
uj5u.com熱心網友回復:
樓上真牛,半年前的帖子也能翻出來。我回復過網友類似的問題,樓主可以自行搜索一下。uj5u.com熱心網友回復:
這個BBS,一個貼子,可以放N久uj5u.com熱心網友回復:
最好用ADO的方式,一次把表讀出來,然后寫入excel,我有個資源檔案就是做這個事情的,可以參考下!https://download.csdn.net/download/laizx/3915380
uj5u.com熱心網友回復:
妖哥是絕對的大神
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/47627.html
標籤:茶館
