C++ 讀取/寫入EXCEL


程序對EXCEL做寫入操作時值得注意到是數據量多大需要分多個文件寫入,因為EXCEL的最大行數為65535行。

 

//讀取EXCEL  ,CListCtrl list

// sFile :文件位置

//sSheetName : 操作工作表名稱

//items : 讀取內容賦值數組(根據需要)

//nNum : 數組有效賦值行數(根據需要)

bool ReadFromExcel(CString sFile, CString sSheetName, Item **items, int *nNum)
{
    g_sys_log->writeUDPSysLog("ReadFromExcel",0);
    CDatabase database;
    CString sSql;

    //定義EXCEL讀取的字段
    CString AllCapital, Ask1, AskVol1, Bid1, BidVol1, FreeCapital, IndustryCode;
    CString Is100, IsSuspension, LastPrice, Name, NO, OrderPrice, OrderStatus;
    CString OrderVol,Positions,PriceYesterday, Reserved1, Reserved2, Reserved3;
    CString Reserved4, Reserved5, Reserved6, Reserved7, Reserved8, Reserved9, Reserved10;
    CString sDriver;
    CString sDsn;
    Item itemOnce;
    int i = 0;
    //CString sSheetName = "Sheet1";
    //CString sFile = "測試讀取EXCEL.xls";

    //檢查時否安裝有Excel驅動 “Microsoft Excel Driver (*.xls)”
    sDriver = GetExcelDriver();
    if(sDriver.IsEmpty())
    {
        //沒有發現Excel驅動
        AfxMessageBox("沒有安裝Excel驅動");
        return false;
    }
    
    //創建進行存取的字符串
    sDsn.Format("ODBC;DRIVER={%s};DSN='''';DBQ=%s", sDriver, sFile);

    try
    {
        //打開數據庫
        database.Open(NULL, false, false, sDsn);

        CRecordset recset(&database);

        //設置讀取的查詢語句
        sSql.Format("SELECT * from [%s$]", sSheetName);

        //執行查詢語句
        recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);

        //得到查詢結果
        while(!recset.IsEOF())
        {
            
            //讀取Excel內部數值
            recset.GetFieldValue("AllCapital", itemOnce.AllCapital);
            if(itemOnce.AllCapital.GetLength() < 1)
                break;
            recset.GetFieldValue("Ask1", itemOnce.Ask1);
            recset.GetFieldValue("AskVol1", itemOnce.AskVol1);
            recset.GetFieldValue("Bid1", itemOnce.Bid1);
            recset.GetFieldValue("BidVol1", itemOnce.BidVol1);
            recset.GetFieldValue("FreeCapital", itemOnce.FreeCapital);
            recset.GetFieldValue("IndustryCode", itemOnce.IndustryCode);//

            recset.GetFieldValue("Is100", itemOnce.Is100);//
            recset.GetFieldValue("IsSuspension", itemOnce.IsSuspension);//
            recset.GetFieldValue("LastPrice", itemOnce.LastPrice);
            recset.GetFieldValue("Name", itemOnce.Name);
            recset.GetFieldValue("NO", itemOnce.NO);
            recset.GetFieldValue("OrderPrice", itemOnce.OrderPrice);
            recset.GetFieldValue("OrderStatus", itemOnce.OrderStatus);
            recset.GetFieldValue("OrderVol", itemOnce.OrderVol);
            recset.GetFieldValue("Positions", itemOnce.Positions);
            recset.GetFieldValue("PriceYesterday", itemOnce.PriceYesterday);
            recset.GetFieldValue("Reserved1", itemOnce.Reserved1);
            recset.GetFieldValue("Reserved2", itemOnce.Reserved2);
            recset.GetFieldValue("Reserved3", itemOnce.Reserved3);
            recset.GetFieldValue("Reserved4", itemOnce.Reserved4);
            recset.GetFieldValue("Reserved5", itemOnce.Reserved5);
            recset.GetFieldValue("Reserved6", itemOnce.Reserved6);
            recset.GetFieldValue("Reserved7", itemOnce.Reserved7);
            recset.GetFieldValue("Reserved8", itemOnce.Reserved8);
            recset.GetFieldValue("Reserved9", itemOnce.Reserved9);
            recset.GetFieldValue("Reserved10", itemOnce.Reserved10);

            //加入到列表中
            items[i]->AllCapital = itemOnce.AllCapital;
            items[i]->Ask1= itemOnce.Ask1;
            items[i]->AskVol1 = itemOnce.AskVol1;
            items[i]->Bid1 = itemOnce.Bid1;
            items[i]->BidVol1 = itemOnce.BidVol1;
            items[i]->FreeCapital = itemOnce.FreeCapital;
            items[i]->IndustryCode = itemOnce.IndustryCode;
            items[i]->Is100 = itemOnce.Is100;
            items[i]->IsSuspension = itemOnce.IsSuspension;
            items[i]->LastPrice = itemOnce.LastPrice;
            items[i]->Name = itemOnce.Name;
            items[i]->NO = itemOnce.NO;
            items[i]->OrderPrice = itemOnce.OrderPrice;
            items[i]->OrderStatus = itemOnce.OrderStatus;
            items[i]->OrderVol = itemOnce.OrderVol;
            items[i]->Positions = itemOnce.Positions;
            items[i]->PriceYesterday = itemOnce.PriceYesterday;
            items[i]->Reserved1 = itemOnce.Reserved1;
            items[i]->Reserved2 = itemOnce.Reserved2;
            items[i]->Reserved3 = itemOnce.Reserved3;
            items[i]->Reserved4 = itemOnce.Reserved4;
            items[i]->Reserved5 = itemOnce.Reserved5;
            items[i]->Reserved6 = itemOnce.Reserved6;
            items[i]->Reserved7 = itemOnce.Reserved7;
            items[i]->Reserved8 = itemOnce.Reserved8;
            items[i]->Reserved9 = itemOnce.Reserved9;
            items[i]->Reserved10 = itemOnce.Reserved10;

            i ++;
            //移動下一行
            recset.MoveNext();
        }
        *nNum = i;
        //關閉數據庫
        database.Close();
    }
    catch(CDBException e)
    {
        AfxMessageBox("數據庫錯誤:" + e.m_strError);
        return false;
    }
    return true;
}

 

 

