C++ MFC 导出ListControl数据到Excel

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

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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值