MFC 导入EXCEL到数据库

void TaskDlg::importExcel(CString filePathName)

{

    //开始导入操作

    //定义变量

    CApplication m_appExcel;       // Excel应用程序

    CWorkbooks m_books;

    CWorkbook m_book;

    CWorksheets m_sheets; 

    CWorksheet m_sheet;

    CRange m_range;          //选择范围



    LPDISPATCH lpDisp = NULL;

    // TODO: 在此添加控件通知处理程序代码

    // 初始化Com

    if (::CoInitialize( NULL ) == E_INVALIDARG)

    {

        MessageBox(L"初始化Com失败!");

    }



    // 启动Excel

    if ( !m_appExcel.CreateDispatch(_T("Excel.Application"), NULL))

    {

        MessageBox(_T("创建Excel失败!"));

        ::CoUninitialize();

    }



    ///*判断当前Excel的版本*/

    //CString strExcelVersion = m_appExcel.get_Version();

    //int iStart = 0;

    //strExcelVersion = strExcelVersion.Tokenize(_T("."), iStart);

    //if (_T("10") == strExcelVersion)

    //{

    //    AfxMessageBox(_T("当前Excel的版本是2002。"));

    //}

    //else if (_T("11") == strExcelVersion)

    //{

    //    AfxMessageBox(_T("当前Excel的版本是2003。"));

    //}

    //else if (_T("12") == strExcelVersion)

    //{

    //    AfxMessageBox(_T("当前Excel的版本是2007。"));

    //}

    //else if (_T("14") == strExcelVersion)

    //{

    //    AfxMessageBox(_T("当前Excel的版本是2010。"));

    //}

    //else

    //{

    //    AfxMessageBox(_T("当前Excel的版本是其他版本。"));

    //}

    //m_appExcel.put_Visible(TRUE);

    //m_appExcel.put_UserControl(FALSE);



    /*得到工作簿容器*/

    m_books.AttachDispatch(m_appExcel.get_Workbooks()); 

    /*打开一个工作簿*/

    CString strBookPath = filePathName;

    try

    {

        /*打开一个工作簿*/

        lpDisp = m_books.Open(strBookPath, 

            vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,

            vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, 

            vtMissing, vtMissing, vtMissing, vtMissing);

        m_book.AttachDispatch(lpDisp);

    }

    catch(...)

    {

        AfxMessageBox(L"Excel打开失败,请重新操作!");

        return;

    }

    m_sheets.AttachDispatch(m_book.get_Sheets());



    int sheetIndex = 1;//sheetIndex = 1表示任务表,sheetIndex = 2表示条码表

    for (sheetIndex = 1; sheetIndex <= 2; sheetIndex++)

    {

        try

        {

            /*打开一个已有的Sheet*/

            lpDisp = m_sheets.get_Item(_variant_t((short)sheetIndex));

            m_sheet.AttachDispatch(lpDisp);

        }

        catch(...)

        {

            AfxMessageBox(L"Sheet%d未找到,请重新操作!", sheetIndex);

            return;

        }



        // 读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列

        CRange usedRange;

        usedRange.AttachDispatch(m_sheet.get_UsedRange());

        m_range.AttachDispatch(usedRange.get_Rows());

        long iRowNum = m_range.get_Count();                  //已经使用的行数



        m_range.AttachDispatch(usedRange.get_Columns());

        long iColNum = m_range.get_Count();                  //已经使用的列数



        if (iRowNum <= 1)

        {

            AfxMessageBox(L"当前选择的Excel中没有要导入的数据!");

            return;

        }



        COleVariant vResult;

        int i,j=0;

        ////标题行 check the title

        //for (j=1; j<iColNum; j++)

        //{

        //    m_range.AttachDispatch(m_sheet.get_Cells());

        //    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)1 ),COleVariant((long)j)).pdispVal );

        //    vResult =m_range.get_Value2();

        //    CString  str1 = vResult.bstrVal;

        //}

        vector<_ParameterPtr> para;//参数

        try

        {

            //开启事务

            dbAccess->conn->BeginTrans();

            //任务表

            if (sheetIndex == 1)

            {

                //查询本地数据库中已经存在的任务ID

                set<CString> existTaskIds;//数据库中已存在的任务ID

                CString strExistSQL = L"SELECT C_ID FROM tab_task";

                _RecordsetPtr m_ExistRecodeSet = dbAccess->ExecuteReader((LPCTSTR)strExistSQL, para, adCmdText);

                while(!m_ExistRecodeSet->adoEOF)

                {

                    CString existTaskId;

                    _variant_t var = m_ExistRecodeSet->GetCollect(_variant_t((long)0));

                    if (var.vt != VT_NULL)

                        existTaskId = var.bstrVal;

                    existTaskIds.insert(existTaskId);

                    m_ExistRecodeSet->MoveNext();

                }



                int cstatus = 0;

                int cpriority = 0;

                int cgroupNum = 0;

                CString cid = L"";

                CString cmachine = L"";    

                CString ccustom = L"";

                CString cspecial = L"";

                CString cmodel = L"";

                CString cwriteTime = L"";

                CString cmodulus = L"";

                CString cbatteryPlate = L"";

                CString cbattery = L"";

                CString cassemble = L"";

                CString cchargingGroup = L"";



                //vector<_ParameterPtr> para;//参数

                CString strTaskSQL_tmp = L"INSERT INTO tab_task (c_id, c_status, c_machine, c_priority, c_custom, c_special, c_model, c_write_datetime, c_group_num, c_modulus, c_battery_plate, c_battery, c_assemble, c_charging_group)";

                strTaskSQL_tmp.Append(L" VALUES (%s, %d, %s, %d, %s, %s, %s, %s, %d, %s, %s, %s, %s, %s)");

                //数据行

                for ( i=2; i<= iRowNum; i++)

                {

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)1)).pdispVal );//任务ID

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                    {

                        cid = vResult.bstrVal;

                        // 判断本地数据库中是否已经存在当前任务,如果存在,无需导入

                        if (existTaskIds.find(cid) != existTaskIds.end())

                            continue;

                    }



                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)3)).pdispVal );//打标日期

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                        cwriteTime = vResult.bstrVal;

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)4)).pdispVal );//打标机器

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                        cmachine = vResult.bstrVal;

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)6)).pdispVal );//客户

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                        ccustom = vResult.bstrVal;

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)7)).pdispVal );//型号

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                        cmodel = vResult.bstrVal;

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)8)).pdispVal );//系数

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                        cmodulus = vResult.bstrVal;

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)9)).pdispVal );//组数

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                        cgroupNum = (int) vResult.dblVal;

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)10)).pdispVal );//专用

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                        cspecial = vResult.bstrVal;

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)12)).pdispVal );//电池类型

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                        cbattery = vResult.bstrVal;

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)13)).pdispVal );//极板

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                        cbatteryPlate = vResult.bstrVal;

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)14)).pdispVal );//装配类型

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                        cassemble = vResult.bstrVal;

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)15)).pdispVal );//充电机组

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                        cchargingGroup = vResult.bstrVal;



                    //插入到本地Access

                    CString strTaskInsertSQL;//insert语句

                    strTaskInsertSQL.Format(strTaskSQL_tmp, L"'"+ cid + L"'", cstatus, L"'"+ cmachine + L"'", cpriority, L"'"+ ccustom + L"'", L"'"+ cspecial + L"'", L"'"+ cmodel + L"'",  L"'"+ cwriteTime + L"'", cgroupNum, L"'"+ cmodulus + L"'", L"'"+ cbatteryPlate + L"'", L"'"+ cbattery + L"'", L"'"+ cassemble + L"'", L"'"+ cchargingGroup + L"'");

                    dbAccess->ExecuteNonQuery((LPCTSTR)strTaskInsertSQL, para, adCmdText);    

                }

            }

            //条码表

            else if (sheetIndex == 2)

            {

                ////查询本地数据库中已经存在的任务ID

                //set<CString> existTaskIds;//数据库中已存在的任务ID

                //CString strExistSQL = L"SELECT COUNT(*) FROM tab_barcode WHERE C_BARCODE_ID ='" + barCodeTaskId + "'";

                //_RecordsetPtr m_ExistRecodeSet = dbAccess->ExecuteReader((LPCTSTR)strExistSQL, para, adCmdText);

                //variant_t vCount = m_ExistRecodeSet->GetCollect(_variant_t((long)0));

                //if (vCount.lVal == 0)

                //    return;//没有记录,返回



                CString barCodeTaskId = L"";

            

                long csxm = 0;//顺序码

                CString cid = L"";

                int cstatus = 0;

                CString ctaskId = L"";

                CString cplainCode = L"";

                CString csecretCode = L"";



                //vector<_ParameterPtr> para;//参数

                CString strBarCodeSQL_tmp = L"INSERT INTO tab_barcode (c_barcode_id, c_taskid, c_status, c_plain_code, c_secret_code, c_sxm, c_inputdate) VALUES (%s, %s, %d, %s, %s, %d, date())";

                //数据行

                for ( i=2; i<= iRowNum; i++)

                {

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)5)).pdispVal );//条码ID

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                        cid = vResult.bstrVal;

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)1)).pdispVal );//任务ID

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                    {

                        ctaskId = vResult.bstrVal;

                        if (barCodeTaskId == ctaskId)

                        {

                            csxm = csxm + 1;//相同任务的任务的条码累加

                        }else

                        {

                            barCodeTaskId = ctaskId;

                            csxm = 1;//不同的任务的条码从1开始

                        }

                    }

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)2)).pdispVal );//明码

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                        cplainCode = vResult.bstrVal;

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)3)).pdispVal );//暗码

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                        csecretCode = vResult.bstrVal;

                    m_range.AttachDispatch(m_sheet.get_Cells());

                    m_range.AttachDispatch(m_range.get_Item (COleVariant((long)i),COleVariant((long)4)).pdispVal );//打标状态

                    vResult = m_range.get_Value2();

                    if (vResult.vt!=VT_NULL)

                        cstatus = (int) vResult.dblVal;

                



                    //插入到本地Access

                    CString strBarCodeInsertSQL;//insert语句

                    //插入到本地Access

                    strBarCodeInsertSQL.Format(strBarCodeSQL_tmp, L"'"+ cid + L"'", L"'"+ ctaskId + L"'", cstatus, L"'"+ cplainCode + L"'", L"'"+ csecretCode + L"'", csxm);

                    dbAccess->ExecuteNonQuery((LPCTSTR)strBarCodeInsertSQL, para, adCmdText);

                }



            }

            //提交事务

            dbAccess->conn->CommitTrans();

        }catch (...)

        {

            AfxMessageBox(L"操作失败,数据回滚!");

            dbAccess->conn->RollbackTrans();



        }

    }

    

    //绑定数据列表

    DataListBind();



    /*释放资源*/

    m_sheet.ReleaseDispatch();

    m_sheets.ReleaseDispatch();

    m_book.ReleaseDispatch();

    m_books.ReleaseDispatch();

    m_appExcel.Quit();

    m_appExcel.ReleaseDispatch();

    

}

 

你可能感兴趣的:(Excel)