///////////////////////////////////////////////////////華麗分割線////////////////////////////////////////////////////////////////////

//創建並寫入Excel文件
void WriteToExcel()
{
    g_sys_log->writeUDPSysLog("WriteToExcel",0);
  CDatabase database;
  CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安裝驅動
  CString sExcelFile = "c:\\demo.xls";                // 要建立的Excel文件,可以放在函數參中
  CString sSql;
    
  TRY
  {
    // 創建進行存取的字符串
    sSql.Format("DRIVER={%s};DSN='''';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",
                sDriver, sExcelFile, sExcelFile);

    // 創建數據庫 (既Excel表格文件)
    if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
    {
      // 創建表結構(姓名、年齡)
      sSql = "CREATE TABLE demo (Name TEXT,Age NUMBER)";
      database.ExecuteSQL(sSql);

      // 插入數值
      sSql = "INSERT INTO demo (Name,Age) VALUES ('徐景周',26)";
      database.ExecuteSQL(sSql);

      sSql = "INSERT INTO demo (Name,Age) VALUES ('徐志慧',22)";
      database.ExecuteSQL(sSql);

      sSql = "INSERT INTO demo (Name,Age) VALUES ('郭徽',27)";
      database.ExecuteSQL(sSql);
    }      

    // 關閉數據庫
    database.Close();
  }
  CATCH_ALL(e)
  {
    TRACE1("Excel驅動沒有安裝: %s",sDriver);
  }
  END_CATCH_ALL;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM