VC操作excel(读写操作)


1  安装有office2007以上版本的excel 


2.向项目工程中添加基本的7个类(Excel作为OLE/COM库插件,定义好了各类交互的接口,这些接口是跨语言的接口。VC可以通过导入这些接口,并通过接口来对Excel的操作),由于本文只关心对Excel表格中的数据的读取,主要关注7个接_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range、Font0。

    VS2012导入OLE/COM组件的接口的步骤为:项目->类向导->添加类->类型库中的MFC类(TypeLib中的MFC类),先选择要导入的组件所在的路径,即Excel.exe所在的路径,然后再选择要导入的Excel类型库中的接口。组件路径一般为C:\Program Files\Microsoft Office\Office15\EXCEL.exe;格式类似。

   导入后会在项目中自动导入相关类,使用时需要添加其头文件,主要的头文件有:
#include "CApplication.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"
#include "CRange.h"
  #include "CFont0.h"

    3. 导入之后需要“#import "C:\\Program Files\\Microsoft Office\\Office12\\EXCEL.EXE"  no_namespace”注释掉,然后添加头文件:#include <afxdisp.h>到上面7个文件中去。

    4.如果有错误error C2059双击error C2059,将VARIANT DialogBox()改成VARIANT _DialogBox() 再次编译,通过!!


void CMFCApplicationWriteExcelDlg::OnBnClickedButton3()
{
	/*
	1  安装有office2007以上版本的excel 

	2.向项目工程中添加基本的7个类(Excel作为OLE/COM库插件,定义好了各类交互的接口,
	这些接口是跨语言的接口。VC可以通过导入这些接口,并通过接口来对Excel的操作),由
	于本文只关心对Excel表格中的数据的读取,主要关注7个接_Application、Workbooks、
	_Workbook、Worksheets、_Worksheet、Range、Font0。

    VS2012导入OLE/COM组件的接口的步骤为:项目->类向导->添加类->类型库中的MFC类
	(TypeLib中的MFC类),先选择要导入的组件所在的路径,即Excel.exe所在的路径,然后再
	选择要导入的Excel类型库中的接口。组件路径一般为C:\Program Files\Microsoft Office
     \Office15\EXCEL.exe;格式类似。

   导入后会在项目中自动导入相关类,使用时需要添加其头文件,主要的头文件有:
	#include "CApplication.h"
	#include "CWorkbook.h"
	#include "CWorkbooks.h"
	#include "CWorksheet.h"
	#include "CWorksheets.h"
	#include "CRange.h"
  	#include "CFont0.h"

    3. 导入之后需要“#import "C:\\Program Files\\Microsoft Office\\Office12\\EXCEL.EXE" 
	no_namespace”注释掉,然后添加头文件:#include <afxdisp.h>到上面7个文件中去。

    4.如果有错误error C2059双击error C2059,将VARIANT DialogBox()改成VARIANT _DialogBox()
	再次编译,通过!!
	*/
	//默认使用第一个sheet
	int nSheetNumber=1;
	//创建对象
	CApplication app;

	
     if( !app.CreateDispatch(_T("Excel.Application")))
     {
		 AfxMessageBox("没有安装office2007以上版本,无法操作excel文件");
		 return ;
     }

	 //定义其他内部对象
	 CWorkbooks   books;
     CWorkbook    book;
     CWorksheets  sheets;
     CWorksheet   sheet;
	 CFont0 font;
	 CRange range;

	 CString FieldName,FieldValue;
     COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR); 

     books=app.get_Workbooks();
	
	 //需要在c盘建立一个excel文件,也可以改成系统自带的excel文件
    // book=books.Add(COleVariant("c:\\aa.xlsx"));
	 
     book = books.Add(covOptional); 
	 book.put_Title("Mybooks");
	
	 sheets=book.get_Sheets();	 
     sheet=sheets.get_Item(COleVariant((short)nSheetNumber));
	 sheet.put_Name("wxpSheet");
	 //---------------------
	 app.put_Visible(TRUE);//可见性
     app.put_UserControl(TRUE);//只读	

	  //设置标题
	  FieldName="a1";
	  FieldValue="数据A";
	  range=sheet.get_Range(COleVariant(FieldName),COleVariant(FieldName));
	  range.put_Value2(COleVariant(FieldValue));

	  FieldName="B1";
	  FieldValue="数据B";
	  range=sheet.get_Range(COleVariant(FieldName),COleVariant(FieldName));
	  range.put_Value2(COleVariant(FieldValue));

	  //填充数据-------------------------------------------------------
	  for(int row=1;row<10;++row)
	  {
		//每一行的数据 
		for(int col=0;col<10;++col)
		{
		  //放置自己的指定数据------------------------------
		  FieldName.Format("%c%d",'a'+col,(row+1));
		  FieldValue.Format("(%d,%d)",row+1,col+1);		 

		  range=sheet.get_Range(COleVariant(FieldName),COleVariant(FieldName));
		 // range.put_Value2(COleVariant(FieldValue));

		  range.put_Formula(_variant_t("=RAND()*100"));
		  range.put_NumberFormat(_variant_t("00.00"));		 

		   //设置隔行颜色
		   if(row %2==0)
		   {  
			   font=range.get_Font();
			   font.put_Bold(COleVariant((short)TRUE));
			   font.put_Color(COleVariant((long)RGB(255, 0, 0))); 
			   //  font.put_Name(COleVariant(_T("黑体")));	
		   }

		}//end of col
	  }//end of row

	  //设计计算公式,所有excel中的公式都可以使用-------------------------
	 
	  FieldName="a11";
	  range=sheet.get_Range(COleVariant(FieldName),COleVariant(FieldName));

	  range.put_Formula(COleVariant(_T("=sum(a2:a10")));
	 //自适应列宽度--------------------------------
	  CRange      cols;
      cols=range.get_EntireColumn();
      cols.AutoFit();

	  //::Sleep(5000);
	  //读取内容-----------------------------------------------------
	 FieldName="a11";

     range = sheet.get_Range(COleVariant(FieldName),COleVariant(FieldName));

     COleVariant cov = range.get_Value2();

     CString str="success";

	 cov.ChangeType(VT_BSTR);
	 str=cov.bstrVal;	

	 AfxMessageBox(str);

	 //------------------------------------------------------------------
	 //关闭excel文件,根据需要自行决定
	 books.Close();
     app.Quit();
     books.ReleaseDispatch();
     app.ReleaseDispatch();

   
}


猜你喜欢

转载自blog.csdn.net/sichuanpb/article/details/78083577