mfc对Excel的操作

mfc对Excel的操作

配置环境

首要条件:安装好Office

引入Excel资源类

在解决方案资源管理器中右击项目:添加->新建项
请添加图片描述

选择MFC->TypeLib中的MFC类
请添加图片描述

实现接口的位置选文件,位置选择EXCEL.EXE(从Office安装目录中找),实现接口选择_Application_Workbook_WorksheetRangeWorkbooksWorksheets
请添加图片描述

在解决方案资源管理器的头文件中会出现.h文件。
请添加图片描述

在项目的头文件下引入Excel类的头文件。

#include "CApplication.h"
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"

在刚引入的头文件中注释一下代码:

//#import "D:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" no_namespace

进入CRange.h文件中

将DialogBox改为_DialogBox

配置完成。

对Excel操作

从Excel中导入数据操作

Excel中的数据导入到List Control中显示出来。

// 按下导入数据按钮
void CDialogTest::ImportData()
{
	// 选择合适的文件读入数据
	//
	//设置过滤器
	TCHAR szFilter[] = _T("Excel文件(*.xls/*.xlsx)|*.xls*|所有文件(*.*)|*.*||");
	CFileDialog fileDlg(TRUE, _T("doc"), _T(""), OFN_OVERWRITEPROMPT, szFilter, this);
	CString sExcelFile;
	// 构造打开文件对话框
	if (IDOK == fileDlg.DoModal())
	{
		// 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径存储到strFilePath中
		sExcelFile = fileDlg.GetPathName();
		//MessageBox(sExcelFile, _T("Output")); // 输出打开文件所在的路径
	}

	if (sExcelFile == "") return;

	//读取Excel中的数据
	ReadAllItem(sExcelFile);
}

// 读出Excel所有内容,将其所有内容显示在list上
void CDialogTest::ReadAllItem(CString sExcelFile) // 读取Excel文本
{
	CApplication App;//创建应用实例
	CWorkbooks Books;//工作簿,多个Excel文件
	CWorkbook Book;//单个工作簿
	CWorksheets sheets;//多个sheets页面
	CWorksheet sheet;//单个sheet页面
	CRange range;//操作单元格
	CRange iCell;
	LPDISPATCH lpDisp;
	COleVariant vResult;  //COleVariant类是对VARIANT结构的封装
	COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);


	if (!App.CreateDispatch(_T("Excel.Application"), NULL))
	{
		AfxMessageBox(_T("无法启动Excel服务器!"));
		return;
	}


	Books.AttachDispatch(App.get_Workbooks());
	lpDisp = Books.Open(sExcelFile, covOptional, covOptional,
		covOptional, covOptional, covOptional, covOptional, covOptional,
		covOptional, covOptional, covOptional, covOptional, covOptional,
		covOptional, covOptional);


	//得到Workbook    
	Book.AttachDispatch(lpDisp);
	//得到Worksheets   
	sheets.AttachDispatch(Book.get_Worksheets());
	//得到当前活跃sheet 
	//如果有单元格正处于编辑状态中,此操作不能返回,会一直等待 
	lpDisp = Book.get_ActiveSheet();
	sheet.AttachDispatch(lpDisp);

	//获取行列号
	range = sheet.get_UsedRange();
	range = range.get_Rows();
	long rows = range.get_Count();
	range = range.get_Columns();
	long columns = range.get_Count();

	// 清空List数据
	m_List.DeleteAllItems(); //清空所有表项

	// 设置Id的值
	CString strSql = _T("select * from UserInfo;");

	CString strLastId;
	int lastId = RowToId[m_rows - 1] + 1;

	for (long i = 2; i < rows + 1; i++) // 从第二行开始读数据,第一行是表头的信息
	{
		CStringArray strListData; // 存储放在List中的Data信息

		for (long j = 1; j < columns + 1; j++)
		{
			range.AttachDispatch(sheet.get_Cells());
			range.AttachDispatch(range.get_Item(COleVariant(i), COleVariant((long)j)).pdispVal);   //第一变量是行,第二个变量是列,即第i行第j列
			vResult = range.get_Value2();
			CString str;
			if (vResult.vt == VT_BSTR) //字符串  
			{
				str = vResult.bstrVal;
				strListData.Add(str);
			}
			else if (vResult.vt == VT_R8) //8字节的数字  
			{
				str.Format(_T("%.lf"), vResult.dblVal);
				strListData.Add(str);
			}
			else // 若Excel有个单元格为空时会出现错误
			{
				strListData.Add(_T(""));
			}
		}
		m_List.InsertItem(i - 2, strListData[0]);
		m_List.SetItemText(i - 2, 1, strListData[1]);
		m_List.SetItemText(i - 2, 2, strListData[2]);
	}

	Books.Close();
	App.Quit();
	//释放对象      
	range.ReleaseDispatch();
	sheet.ReleaseDispatch();
	sheets.ReleaseDispatch();
	Book.ReleaseDispatch();
	Books.ReleaseDispatch();
	App.ReleaseDispatch();
}

