前言
在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坑中,这是正常现象。我遇到的,不同地方代码段的错误,会报相同的提示。