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();
    
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值