MFC 如何使用已经读入的Excel数据

rngming 2019-04-11 11:10:19
已经用相应的程序,将指定的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;
};


想使用这个数据的话可以直接调用这个函数嘛?
...全文
417 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
量子 2019-04-28
  • 打赏
  • 举报
回复
数据不是特别多的话,一次性把数据都读出来,自己设计数据结构保存起来。
如果数据特别多的话,分批读取使用
tiger波波 2019-04-11
  • 打赏
  • 举报
回复
引用 3 楼 rngming 的回复:
每次我想添加调用这个函数的实例时候,编译执行后就会出现这样的现象
你单步调试啊,这个函数没几行,你一行行执行,看到了哪一行出错。
rngming 2019-04-11
  • 打赏
  • 举报
回复

每次我想添加调用这个函数的实例时候,编译执行后就会出现这样的现象
待续_1006 2019-04-11
  • 打赏
  • 举报
回复
我目前用的读写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进程,后续解决.用下面方式读取没问题

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}

tiger波波 2019-04-11
  • 打赏
  • 举报
回复
不建议使用这个函数。你不能读一次数据就打开一次excel,很慢的,可以定义一个函数,一次性把所有的数据都读出来。 调试时到哪停止了?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