如何生成excel文件作为图像识别结果

时间:2023-12-10 12:41:56

如何生成excel文件作为图像识别结果

在进行大规模图像处理的时候,如果能够以表格的形式生成结果文件,将非常的直观。这个时候,选择excel作为结果输出文件,将是合适的。
查询相关资料,有很多关于excel的操作方法,但是使用mfc来进行excel的操作,总是要涉及到很多东西。
一、采用csv方式
实验如下:
创建1.csv文件,使用记事本进行编辑
如何生成excel文件作为图像识别结果
而后使用excel进行打开
如何生成excel文件作为图像识别结果
效果很好。而csv的操作是可以直接采用文本编辑的方式生成的,可以直接采用std:file操作的方法来生成csv文件,然后使用excel打开就可以。
再附上一段代码,是opencv官方提供的csv操作相关的,可以参考
//创建或续写目录下的csv文件,填写“文件位置-分类”对
    int writeCsv(const string& filename,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 string& filename, char separator) {
        pair<string,string> apair;
        string line, path, classlabel;
        vector<pair<string,string>> retVect;
        ifstream file(filename.c_str(), ifstream::in);
        if (!file) 
            return retVect;
        while (getline(file, line)) {
            stringstream liness(line);
            getline(liness, path, separator);
            getline(liness, classlabel);
            if(!path.empty() && !classlabel.empty()) {
                apair.first = path;
                apair.second = classlabel;
                retVect.push_back(apair);
            }
        }
        return retVect;
    }
二、采用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(szBuf, cbBufMax, &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 MakeSurePathExists( CString &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(CString& sExcelFile)
    {
        ///默认文件名: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(CListCtrl* pList, CString 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",sDriver, sExcelFile, sExcelFile);
            // 创建数据库 (既Excel表格文件)
            if( database.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,"中药识别结果");