将数据导出Excel操作

List Control的数据导入Excel

// 导出所有数据
void CDialogTest::ExportData(CString sExcelFile)
{
	COleVariant
		covTrue((short)TRUE),
		covFalse((short)FALSE),
		covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	CApplication app;
	CWorkbooks books;
	CWorkbook book;
	CWorksheets sheets;
	CWorksheet sheet;
	CRange range;
	if (!app.CreateDispatch(_T("Excel.Application")))
	{
		MessageBox(_T("创建失败!"));
		return;
	}
	books = app.get_Workbooks();
	book = books.Add(covOptional);
	sheets = book.get_Worksheets();             //得到books
	sheet = sheets.get_Item(COleVariant((short)1));
	//得到全部Cells
	range.AttachDispatch(sheet.get_Cells());
	CString sText[] = { _T("id"), _T("Account"), _T("Pass") };
	for (int setnum = 0; setnum < m_List.GetItemCount() + 1; setnum++)   //GetItemCount()列表的里面的条目数量, 横着的  行
	{
		for (int num = 0; num < 3; num++)
		{
			if (!setnum)
			{
				range.put_Item(_variant_t((long)(setnum + 1)), variant_t((long)(num + 1)),
					_variant_t(sText[num]));
			}
			else
			{
				range.put_Item(_variant_t((long)(setnum + 1)), _variant_t((long)(num + 1)),
					_variant_t(m_ListData.GetItemText(setnum - 1, num)));//GetItemText()获取第setnum-1行,num列的文本
			}
		}
	}
	//保存
	book.SaveCopyAs(COleVariant(sExcelFile));  //SaveCopyAs在strFile路径下保存为指定格式.xlsx的文件
	book.put_Saved(true);   //将Workbook的保存状态设置为已保存,即不让系统提示是否人工保存
	app.put_Visible(true);        //设置表可见性

	//释放对象
	range.ReleaseDispatch();
	sheet.ReleaseDispatch();
	sheets.ReleaseDispatch();
	book.ReleaseDispatch();
	books.ReleaseDispatch();
	app.ReleaseDispatch();
	app.Quit();
}
  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: VS2019 MFC操作Excel是一种常用的开发技术,可以通过使用MFC库中的一些功能和类来实现对Excel文件的读写操作。 首先,需要在工程中引入MFC库和所需的头文件,如afxwin.h、afxdisp.h等。 接下来,使用COleVariant类型的变量来打开Excel应用程序,并创建一个工作簿(Workbook)对象。例如: ```cpp CApplication excelApp; if (!excelApp.CreateDispatch(_T("Excel.Application"))) { AfxMessageBox(_T("Excel应用程序创建失败!")); return; } CWorkbooks workbooks = excelApp.GetWorkbooks(); CWorkbook workbook = workbooks.Add(); ``` 然后,通过获取工作簿中的工作表(Worksheets)对象,可以进行对工作簿的操作。例如: ```cpp CWorksheets worksheets = workbook.GetWorksheets(); CWorksheet worksheet = worksheets.GetItem(COleVariant((short)1)); //获取第一个工作表 Range range; //定义一个区域对象 range.AttachDispatch(worksheet.GetRange(COleVariant(L"A1"), COleVariant(L"C3"))); //获取A1到C3的单元格区域 COleVariant data(_T("Hello, Excel!")); //准备要写入的数据 range.put_Value2(data); //将数据写入区域 ``` 当需要读取Excel数据时,可以借助Worksheet对象的Cells属性和Range对象进行操作。例如: ```cpp CRange usedRange = worksheet.GetUsedRange(); //获取已使用的单元格范围 int rowCount = usedRange.GetRows().GetCount(); //获取行数 int columnCount = usedRange.GetColumns().GetCount(); //获取列数 for (int i = 1; i <= rowCount; i++) { for (int j = 1; j <= columnCount; j++) { CRange cell = worksheet.GetCells().GetItem(COleVariant(i), COleVariant(j)); //获取指定单元格 CString value = cell.GetValue(); //获取单元格的值 //对获取到的数据进行处理 } } ``` 最后,记得在不需要使用Excel时,调用相关的关闭和释放函数,以结束Excel应用程序的运行。例如: ```cpp workbook.SaveAs(COleVariant(L"test.xlsx")); //保存工作簿到文件 workbook.Close(); excelApp.Quit(); ``` 以上是使用VS2019 MFC操作Excel的基本方法,通过这些方法可以方便地对Excel文件进行读写操作,实现各种需求。 ### 回答2: VS2019 MFC操作Excel的基本步骤如下: 首先,我们需要在项目中引入MFC类库。在新建项目时,选择MFC应用程序,并在创建向导中勾选"使用MFC功能"。 接下来,我们需要添加Excel的头文件和库文件。在项目的stdafx.h文件中添加以下代码: ``` #include "afxdb.h" #include "afxdao.h" ``` 然后,在需要操作Excel的代码文件中,包含afxdao.h头文件,并定义以下变量: ``` CDatabase db; CDaoWorkspace workspace; CDaoDatabase* pDaoDB; CDaoRecordset rs; ``` 接着,我们需要创建一个Excel数据源。通过以下代码连接数据库: ``` CString strExcelFile = _T("C:\\path\\to\\excel.xls"); // 替换为实际的Excel文件路径 CString strConnect = _T("Excel 8.0;HDR=YES;IMEX=1;"); // 数据源连接字符串 db.Open(NULL, FALSE, FALSE, strConnect); pDaoDB = db.m_pDaoDatabase; ``` 通过以上代码,我们成功地连接了Excel文件,现在可以开始操作Excel表格了。 例如,我们可以执行下列操作来读取Excel文件中的数据: ``` rs.Open(db.OpenRecordset(_T("SELECT * FROM Sheet1")));//替换Sheet1为实际的工作表名称 while (!rs.IsEOF()) { CString strName; rs.GetFieldValue(_T("Name"), strName); // 读取Name列的数据 // 在这里处理读取到的数据 rs.MoveNext(); } rs.Close(); ``` 类似地,我们可以编写代码实现写入数据、修改数据等其他操作操作完成后,务必关闭数据库连接: ``` db.Close(); ``` 这样,我们就完成了在VS2019 MFC操作Excel的基本步骤。当然,在实际应用中,还可以根据具体需求进一步扩展功能。 ### 回答3: VS2019 MFC操作Excel的主要步骤如下: 首先,我们需要添加必要的头文件和库文件。在MFC应用程序的代码中,包含<afxdisp.h>和<atlbase.h>这两个头文件。此外,还需要在项目的属性中添加Microsoft.Office.Interop.Excel作为附加依赖项。 接下来,我们可以使用Excel应用程序对象进行操作。可以通过以下代码进行初始化: ``` _Application excelApp; if (!excelApp.CreateDispatch(L"Excel.Application")) { AfxMessageBox(L"无法启动Excel应用程序。"); return; } excelApp.put_Visible(TRUE); ``` 然后,我们可以打开一个工作簿并选择一个工作表进行操作。可以使用以下代码打开工作簿: ``` _Workbook excelWorkbook; excelWorkbook = excelApp.get_Workbooks().Open(L"C:\\Path\\To\\Workbook.xlsx"); ``` 接着,我们可以访问工作表中的单元格数据,并进行读取或写入操作。例如,可以使用下面的代码来读取A1单元格的数据并将其显示在MessageBox中: ``` _Range excelRange; excelRange = excelWorkbook.get_Worksheets().get_Item(1).get_Range(COleVariant(L"A1"), COleVariant(L"A1")); CString value = (LPCTSTR)excelRange.get_Value2().bstrVal; AfxMessageBox(value); ``` 最后,在完成操作后,我们应该关闭工作簿和Excel应用程序,释放相关资源。可以使用以下代码来关闭工作簿和Excel应用程序: ``` excelWorkbook.Close(FALSE); excelApp.Quit(); ``` 以上是使用VS2019 MFC操作Excel的基本步骤。在实际开发中,根据具体需求,还可以进行更多的操作,如新增工作表、格式化单元格、插入图表等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值