【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地址