如何生成excel文件做爲圖像識別結果

如何生成excel文件做爲圖像識別結果數據庫

在進行大規模圖像處理的時候,若是可以以表格的形式生成結果文件,將很是的直觀。這個時候,選擇excel做爲結果輸出文件,將是合適的。
查詢相關資料,有不少關於excel的操做方法,可是使用mfc來進行excel的操做,老是要涉及到不少東西。
1、採用csv方式
實驗以下:
建立1.csv文件,使用記事本進行編輯
然後使用excel進行打開
效果很好。而csv的操做是能夠直接採用文本編輯的方式生成的,能夠直接採用std:file操做的方法來生成csv文件,而後使用excel打開就能夠。
再附上一段代碼,是opencv官方提供的csv操做相關的,能夠參考
//建立或續寫目錄下的csv文件,填寫「文件位置-分類」對
    int writeCsv(const stringfilename,const Vector<pair<string,string>>srcVect,char separator ){
        ofstream file(filename.c_str(),ofstream::app);
        if (!file)
            return 0;
        for (int i=0;i<srcVect.size();i++){
            file<<srcVect[i].first<<separator<<srcVect[i].second<<endl;
        }
        return srcVect.size();
    }
    //讀取目錄下的csv文件,得到「文件位置-分類」對
    vector<pair<string,string>> readCsv(const stringfilenamechar separator) {
        pair<string,stringapair;
        string linepathclasslabel;
        vector<pair<string,string>> retVect;
        ifstream file(filename.c_str(), ifstream::in);
        if (!file
            return retVect;
        while (getline(fileline)) {
            stringstream liness(line);
            getline(linesspathseparator);
            getline(linessclasslabel);
            if(!path.empty() && !classlabel.empty()) {
                apair.first = path;
                apair.second = classlabel;
                retVect.push_back(apair);
            }
 
        }
        return retVect;
    }
 
2、採用xls方式
涉及到的東西比較多,如今已經集成到了GOcvHelper中去
#pragma region 
    //////////////////////////////////////////////////////////////////////////////
    //名稱:GetExcelDriver
    //功能:獲取ODBC中Excel驅動
    //做者:徐景周(jingzhou_xu@163.net)
    //組織:將來工做室(Future Studio)
    //日期:2002.9.1
    /////////////////////////////////////////////////////////////////////////////
    CString GetExcelDriver()
    {
        char szBuf[2001];
        WORD cbBufMax = 2000;
        WORD cbBufOut;
        char *pszBuf = szBuf;
        CString sDriver;
 
        // 獲取已安裝驅動的名稱(涵數在odbcinst.h裏)
        if (!SQLGetInstalledDrivers(szBufcbBufMax, &cbBufOut))
            return "";
 
        // 檢索已安裝的驅動是否有Excel...
        do
        {
            if (strstr(pszBuf"Excel") != 0)
            {
                //發現 !
                sDriver = CString(pszBuf);
                break;
            }
            pszBuf = strchr(pszBuf'\0') + 1;
        }
        while (pszBuf[1] != '\0');
 
        return sDriver;
    }
 
    ///////////////////////////////////////////////////////////////////////////////
    //    BOOL MakeSurePathExists( CString &Path,bool FilenameIncluded)
    //    參數:
    //        Path                路徑
    //        FilenameIncluded    路徑是否包含文件名
    //    返回值:
    //        文件是否存在
    //    說明:
    //        判斷Path文件(FilenameIncluded=true)是否存在,存在返回TURE,不存在返回FALSE
    //        自動建立目錄
    //
    ///////////////////////////////////////////////////////////////////////////////
    BOOL MakeSurePathExistsCString &Path,
        bool FilenameIncluded)
    {
        int Pos=0;
        while((Pos=Path.Find('\\',Pos+1))!=-1)
            CreateDirectory(Path.Left(Pos),NULL);
        if(!FilenameIncluded)
            CreateDirectory(Path,NULL);
        //    return ((!FilenameIncluded)?!_access(Path,0):
        //    !_access(Path.Left(Path.ReverseFind('\\')),0));
 
        return !_access(Path,0);
    }
 
    //得到默認的文件名
    BOOL GetDefaultXlsFileName(CStringsExcelFile)
    {
        ///默認文件名:yyyymmddhhmmss.xls
        CString timeStr;
        CTime day;
        day=CTime::GetCurrentTime();
        int filenameday,filenamemonth,filenameyear,filehour,filemin,filesec;
        filenameday=day.GetDay();//dd
        filenamemonth=day.GetMonth();//mm月份
        filenameyear=day.GetYear();//yyyy
        filehour=day.GetHour();//hh
        filemin=day.GetMinute();//mm分鐘
        filesec=day.GetSecond();//ss
        timeStr.Format("%04d%02d%02d%02d%02d%02d",filenameyear,filenamemonth,filenameday,filehour,filemin,filesec);
 
        sExcelFile =  timeStr + ".xls"//獲取隨機時間的文件名稱
        //打開選擇路徑窗口
        CString pathName
        CString defaultDir = _T("C:\\outtest");
        CString fileName=sExcelFile;
        CString szFilters_T("xls(*.xls)");
        CFileDialog dlg(FALSE,defaultDir,fileName,OFN_HIDEREADONLY|OFN_READONLY,szFilters,NULL);
        if(dlg.DoModal()==IDOK){
            //得到保存位置
            pathName = dlg.GetPathName();
        }
 
        sExcelFile = pathName;
        return TRUE;
    }
 
    ///////////////////////////////////////////////////////////////////////////////
    //    void GetExcelDriver(CListCtrl* pList, CString strTitle)
    //    參數:
    //        pList        須要導出的List控件指針
    //        strTitle    導出的數據表標題
    //    說明:
    //        導出CListCtrl控件的所有數據到Excel文件。Excel文件名由用戶經過「另存爲」
    //        對話框輸入指定。建立名爲strTitle的工做表,將List控件內的全部數據(包括
    //        列名和數據項)以文本的形式保存到Excel工做表中。保持行列關係。
    //    
    //    edit by [r]@dotlive.cnblogs.com
    ///////////////////////////////////////////////////////////////////////////////
    CString ExportListToExcel(CListCtrlpListCString strTitle)
    {
        CString warningStr;
        if (pList->GetItemCount ()>0) {    
            CDatabase database;
            CString sDriver;
            CString sExcelFile
            CString sSql;
            CString tableName = strTitle;
 
            // 檢索是否安裝有Excel驅動 "Microsoft Excel Driver (*.xls)" 
            sDriver = GetExcelDriver();
            if (sDriver.IsEmpty())
            {
                // 沒有發現Excel驅動
                AfxMessageBox("沒有安裝Excel!\n請先安裝Excel軟件才能使用導出功能!");
                return NULL;
            }
 
            ///默認文件名
            if (!GetDefaultXlsFileName(sExcelFile))
                return NULL;
 
            // 建立進行存取的字符串
            sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",sDriversExcelFilesExcelFile);
 
            // 建立數據庫 (既Excel表格文件)
            ifdatabase.OpenEx(sSql,CDatabase::noOdbcDialog) )
            {
                // 建立表結構
                int i;
                LVCOLUMN columnData;
                CString columnName;
                int columnNum = 0;
                CString strH;
                CString strV;
 
                sSql = "";
                strH = "";
                columnData.mask = LVCF_TEXT;
                columnData.cchTextMax =100;
                columnData.pszText = columnName.GetBuffer (100);
                for(i=0;pList->GetColumn(i,&columnData);i++)
                {
                    if (i!=0)
                    {
                        sSql = sSql + ", " ;
                        strH = strH + ", " ;
                    }
                    sSql = sSql + " " + columnData.pszText +" TEXT";
                    strH = strH + " " + columnData.pszText +" ";
                }
                columnName.ReleaseBuffer ();
                columnNum = i;
 
                sSql = "CREATE TABLE " + tableName + " ( " + sSql +  " ) ";
                database.ExecuteSQL(sSql);
 
                // 插入數據項
                int nItemIndex;
                for (nItemIndex=0;nItemIndex<pList->GetItemCount ();nItemIndex++){
                    strV = "";
                    for(i=0;i<columnNum;i++)
                    {
                        if (i!=0)
                        {
                            strV = strV + ", " ;
                        }
                        strV = strV + " '" + pList->GetItemText(nItemIndex,i) +"' ";
                    }
 
                    sSql = "INSERT INTO "tableName 
                        +" ("strH + ")"
                        +" VALUES("strV + ")";
                    database.ExecuteSQL(sSql);
                }
 
            }      
 
            // 關閉數據庫
            database.Close();
 
            warningStr.Format("導出文件保存於%s!",sExcelFile);
            AfxMessageBox(warningStr);
            return sExcelFile;
        }
    }
#pragma endregion
使用的時候,直接生成gridview,而後調用就能夠
CString cstresult =  ExportListToExcel(&m_MyListCtrl,"中藥識別結果");



相關文章
相關標籤/搜索