找回密码
 立即注册
发表于 2017-9-12 10:40:04 | 显示全部楼层 |阅读模式
1Qter豆
我Qt操作Excel时,如果设置Excel窗口可见,即:
  1. excel->setProperty("Visible", true); //true显示窗体
复制代码

没有任何问题,但设置为不可见时,在执行到
  1. workBooks->dynamicCall("Open(const QString&)", xlsFilePath);
复制代码
会报:QAxBase: Error calling IDispatch member Open: Unknown error
而且在析构后,计算机的EXCEL进程也没能关闭,请问解决方法

回复

使用道具 举报

发表于 2017-9-12 10:47:47 | 显示全部楼层
1、报错问题可能是因为 xlsFilePath路径中斜杠\反斜杠的问题

2、至于excel进程关闭还需要调用退出方法
  1. dynamicCall("Quit()")
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-9-12 11:02:43 | 显示全部楼层
shasidaran 发表于 2017-9-12 10:47
1、报错问题可能是因为 xlsFilePath路径中斜杠\反斜杠的问题

2、至于excel进程关闭还需要调用退出方法

报错与进程关闭都仅仅只是我在设置Excel窗口可见后才出现的,所有路径应该没问题;
我的析构函数有调用"Quit()"函数,也delete excel了,就是不知道为什么一定需要窗口可见才能正常关闭进程
回复

使用道具 举报

发表于 2017-9-12 17:06:12 | 显示全部楼层
我只用过窗口不可见 没问题
设置窗口可见出问题的情况没遇到过...
回复

使用道具 举报

 楼主| 发表于 2017-9-12 17:51:49 | 显示全部楼层
shasidaran 发表于 2017-9-12 17:06
我只用过窗口不可见 没问题
设置窗口可见出问题的情况没遇到过...

我现在是窗口可见没问题,
窗口不可见有问题,,,
我现在的临时解决方法只能是先设置窗口可见,然后设置窗口最小化欺骗欺骗自己

点评

因为我目前没调试环境,但我代码是这样的:  详情 回复 发表于 2017-9-12 18:05
回复

使用道具 举报

发表于 2017-9-12 18:05:58 | 显示全部楼层
emose 发表于 2017-9-12 17:51
我现在是窗口可见没问题,
窗口不可见有问题,,,
我现在的临时解决方法只能是先设置窗口可见,然后设置 ...

因为我目前没调试环境,但我代码是这样的:
  1. QExcel::QExcel(QObject *parent /*=0*/) :
  2.     m_excel(nullptr),
  3.     m_work_books(nullptr),
  4.     m_work_book(nullptr),
  5.     m_sheets(nullptr),
  6.     m_sheet(nullptr)
  7. {
  8.     // 设置启动Excel的方式
  9.     m_excel = new QAxObject("Excel.Application");
  10.     m_excel->dynamicCall("SetVisible (bool Visible)", "false"); // false表示后台启动
  11.     m_excel->setProperty("DisplayAlerts", false);               // 操作修改后,是否提示保存
  12.     m_work_books = m_excel->querySubObject("WorkBooks");        // 获取工作簿集合
  13. }

  14. QExcel::~QExcel()
  15. {
  16.     // 断开excel连接,释放资源
  17.     m_excel->dynamicCall("Quit()");
  18.     m_work_books = nullptr;
  19.     if(nullptr != m_excel)
  20.         delete m_excel;
  21.     m_excel = nullptr;
  22. }

  23. bool QExcel::open(const QString &xlsFilePath)
  24. {
  25.     // 检查excel路径是否正确
  26.     QFile file(xlsFilePath);
  27.     if(!file.exists())
  28.     {
  29.         m_work_books->dynamicCall("Add");
  30.         m_work_book = m_excel->querySubObject("ActiveWorkBook");
  31.         // 获取当前工作表集合
  32.         m_sheets = m_work_book->querySubObject("Sheets");   //Sheets也可换用WorkSheets
  33.         return false;
  34.     }
  35.     else
  36.     {
  37.         // 获取当前工作簿
  38.         m_work_books->dynamicCall("Open(const QString&)", xlsFilePath);
  39.         m_work_book = m_excel->querySubObject("ActiveWorkBook");
  40.         // 获取当前工作表集合
  41.         m_sheets = m_work_book->querySubObject("Sheets");   //Sheets也可换用WorkSheets
  42.         return true;
  43.     }
  44. }

复制代码
回复

使用道具 举报

 楼主| 发表于 2017-9-12 19:42:37 | 显示全部楼层
  1.     if(file.exists())
  2.     {
  3.         qDebug() << "file exists";
  4.         isFile = true;
  5.         excel = new QAxObject("Excel.Application", parent);

  6.         excel->dynamicCall("SetVisible(bool Visible)", "false");  //测试
  7. //        excel->setProperty("Visible", true); //true显示窗体
  8. //        excel->setProperty("WindowState", "xlMinimized");   //设置窗口最小化
  9.         excel->setProperty("DisplayAlerts", false);//不显示任何警告信息
  10.         workBooks = excel->querySubObject("Workbooks");
  11.         workBooks->dynamicCall("Open(const QString&)", xlsFilePath);
  12.         workBook = excel->querySubObject("ActiveWorkBook");
  13.         sheets = workBook->querySubObject("WorkSheets");
  14.         selectSheet();
  15.     }
复制代码

不行,仍是一样,设置窗体为false时,运行到 workBooks->dynamicCall("Open(const QString&)", xlsFilePath);就会报上述错误,析构时进程也关不掉。除此之外,对表格的操作都正常,我也很无奈-_-!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

emose

    主题

    帖子

    14

    积分

    Qter1级会员

    Rank: 1

    积分
    14

Qter1级会员

发私信

Qt开源社区——开源 共享 自由

微信扫一扫
查看精品教程!