【MFC】学习MFC day4 vs2019 基于对话框的MFC应用程序&导出列表框控件(List Control)的数据到EXCEL文件

【MFC】学习MFC day4 vs2019 基于对话框的MFC应用程序&导出列表框控件(List Control)的数据到EXCEL文件

上一篇

今天的目标:

1、收集数据到列表框控件
2、列表框控件的数据导出到EXCEL文件(.xls)

开始:

今天的代码文件Github的链接我也会放在博客的底部哟
偷个懒,我将我上一篇博客的项目改了一下。
将三个对话框窗体的界面设置成下图
在这里插入图片描述

列表框(List Control)的设置

将List Control 控件的View属性设置为Report(报表模式)

BOOL CMFCDialogDlg::OnInitDialog()
{
	......
	// TODO: 在此添加额外的初始化代码
}

将下面的代码放到上面OnInitDialog()里面
以下代码是初始列表框的样式

	CRect mRect;
	mList1.GetWindowRect(&mRect);    //获取控件矩形区域
	int kuan = mRect.Width();
	mList1.InsertColumn(0, _T("姓名"), LVCFMT_CENTER, kuan/3, -1);//添加标题
	mList1.InsertColumn(1, _T("职务"), LVCFMT_CENTER, kuan / 3, -1);//添加标题
	mList1.InsertColumn(2, _T("自我介绍"), LVCFMT_CENTER, kuan / 3, -1);//添加标题

	DWORD dwStyle = mList1.GetExtendedStyle(); //获取当前扩展样式
	dwStyle |= LVS_EX_FULLROWSELECT; //选中某行使整行高亮(report风格时)
	dwStyle |= LVS_EX_GRIDLINES; //网格线(report风格时)
	dwStyle |= LVS_EX_CHECKBOXES; //item前生成checkbox控件
	mList1.SetExtendedStyle(dwStyle); //设置扩展风格

List Control类的成员函数列表(一部分):

int InsertItem(int nItem,LPCTSTR lpszItem)

nItem索引(从0开始;列表框标题不占索引) lpszItem 内容⬆

CString GetItemText(int nItem,int nSubItem)//nItem 索引 nSubItem子项索引(从0开始)

说人话就是:第nItem行 第nSubItem列⬆

BOOL SetItemText(int nItem,int nSubItem,LPTSTR lpszText)

这个就不用多说了吧,和上面对照来看就明白了⬆

int InsertColumn(int nCol,
                 LPCTSTR lpszColumnHeading,
                 int nFormat = LVCFMT_LEFT,
                 int nWidth = -1,
                 int nSubItem = -1
                )

这个就举个例子:mList1.InsertColumn(0, _T(“姓名”), LVCFMT_CENTER, kuan/3, -1);//添加标题

标题为 导出为EXECLE文件 的按钮的点击事件代码:

首先先在CMFCDialogDlg.h文件中引用以下头文件

#include<afxdb.h>  //用于建立数据库对象,包括CDatabase类
#include <odbcinst.h>
#pragma comment(lib,"odbc32.lib")
#pragma comment(lib,"odbccp32.lib")
#pragma comment(lib,"legacy_stdio_definitions.lib")
void CMFCDialogDlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码
	//导出数据到EXCEL
	CDatabase database;
	//CString sDriver = CString("MICROSOFT EXCEL DRIVER (*.XLS)"); // Excel安装驱动
	CString sDriver= GetExcelDriver(); // Excel安装驱动
	CString sExcelFile, sPath;
	CString sSql;
	//AfxMessageBox(GetExcelDriver());
	//获取主程序所在路径,存在sPath中
	//CString TopIndex;
	int ItemCount = this->mList1.GetItemCount();//获取列表项数量
	//TopIndex.Format(CString("%d"), this->mList1.GetItemCount());
	//AfxMessageBox(TopIndex);
	GetModuleFileName(NULL, sPath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
	sPath.ReleaseBuffer();
	int nPos;
	nPos = sPath.ReverseFind('\\');
	sPath = sPath.Left(nPos);
	sExcelFile=sPath + CString("\\test.xls");     // 要建立的Excel文件
	TRY
	{
		// 创建进行存取的字符串
		sSql.Format(CString("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"),sDriver, sExcelFile, sExcelFile);
	// 创建数据库 (既Excel表格文件)
	if (database.OpenEx(sSql,CDatabase::noOdbcDialog))
	{
		sSql.Format(CString("CREATE TABLE Exceldemo (%s TEXT,%s TEXT,%s TEXT)"),
			CString("名字"),
			CString("职务"),
			CString("自我介绍"));
		database.ExecuteSQL(sSql);
		for (int i = 0; i <=ItemCount-1;i++) {//索引从0开始所以需要ItemCount-1

			// 插入数值
			sSql.Format(CString("INSERT INTO Exceldemo (名字,职务,自我介绍) VALUES ('%s','%s','%s')"),
				CString(mList1.GetItemText(i,0)),
				CString(mList1.GetItemText(i, 1)),
				CString(mList1.GetItemText(i, 2))
			);
			database.ExecuteSQL(sSql);
		}
		// 创建表结构(名字、职务、自我介绍)
		
	}
	// 关闭数据库
	database.Close();
	AfxMessageBox(CString("Excel文件写入成功!")+ sExcelFile);
	}
		CATCH_ALL(e)
	{
		TRACE1("Excel驱动没有安装: %s", sDriver);
	}
	END_CATCH_ALL;
}

GetExcelDriver()函数的代码:

CString CMFCDialogDlg::GetExcelDriver()//读取EXCEL文件//检索是否安装有Excel驱动
{
	CString sDriver;
	TCHAR szDrivers[4096];
	memset(szDrivers, 0, sizeof(szDrivers));
	WORD wRet = 0;
	// 获取已安装驱动的名称(函数在odbcinst.h里)
	if (SQLGetInstalledDrivers(szDrivers, _countof(szDrivers), &wRet))
	{
		LPTSTR pszDrv = szDrivers;

		
		
		while (*pszDrv)
		{
			CString str = CString(pszDrv);
			CStringA StrA = static_cast<CStringA>(str);
			char* str2 = StrA.GetBuffer();
			//LPTSTR -> char*

			//MessageBox(pszDrv);
			if (strstr(str2, "Excel") != 0) {
				
				sDriver = CString(str2);
				return sDriver;
			}
			pszDrv += _tcslen(pszDrv) + 1;
		}
	}
}

最后效果图:

在这里插入图片描述

最后

感谢大家的翻阅

附加:

本篇博客的项目源代码文件的GitHub地址

猜你喜欢

转载自blog.csdn.net/m0_46202128/article/details/107800574