VisualCpp之旅4-visual studio 2010 读取Excel

【整理】Dword、LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR:  https://www.cnblogs.com/goed/archive/2011/11/11/2245702.html

1、新建MFC application工程,改为dialog based

2、http://www.cnblogs.com/xianyunhe/archive/2011/09/25/2190485.html

project>MFC Class Wizard 红色箭头找到add class from typelib 然后添加选excel 添加类

excel接口

导入类

头文件

说明

_Application

CApplicaton

Application.h

Excel应用程序。

Workbooks

CWorkbooks

Workbooks.h

工作簿的容器,里面包括了Excel应用程序打开的所有工作簿。

_Workbook

CWorkbook

Workbook.h

单个工作簿。

Worksheets

CWorksheets

Worksheets.h

单个工作簿中的Sheet表格的容器,包括该工作簿中的所有Sheet。

_Worksheet

CWorksheet

Worksheet.h

单个Sheet表格。

Range

CRange

Range.h

一定数量的单元格,可对单元格进行单个或多个单元格进行操作。

 可以在类视图中看到已经加上了这些类。

 

3、回到主界面,拖动一个button到上面,右击property,修改caption为 打开Excel文件,

增加点击的相应函数。右击打开class wizard

4、在ReadExcelDlg.cpp中引入这些.h,并将这些第三行的import直接注释掉

然后将CRange.h 335行改为VARIANT _DialogBox() 加一个下划线 避免了冲突 不然报错

 

5、多行缩进:

    首先,选中需要缩进的行代码:

    1、增大缩进:“Tab”键

    2、减小缩进:“Shift”键 + “Tab”键

