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

讀excel內的資料很慢?

尚未結案
blink182
一般會員


發表:4
回覆:2
積分:1
註冊:2002-04-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-01 16:02:34 IP:140.110.xxx.xxx 未訂閱
各位先進大家好 搜尋站內有關讀取excel資訊後,小弟改寫範例內容,讀值正確,但讀取速度非常慢請各位指教。 以下程式碼存成cpp,include進來後 則利用ReturnExcelCell(char *aa,int page,int row,int col,double &CellValue)即可使用 其中 *aa為excel檔路徑、page為第幾個sheet、CellValue為該sheet內第row、col回傳值。 1.sheet從1開始 2.row、col從0開始 3.程式碼如底下 4.存成cpp之後將此cpp要inclde進來程式內 即可使用 5.若無法使用確認view->project manager底下有add進來 第4.所存的cpp 6.成功後利用ReturnExcelCell指令 即可使用 7.作業環境為winxp,officexp    以下為程式碼     
#include "ComObj.hpp"
#include "Excel_2K_SRVR.h"
#define COL_CYCLE 26
const char szColCycle[COL_CYCLE]=
{   'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J',   'K', 'L', 'M'
, 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z'};    AnsiString ExcelCellName(int iCol, int iRow)
{
        AnsiString szCol;
        AnsiString szRow;
        int m=iCol/COL_CYCLE-1;
        int n=iCol%COL_CYCLE;
        szCol=(m<0)?
        (AnsiString)szColCycle[n]:
        (AnsiString)szColCycle[m] (AnsiString)szColCycle[n];
        szRow=IntToStr(iRow 1);
        return(szCol szRow);
}
void ReturnExcelCell(char *aa,int page,int row,int col,double &CellValue)
{
        // Read cells from a *.xls file
        Variant ExcelApp,
        ExcelBooks, ExcelBook,
        ExcelSheets, ExcelSheet, UsedRange;
        Variant ExcelRange, ExcelColumn, ColumnCount, ExcelRow, RowCount;
        try
        {
                ExcelApp=Variant::CreateObject("Excel.Application");
        }
        catch(Exception &e)
        {
                //ShowMessage(e.Message);
        }
        if(ExcelApp.IsEmpty())   {      return;   }
        //ExcelApp.OlePropertySet("Visible", true);          ExcelBooks=ExcelApp.OlePropertyGet("Workbooks");
        try
        {
                AnsiString szXlsFile1=aa;
                ExcelBook=ExcelBooks.OleFunction("Open", StringToOleStr(szXlsFile1));
        }
        catch(Exception &e)
        {
                //ShowMessage(e.Message);
        }
        if(ExcelBook.IsEmpty())   {      return;   }
        ExcelSheets=ExcelBook.OlePropertyGet("Worksheets");
        ExcelSheet=ExcelSheets.OlePropertyGet("Item", page);
        UsedRange=ExcelSheet.OlePropertyGet("UsedRange");
        ExcelColumn=UsedRange.OlePropertyGet("Columns");
        ColumnCount=ExcelColumn.OlePropertyGet("Count");
        //StringGrid1->ColCount=ColumnCount;
        //StringGrid1->RowCount=RowCount;
        
        ExcelRange=ExcelSheet.OlePropertyGet("Range", StringToOleStr(ExcelCellName(col, row)));
        CellValue=ExcelRange.OlePropertyGet("Value");
        //ShowMessage(CellValue);
        Application->ProcessMessages();
        ExcelBook.OleFunction("Close");
        ExcelApp.OleFunction("Quit");
        
}     
發表人 - blink182 於 2005/07/01 16:58:55 發表人 - blink182 於 2005/07/01 17:03:01
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-01 17:58:12 IP:61.70.xxx.xxx 未訂閱
您好: 透過OLE的方式讀原本就會比較慢,而且看程式也沒看到有何可以改善的地方. 你可以試試用AdoQuery的方式去讀看看,也許有幫助,參考看看. http://delphi.ktop.com.tw/topic.php?TOPIC_ID=72106 發表人 - supman 於 2005/07/01 18:21:38
系統時間:2024-06-02 2:36:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!