描述:
现在EXCEL会退出了,但我在从EXCEL读取记录的时候,发现如果EXCEL行比较少,比如两三行,读取成功,如果行数多了,比如10行,则会在读取时发生错误,错误如下:1017 dbgheap.c _BLOCK_TYPE_IS_VALID(pHead->nBlockuse),不知道什么原因,大侠们指点指点。
struct ItemData
{
LPTSTR* arrStrItem;
};
下面代码中的pid是我在class CCallLogAddDlg中定义的ItemData *pid对象。
void CCallLogAddDlg::OnButtonImport()
{
// TODO: Add your control notification handler code here
static char BASED_CODE szFilter[] =
"Excel Files (*.xls)|*.xls|All Files (*.*)|*.*||";
CFileDialog dlg(true,"xls",NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,this);
;
if ( dlg.DoModal() == IDOK )
{
_Application ExcelApp;
Workbooks workBooks;
_Workbook workBook;
Worksheets workSheets;
_Worksheet workSheet;
Range range;
COleException *e = new COleException;
try
{
if ( !ExcelApp.CreateDispatch("Excel.Application",e) )
{
// AfxMessageBox("创建Excel服务失败!");
// exit(1);
throw e;
}
}
catch ( COleDispatchException *e)
{
CString cStr;
if (!e->m_strSource.IsEmpty())
cStr = e->m_strSource + " - ";
if (!e->m_strDescription.IsEmpty())
cStr += e->m_strDescription;
else
cStr += "unknown error";
AfxMessageBox(cStr, MB_OK,
(e->m_strHelpFile.IsEmpty())? 0:e->m_dwHelpContext);
e->Delete();
}
catch (CException *e)
{
TRACE("%s(%d): OLE Execption caught: SCODE = %x",
__FILE__, __LINE__, COleException::Process(e));
e->Delete();
}
workBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);
workBook.AttachDispatch( workBooks.Add(
_variant_t(dlg.GetPathName())));
workSheets.AttachDispatch( workBook.GetWorksheets());
workSheet.AttachDispatch( workSheets.GetItem(
_variant_t("sheet1")),true);
range.AttachDispatch( workSheet.GetCells(),true);
ExcelApp.SetVisible(true);
_variant_t vData;
vData = range.GetItem(_variant_t(long(1)),
_variant_t(long(1)));
COleVariant temp;
int i = 2;
CString strVal;
CString str1;
char cCol;
for ( ; ; )
{
Range r;
cCol = 'A';
pid->arrStrItem = new LPTSTR[7];
str1.Format("A%d",i);
r = workSheet.GetRange(COleVariant(str1),vtMissing);
temp = r.GetValue();
strVal = (LPCTSTR)_bstr_t(temp);
if ( strVal == "" )
break;
pid->arrStrItem[0] = new char(strVal.GetLength()+1);
strcpy(pid->arrStrItem[0], strVal);
m_lstCallLogs.InsertItem(i-2,pid->arrStrItem[0]);
LV_ITEM lvitem;
lvitem.iItem = i-2;
lvitem.mask = LVIF_TEXT;
for ( int iCol = 1; iCol <= 6; iCol++ )
{
lvitem.iSubItem = iCol;
cCol += 1;
str1.Format("%c%d",cCol,i);
r = workSheet.GetRange(COleVariant(str1),vtMissing);
temp = r.GetValue();
if ( temp.vt != VT_BSTR )
{
HRESULT hr=::VariantChangeType(&temp,&temp,
VARIANT_NOUSEROVERRIDE|VARIANT_LOCALBOOL,VT_BSTR);
}
strVal=(LPCTSTR)_bstr_t(temp);
if ( strVal == "")
break;
pid->arrStrItem[iCol] = new char(strVal.GetLength() + 1);
strcpy(pid->arrStrItem[iCol], strVal);
lvitem.pszText = pid->arrStrItem[iCol];
m_lstCallLogs.SetItem(&lvitem);
}
// m_lstCallLogs.SetItemData
// ( i-2,reinterpret_cast<DWORD>(pid) );
i++;
}
// workBook.Save();
/////////////////////////////////////////修改如下
workBook.Close(COleVariant((short)false),vtMissing,vtMissing);
ExcelApp.Quit();
range.ReleaseDispatch();
workSheet.ReleaseDispatch();
workSheets.ReleaseDispatch();
workBook.ReleaseDispatch();
workBooks.ReleaseDispatch();
ExcelApp.ReleaseDispatch();
}
}