电子元器件管理系统

使用到的知识点

   在Windows操作系统中读和写excel;

  关闭指定名字的exe进程,打开指定名字的exe进程;

  使生成的exe在windows各个系统中兼容;

源码下载链接

  http://pan.baidu.com/share/home?uk=369664793&view=share#category/type=0

说明

  读取excel数据采用的是微软的office COM类库。核心源码在excel.cpp文件中,核心函数为HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...);对外接口是CString** GetExcelData(string &fileAddress);输入为excel文件路径名,输出为一个二维数组,对应excel文件中的每个格点的字符串数据。

  写入excel文件采用的是基于COM库实现的basicexcel,参考链接为:http://blog.csdn.net/augusdi/article/details/13295735

  运行IcMatchTool.exe关闭之后,在任务管理器中观察该进程没有关闭,没有去深究原因,直接采用一个新的进程关闭该进程。

  关闭指定名字的exe进程,参考链接:http://blog.csdn.net/caroline_wendy/article/details/29382347

软件截图

  

软件说明

   1.IcLibrary.xls和input.xls都需要在最后一行手动加一个end;

  2.IcLibrary为元器件库文件,input为需匹配的元器件文件;

  3.点击“匹配”按钮之后,在弹出的文件选择框中选择input.xls即可;

  4.文件中的close.exe不能删除。

  5.yes.xls是在元器件库中找到的元器件,no.xls是在元器件中没有找到的元器件;

  6.如果需匹配的元器件文件input.xls较大,程序需要运行较长时间,等待有“匹配完成”的弹窗出来即可。

核心源码

void CEXCELACESSDlg::OnMath()
{
    
    //打开库文件
    string LibraryFileAddress("D:\\IcManage\\icLibrary.xls");
    CString **getLibData = GetExcelData(LibraryFileAddress);
    //row_num
    multimap<string,int> libMap;
    int libRowNum = row_num;
    for(int i = 1;i<libRowNum;i++)
    {
        string tmp(getLibData[i][0].GetBuffer());
        libMap.insert(pair<string,int>(tmp,i));
        getLibData[i][0].ReleaseBuffer();
    }

    //打开需要匹配的文件
    _TCHAR strFileFilter[] = "excel 文件(*.xlsx;*.xls)|*.xlsx;*.xls|文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||";
    CFileDialog Dlg(TRUE,NULL ,NULL, OFN_HIDEREADONLY,strFileFilter);
    //修改默认打开路径
    Dlg.m_ofn.lpstrInitialDir=_T("D:\\IcManage");
    if(Dlg.DoModal()==IDOK)
    {             
        m_FILE=Dlg.GetFileName();
        PathName=Dlg.GetPathName();
        UpdateData(FALSE);
    }
    string mathFileAddress(PathName.GetBuffer());
    CString **getMathData = GetExcelData(mathFileAddress);
    PathName.ReleaseBuffer();
    int mathRowNum = row_num;

    //创建输出的Yes.xls和No.xls文件
    BasicExcel eYes,eNo;
    BasicExcelWorksheet *sheetYes,*sheetNo;
    char bufYes[200],bufNo[200];
    CString   yesName,noName; 
    string yesAddress("D:\\IcManage\\yes.xls");
    string noAddress("D:\\IcManage\\no.xls");
    yesName.Format("%s", yesAddress.c_str());
    noName.Format("%s", noAddress.c_str());
    int k;
    for(k=0;k<yesName.GetLength();k++)
        bufYes[k]=yesName.GetAt(k);
    bufYes[k]=0;
    for(k=0;k<noName.GetLength();k++)
        bufNo[k]=noName.GetAt(k);
    bufNo[k]=0;

    eYes.Load(bufYes);
    eNo.Load(bufNo);
    eYes.New(1);
    eNo.New(1);
    r1 = 0;
    r2 = 0;
    sheetYes = eYes.GetWorksheet("Sheet1");
    sheetNo = eNo.GetWorksheet("Sheet1");

    string tmp_yes,tmp_no;
    for(int j = 0;j<3;j++)
    {
        string s(getLibData[0][j].GetBuffer());
        if(j==2)
            tmp_yes.append("");
        tmp_yes.append(s);
        tmp_yes.append(" ");
        tmp_no.append(s);
        tmp_no.append(" ");
    }
    tmp_no.append("\0");
    tmp_yes.append("需要数量");
    tmp_yes.append("\0");
    CString newCstring;
    newCstring.Format("%s", tmp_no.c_str());
    sheetFlag = 0;
    fenxi(newCstring,sheetNo);
    sheetFlag = 1;
    newCstring.Format("%s", tmp_yes.c_str());
    fenxi(newCstring,sheetYes);

    //匹配
    multimap<string,int>::iterator mapIter;
    for(int i = 1;i<mathRowNum;i++)
    {
        string tmp1(getMathData[i][0].GetBuffer());
    //    mapIter = libMap.find(tmp1);
        mapIter = FindNew(libMap.begin(),libMap.end(),tmp1);
        if(mapIter == libMap.end())//没找到
        {
            string tmp;
            for(int j = 0;j<3;j++)
            {
                string s(getMathData[i][j].GetBuffer());
                tmp.append(s);
                if(j<2)
                    tmp.append(" ");
                getMathData[i][j].ReleaseBuffer();
            }

//            tmp.append("\0");
            CString newCstring;
            newCstring.Format("%s", tmp.c_str());
            sheetFlag = 0;
            fenxi(newCstring,sheetNo);
        }
        else//找到
        {
            int pos = (*mapIter).second;
            string tmp;
            int j;
            for(j = 0;j<3;j++)
            {
                string s(getLibData[pos][j].GetBuffer());
                tmp.append(s);
//                if(j<2)
                tmp.append(" ");
                getLibData[pos][j].ReleaseBuffer();
            }
            string s(getMathData[i][j].GetBuffer());
            tmp.append(s);
            getMathData[i][j].ReleaseBuffer();
//            tmp.append("\0");
            CString newCstring;
            newCstring.Format("%s", tmp.c_str());
            sheetFlag = 1;
            fenxi(newCstring,sheetYes);
        }
        getMathData[i][0].ReleaseBuffer();
    }
    for(int i=0; i<libRowNum; i++)
    {
        delete[] getLibData[i];
    }

    delete[] getLibData;
    for(int i=0; i<mathRowNum; i++)
    {
        delete[] getMathData[i];
    }

    delete[] getMathData;
    eYes.SaveAs(bufYes);
    eNo.SaveAs(bufNo);
    AfxMessageBox("匹配完成!");
  //打开某exe进程 ShellExecute(NULL,
"open", "D:\\IcManage\\close.exe", NULL, NULL, SW_SHOWNORMAL); DestroyWindow(); AfxPostQuitMessage(0); exit(0); }

 

posted on 2014-12-09 12:06  tractorman  阅读(2003)  评论(0编辑  收藏  举报

导航