VS2008中导入EXCEL文件数据(Unicode版本下)

来源:互联网 发布:日立n3000知乎 编辑:程序博客网 时间:2024/06/08 02:20

1. 操作Excel文件初始化: 

  • project->add class->MFC class from typelib (项目->添加类->Typelib中的MFC类)导入Excel.exe,一般都在C:/Program Files/Microsoft Office/Office12路径下(即选择你的office安装路径下的excel.exe加入)
  • 选中以下几项_Application,_WorkSheet,_WorkBook,WorkSheets,WorkBooks,Range,然后导入;
  • 导入后自动在工程中添加CApplication,CWorkSheet,CWorkBook,CWorkSheets,CWorkBooks,CRange这些类;
然后需要把这些类的头文件中的第一句话 #import ".......EXCEL.EXE" nonamespace 删除;

引入之后如果编译遇到错误,Not enough actual parameters for macro ''DialogBoxW''. 让人头疼!

解决方法是在CRange类中,

1 VARIANT DialogBox()
2 {
3 VARIANT result;
4 InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT,(void*)&result, NULL);
5 return result;
6 }

DialogBox()前面添加下划线变成_DialogBox(),解决了!

3.操作excel文件

在“资源”里面选择MFC自动建立的对话框,双击“打开”按钮(若没有就自己做一个),然后程序会将你到对这个按钮的函数里,在函数中写如下内容: (文件是CxxxDlg.cpp  xxx是你的项目名称)

在头文件中包含:

1 #include "CApplication.h"
2 #include "CRange.h"
3 #include "CWorkbook.h"
4 #include "CWorkbooks.h"
5 #include "CWorksheet.h"
6 #include "CWorksheets.h"
程序代码如下:

void CReadExcelDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码


CApplication app;  
CWorkbooks books;  
CWorkbook book;  
CWorksheets sheets;  
CWorksheet sheet;  
CRange range;  
CRange iCell;  
LPDISPATCH lpDisp;  
COleVariant vResult;  
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); 


CoInitialize(NULL);

 
if(!app.CreateDispatch(L"Excel.Application"))  
{  
AfxMessageBox(L"无法启动Excel服务器!");  
return;  
}  
books.AttachDispatch(app.get_Workbooks());  




lpDisp = books.Open(GetAppPath()+_T("\\控制字换算.xls"),covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional,covOptional);  
        
//得到Workbook  
book.AttachDispatch(lpDisp);  

//得到Worksheets  
sheets.AttachDispatch(book.get_Worksheets());  
    
CString strSheetName = _T("内792");
lpDisp = sheets.get_Item(_variant_t(strSheetName));
    sheet.AttachDispatch(lpDisp);


// sheet = sheets.get_Item(COleVariant((short)6));   //得到指定sheet






//得到当前活跃sheet  
//如果有单元格正处于编辑状态中,此操作不能返回,会一直等待  
// lpDisp=book.get_ActiveSheet();  
// sheet.AttachDispatch(lpDisp);
//读取第一个单元格的值  
range.AttachDispatch(sheet.get_Cells());  
range.AttachDispatch(range.get_Item (COleVariant((long)183),COleVariant((long)10)).pdispVal );  
/*COleVariant*/ vResult =range.get_Value2();  
CString str;  
if(vResult.vt == VT_BSTR) //字符串  
{  
str=vResult.bstrVal;  
}  
else if (vResult.vt==VT_R8) //8字节的数字  
{  
str.Format(L"%f",vResult.dblVal);  
}   
// else if(vResult.vt==VT_DATE) //时间格式 
//
//    SYSTEMTIME st; 
//    VariantTimeToSystemTime(&vResult.date, &st); 
//     } 
else if(vResult.vt==VT_EMPTY) //单元格空的 

    str=""; 
    }    
books.Close();   
app.Quit();             // 退出  
//释放对象    
range.ReleaseDispatch();  
sheet.ReleaseDispatch();  
sheets.ReleaseDispatch();  
book.ReleaseDispatch();  
books.ReleaseDispatch();  
app.ReleaseDispatch();  
MessageBox(str);  


// 注销COM库
CoUninitialize();
}




CString CReadExcelDlg::GetAppPath()
{
wchar_t lpFileName[MAX_PATH];
GetModuleFileName(AfxGetInstanceHandle(),lpFileName,MAX_PATH);


CString strFileName = lpFileName;
int nIndex = strFileName.ReverseFind ('\\');


CString strPath;


if (nIndex > 0)
strPath = strFileName.Left (nIndex);
else
strPath = "";
return strPath;
}

0 0
原创粉丝点击