我正在尝试处理 Excel 工作表,以使用 Qt (4.6.3) 对其中的数据进行一些处理。 我尝试使用
QAxWidget excel("Excel.Application")
,就像这里一样。
我首先尝试以简单的方法使用它,一切正常,但 GUI 冻结了一段时间,所以我尝试用不同的
QThread
来实现它。
正如某些人所说,不允许在主线程以外的其他线程中使用从
QWidget
继承的类。
我也尝试过这个方式,但无论如何都会出现运行时错误。
这是我的代码片段:
void MainDialog::extractData()
{
QAxWidget excel("Excel.Application");
excel.setProperty("Visible", false);
QAxObject * workbooks = excel.querySubObject("WorkBooks");
workbooks->dynamicCall("Open (const QString&)", ui->lineEditAdress->text());
QAxObject * workbook = excel.querySubObject("ActiveWorkBook");
QAxObject * worksheet = workbook->querySubObject("Worksheets(int)", 1);
// ... some work here...
workbook->dynamicCall("Close (Boolean)", false);
excel.dynamicCall("Quit (void)");
}
我做错了什么?有更好的方法来完成工作吗?比 ActiveX 更好的主意?
谢谢。
编辑: 正如 Raiv 所说,我将
QAxWidget
替换为 QAxObject
只需调用线程的run()即可:
// ...
CoInitialize(0);
QAxObject excel("Excel.Application");
// ...
而且效果很好。
尝试使用 QAxObject 而不是 QAxWidget,它可以在另一个线程中工作。只是不要忘记在那里调用 CoInitialize() 。
我想补充更多:
void Fn:示例(){
CoInitialize(0); // function used to initialize COM libraries in a process
// code etc
...
CoUninitialize(); // function used to release COM resources and end COM usage in a process
}