C++ MFC 导出ListControl数据到Excel

2023-11-20

一、导入对应的类()
二、开启线程

void CLDITxtQueryDlg::OnBnClickedBnExportToXLS()
{
	// TODO: 在此添加控件通知处理程序代码
	if(ui_ListCtrlDataResult.GetItemCount()==0)
	{
		MessageBox("抱歉,查询结果中没有数据,不能导出!");
		return ;
	}
	CString newFileName="";
	SYSTEMTIME st = { 0 };
	GetLocalTime(&st);
	newFileName.Format(g_curQueryDataResult.m_strExportFileName+"%d-%02d-%02d %02d%02d%02d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
	CFileDialog dlg(FALSE,_T("(*.xlsx)"),_T(newFileName),OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT, _T("(*.*)|*.xlsx||"),NULL);
	if (dlg.DoModal() == IDOK)
	{
		//获取路径
		CString strFileName=dlg.GetPathName();
		g_curQueryDataResult.m_strExportFileName=strFileName;
		/*测试线程*/
		exportPro.dCurNum=0;
		exportPro.nExportState=0;
		exportPro.dTotalNum=ui_ListCtrlDataResult.GetItemCount();
		CEPorgressDlg epdlg;
		AfxBeginThread(ExportToExcel,this);//申请一个进程来执行方法,也就是主程序处理代码。
		epdlg.DoModal();
		/*结束*/
		MessageBox("    导出成功!");
	}
}

三、调用方法

UINT CLDITxtQueryDlg::ExportToExcel(LPVOID pParam)
{
	CLDITxtQueryDlg* pDlg = (CLDITxtQueryDlg*)pParam;
	//获取路径
	CString strFile=g_curQueryDataResult.m_strExportFileName;
	//获取listcontrol数据导出
	COleVariant covTrue((long)TRUE),covFalse((long)FALSE),covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	CApplication app;
	CWorkbooks books;
	CWorkbook book;
	CWorksheets sheets;
	CWorksheet sheet;
	CRange range;
	CRange cols;
	CFont0 font;
	//创建Excel 办事器(启动Excel)
	if (!app.CreateDispatch(_T("Excel.Application")))
	{
		pDlg->MessageBox(_T("创建失败!"));
		return 0;
	}
	//app.put_Visible(TRUE);//设置表可见性
	//app.put_DisplayFullScreen(FALSE);//设置全屏显示
	app.put_DisplayAlerts(FALSE);//屏蔽警告
	//获取一个新的workbook.
	books = app.get_Workbooks();
	book = books.Add(covOptional);
	sheets = book.get_Worksheets();
	sheet = sheets.get_Item(COleVariant((long)1));
	

	CHeaderCtrl *pmyHeaderCtrl;
	pmyHeaderCtrl = pDlg->ui_ListCtrlDataResult.GetHeaderCtrl();//此句取得CListCtrl控件的列表头
	long iRow,iCol;
	long m_cols = pmyHeaderCtrl->GetItemCount();
	long m_rows = pDlg->ui_ListCtrlDataResult.GetItemCount();
	if(m_rows>1048576) 
	{
		m_rows=1048576;
		pDlg->MessageBox("查询结果超过excel的最大行数,超过部分数据将丢失!");
	}
	HDITEM hdi;
	TCHAR lpBuffer[256];
	bool fFound=false;
	hdi.mask=HDI_TEXT;
	hdi.pszText=lpBuffer;
	hdi.cchTextMax=256;
	CString colName;
	CString strTemp;
	if(g_curQueryDataResult.m_strExportFileName.Find("生产明细数据")>-1)
	{
		CString strHeader="序号,StartTM,EndTM,PN,SN,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col,col";
		vector<CString> vecHeader=Split(strHeader,",");
		m_cols=vecHeader.size();
		for(iCol=0;iCol<m_cols;iCol++)//将列表的标题头写入EXCEL
		{
			pDlg->GetCellName(1,iCol+1,colName);
			range = sheet.get_Range(COleVariant(colName),COleVariant(colName));
			pmyHeaderCtrl->GetItem(iCol,&hdi);
			range.put_Value2(COleVariant(vecHeader[iCol]));
			long nWidth = vecHeader.size()/4;
			//long nWidth=15;
			//得到第iCol+1列  
			range.AttachDispatch(range.get_Item(_variant_t((long)(iCol+1)),vtMissing).pdispVal,true);  
			//设置列宽 
			range.put_ColumnWidth(_variant_t((long)nWidth));
			//range.AutoFit();
			range.put_RowHeight(_variant_t(13.5));
		}
	}
	else
	{
		for(iCol=0;iCol<m_cols;iCol++)//将列表的标题头写入EXCEL
		{
			pDlg->GetCellName(1,iCol+1,colName);
			range = sheet.get_Range(COleVariant(colName),COleVariant(colName));
			pmyHeaderCtrl->GetItem(iCol,&hdi);
			range.put_Value2(COleVariant(hdi.pszText));
			long nWidth = pDlg->ui_ListCtrlDataResult.GetColumnWidth(iCol)/4;
			//得到第iCol+1列  
			range.AttachDispatch(range.get_Item(_variant_t((long)(iCol+1)),vtMissing).pdispVal,true);  
			//设置列宽 
			range.put_ColumnWidth(_variant_t((long)nWidth));
			//range.AutoFit();
			range.put_RowHeight(_variant_t(13.5));
		}
	}
	range = sheet.get_Range(COleVariant( _T("A1 ")),COleVariant(colName));
	range.put_RowHeight(_variant_t((long)14));//设置行的高度
	font = range.get_Font();
	font.put_Italic(_variant_t("Arial"));//
	font.put_Bold(covTrue);
	range.put_VerticalAlignment(COleVariant((long)-4108));//垂直对齐
	//range.put_HorizontalAlignment(COleVariant((long)-4108));//水平对齐
	COleSafeArray saRet;
	DWORD numElements[]={m_rows,m_cols};   
	saRet.Create(VT_BSTR,2,numElements);
	try
	{
		range = sheet.get_Range(COleVariant( _T("A2 ")),covOptional);
		range = range.get_Resize(COleVariant((long)m_rows),COleVariant((long)m_cols));
		long index[2];
		range = sheet.get_Range(COleVariant( _T("A2 ")),covOptional);
		range = range.get_Resize(COleVariant((long)m_rows),COleVariant((long)m_cols));
		if(g_curQueryDataResult.m_strExportFileName.Find("生产明细数据")>-1)
		{
			for(iRow = 1; iRow <= m_rows; iRow++)//将列表内容写入EXCEL
			{
				exportPro.dCurNum=iRow;
				for(iCol = 1;iCol<=m_cols;iCol++)  
				{
					index[0]=iRow-1;
					index[1]=iCol-1;
					CString szTemp;
					szTemp=g_curQueryDataResult.m_vecDataResult[iRow-1][iCol-1];
					BSTR bstr = szTemp.AllocSysString();
					saRet.PutElement(index,bstr);
					SysFreeString(bstr);
				}
			}
		}
		else
		{
			for(iRow = 1; iRow <= m_rows; iRow++)//将列表内容写入EXCEL
			{
				exportPro.dCurNum=iRow;
				for(iCol = 1;iCol<=m_cols;iCol++)  
				{
					index[0]=iRow-1;
					index[1]=iCol-1;
					CString szTemp;
					szTemp=pDlg->ui_ListCtrlDataResult.GetItemText(iRow-1,iCol-1);
					BSTR bstr = szTemp.AllocSysString();
					saRet.PutElement(index,bstr);
					SysFreeString(bstr);
				}
			}
		}
		range.put_Value2(COleVariant(saRet));
		//设置单元格格式
		range.put_RowHeight(_variant_t(13.5));//磅
		font = range.get_Font();
		font.put_Name(_variant_t("Arial"));//字体
		font.put_Size(_variant_t(10));
		 cols = range.get_EntireColumn();
			 cols.AutoFit();
	}
	catch(...)
	{
		TRACE("出现错误");
	}
	saRet.Detach();
	book.SaveCopyAs(COleVariant(strFile));
	book.put_Saved(true);
	exportPro.nExportState=1;
	book.ReleaseDispatch();  
	books.ReleaseDispatch();  
	app.Quit();
	app.ReleaseDispatch();
	pDlg->ShowWindow(true);
	return 0;
}

void CLDITxtQueryDlg::GetCellName(int nRow, int nCol, CString &strName)
{
	int nSeed = nCol;
	CString strRow;
	CString temp1;
	CString temp2;
	CString temp3;
	if((nCol-1)/26>0)//超过Z1,应该变成AA1,AB1
	{
		int c1=(nCol-1)/26-1;
		int c2=(nCol-1)%26;
		char cCell1='A'+c1;
		char cCell2='A'+c2;
		temp1.Format(_T("%c"), cCell1);
		temp2.Format(_T("%c"), cCell2);
		temp3.Format(_T( "%d "), nRow);
		strName=temp1+temp2+temp3;
	}
	else
	{
		char cCell = 'A' + nCol - 1;
		strName.Format(_T("%c"), cCell);
		strRow.Format(_T( "%d "), nRow);
		strName += strRow;
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ MFC 导出ListControl数据到Excel 的相关文章

随机推荐

  • Vue组件报错For recursive components, make sure to provide the “name“ option.

    在Vue的组件component学习中报错 Vue warn Unknown custom element
  • Fedora 10網卡消失的問題

    http itgroup blueshop com tw towns hc n convew i 6000 今天看到肉鬆Selinux的問題 想說來測試處理一下 將以備份出來的Fedora 10 VM拿出來用 啟動系統後 出現了一個怪問題
  • Python中的itertools.permutations(关键词:itertools/permutations)

    通俗地讲 就是返回可迭代对象的所有数学全排列方式 Python 2 7 12 default Nov 20 2017 18 23 56 GCC 5 4 0 20160609 on linux2 Type help copyright cre
  • python-测试代码

    目录 介绍 测试函数 单元测试和测试用例 可通过的测试 不能通过的测试 测试未通过时怎么办 添加新测试 测试类 各种断言方法 一个要测试的类 测试AnonymousSurvey类 方法setUp 介绍 在本章中你会学习如何使用Python模
  • jvm垃圾回收之Eden、S0、S1、Old的关系

    jvm垃圾回收之Eden S0 S1 Old的关系 https blog csdn net u012799221 article details 73180509
  • 解决win10系统 3dMax只能渲染一次的问题

    是不是很多人疑问为什么自己的电脑配置明明足够 但在3dMax正常运行过程中 渲染一次过后 3dMax便卡住不动了 只能重启解决 无形之中浪费了很多时间 近日 我在使用3dMax时也遇到了此问题 发现是因为win10的微软输入法与3dMax不
  • 解决request.getServletContext()方法报红问题

    getServletContext 方法是Servlet3 0添加的 所以需要引入3 0以上的jar包
  • Tomcat的context path

    本文章转载自 https www cnblogs com yanan7890 p 8329163 html tomcat server xml context path配置需要注意的事情 在tomcat下放个war包 假如我是这样配置ser
  • 代码生成二维码

    使用java生成二维码 前言 使用步骤 xml 生成二维码 二维码转url 总结 前言 Zxing Zxing 是一个开源的 Java 二维码扫描和生成库 由美国 Google 公司的一位开发者 Sean Owen 在 2006 年开发并发
  • 自动化测试——接口测试

    一 接口分类 1 内部接口 测试被测系统各个子模块之前的接口 或者测试被测系统提供给内部用户系统使用的接口 2 外部接口 被测系统调用外部的接口 系统对外提供的接口 接口测试重点 检查结论参数传递的正确性 输出结果的正确性及对各种异常情况的
  • 普通游戏显卡和专业图形显卡的区别

    搞图形设计的朋友应该都知道 显卡分为普通游戏显卡和专业图形显卡 有些人会错误的认为图形显卡比游戏显卡性能强 或者游戏显卡比图形显卡性能强 其实这两种显卡是没有可比性的 因为它们在功能设计上是有一定的区别 这里首先可以告诉大家游戏显卡和图形显
  • Linux学习--CentOS7.5

    CentOS7命令大全 Linux系统简介 Unix Linux发展史 Linux目录结构 树形结构 查看 切换以及创建目录 文本内容操作 grep工具 关机和重启 Linux命令 基本用法 ls list 使用通配符 mkdir 别名 g
  • 机器视觉毕业设计 深度学习人脸识别系统设计与实现 - opencv python

    文章目录 0 前言 1 机器学习 人脸识别过程 人脸检测 人脸对其 人脸特征向量化 人脸识别 2 深度学习 人脸识别过程 人脸检测 人脸识别 Metric Larning 3 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升
  • 时序预测

    时序预测 Matlab实现SO CNN BiGRU蛇群算法优化卷积双向门控循环单元时间序列预测 目录 时序预测 Matlab实现SO CNN BiGRU蛇群算法优化卷积双向门控循环单元时间序列预测 预测效果 基本介绍 程序设计 参考资料 预
  • Google Java编程风格指南

    http hawstein com posts google java style html 目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 这份文档是Google Java编程风格规范的完整定义
  • .inl文件

    背景 最近工作涉及到thrust库 看了半天也没找到一个头文件的函数定义 本来以为会有一个cpp源文件对应h头文件 后来问头文件的末尾发现了一个include lt inl gt 所以有必要了解这个文件组织形式 引用 作者 Return H
  • JSX、JSX的介绍、JSX特点、JSX的语法、XML基本语法

    1 JSX的介绍 什么是JSX JSX javascript xml就是Javascript和XML结合的一种格式 是 JavaScript 的语法扩展 只要你把HTML代码写在JS里 那就是JSX 在实际开发中 JSX 在产品 打包阶段
  • 自动驾驶路径规划与控制:讨论自动驾驶车辆的路径规划算法,如A*、Dijkstra等,以及控制策略,如PID控制等

    摘要 随着自动驾驶技术的快速发展 路径规划和控制算法在自动驾驶系统中扮演了越来越重要的角色 本文将探讨自动驾驶车辆的路径规划算法 如A 和Dijkstra 以及控制策略 如PID控制 同时 我们将引用相关论文 以便于深入了解这些技术的原理和
  • 中国互联网技术联盟推出国内首个“互联网+”资讯门户

    ITA1024中国互联网技术联盟7月正式推出专注 互联网 的资讯门户网站http abc ita1024 com 这也是国内首个专注于帮助中国企业有效落地 互联网 的服务平台 如果你是负责企业 互联网 转型战略的CEO CIO CFO CM
  • C++ MFC 导出ListControl数据到Excel

    一 导入对应的类 二 开启线程 void CLDITxtQueryDlg OnBnClickedBnExportToXLS TODO 在此添加控件通知处理程序代码 if ui ListCtrlDataResult GetItemCount