MFC读取Excel文件+数据处理+写入Excel

MFC读取Excel文件+数据处理+写入Excel在日常编程的过程中 我们经常会遇到需要读写文件的操作 当然 最好的选择是数据库来进行读写 但是由于数据库使用环境的要求 比如某些数据库要求必须安装数据库软件后才能使用 同时 要进行数据库操作需要对 SQL 语句有一定的了解 门槛相对较高 所以我们有时需要用 EXCEL 来代替简单的数据库操作 对于 MFC 连接数据库并进行对应操作 可以参考之前的博客 MFC 以 ADO 方式连接 ACCESS 数据库今天主要介绍

在日常编程的过程中,我们经常会遇到需要读写文件的操作,当然,最好的选择是数据库来进行读写,但是由于数据库使用环境的要求(比如某些数据库要求必须安装数据库软件后才能使用),同时,要进行数据库操作需要对SQL语句有一定的了解,门槛相对较高,所以我们有时需要用EXCEL来代替简单的数据库操作,对于MFC连接数据库并进行对应操作,可以参考之前的博客:MFC以ADO方式连接ACCESS数据库

今天主要介绍MFC连接Excel的操作方法(包含Excel打开、读取、数据操作、和生成新文件),话不多说,先上程序效果图:

需要下载程序源码的请点击这里

这里特别感谢两个程序源码,从中受益匪浅,博主主要使用了2中提供的修正版的“Excel封装库V2.0”以及1中的存文件部分代码:

1、MFC List Control控件内容导出成Excel

2、MFC读取Excel文件

MFC读取Excel文件+数据处理+写入Excel

MFC读取Excel文件+数据处理+写入Excel

 程序示例中我们采用的是OLE方式对数据库进行操作

准备步骤:

接下来就是分别介绍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;i<=iCols;i++) { CString m_content = Excel_example.GetText(1,i); m_HeadName.Add(m_content); } //清空ClistCtrl m_list.DeleteAllItems(); while(m_list.GetHeaderCtrl()->GetItemCount()>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); //加法 if (int colum =1) { CString num; CString show; num= Excel_example.GetText(row, colum) ; int mid_num = atoi(num); mid_num = mid_num + 2; show.Format("%d", mid_num); m_list.SetItemText(pos, colum, show); } //减法 if (int colum =2) { CString num; CString show; num = Excel_example.GetText(row, colum); int mid_num = atoi(num); mid_num = mid_num -2; show.Format("%d", mid_num); m_list.SetItemText(pos, colum, show); } //乘法 if (int colum = 3) { CString num; CString show; num = Excel_example.GetText(row, colum); int mid_num = atoi(num); mid_num = mid_num* 2; show.Format("%d", mid_num); m_list.SetItemText(pos, colum, show); } //除法 if (int colum = 4) { CString num; CString show; num = Excel_example.GetText(row, colum); float mid_num = atof(num); mid_num = mid_num /2.0; show.Format("%0.1f", mid_num); m_list.SetItemText(pos, colum, show); } } //关闭Excel文件 Excel_example.Close(); }

接下来是对于List Control中内容的保存操作:

void CExcelTestDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 CFileDialog FileDialog(FALSE, "xls", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Microsoft Excel 2000(*.xls)|*.xls|所有文件(*.*)"), this); if (FileDialog.DoModal() != IDOK) { return; } CString cStrFile = FileDialog.GetPathName(); //选择保存路径名称 if (::PathFileExists(cStrFile)) DeleteFile(cStrFile); //CString cStrFile = _T("E:\\myexcel.xls"); COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); CApplication app; //Excel程序 CWorkbooks books; //工作簿集合 CWorkbook book; //工作表 CWorksheets sheets; //工作簿集合 CWorksheet sheet; //工作表集合 CRange range; //使用区域 CoUninitialize(); book.PrintPreview(_variant_t(false)); if (CoInitialize(NULL) == S_FALSE) { MessageBox("初始化COM支持库失败!"); return; } if (!app.CreateDispatch(_T("Excel.Application"))); //创建IDispatch接口对象 { //MessageBox(_T("Error!")); } books = app.get_Workbooks(); book = books.Add(covOptional); sheets = book.get_Worksheets(); sheet = sheets.get_Item(COleVariant((short)1)); //得到第一个工作表 CHeaderCtrl *pmyHeaderCtrl = m_list.GetHeaderCtrl(); //获取表头 int m_cols = pmyHeaderCtrl->GetItemCount(); //获取列数 int m_rows = m_list.GetItemCount(); //获取行数 TCHAR lpBuffer[256]; HDITEM hdi; //This structure contains information about an item in a header control. This structure has been updated to support header item images and order values. hdi.mask = HDI_TEXT; hdi.pszText = lpBuffer; hdi.cchTextMax = 256; CString colname; CString strTemp; int iRow, iCol; for (iCol = 0; iCol 
  
    GetItem(iCol, &hdi); //获取表头每列的信息 range.put_Value2(COleVariant(hdi.pszText)); //设置每列的内容 int nWidth = m_list.GetColumnWidth(iCol) / 6; //得到第iCol+1列 range.AttachDispatch(range.get_Item(_variant_t((long)(iCol + 1)), vtMissing).pdispVal, true); //设置列宽 range.put_ColumnWidth(_variant_t((long)nWidth)); } range = sheet.get_Range(COleVariant(_T("A1 ")), COleVariant(colname)); range.put_RowHeight(_variant_t((long)50));//设置行的高度 range.put_VerticalAlignment(COleVariant((short)-4108));//xlVAlignCenter = -4108 COleSafeArray saRet; //COleSafeArray类是用于处理任意类型和维数的数组的类 DWORD numElements[] = { m_rows, m_cols }; //行列写入数组 saRet.Create(VT_BSTR, 2, numElements); //创建所需的数组 range = sheet.get_Range(COleVariant(_T("A2 ")), covOptional); //从A2开始 range = range.get_Resize(COleVariant((short)m_rows), COleVariant((short)m_cols)); //表的区域 long index[2]; for (iRow = 1; iRow <= m_rows; iRow++)//将列表内容写入EXCEL { for (iCol = 1; iCol <= m_cols; iCol++) { index[0] = iRow - 1; index[1] = iCol - 1; CString szTemp; szTemp = m_list.GetItemText(iRow - 1, iCol - 1); //取得m_list控件中的内容 BSTR bstr = szTemp.AllocSysString(); //The AllocSysString method allocates a new BSTR string that is Automation compatible saRet.PutElement(index, bstr); //把m_list控件中的内容放入saRet SysFreeString(bstr); } } range.put_Value2(COleVariant(saRet)); //将得到的数据的saRet数组值放入表格 book.SaveCopyAs(COleVariant(cStrFile)); //保存到cStrFile文件 book.put_Saved(true); books.Close(); // book.ReleaseDispatch(); books.ReleaseDispatch(); app.ReleaseDispatch(); app.Quit(); } 
  

这里,保存文件需要配合封装类GetCellName使用,函数代码:

void CExcelTestDlg::GetCellName(int nRow, int nCol, CString &strName) { int nSeed = nCol; CString strRow; char cCell = 'A' + nCol - 1; strName.Format(_T("%c"), cCell); strRow.Format(_T("%d "), nRow); strName += strRow; } 

好了,这就是简单的MFC对于Excel文件的操作,如果你需要更多的操作如:

创建表、设置是否显示 “是否保存对文件的修改”的对话框、设置指定列的列宽、设置自动适应列宽、设置当前活动表、首行冻结、首行颜色、在指定的行和列显示文本、合并单元格、获取合并单元格信息、公式读写操作、设置边框、设置单元格“文本”格式、设置对齐方式、设置字体、保存Excel文件、关闭Excel操作、创建图表......

请参考:基于VC++的Excel封装库2.0 最新版

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204402.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午8:22
下一篇 2026年3月19日 下午8:23


相关推荐

  • LVS 负载均衡详解 + NAT 集群构建

    LVS 负载均衡详解 + NAT 集群构建文章目录一 企业群集应用概述 1 集群的含义 2 企业应用中的问题 3 企业群集的分类 1 负载均衡集群 LoadBalanceC 2 高可用群集 HighAvailabi 3 高性能运算群集 HighPerforma 4 负载均衡群集架构一 企业群集应用概述 1 集群的含义 群集 Cluster 也可称为集群 是由多台主机构成 但对外只表现为一个整体 只提供一个访问入口 域名或 IP 地址 相当于一

    2026年3月26日
    2
  • php setscale,ming_setscale「建议收藏」

    php setscale,ming_setscale「建议收藏」[#1]mabuzzerathotmaildotcom[2002-03-1310:58:56]ming_setscale()setsthescaleoftheoutputSWF.InsidetheSWFfile,coordinatesaremeasuredinTWIPS,ratherthanPIXELS.Thereare20TWIPSin…

    2022年10月20日
    5
  • html滑动解锁,js实现滑动解锁效能(PC+Moblie)

    html滑动解锁,js实现滑动解锁效能(PC+Moblie)js实现滑动解锁功能(PC+Moblie)实现效果:css样式代码略。html代码:页面上导入了jquery.mobile、jquerySlidetoconfirmIamhuman!js代码:window.onload=function(){varslider1=newSlider();slider1.Init();///屏幕大小发生改变时触发$(window).res…

    2022年6月18日
    34
  • 蓝牙硬件简介

    蓝牙硬件简介蓝牙硬件模块由蓝牙协议栈的无线收发器 RF 基带控制器 BB 和链路管理层 LMP 组成 大多数生产厂家都是利用片上系统技术 SOC System On Chip 将这三层功能模块集嵌在同一块芯片上 它由微处理器 CPU 无线收发器 RF 基带控制器 BB 静态随机存储器 SRAM 闪存 Flash 程序存储器 通用异步收发器 UART 通用串行接口 USB 语音编 解码器 CODEC

    2026年3月17日
    1
  • C语言文件操作(含详细步骤)

    C语言文件操作(含详细步骤)文章目录一 为什么使用文件 二 什么是文件 1 程序文件 2 数据文件 3 文件名三 文件的打开和关闭 1 文件指针 2 文件的打开和关闭 4 文件的顺序读写一 为什么使用文件 当我们在编写一个项目的时候 自然而然想到要把之前写入的数据保存起来 而只有我们自己选择删除数据的时候 数据才不复存在 这就涉及到了数据持久化的问题 我们一般数据持久化的方法有 把数据存放在磁盘文件 存放到数据库等方式 此处我们就讲到如何将数据放入到磁盘文件当中 二 什么是文件 磁盘上的文件就是文件 例如电脑当中的 C 盘内放入的文件夹内

    2026年3月19日
    2
  • 文心一言在AIGC领域的10大创新应用场景

    文心一言在AIGC领域的10大创新应用场景

    2026年3月12日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号