//导出全部数据 void MainWindow::on_btnexportData_clicked() { QAxObject* excel = new QAxObject("Excel.Application"); excel->setProperty("Visible", false); QAxObject* workbooks = excel->querySubObject("Workbooks"); 用这种方式保存很慢.怎么解决给出代码
时间: 2024-02-26 20:56:41 浏览: 22
这种方式保存很慢的原因可能是因为每次写入数据时都会调用Excel的COM接口,造成了很大的性能开销。为了提高保存速度,可以采用将数据先写入到一个QTableWidget中,然后再一次性导出到Excel中的方式。
以下是一个示例代码:
```
void MainWindow::on_btnexportData_clicked()
{
QTableWidget* tableWidget = ui->tableWidget;
int row_count = tableWidget->rowCount();
int column_count = tableWidget->columnCount();
QAxObject* excel = new QAxObject("Excel.Application");
excel->setProperty("Visible", false);
QAxObject* workbooks = excel->querySubObject("Workbooks");
QAxObject* workbook = workbooks->querySubObject("Add");
QAxObject* worksheet = workbook->querySubObject("Worksheets(int)", 1);
QAxObject* range = worksheet->querySubObject("Range(QString, QString)", "A1", "Z10000");
QVariant table_header;
for (int i = 0; i < column_count; i++) {
QTableWidgetItem* item = tableWidget->horizontalHeaderItem(i);
table_header.setValue(item->text());
range->querySubObject("Cells(int, int)", 1, i + 1)->setProperty("Value", table_header);
}
for (int i = 0; i < row_count; i++) {
for (int j = 0; j < column_count; j++) {
QTableWidgetItem* item = tableWidget->item(i, j);
if (item) {
range->querySubObject("Cells(int, int)", i + 2, j + 1)->setProperty("Value", item->text());
}
}
}
workbook->dynamicCall("SaveAs(const QString&)", "data.xlsx");
workbook->dynamicCall("Close()");
excel->dynamicCall("Quit()");
delete excel;
}
```
这个示例代码中,首先获取了QTableWidget中的数据,然后使用COM接口创建了一个Excel应用程序,并创建了一个工作簿和一个工作表。接着,将QTableWidget中的表头和数据写入到Excel中。最后,将Excel文件保存到了磁盘上,并关闭了Excel应用程序。
请注意,这个示例代码中的写入操作是一次性的,因此会比每次写入一个单元格的方式更快。