【背景】:
[01:感叹]
我真怕使用MFC或者Qt操作作Excel! 我真的太怕使用MFC或者Qt操作作Excel! 我真的太太怕使用MFC或者Qt操作作Excel! 现在还心有余悸!怕呀,怕呀,怕呀!
[02:怕的场景]
特别是不什么操作Excel,平时偶尔操作时也看一下网上的,看懂算法与操作后,cp后略修改,然后了事,了...事。从来没觉得使用Q T竟然让我觉得是可怕的事过,相反都不把它放在心上过,可是,需求人员提出要给写将某某一堆结果,什么数据呀,什么二进制图片,什么本地图片呀,都 弄到Excel中,好吧,没什么了不起的要求,很和蔼的请求,咱能拒绝?这么和蔼的需求都拒绝,你还敢出来混,公司HR早找你去聊天了,算了,扯多了!之后,该总之,嗯!总之,不能,也无法拒绝!好了,下面是问题的现象,真是让人后怕的现象,看了,现在还真里后怕,因为它们让我卡了一周呀,我去TMD一周呀(非精口话不可了),一直卡着,一面做别的事,一面每天抽出一两个小时来调试,想想,反正像恶梦似的。可能太怕了,话都乱糟糟说了一堆,抱歉,见谅则个!(卡一周的原因:自己掉以轻心了,其次,对Excel了解不多,然后就是网上的资料太少,或者太浅,当然,我也不能说得多深,才用那么一会,能有多深呀)
[03:问题现象]
[03-1:问题现象一] Cells 的错误
(1)ERROR:
QAxBase: Error calling IDispatch member Cells: Exception thrown by server
Code : -2146827284
Source :
Description:
Help :
Connect to the exception(int,QString,QString,QString) signal to catch this exception
(2) 源码接口:(在类中很友好的加工,也真没有问题)
bool FaceAlgorithmCompTool::setCellData(QAxObject* pSheet, int row, int column, QString value)
{
try{ if(m_pExcel && pSheet) //QAxObject *m_pExcel; //本例中,excel设定为Excel文件的操作对象
{
//m_pExcel在类的构造函数已经初始化了(new),并配置好了。这个如果看的朋友要你有一定的基础,反正一点不了解看不懂的
QAxObject* pCell = pSheet->querySubObject("Cells(int,int)",row,column);
if(pCell)
{
pCell->setProperty("Value2", value);
}else{
qDebug()<<"setCellData:"<<"pCell指针异常";
return false;
}
//qDebug()<< getCurDate() <<" - 写入单元格的信息:"<
}else{
qDebug()<<"m_pExcel && pSheet:"<<"指针异常";
return false;
}
}catch(...){
ui->txtEtLog->append(getCurDate()+": 数据写入Excel单元格失败!");
return false;
}
return true;
}
(3) 问题分析:
1)上面代码真没有任务问题,由于报了”Error calling IDispatch member Cells: Exception thrown by server“我还在try中多添加了检测,其实完全不用,但你用,也没事,更全面更精准的定位。这个不多说了。
2) 上面的问题在于,我传入的row = 0;我太了解excel,一般程序员数组或者什么的,都喜欢从0开始,而且pSheet->querySubObject("Cells(int,int)",row,column)中,我给row传0,是int,没问题呀。还有,就是如果你的代码很大,
你在类初始化就是定义了m_iRow,喜欢将其初始化为0,然后在写更多行时,m_iRow++;的往下用。汗,哪想到,
excel最小的的row=1,最小的纵列column = 1; 当上面报错这个时,我一开始觉得是不是我Excel不注册好,反正网上一堆人,说没注册好序列好,但我们公司都买好了。好吧,但我还是怀疑,汗,我什么了?也许我反正检测代码,发现上面的自己的源码接口,确实没有任务问题。重装呀,反正各种注册(公司都买相关的正版了,并注册好了,我还个种瞎搞,汗),不过,有对很准确的东西敢怀疑的精神还是不错的,就是太TDM浪费时间了,哈哈!
3)处理方法:
分析已经说明了,处理方法,就是在类构造函数中(或者在你最初初始化)excel的行(row)及列(column)的地方,将row与column重新初始化,按你的情况初始化,反正row最小不能小于1,column最小不能小于1。如果你的row=1有标题,那么row初始化则是2,列也这样的道理。
[03-2:问题现象二] AddPicture 的错误
1)ERROR
QAxBase: Error calling IDispatch member AddPicture: Exception thrown by server
Code : -2146827284
Source :
Description: ????????
Help :
Connect to the exception(int,QString,QString,QString) signal to catch this exception
2)源码
不在多说,给出关键的部分:
"AddPicture(QString&, bool, bool, double, double, double, double)"
3)分析上面的源码:
"AddPicture(QString&, bool, bool, double, double, double, double)"中,QString&是图片的路径+图片名如:D:/PIC/1.jpg
当你通过,UI上的PushButton Open图片路径+图片名时(假如为:qsPathPicName="D:/PIC/1.jpg",当然不是直接这样给的,通过:QFileDialog::getOpenFileName或者类似的拿到),然后将AddPicture(qsPathPicName,...)。好吧,恭喜你,肯定分出现上面的的Error现象的。
4)解决的办法
上面的AddPicture(qsPathPicName,...)中的qsPathPicName一定要使用类似这样的D:\\PIC\\1.jpg才不会出问题。
[03-3:问题现象三] Excel其他Error
从上面的问题中抽象的去分析类似的问题,再遇到其他 问题的做法:
1)了解excel基本信息,比如写时,列、行的最小不能小于1,等等类似的关于excel基础信息;
2)对于QT/MFC/Python/java等,操作excel的接口时,每一个参数都仔细的引入,因为在你习惯中某个参数这样用没问题,但是在但却报错,那时你一般不会去检测你习惯性让为是这样的用的参数。所以,清楚每个参数,并严格按接口的规定使用,而不是你习惯性为主导下使用这些接口。这也是程序员的基本素质,严谨性,代码一致性。
3)怕呀!怕呀!怕呀!好吧,怕那就多对面它呗,怕有什么了不起的,咱们还在,就奋斗着!
4)没得说了,那就再见吧!有用的话别谢我,没有用的话捶我吧!