VS2017,MFC对WPS下Excel表格的操作

VS2017,MFC对WPS下Excel表格的操作

1、添加Excel类库

1、在菜单栏的“项目”->“添加新项目”->MFC下的Type Liabrary  选择 mircosoft  excel....可看到对应的dll文件路径,从文件夹中添加。
主要用到以下几个类:
 _Application:表示整个的Excel应用程序,包含一个工作簿集合

  Workbooks:工作簿集合,包含N个工作簿(Workbook)

  _Workbook:工作簿,包含一个工作表(sheets)集合

  Worksheets:工作表集合,包含N个工作表

  _Worksheet:工作表,也就是我们在Excel中看到的Sheet1、Sheet2、Sheet3,它是我们操作Excel的基本单位

  Range:这是单元格的集合,我们知道Excel是由一个个的单元格组成的,通过Range来操作单元格

  Font:用于设置单元格的字体、颜色、字号、粗体设置

  Interior:设置底色

  Boards:设置区域内所有单元格的边框,如果要设置一组区域的外边框的话用Rang->BorderAround设置
  下面举个我自己的例子进行说明

2、COM库初始化

	通常在App的InitInstance()里面加入初始化和关闭COM库的操作,在DoModal()调用之前加入初始化的代码:
	

if (!AfxOleInit())
	{
		AfxMessageBox(_T("注册COM出错!"));
		return FALSE;
	}

3、Excel.tlh报大量错误

因为加载的类与vs本身自带的起了冲突。解决办法:
1,注释掉每个头文件的
#import “C:\Program Files\Microsoft Office\Office12\EXCEL.EXE” no_namespace,

2,在添加的头文件中每个里面都加入#include

3,然后在CRange.h中的 VARIANT DialogBox() 改成 VARIANT _DialogBox()

4.在stdafx.h文件中,添加

    #include "CApplication.h"  
    #include "CRange.h"  
    #include "CWorkbook.h"  
    #include "CWorkbooks.h"  
    #include "CWorksheet.h"  
    #include "CWorksheets.h"  
     #include"CFont0.h"
    #include"Cnterior.h"
 	 #include"CBorder.h"

4、代码演示一些操作

在.h中定义一些全局变量。

CApplication app;
CWorkbooks books;
CWorkbook book;
CWorksheets sheets;
CWorksheet sheet;
CRange range;
LPDISPATCH lpDisp;
COleVariant vResult;

CString str = _T("");

在*dlg.cpp文件中进行操作

打开Excel表格,进行一系列对象的初始化:

void CFirstWorkDlg::OpenExcel(CString szFileName,INT iSheet)
{
	if (!app.CreateDispatch(_T("Excel.Application"), NULL))
	{
		AfxMessageBox(_T("Create Excel service failure!"));
		return;
	}

	// 设置为FALSE时,后面的app.Quit();注释要打开  
	// 否则EXCEL.EXE进程会一直存在,并且每操作一次就会多开一个进程  
	app.put_Visible(FALSE);
	books.AttachDispatch(app.get_Workbooks(), true);
	/*
	*   打开一个工作簿。
	*   Excel 2000 只需要13个参数就行,Excel 2003需要15个参数
	*/
	lpDisp = books.Open(szFileName,
		covOptional, covOptional, covOptional, covOptional,
		covOptional, covOptional, covOptional, covOptional,
		covOptional, covOptional, covOptional, covOptional,
		covOptional, covOptional);
	ASSERT(lpDisp);

	book.AttachDispatch(lpDisp);

	// 得到Worksheets    
	sheets.AttachDispatch(book.get_Worksheets(), true);

	// 得到Worksheet  
	sheet.AttachDispatch(sheets.get_Item(_variant_t(iSheet)));

	// 得到全部Cells   
	//range.AttachDispatch(sheet.get_Cells(), true);
}

按钮单击事件函数,读取Excel表格内容并放到ListControl控件中

 void CFirstWorkDlg::OnBnClickedRead()
{
	CFileDialog fileDlg(TRUE, _T("(*.xls)|*.xls"), NULL,
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		_T("Material File(*.xls)|*.xls||"), this);
	CString szFileName;
	if (fileDlg.DoModal() == IDOK)
	{
		szFileName = fileDlg.GetPathName();
	}
	//CString szFileName = _T("C:\\Users\\Administrator\\Desktop\\ENGDATA.xls");
	INT iSheet = 1;
	OpenExcel(szFileName,iSheet);

	m_list.DeleteAllItems();
	

	CRange oCurSel;
	range.AttachDispatch(sheet.get_UsedRange());

	range.AttachDispatch(range.get_Rows());
	long row = range.get_Count();

	range.AttachDispatch(range.get_Columns());
	long col = range.get_Count();

	range.AttachDispatch(sheet.get_Cells(), true);
	for (int i = 1; i <= row; ++i)
	{
		for (int j = 1; j <= col; ++j)
		{
			oCurSel.AttachDispatch(range.get_Item(_variant_t((long)i), _variant_t((long)j)).pdispVal);
			vResult = oCurSel.get_Text();
			//VARIANT res = oCurSel.get_Text();
			//CString strRes = res.bstrVal;
			str = vResult.bstrVal;

			if (1 == i)
				m_list.InsertColumn(j-1, str, LVCFMT_CENTER, 100, -1);
			else if (1 == j)
				m_list.InsertItem(i-2, str);
			else
				m_list.SetItemText(i-2,j-1, str);
			/*
			switch (vResult.vt)
			{
			case VT_BSTR:       // 字符串  
				str = vResult.bstrVal;
				break;
			case VT_R8:         // 8字节的数字  
				str.Format(_T("%f"), vResult.dblVal);
				break;
			case VT_DATE:       // 时间格式  
				SYSTEMTIME st;
				VariantTimeToSystemTime(vResult.date, &st);
				break;
			case VT_EMPTY:      // 单元格空的  
				str = "";
				break;
			}
			*/
			
		}
	}
	CloseExcel(); 
}

释放对象。

 void CFirstWorkDlg::CloseExcel()
    {
    //	book.Save();                    // 保存Excel的内容  
    //  app.put_DisplayAlerts(true);    // 弹出对话框询问是否保存  
    	app.Quit();                     // 退出  
    
    	//释放对象    
    	range.ReleaseDispatch(); 
    	sheet.ReleaseDispatch();
    	sheets.ReleaseDispatch();
    	book.ReleaseDispatch();
    	books.ReleaseDispatch();
    	app.ReleaseDispatch();
    }

5、其他对Excel表格的操作可参考另一位仁兄的博客

https://blog.csdn.net/mars_xiaolei/article/details/79077480

上面就是一些对于Excel的基本操作,如果有什么问题希望大家能够指出!

你可能感兴趣的:(MFC,MFC,Excel,VS2017)