Qt5操作Excel操作的一些心得

8 篇文章 0 订阅

【背景】:

[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() <<" - 写入单元格的信息:"<<pCell->property("Value").toString();
        }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)没得说了,那就再见吧!有用的话别谢我,没有用的话捶我吧!

 

 

 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值