复制以下代码段进入void CReadExcelDlg::OnClickedButton1()

	CFileDialog dlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,_T("excel (*.xlsx)|*.xlsx|excel (*.xls)|*.xls|All Files (*.*)|*.*|"),NULL);

	char buffer[255];
	GetCurrentDirectory(sizeof(buffer),(LPWSTR)buffer);//当前目录作为默认文件路径
	dlg.m_ofn.lpstrInitialDir = (LPWSTR)buffer;

	dlg.DoModal();

	CString strFileName=dlg.GetPathName();

    if(strFileName=="")
	{
		MessageBox(_T("还没有选择文件呢"));
		return;
	}
	 //MessageBox(strFileName);
	
	//复杂应用程序多个对象定义	
	CApplication app; 
	CWorkbook book;
	CWorkbooks books;
	CWorksheet sheet;
	CWorksheets sheets;
	CRange range;

	//创建Excel 服务器(启动Excel)
	if (!app.CreateDispatch(_T("Excel.Application")))
	{
		MessageBox(_T("启动失败"));
	}

	COleVariant vResult;//存放临时单元格内容
	COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	LPDISPATCH lpDisp;//结构体 用于单元格显示数据

	books.AttachDispatch(app.get_Workbooks()); //启动app, 打开books工作簿

	lpDisp = books.Open(strFileName, covOptional, covOptional,
		   covOptional, covOptional, covOptional, covOptional, covOptional, 
		   covOptional, covOptional, covOptional, covOptional, covOptional,
		   covOptional, covOptional);//为了获得工作簿是谁
	//得到Workbook    
	book.AttachDispatch(lpDisp);//通过lpDisp,打开book

	//得到Worksheets   
	sheets.AttachDispatch(book.get_Worksheets());//sheets
	sheet = sheets.get_Item(COleVariant((short)1));
	//得到当前活跃sheet 
	//如果有单元格正处于编辑状态中,此操作不能返回,会一直等待 
	lpDisp = book.get_ActiveSheet();
	sheet.AttachDispatch(lpDisp);
	//读取Cells信息   
	range.AttachDispatch(sheet.get_Cells());
	//第一变量是行,第二个变量是列,即第二行第一列
	range.AttachDispatch(range.get_Item(COleVariant((long)1), COleVariant((long)5)).pdispVal);   
    vResult = range.get_Value2();

	CString str;
	str = vResult.bstrVal;//bVal对数值进行处理
	//MessageBox(str);
	//为什么这里任务管理器里面还有Excel?

	
	//range.AttachDispatch(sheet.get_Cells());
	//range.AttachDispatch(range.get_Item(COleVariant((long)1), COleVariant((long)1)).pdispVal);   
 //   vResult = range.get_Value2();
	//str = vResult.bstrVal;
	//MessageBox(str);
	


	range.AttachDispatch(sheet.get_UsedRange());
	range.AttachDispatch(range.get_Rows());
	long iRow = range.get_Count(); //得到行数

	range.AttachDispatch(range.get_Columns());
	long iCol = range.get_Count();//得到列数
	//CString str;
	str.Format(_T("%ld行 %ld列"),iRow,iCol);
	//MessageBox(str);

	CString *name = new CString[iRow-1];
	int *depart = new int[iRow-1];
	CString *tel = new CString[iRow-1];

	MessageBox(_T("即将开始导入"));
	for(int i=2;i<=iRow;i++)
	{
		
		range.AttachDispatch(sheet.get_Cells());
		range.AttachDispatch(range.get_Item(COleVariant((long)i), COleVariant((long)6)).pdispVal);
		vResult = range.get_Value2();
		name[i-2] = vResult.bstrVal;
		
		//str = vResult.bstrVal;
		//MessageBox(str);

		range.AttachDispatch(sheet.get_Cells());
		range.AttachDispatch(range.get_Item(COleVariant((long)i), COleVariant((long)7)).pdispVal);
		vResult = range.get_Value2();
		depart[i-2] = (int)vResult.dblVal;//vResult.dblVal;
		//str.Format(_T("%d"),(int)vResult.dblVal);
		//MessageBox(str);

		int posi = 0;
		range.AttachDispatch(sheet.get_Cells());
		range.AttachDispatch(range.get_Item(COleVariant((long)i), COleVariant((long)12)).pdispVal);
		vResult = range.get_Value2();
		//tel[i-2].Format(_T("%f"),vResult.dblVal);
		//MessageBox(tel[i-2]);
		str.Format(_T("%f"), vResult.dblVal);
		posi = str.Find('.');
		tel[i-2] = str.Left(posi);
		//MessageBox(tel[i-2]);
	}

	//ListControl中展示数据
	int nItem = 0;//m_List.GetItemCount();
	CString de;//department用于转换,只有CString才可以传入控件中显示
	for(int i=1;i<iRow-1;i++)
	{		
		nItem = m_List.GetItemCount();//获得当前的行数
		m_List.InsertItem(nItem,_T(""));
		m_List.SetItemText(nItem,0,name[i]);
		de.Format(_T("%d"),depart[i]);
		m_List.SetItemText(nItem,1,de);
		m_List.SetItemText(nItem,2,tel[i]);
	}
	UpdateData(0);//UpdateData(FALSE)  拷贝 变量 值到控件显示。

	//退出
	range.ReleaseDispatch();
	sheet.ReleaseDispatch();
	sheets.ReleaseDispatch();
	book.ReleaseDispatch();
	books.ReleaseDispatch(); 
	app.Quit();
	app.ReleaseDispatch();

在ReadExcel.RC中建一个 List Control。改icon为Report形式。

在BOOL CDialogXLSDlg::OnInitDialog()中输入以下代码

	// TODO: 在此添加额外的初始化代码

	m_List.ModifyStyle(0L,LVS_SHOWSELALWAYS);
	DWORD dwStyle = m_List.GetExtendedStyle();
	dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
	dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的list control)
	dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
	m_List.SetExtendedStyle(dwStyle);

	m_List.InsertColumn(0,_T("姓名"),LVCFMT_CENTER,100);
	m_List.InsertColumn(1,_T("系"),LVCFMT_CENTER,50);
	m_List.InsertColumn(2,_T("联系方式"),LVCFMT_CENTER,200);

6、此项目基本完成。

