下面展示一些 `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;