已經用相應的程式,將指定的Excel表格讀入。但是現在想使用這個資料,我的想法是編輯了一個函式,但是除錯程序中總是停止作業,本人MFC剛剛接觸,求大佬幫助,下面附上原始碼。
打開Excel的代碼
int DuQu(int i, int j)
{
//獲取檔案路徑
BOOL isOpen = TRUE; //是否打開(否則為保存)
CString defaultDir = L"E:\\論文"; //默認打開的檔案路徑
CString fileName = L"\\信號機資料表.xlsx"; //默認打開的檔案名
//CString filter = L"檔案 (*.doc; *.ppt; *.xlsx)|*.doc;*.ppt;*.xlsx||"; //檔案過慮的型別
//CFileDialog openFileDlg(isOpen, defaultDir, fileName, OFN_HIDEREADONLY | OFN_READONLY, filter, NULL);
//openFileDlg.GetOFN().lpstrInitialDir = L"E:\\論文\\信號機資料表.xlsx";
//INT_PTR result = openFileDlg.DoModal();
CString filePath = defaultDir + "\\信號機資料表.xlsx";
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
books = app.get_Workbooks();
//打開Excel,其中pathname為Excel表的路徑名
lpDisp = books.Open(filePath, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);
book.AttachDispatch(lpDisp);
sheets = book.get_Worksheets();
sheet = sheets.get_Item(COleVariant((short)1));
CString CellName;
//獲取任意單元格的值
CellName.Format(_T("c%d"), i, j); //A–Z 65-90
range = sheet.get_Range(COleVariant(CellName), COleVariant(CellName));
//獲得單元格的內容
COleVariant rValue;
rValue = COleVariant(range.get_Value2());
rValue.ChangeType(VT_I4);
int A;
A = rValue.intVal;
//book.put_Saved(TRUE);
//app.Quit();
return A;
};
想使用這個資料的話可以直接呼叫這個函式嘛?
uj5u.com熱心網友回復:
不建議使用這個函式。你不能讀一次資料就打開一次excel,很慢的,可以定義一個函式,一次性把所有的資料都讀出來。除錯時到哪停止了?
uj5u.com熱心網友回復:
我目前用的讀寫excel代碼,希望能幫到你bool CDlgMakeBatchTitle::readExcelData(CString strFileName)
{
// TODO: Add your control notification handler code here
if( !app.CreateDispatch("Excel.Application") )
{
CommonFile::AddSystemLog("readExcelData 函式報錯,無法創建Excel應用!");
MessageBox("無法創建Excel應用!");
return false;
}
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
///////////////////////////////////讀取excel測驗/////////////////////////////////////////////////////////////
books = app.get_Workbooks();
//books.AttachDispatch(app.get_Workbooks())作用和上面一樣
//打開Excel,其中pathname為Excel表的路徑名
lpDisp = books.Open(strFileName,covOptional ,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional);
book.AttachDispatch(lpDisp);
sheets = book.get_Worksheets();
//sheets.AttachDispatch(book.get_Sheets(),true);
sheet = sheets.get_Item(COleVariant((short)1));
//sheet.AttachDispatch(sheets.get_Item(COleVariant((short)1)),TRUE);
//獲得execl資料行數和列數
CRange usedRange;
CRange mRange;
usedRange.AttachDispatch(sheet.get_UsedRange());
mRange.AttachDispatch(usedRange.get_Rows(),true);
int countRow = mRange.get_Count();
//mRange.AttachDispatch(usedRange.get_Columns(),true);
//int countColumn = mRange.get_Count();
usedRange.ReleaseDispatch();
mRange.ReleaseDispatch();
//如果界面輸入的截止行數大于excel臺賬資料的實際行數則取實際資料行
if (m_nEndRow>countRow)
{
m_nEndRow = countRow;
}
m_sumRow = m_nEndRow - m_nStartRow;
//讀取第一個單元格的值
//range.AttachDispatch(sheet.get_Cells());
int cloumn = 2;
CString strTemp("");
COleVariant vResult;
//行數和列數可以后續在界面填寫,防止讀錯誤導致死回圈
while(m_nStartRow < m_nEndRow)
{
while (true)
{
range.AttachDispatch(sheet.get_Cells());
range.AttachDispatch(range.get_Item(COleVariant((long)m_nStartRow), COleVariant((long)cloumn)).pdispVal);
vResult = range.get_Value2();
if (vResult.vt == VT_BSTR) //字串
{
strTemp = vResult.bstrVal;
}
else if (vResult.vt == VT_R8) //8位元組的數字
{
if (4 == cloumn)
{
//地塊資料不存在小數點
strTemp.Format(_T("%0.0f"), vResult.dblVal);
}
else
{
strTemp.Format(_T("%0.2f"), vResult.dblVal);
}
}
else
{
strTemp= "";
}
if (strTemp.GetLength() <= 0)
{
break;
}
if (2== cloumn)
{
m_map_Every_info["戶主姓名"] = strTemp;
}
else if (3== cloumn)
{
m_map_Every_info["家庭成員"] = strTemp;
}
else if (4== cloumn)
{
m_map_Every_info["地塊數"] = strTemp;
}
else if (5== cloumn)
{
m_map_Every_info["承包面積"] = strTemp;
}
else if (6== cloumn)
{
m_map_Every_info["承包期限"] = strTemp;
}
else if (7== cloumn)
{
m_map_Every_info["證書編號"] = strTemp;
}
else if (8== cloumn)
{
m_map_Every_info["身份證號碼"] = strTemp;
}
else if (9== cloumn)
{
m_map_Every_info["所屬村組"] = strTemp;
}
cloumn++;
}
m_vec_Result.emplace_back(m_map_Every_info);
m_map_Every_info.clear();
m_nStartRow++;
cloumn= 2;
range.AttachDispatch(sheet.get_Cells());
range.AttachDispatch(range.get_Item(COleVariant((long)m_nStartRow), COleVariant((long)cloumn)).pdispVal);
vResult = range.get_Value2();
if (vResult.vt == VT_BSTR) //字串
{
strTemp = vResult.bstrVal;
}
else if (vResult.vt == VT_R8) //8位元組的數字
{
strTemp.Format(_T("%0.2f"), vResult.dblVal);
}
else
{
strTemp= "";
}
if (strTemp.GetLength() <= 0)
{
break;
}
}
books.Close();
app.Quit();
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();
return true;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//range.AttachDispatch(sheet.get_Range(_variant_t("A1"),_variant_t("D1")),TRUE);
//CString tmps = range.get_Item(_variant_t((long)4),_variant_t((long)7));//讀取資料-----------------------------------不自動關閉excel行程,后續解決.用下面方式讀取沒問題
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
uj5u.com熱心網友回復:

每次我想添加呼叫這個函式的實體時候,編譯執行后就會出現這樣的現象
uj5u.com熱心網友回復:
你單步除錯啊,這個函式沒幾行,你一行行執行,看到了哪一行出錯。
uj5u.com熱心網友回復:
資料不是特別多的話,一次性把資料都讀出來,自己設計資料結構保存起來。如果資料特別多的話,分批讀取使用
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/48558.html
標籤:基礎類