【前言】 工作或学习中可能需要实现基于VC读\写Excel文件的功能,本人最近也遇到了该问题。中间虽经波折,但是最终还是找到了解决问题的办法。 在此跟大家分享,希望对跟我同样迷茫过的同学们有所帮助。 1、程序功能 1)打开一个excel文件; 2)显示到CListCtrl上; 3)新建一个Excel文件。 以上均在对话框中实现。 2、平台 VC++2010 3、实现方法 常用的Excel打开方式有两种 1)通过数据库打开; 2)OLE方式打开。 由于方式1)操作繁琐,经常出现莫名的错误,这里选用方式2). 4、准备步骤 首先新建一个Dialog窗体程序,添加list control和两个按钮 1)将ExcelLib文件夹拷贝到程序目录下; 2)将Export2Excel.h,Export2Excel.cpp两个文件添加到项目; 3)包含头文件,#include "ExcelLib/Export2Excel.h" 通过以上步骤在程序中引入了可以读取Excle文件的CExport2Excel类; 5、打开excel文件 通过按钮点击打开 void CExcelTestDlg::OnBnClickedButtonOpenExcel() { //获取文件路径 CFileDialog* lpszOpenFile; CString szGetName; lpszOpenFile = new CFileDialog(TRUE,"","",OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,"Excel File(*.xlsx;*.xls)|*.xls;*.xlsx",NULL); if (lpszOpenFile->DoModal()==IDOK) { szGetName = lpszOpenFile->GetPathName(); SetWindowText(szGetName); delete lpszOpenFile; } else return; //打开文件 //文件中包含多个sheet时,默认打开第一个sheet CExport2Excel Excel_example; Excel_example.OpenExcel(szGetName); //获取sheet个数 int iSheetNum = Excel_example.GetSheetsNumber(); //获取已使用表格行列数 int iRows = Excel_example.GetRowCount(); int iCols = Excel_example.GetColCount(); //获取单元格的内容 CString cs_temp = Excel_example.GetText(1,1); //AfxMessageBox(cs_temp); //List control上显示 //获取工作表列名(第一行) CStringArray m_HeadName; m_HeadName.Add(_T("ID")); for (int i=1;iGetItemCount()>0) { m_list.DeleteColumn(0); } //初始化ClistCtrl,加入列名 InitList(m_list,m_HeadName); //填入内容 //第一行是标题,所以从第2行开始 CString num; int pos; for (int row = 2;row<=iRows; row++) { pos = m_list.GetItemCount(); num.Format(_T("%d"),pos +1); m_list.InsertItem(pos,num); for (int colum=1;columDoModal()==IDOK) { szGetName = lpszOpenFile->GetPathName(); SetWindowText(szGetName); delete lpszOpenFile; } else return; //文件全名称 CString csFileName = szGetName; //需要添加的两个sheet的名称 CString csSheetName = "newSheet"; CString csSheetName2 = "newSheet2"; // 新建一个excel文件,自己写入文字 CExport2Excel Excel_example; //新建excel文件 Excel_example.CreateExcel(csFileName); //添加sheet,新加的sheet在前,也就是序号为1 Excel_example.CreateSheet(csSheetName); Excel_example.CreateSheet(csSheetName2); //操作最开始添加的sheet:(newSheet) Excel_example.SetSheet(2); //添加表头 Excel_example.WriteHeader(1,"第一列"); Excel_example.WriteHeader(2,"第二列"); //添加核心数据 Excel_example.WriteData(1,1,"数据1"); Excel_example.WriteData(1,2,"数据2"); //保存文件 Excel_example.Save(); //关闭文件 Excel_example.Close(); } 7、注意事项 1)一般单个Excel文件包含多个sheet,程序默认打开第一个; 2)指定操作sheet,使用Excel_example.SetSheet(2)函数; 3)打开文件时最左侧的sheet序号为1,新建excel时最新添加的sheet序号为1. 【后记】 本程序主要基于网络CSDN中---“Excel封装库V2.0”---完成,下载地址是:http://download.csdn.net/detail/yeah2000/3576494,在此表示感谢!同时, 1)在其基础上作了小改动,改正了几个小错误,添加了几个小接口; 2)添加了如何使用的例子,原程序是没有的; 3)详细的注释 发现不足之处,还请大家多多指教!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值