MFC读写Excel操作——遇到的问题

18 篇文章 1 订阅

前言

在MFC读写Excel表格时,稍微有一点点点的问题,都不能通过。甚至,仅仅是调整几行代码,也不能通过。把这些坑记录下来,分享出来。

坑-No.1

CString sDriver = L"Microsoft Excel Driver (*.XLS)";// 驱动

上面这句话是加载驱动的。我本想着自己写一遍,而不是粘贴别人的,为了加深印象。结果,Driver后面有一个英文空格,没有加上。导致失败:未发现数据源名称并且未指定默认驱动程序。

 

坑-No.2

sql = L"SELECT name,age,will FROM demo1";

......

recset.GetFieldValue(L"name",item1);
recset.GetFieldValue(L"age",item2);
recset.GetFieldValue(L"grade",item3);
recset.GetFieldValue(L"will",item4);

sql语句,与下面直接对应的获取数据语句不匹配,失败: 参数不足,期待是1。

所以,最好的是直接 :"SELECT * FROM demo"; 即使下面并不获取全部列,也没有关系。避免出错。 

 

坑-No.3

CString sFilename = L"E:\\prac\\test\\Debug\\test.xls";

 文件路劲没写对,导致:找不到对应的demo。或者sql语句中:sql = L"SELECT name,age,will FROM demo1";  这里是demo1而不是demo,造成这种错误。

坑-No.4

字段名或字段索引不正确。这个问题,让我很恼火。

1、如果Excel表格中,键名用了:number,这种关键字,会报错。(我想用来表示学生的学号)

2、如果Excel表格中,键名用了:xuehao,这种拼音,会报错。(中文拼音,不行,有时候,又可以。真是奇怪)

3、sql查询语句与Excel表头不匹配,就是sql有,但Excel里没有,这种情况会报错

4、Excel表头,如果 左上角没有那个英文的单引号,会报错

5、这个情况,让我很恼火

// 方案1,报错
recset.GetFieldValue(L"姓名",item1);
studentInfo.name = item1;
recset.GetFieldValue(L"学号",item2);
studentInfo.number = item2;
recset.GetFieldValue(L"班级",item3);
studentInfo.claz = item3;
recset.GetFieldValue(L"志愿",item4);
studentInfo.willGroup = item4;
recset.GetFieldValue(L"性别",item5);
studentInfo.sex = item5;


// 方案2,通过
recset.GetFieldValue(L"姓名",item1);
recset.GetFieldValue(L"学号",item2);
recset.GetFieldValue(L"班级",item3);
recset.GetFieldValue(L"志愿",item4);
recset.GetFieldValue(L"性别",item5);
studentInfo.name = item1;
studentInfo.number = item2;
studentInfo.claz = item3;
studentInfo.willGroup = item4;
studentInfo.sex = item5;

6、Excel表格中,中文字符太长会报错,仅4个汉字,通不过去:

recset.GetFieldValue(L"行政班级",item3);
recset.GetFieldValue(L"最终志愿",item4);

7、中文不需要加 英文单引号。否则,会报错。

sql = L"SELECT 姓名,学号,班级,志愿,性别 FROM [demo$]";    // 正确

sql = L"SELECT '姓名','学号','班级','志愿','性别' FROM [demo$]";// 错误

 

坑-No.5

参数不足,期待是1. 

参数不足,期待是3. 

参数不足,期待是5.   

  

 

坑-No.6

sql语句中,字段名中间,有英文逗号,不要加空格, 关键字与字段名中间有空格,是英文的。

坑-No.7

当成功的趟过前面的坑,又遇到一个:

// 本来Excel里面,有几百条数据。
// 但是这里读取了4条(读了4个学生的信息)之后,直接MoveNext就到Excel的末尾了,跳出循环。
// 费解!!!

// 本来Excel里面,有几百条数据。
// 但是这里读取了4条之后,直接MoveNext就到Excel的末尾了,跳出循环。
// 费解!!!
while(!recset.IsEOF())
{
...
    recset.GetFieldValue(L"姓名",item1);
    recset.GetFieldValue(L"学号",item2);
    recset.GetFieldValue(L"班级",item3);
    recset.GetFieldValue(L"性别",item4);

    studentInfo.name = item1;
    studentInfo.number = item2;
    studentInfo.claz = item3;
    studentInfo.sex = item4;
    fenban.stuList.push_back(studentInfo);

    recset.MoveNext();
}
...

https://bbs.csdn.net/topics/90199957  这个2006年的帖子中,遇到的问题,跟我的相同。却没有留下答案。

https://blog.51cto.com/liweibird/274434  这个博客有详细的介绍,还没看明白,先贴这里。

第4行数据读取完之后,就直接跳出了。所以,我怀疑是第4行数据的问题,然后将第4行数据移动到第10行数据。验证结果是:读取到第10行,就直接跳出了。所以,极有可能是第4行数据的问题。

① 将数组串的前面,添加英文单引号,转换为文本格式。并不能解决问题。

②直接用代码生成模板的时候,生成1000行数据,然后将学生的信息共900行 直接复制 值,到对应的表格处。将多余的100行模板数据删除,即仅删除数据,但是会读取到后100行的内容,即使内容为空。 所以得直接选中后100行的行,直接删除行,这样再进行读取,就能正常读取了。

不清楚,插入的模板,为啥不能读取。也不知道内部有什么差异。费解!!

综上所述

有的错误的解释,可能跟图不搭配,有时候a坑中的错图,答案可能在b坑中,这是正常现象。我遇到的,不同地方代码段的错误,会报相同的提示。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值