excel的内容导入到listcontrol

下面展示一些 `excel导入到listcontrol`。
CApplication0 app;
CWorkbooks0 books;
CWorkbook0 book;
CWorksheets0 sheets;
CWorksheet0 sheet;
CRange0 usedrange;

LPDISPATCH lpdisp;
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;

COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	if (!app.CreateDispatch(_T("Excel.Application")))    //创建接口对象
	{
		MessageBox(_T("无法启动Excel服务器"));
		return;
	}
	COleVariant	covOption((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
	
	books.AttachDispatch(app.get_Workbooks());
	lpdisp = books.Open(szGetName, covOption, covOption, covOption, covOption,
		covOption, covOption, covOption, covOption, covOption, covOption,
		covOption, covOption, covOption, covOption);	
	book.AttachDispatch(lpdisp);	
	sheets.AttachDispatch(book.get_Worksheets());	
	//range.AttachDispatch(sheet.get_Cells());
	//得到当前活跃sheet
	//如果有单元格正处于编辑状态,此操作不会返回,会一直等待
	lpdisp = book.get_ActiveSheet();
	sheet.AttachDispatch(lpdisp);
	usedrange.AttachDispatch(sheet.get_UsedRange());

	COleVariant vResult, vResult1;
	//读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列
	

	//取得已经使用的行数
	usedrange.AttachDispatch(usedrange.get_Rows());
	 rownum = usedrange.get_Count();

	//取得已经使用的列数
	usedrange.AttachDispatch(usedrange.get_Columns());
	 colnum = usedrange.get_Count();

	//取得已使用区域的起始行,从1开始
	long startrow = usedrange.get_Row();// range.get_Row();
	//取得已使用区域的起始列,从1开始
	long startcol = usedrange.get_Column(); //range.get_Column();
	//清空list控件内容



	m_show_answer.DeleteAllItems();
	for (int i = startrow; i <= rownum; i++)
	{
		//先插入行首,即首列元素
		
		usedrange.AttachDispatch(sheet.get_Cells());
		usedrange.AttachDispatch(usedrange.get_Item(_variant_t((long)i + 1),
			_variant_t((long)startcol)).pdispVal);
		vResult = usedrange.get_Value2();
		CString strread, stry0, strm0, strd0;
		SYSTEMTIME st0;
		//判断读入的类型
		if (vResult.vt == VT_BSTR)     //若是字符串
		{
			strread = vResult.bstrVal;
		}
		else if (vResult.vt == VT_R8) //8字节的数字
		{
			strread.Format(_T("%f"), vResult.dblVal);
		}
		else if (vResult.vt == VT_DATE) //时间格式
		{
			VariantTimeToSystemTime(vResult.date, &st0);
			stry0.Format(_T("%d"), st0.wYear);
			strm0.Format(_T("%d"), st0.wMonth);
			strd0.Format(_T("%d"), st0.wDay);
			strread = stry0 + L"-" + strm0 + L"-" + strd0;
		}
		else if (vResult.vt == VT_EMPTY) //单元为空
		{
			strread = L"";
		}
		else if (vResult.vt == VT_I4)
		{
			strread.Format(_T("%ld"), (int)vResult.lVal);
		};
		m_show_answer.InsertItem(i, strread);

		//插入后面元素
		for (int j = startcol + 1; j <= colnum; j++)
		{
			//读取单元格的值
			usedrange.AttachDispatch(sheet.get_Cells());
			usedrange.AttachDispatch(usedrange.get_Item(_variant_t((long)i + 1),
				_variant_t((long)j)).pdispVal);
			vResult1 = usedrange.get_Value2();
			CString str, stry, strm, strd;
			SYSTEMTIME st;
			if (vResult1.vt == VT_BSTR)     //若是字符串
			{
				str = vResult1.bstrVal;
			}
			else if (vResult1.vt == VT_R8) //8字节的数字
			{
				str.Format(_T("%f"), vResult1.dblVal);
			}
			else if (vResult1.vt == VT_DATE) //时间格式
			{
				VariantTimeToSystemTime(vResult1.date, &st);
				stry.Format(_T("%d"), st.wYear);
				strm.Format(_T("%d"), st.wMonth);
				strd.Format(_T("%d"), st.wDay);
				str = stry + L"-" + strm + L"-" + strd;
			}
			else if (vResult1.vt == VT_EMPTY) //单元为空
			{
				str = L"";
			}
			else if (vResult1.vt == VT_I4)
			{
				str.Format(_T("%ld"), (int)vResult1.lVal);
			}
		
			m_show_answer.SetItemText(i - 1, j - 1, str);
			usedrange.ReleaseDispatch();
			usedrange.ReleaseDispatch();
		}
		usedrange.ReleaseDispatch();
		usedrange.ReleaseDispatch();
	}
	
	
	sheet.ReleaseDispatch();
	sheets.ReleaseDispatch();
	book.ReleaseDispatch();
	books.ReleaseDispatch();
	app.Quit();
	app.ReleaseDispatch();
    usedrange.ReleaseDispatch();
	//MessageBox(_T("读取成功"));
	return;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值